From 7507023403933bbd0d851a250a474f85ba6a89d2 Mon Sep 17 00:00:00 2001 From: Mystery Man Date: Mon, 11 Jun 2001 11:44:34 +0000 Subject: This commit was manufactured by cvs2svn to create branch 'ppp'. --- mdk-stage1/.cvsignore | 10 - mdk-stage1/Makefile | 240 - mdk-stage1/Makefile.common | 51 - mdk-stage1/Makefile.mkinitrd_helper | 30 - mdk-stage1/adsl.c | 106 - mdk-stage1/adsl.h | 34 - mdk-stage1/automatic.c | 148 - mdk-stage1/automatic.h | 32 - mdk-stage1/bzlib/Makefile | 55 - mdk-stage1/bzlib/blocksort.c | 1138 ---- mdk-stage1/bzlib/bzlib.c | 1567 ------ mdk-stage1/bzlib/bzlib_private.h | 530 -- mdk-stage1/bzlib/compress.c | 720 --- mdk-stage1/bzlib/crctable.c | 148 - mdk-stage1/bzlib/decompress.c | 664 --- mdk-stage1/bzlib/huffman.c | 232 - mdk-stage1/bzlib/randtable.c | 128 - mdk-stage1/cdrom.c | 181 - mdk-stage1/cdrom.h | 29 - mdk-stage1/config-stage1.h | 45 - mdk-stage1/dhcp.c | 614 --- mdk-stage1/dhcp.h | 34 - mdk-stage1/dietlibc/.cvsignore | 12 - mdk-stage1/dietlibc/AUTHOR | 1 - mdk-stage1/dietlibc/Makefile | 148 - mdk-stage1/dietlibc/README | 43 - mdk-stage1/dietlibc/alpha/Makefile.add | 5 - mdk-stage1/dietlibc/alpha/__longjmp.S | 38 - mdk-stage1/dietlibc/alpha/__time.c | 11 - mdk-stage1/dietlibc/alpha/accept.S | 3 - mdk-stage1/dietlibc/alpha/bind.S | 3 - mdk-stage1/dietlibc/alpha/clone.S | 42 - mdk-stage1/dietlibc/alpha/connect.S | 3 - mdk-stage1/dietlibc/alpha/divl.S | 101 - mdk-stage1/dietlibc/alpha/divq.S | 102 - mdk-stage1/dietlibc/alpha/getegid.S | 11 - mdk-stage1/dietlibc/alpha/geteuid.S | 11 - mdk-stage1/dietlibc/alpha/getgid.S | 3 - mdk-stage1/dietlibc/alpha/getpeername.S | 3 - mdk-stage1/dietlibc/alpha/getpid.S | 3 - mdk-stage1/dietlibc/alpha/getppid.S | 11 - mdk-stage1/dietlibc/alpha/getsockname.S | 3 - mdk-stage1/dietlibc/alpha/getsockopt.S | 3 - mdk-stage1/dietlibc/alpha/getuid.S | 3 - mdk-stage1/dietlibc/alpha/listen.S | 3 - mdk-stage1/dietlibc/alpha/mmap.S | 3 - mdk-stage1/dietlibc/alpha/msgctl.S | 3 - mdk-stage1/dietlibc/alpha/msgget.S | 3 - mdk-stage1/dietlibc/alpha/msgrcv.S | 3 - mdk-stage1/dietlibc/alpha/msgsnd.S | 3 - mdk-stage1/dietlibc/alpha/pipe.S | 17 - mdk-stage1/dietlibc/alpha/recv.S | 3 - mdk-stage1/dietlibc/alpha/recvfrom.S | 3 - mdk-stage1/dietlibc/alpha/recvmsg.S | 3 - mdk-stage1/dietlibc/alpha/reml.S | 101 - mdk-stage1/dietlibc/alpha/remq.S | 97 - mdk-stage1/dietlibc/alpha/semctl.S | 3 - mdk-stage1/dietlibc/alpha/semget.S | 3 - mdk-stage1/dietlibc/alpha/semop.S | 3 - mdk-stage1/dietlibc/alpha/send.S | 3 - mdk-stage1/dietlibc/alpha/sendmsg.S | 3 - mdk-stage1/dietlibc/alpha/sendto.S | 3 - mdk-stage1/dietlibc/alpha/seteuid.c | 7 - mdk-stage1/dietlibc/alpha/setjmp.S | 46 - mdk-stage1/dietlibc/alpha/setsockopt.S | 3 - mdk-stage1/dietlibc/alpha/shmat.S | 3 - mdk-stage1/dietlibc/alpha/shmctl.S | 3 - mdk-stage1/dietlibc/alpha/shmdt.S | 3 - mdk-stage1/dietlibc/alpha/shmget.S | 3 - mdk-stage1/dietlibc/alpha/shutdown.S | 3 - mdk-stage1/dietlibc/alpha/signal.S | 3 - mdk-stage1/dietlibc/alpha/sigprocmask.S | 3 - mdk-stage1/dietlibc/alpha/socket.S | 3 - mdk-stage1/dietlibc/alpha/socketcall.S | 5 - mdk-stage1/dietlibc/alpha/start.S | 35 - mdk-stage1/dietlibc/alpha/strlen.c | 32 - mdk-stage1/dietlibc/alpha/time.S | 0 mdk-stage1/dietlibc/alpha/unified.S | 29 - mdk-stage1/dietlibc/alpha/utime.S | 3 - mdk-stage1/dietlibc/alpha/waitpid.S | 10 - mdk-stage1/dietlibc/diet.c | 112 - mdk-stage1/dietlibc/dietdirent.h | 6 - mdk-stage1/dietlibc/dietfeatures.h | 42 - mdk-stage1/dietlibc/dietstdarg.h | 12 - mdk-stage1/dietlibc/dietstdio.h | 81 - mdk-stage1/dietlibc/dietwarning.h | 23 - mdk-stage1/dietlibc/dirstream.h | 78 - mdk-stage1/dietlibc/i386/Makefile.add | 3 - mdk-stage1/dietlibc/i386/__longjmp.S | 18 - mdk-stage1/dietlibc/i386/__testandset.S | 8 - mdk-stage1/dietlibc/i386/clone.S | 51 - mdk-stage1/dietlibc/i386/mmap.c | 16 - mdk-stage1/dietlibc/i386/select.S | 3 - mdk-stage1/dietlibc/i386/setjmp.S | 62 - mdk-stage1/dietlibc/i386/start.S | 42 - mdk-stage1/dietlibc/i386/unified.S | 34 - mdk-stage1/dietlibc/include/alloca.h | 0 mdk-stage1/dietlibc/include/arpa/inet.h | 19 - mdk-stage1/dietlibc/include/arpa/nameser.h | 217 - mdk-stage1/dietlibc/include/assert.h | 27 - mdk-stage1/dietlibc/include/ctype.h | 28 - mdk-stage1/dietlibc/include/daemon.h | 6 - mdk-stage1/dietlibc/include/dirent.h | 26 - mdk-stage1/dietlibc/include/dlfcn.h | 15 - mdk-stage1/dietlibc/include/elf.h | 1 - mdk-stage1/dietlibc/include/endian.h | 43 - mdk-stage1/dietlibc/include/errno.h | 11 - mdk-stage1/dietlibc/include/fcntl.h | 24 - mdk-stage1/dietlibc/include/features.h | 3 - mdk-stage1/dietlibc/include/fnmatch.h | 15 - mdk-stage1/dietlibc/include/ftw.h | 51 - mdk-stage1/dietlibc/include/getopt.h | 32 - mdk-stage1/dietlibc/include/glob.h | 55 - mdk-stage1/dietlibc/include/grp.h | 25 - mdk-stage1/dietlibc/include/inttypes.h | 0 mdk-stage1/dietlibc/include/limits.h | 48 - mdk-stage1/dietlibc/include/locale.h | 6 - mdk-stage1/dietlibc/include/malloc.h | 1 - mdk-stage1/dietlibc/include/math.h | 61 - mdk-stage1/dietlibc/include/memory.h | 6 - mdk-stage1/dietlibc/include/mntent.h | 72 - mdk-stage1/dietlibc/include/net/if.h | 11 - mdk-stage1/dietlibc/include/net/if_arp.h | 6 - mdk-stage1/dietlibc/include/net/route.h | 6 - mdk-stage1/dietlibc/include/netdb.h | 90 - mdk-stage1/dietlibc/include/netinet/in.h | 9 - mdk-stage1/dietlibc/include/netinet/in_systm.h | 0 mdk-stage1/dietlibc/include/netinet/ip.h | 6 - mdk-stage1/dietlibc/include/paths.h | 16 - mdk-stage1/dietlibc/include/pthread.h | 227 - mdk-stage1/dietlibc/include/pwd.h | 24 - mdk-stage1/dietlibc/include/regex.h | 67 - mdk-stage1/dietlibc/include/resolv.h | 1 - mdk-stage1/dietlibc/include/rpc/auth.h | 213 - mdk-stage1/dietlibc/include/rpc/auth_des.h | 112 - mdk-stage1/dietlibc/include/rpc/auth_unix.h | 90 - mdk-stage1/dietlibc/include/rpc/clnt.h | 421 -- mdk-stage1/dietlibc/include/rpc/des_crypt.h | 97 - mdk-stage1/dietlibc/include/rpc/key_prot.h | 346 -- mdk-stage1/dietlibc/include/rpc/netdb.h | 74 - mdk-stage1/dietlibc/include/rpc/pmap_clnt.h | 98 - mdk-stage1/dietlibc/include/rpc/pmap_prot.h | 108 - mdk-stage1/dietlibc/include/rpc/pmap_rmt.h | 68 - mdk-stage1/dietlibc/include/rpc/rpc.h | 72 - mdk-stage1/dietlibc/include/rpc/rpc_des.h | 72 - mdk-stage1/dietlibc/include/rpc/rpc_msg.h | 202 - mdk-stage1/dietlibc/include/rpc/svc.h | 316 -- mdk-stage1/dietlibc/include/rpc/svc_auth.h | 54 - mdk-stage1/dietlibc/include/rpc/types.h | 78 - mdk-stage1/dietlibc/include/rpc/xdr.h | 379 -- mdk-stage1/dietlibc/include/sched.h | 74 - mdk-stage1/dietlibc/include/scsi/scsi.h | 224 - mdk-stage1/dietlibc/include/scsi/scsi_ioctl.h | 34 - mdk-stage1/dietlibc/include/scsi/sg.h | 274 - mdk-stage1/dietlibc/include/setjmp.h | 123 - mdk-stage1/dietlibc/include/shadow.h | 24 - mdk-stage1/dietlibc/include/signal.h | 35 - mdk-stage1/dietlibc/include/stdint.h | 6 - mdk-stage1/dietlibc/include/stdio.h | 97 - mdk-stage1/dietlibc/include/stdlib.h | 67 - mdk-stage1/dietlibc/include/string.h | 57 - mdk-stage1/dietlibc/include/strings.h | 2 - mdk-stage1/dietlibc/include/sys/cdefs.h | 36 - mdk-stage1/dietlibc/include/sys/file.h | 19 - mdk-stage1/dietlibc/include/sys/io.h | 41 - mdk-stage1/dietlibc/include/sys/ioctl.h | 10 - mdk-stage1/dietlibc/include/sys/ipc.h | 8 - mdk-stage1/dietlibc/include/sys/kd.h | 6 - mdk-stage1/dietlibc/include/sys/mman.h | 33 - mdk-stage1/dietlibc/include/sys/mount.h | 19 - mdk-stage1/dietlibc/include/sys/msg.h | 13 - mdk-stage1/dietlibc/include/sys/mtio.h | 6 - mdk-stage1/dietlibc/include/sys/param.h | 8 - mdk-stage1/dietlibc/include/sys/poll.h | 11 - mdk-stage1/dietlibc/include/sys/ptrace.h | 10 - mdk-stage1/dietlibc/include/sys/reboot.h | 9 - mdk-stage1/dietlibc/include/sys/resource.h | 16 - mdk-stage1/dietlibc/include/sys/select.h | 0 mdk-stage1/dietlibc/include/sys/sem.h | 11 - mdk-stage1/dietlibc/include/sys/sendfile.h | 9 - mdk-stage1/dietlibc/include/sys/shm.h | 17 - mdk-stage1/dietlibc/include/sys/signal.h | 1 - mdk-stage1/dietlibc/include/sys/socket.h | 46 - mdk-stage1/dietlibc/include/sys/stat.h | 52 - mdk-stage1/dietlibc/include/sys/syscall.h | 6 - mdk-stage1/dietlibc/include/sys/sysinfo.h | 9 - mdk-stage1/dietlibc/include/sys/syslog.h | 102 - mdk-stage1/dietlibc/include/sys/time.h | 46 - mdk-stage1/dietlibc/include/sys/times.h | 8 - mdk-stage1/dietlibc/include/sys/types.h | 33 - mdk-stage1/dietlibc/include/sys/uio.h | 9 - mdk-stage1/dietlibc/include/sys/un.h | 8 - mdk-stage1/dietlibc/include/sys/utsname.h | 35 - mdk-stage1/dietlibc/include/sys/vfs.h | 11 - mdk-stage1/dietlibc/include/sys/wait.h | 37 - mdk-stage1/dietlibc/include/syslog.h | 1 - mdk-stage1/dietlibc/include/termios.h | 22 - mdk-stage1/dietlibc/include/time.h | 24 - mdk-stage1/dietlibc/include/unistd.h | 168 - mdk-stage1/dietlibc/include/utime.h | 16 - mdk-stage1/dietlibc/include/utmp.h | 73 - mdk-stage1/dietlibc/lib/__dtostr.c | 104 - mdk-stage1/dietlibc/lib/__fstat64.c | 25 - mdk-stage1/dietlibc/lib/__getcwd.c | 10 - mdk-stage1/dietlibc/lib/__isnan.c | 14 - mdk-stage1/dietlibc/lib/__lltostr.c | 31 - mdk-stage1/dietlibc/lib/__lstat64.c | 25 - mdk-stage1/dietlibc/lib/__ltostr.c | 31 - mdk-stage1/dietlibc/lib/__stat64.c | 25 - mdk-stage1/dietlibc/lib/__stat64_cvt.c | 18 - mdk-stage1/dietlibc/lib/__xmknod.c | 6 - mdk-stage1/dietlibc/lib/_brk.c | 14 - mdk-stage1/dietlibc/lib/abort.c | 13 - mdk-stage1/dietlibc/lib/abs.c | 6 - mdk-stage1/dietlibc/lib/accept.c | 14 - mdk-stage1/dietlibc/lib/alarm.c | 47 - mdk-stage1/dietlibc/lib/alloc.c | 243 - mdk-stage1/dietlibc/lib/assert_fail.c | 30 - mdk-stage1/dietlibc/lib/atexit.c | 23 - mdk-stage1/dietlibc/lib/atof.c | 10 - mdk-stage1/dietlibc/lib/atoi.c | 8 - mdk-stage1/dietlibc/lib/atol.c | 8 - mdk-stage1/dietlibc/lib/bind.c | 12 - mdk-stage1/dietlibc/lib/bsearch.c | 20 - mdk-stage1/dietlibc/lib/cfmakeraw.c | 14 - mdk-stage1/dietlibc/lib/closedir.c | 10 - mdk-stage1/dietlibc/lib/connect.c | 14 - mdk-stage1/dietlibc/lib/creat.c | 5 - mdk-stage1/dietlibc/lib/creat64.c | 9 - mdk-stage1/dietlibc/lib/errlist.c | 132 - mdk-stage1/dietlibc/lib/errno_location.c | 5 - mdk-stage1/dietlibc/lib/exec_lib.c | 20 - mdk-stage1/dietlibc/lib/exec_lib.h | 9 - mdk-stage1/dietlibc/lib/execl.c | 24 - mdk-stage1/dietlibc/lib/execlp.c | 26 - mdk-stage1/dietlibc/lib/execv.c | 13 - mdk-stage1/dietlibc/lib/execvp.c | 38 - mdk-stage1/dietlibc/lib/ftw.c | 52 - mdk-stage1/dietlibc/lib/getdomainname.c | 17 - mdk-stage1/dietlibc/lib/getenv.c | 17 - mdk-stage1/dietlibc/lib/gethostname.c | 18 - mdk-stage1/dietlibc/lib/getopt.c | 118 - mdk-stage1/dietlibc/lib/getpeername.c | 13 - mdk-stage1/dietlibc/lib/getpgrp.c | 6 - mdk-stage1/dietlibc/lib/getservent.c | 137 - mdk-stage1/dietlibc/lib/getsockname.c | 13 - mdk-stage1/dietlibc/lib/getsockopt.c | 13 - mdk-stage1/dietlibc/lib/htonl.c | 12 - mdk-stage1/dietlibc/lib/htons.c | 11 - mdk-stage1/dietlibc/lib/if_indextoname.c | 29 - mdk-stage1/dietlibc/lib/if_nametoindex.c | 27 - mdk-stage1/dietlibc/lib/isalnum.c | 7 - mdk-stage1/dietlibc/lib/isalpha.c | 7 - mdk-stage1/dietlibc/lib/isascii.c | 6 - mdk-stage1/dietlibc/lib/isatty.c | 20 - mdk-stage1/dietlibc/lib/isblank.c | 6 - mdk-stage1/dietlibc/lib/iscntrl.c | 7 - mdk-stage1/dietlibc/lib/isdigit.c | 7 - mdk-stage1/dietlibc/lib/isgraph.c | 5 - mdk-stage1/dietlibc/lib/islower.c | 7 - mdk-stage1/dietlibc/lib/isprint.c | 6 - mdk-stage1/dietlibc/lib/ispunct.c | 7 - mdk-stage1/dietlibc/lib/isspace.c | 8 - mdk-stage1/dietlibc/lib/isupper.c | 7 - mdk-stage1/dietlibc/lib/isxdigit.c | 5 - mdk-stage1/dietlibc/lib/listen.c | 13 - mdk-stage1/dietlibc/lib/lockf.c | 37 - mdk-stage1/dietlibc/lib/longjmp.c | 51 - mdk-stage1/dietlibc/lib/lseek64.c | 22 - mdk-stage1/dietlibc/lib/memccmp.c | 17 - mdk-stage1/dietlibc/lib/memccpy.c | 19 - mdk-stage1/dietlibc/lib/memchr.c | 9 - mdk-stage1/dietlibc/lib/memcmp.c | 16 - mdk-stage1/dietlibc/lib/memcpy.c | 12 - mdk-stage1/dietlibc/lib/memmove.c | 23 - mdk-stage1/dietlibc/lib/memset.c | 9 - mdk-stage1/dietlibc/lib/mkfifo.c | 6 - mdk-stage1/dietlibc/lib/msgctl.c | 10 - mdk-stage1/dietlibc/lib/msgget.c | 10 - mdk-stage1/dietlibc/lib/msgrcv.c | 13 - mdk-stage1/dietlibc/lib/msgsnd.c | 10 - mdk-stage1/dietlibc/lib/nop.c | 7 - mdk-stage1/dietlibc/lib/open64.c | 14 - mdk-stage1/dietlibc/lib/opendir.c | 18 - mdk-stage1/dietlibc/lib/perror.c | 22 - mdk-stage1/dietlibc/lib/pread.c | 10 - mdk-stage1/dietlibc/lib/pread64.c | 13 - mdk-stage1/dietlibc/lib/putenv.c | 37 - mdk-stage1/dietlibc/lib/puts.c | 12 - mdk-stage1/dietlibc/lib/qsort.c | 125 - mdk-stage1/dietlibc/lib/raise.c | 8 - mdk-stage1/dietlibc/lib/rand.c | 9 - mdk-stage1/dietlibc/lib/random.c | 9 - mdk-stage1/dietlibc/lib/readdir.c | 13 - mdk-stage1/dietlibc/lib/reboot.c | 8 - mdk-stage1/dietlibc/lib/recv.c | 15 - mdk-stage1/dietlibc/lib/recvfrom.c | 15 - mdk-stage1/dietlibc/lib/recvmsg.c | 15 - mdk-stage1/dietlibc/lib/remove.c | 11 - mdk-stage1/dietlibc/lib/rewind.c | 6 - mdk-stage1/dietlibc/lib/rewinddir.c | 8 - mdk-stage1/dietlibc/lib/sbrk.c | 20 - mdk-stage1/dietlibc/lib/seekdir.c | 8 - mdk-stage1/dietlibc/lib/semctl.c | 10 - mdk-stage1/dietlibc/lib/semget.c | 10 - mdk-stage1/dietlibc/lib/semop.c | 10 - mdk-stage1/dietlibc/lib/send.c | 15 - mdk-stage1/dietlibc/lib/sendmsg.c | 15 - mdk-stage1/dietlibc/lib/sendto.c | 15 - mdk-stage1/dietlibc/lib/set_errno.c | 9 - mdk-stage1/dietlibc/lib/setpgrp.c | 6 - mdk-stage1/dietlibc/lib/setsockopt.c | 13 - mdk-stage1/dietlibc/lib/shmat.c | 15 - mdk-stage1/dietlibc/lib/shmctl.c | 10 - mdk-stage1/dietlibc/lib/shmdt.c | 10 - mdk-stage1/dietlibc/lib/shmget.c | 10 - mdk-stage1/dietlibc/lib/shutdown.c | 14 - mdk-stage1/dietlibc/lib/sigaddset.c | 15 - mdk-stage1/dietlibc/lib/sigdelset.c | 15 - mdk-stage1/dietlibc/lib/sigemptyset.c | 14 - mdk-stage1/dietlibc/lib/sigfillset.c | 11 - mdk-stage1/dietlibc/lib/sigismember.c | 21 - mdk-stage1/dietlibc/lib/sigjmp.c | 35 - mdk-stage1/dietlibc/lib/sleep.c | 11 - mdk-stage1/dietlibc/lib/snprintf.c | 14 - mdk-stage1/dietlibc/lib/socket.c | 12 - mdk-stage1/dietlibc/lib/speed.c | 67 - mdk-stage1/dietlibc/lib/sprintf.c | 18 - mdk-stage1/dietlibc/lib/sscanf.c | 13 - mdk-stage1/dietlibc/lib/strcasecmp.c | 17 - mdk-stage1/dietlibc/lib/strcat.c | 18 - mdk-stage1/dietlibc/lib/strchr.c | 18 - mdk-stage1/dietlibc/lib/strcmp.c | 16 - mdk-stage1/dietlibc/lib/strcpy.c | 15 - mdk-stage1/dietlibc/lib/strcspn.c | 17 - mdk-stage1/dietlibc/lib/strdup.c | 9 - mdk-stage1/dietlibc/lib/strerror.c | 10 - mdk-stage1/dietlibc/lib/strlcat.c | 72 - mdk-stage1/dietlibc/lib/strlcpy.3 | 169 - mdk-stage1/dietlibc/lib/strlcpy.c | 68 - mdk-stage1/dietlibc/lib/strlen.c | 47 - mdk-stage1/dietlibc/lib/strncasecmp.c | 18 - mdk-stage1/dietlibc/lib/strncat.c | 31 - mdk-stage1/dietlibc/lib/strncmp.c | 6 - mdk-stage1/dietlibc/lib/strncpy.c | 10 - mdk-stage1/dietlibc/lib/strpbrk.c | 11 - mdk-stage1/dietlibc/lib/strrchr.c | 20 - mdk-stage1/dietlibc/lib/strsep.c | 16 - mdk-stage1/dietlibc/lib/strspn.c | 17 - mdk-stage1/dietlibc/lib/strstr.c | 15 - mdk-stage1/dietlibc/lib/strtod.c | 52 - mdk-stage1/dietlibc/lib/strtok.c | 8 - mdk-stage1/dietlibc/lib/strtok_r.c | 21 - mdk-stage1/dietlibc/lib/strtol.c | 15 - mdk-stage1/dietlibc/lib/strtoll.c | 15 - mdk-stage1/dietlibc/lib/strtoul.c | 32 - mdk-stage1/dietlibc/lib/strtoull.c | 30 - mdk-stage1/dietlibc/lib/sys_siglist.c | 37 - mdk-stage1/dietlibc/lib/tcdrain.c | 8 - mdk-stage1/dietlibc/lib/tcflush.c | 23 - mdk-stage1/dietlibc/lib/tcgetattr.c | 7 - mdk-stage1/dietlibc/lib/tcgetpgrp.c | 7 - mdk-stage1/dietlibc/lib/tcsetattr.c | 27 - mdk-stage1/dietlibc/lib/tcsetpgrp.c | 7 - mdk-stage1/dietlibc/lib/telldir.c | 7 - mdk-stage1/dietlibc/lib/tolower.c | 6 - mdk-stage1/dietlibc/lib/toupper.c | 6 - mdk-stage1/dietlibc/lib/ttyname.c | 59 - mdk-stage1/dietlibc/lib/usleep.c | 12 - mdk-stage1/dietlibc/lib/vfork.c | 6 - mdk-stage1/dietlibc/lib/vfprintf.c | 19 - mdk-stage1/dietlibc/lib/vprintf.c | 14 - mdk-stage1/dietlibc/lib/vsnprintf.c | 238 - mdk-stage1/dietlibc/lib/vsprintf.c | 10 - mdk-stage1/dietlibc/lib/vsscanf.c | 304 -- mdk-stage1/dietlibc/lib/wait.c | 6 - mdk-stage1/dietlibc/lib/wait3.c | 5 - mdk-stage1/dietlibc/libcruft/___div.c | 11 - mdk-stage1/dietlibc/libcruft/dnscruft.c | 115 - mdk-stage1/dietlibc/libcruft/dnscruft2.c | 185 - mdk-stage1/dietlibc/libcruft/entlib.c | 153 - mdk-stage1/dietlibc/libcruft/entlib.h | 44 - mdk-stage1/dietlibc/libcruft/getdtablesize.c | 6 - mdk-stage1/dietlibc/libcruft/getgrgid.c | 14 - mdk-stage1/dietlibc/libcruft/getgrnam.c | 14 - mdk-stage1/dietlibc/libcruft/gethostbyaddr.c | 38 - mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c | 51 - mdk-stage1/dietlibc/libcruft/gethostbyname.c | 39 - mdk-stage1/dietlibc/libcruft/gethostbyname2.c | 40 - mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c | 36 - mdk-stage1/dietlibc/libcruft/gethostbyname_r.c | 30 - mdk-stage1/dietlibc/libcruft/getlogin.c | 5 - mdk-stage1/dietlibc/libcruft/getpagesize.c | 14 - mdk-stage1/dietlibc/libcruft/getpass.c | 40 - mdk-stage1/dietlibc/libcruft/getpwnam.c | 14 - mdk-stage1/dietlibc/libcruft/getpwuid.c | 14 - mdk-stage1/dietlibc/libcruft/getspnam.c | 14 - mdk-stage1/dietlibc/libcruft/grent.c | 54 - mdk-stage1/dietlibc/libcruft/h_errno.c | 1 - mdk-stage1/dietlibc/libcruft/herrno_location.c | 5 - mdk-stage1/dietlibc/libcruft/inet_addr.c | 11 - mdk-stage1/dietlibc/libcruft/inet_aton.c | 43 - mdk-stage1/dietlibc/libcruft/inet_ntoa.c | 10 - mdk-stage1/dietlibc/libcruft/inet_ntoa_r.c | 22 - mdk-stage1/dietlibc/libcruft/inet_ntop.c | 75 - mdk-stage1/dietlibc/libcruft/inet_pton.c | 97 - mdk-stage1/dietlibc/libcruft/initgroups.c | 23 - mdk-stage1/dietlibc/libcruft/mkstemp.c | 23 - mdk-stage1/dietlibc/libcruft/pwent.c | 43 - mdk-stage1/dietlibc/libcruft/res_init.c | 7 - mdk-stage1/dietlibc/libcruft/spent.c | 45 - mdk-stage1/dietlibc/libcrypt/crypt.c | 309 -- mdk-stage1/dietlibc/libdl/Makefile | 24 - mdk-stage1/dietlibc/libdl/README | 6 - mdk-stage1/dietlibc/libdl/_dl_int.h | 31 - mdk-stage1/dietlibc/libdl/_dl_jump.S | 8 - mdk-stage1/dietlibc/libdl/_dl_open.c | 207 - mdk-stage1/dietlibc/libdl/_dl_search.c | 84 - mdk-stage1/dietlibc/libdl/dlclose.c | 14 - mdk-stage1/dietlibc/libdl/dlerror.c | 4 - mdk-stage1/dietlibc/libdl/dlopen.c | 21 - mdk-stage1/dietlibc/libdl/dlsym.c | 7 - mdk-stage1/dietlibc/libdl/elf_hash.c | 12 - mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c | 5 - mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c | 4 - mdk-stage1/dietlibc/liblatin1/latin1-islower.c | 5 - mdk-stage1/dietlibc/liblatin1/latin1-isprint.c | 4 - mdk-stage1/dietlibc/liblatin1/latin1-isupper.c | 5 - mdk-stage1/dietlibc/libpthread/CHANGES | 45 - mdk-stage1/dietlibc/libpthread/Makefile | 139 - mdk-stage1/dietlibc/libpthread/README | 42 - mdk-stage1/dietlibc/libpthread/pthread_atfork.c | 77 - .../libpthread/pthread_attr_getdetachstate.c | 14 - .../libpthread/pthread_attr_getinheritsched.c | 13 - .../libpthread/pthread_attr_getschedparam.c | 13 - .../libpthread/pthread_attr_getschedpolicy.c | 13 - .../dietlibc/libpthread/pthread_attr_getscope.c | 13 - .../libpthread/pthread_attr_getstackaddr.c | 13 - .../libpthread/pthread_attr_getstacksize.c | 14 - mdk-stage1/dietlibc/libpthread/pthread_attr_init.c | 17 - .../libpthread/pthread_attr_setdetachstate.c | 18 - .../libpthread/pthread_attr_setinheritsched.c | 18 - .../libpthread/pthread_attr_setschedparam.c | 23 - .../libpthread/pthread_attr_setschedpolicy.c | 25 - .../dietlibc/libpthread/pthread_attr_setscope.c | 18 - .../libpthread/pthread_attr_setstackaddr.c | 13 - .../libpthread/pthread_attr_setstacksize.c | 17 - mdk-stage1/dietlibc/libpthread/pthread_cancel.c | 35 - .../dietlibc/libpthread/pthread_cleanup_pop.c | 27 - .../dietlibc/libpthread/pthread_cleanup_push.c | 23 - .../dietlibc/libpthread/pthread_cond_broadcast.c | 23 - .../dietlibc/libpthread/pthread_cond_destroy.c | 19 - mdk-stage1/dietlibc/libpthread/pthread_cond_init.c | 14 - .../dietlibc/libpthread/pthread_cond_signal.c | 24 - .../dietlibc/libpthread/pthread_cond_timedwait.c | 43 - mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c | 37 - mdk-stage1/dietlibc/libpthread/pthread_condattr.c | 15 - mdk-stage1/dietlibc/libpthread/pthread_create.c | 76 - mdk-stage1/dietlibc/libpthread/pthread_detach.c | 36 - mdk-stage1/dietlibc/libpthread/pthread_exit.c | 17 - .../dietlibc/libpthread/pthread_getspecific.c | 20 - mdk-stage1/dietlibc/libpthread/pthread_join.c | 50 - .../dietlibc/libpthread/pthread_key_create.c | 35 - .../dietlibc/libpthread/pthread_key_delete.c | 21 - .../dietlibc/libpthread/pthread_mutex_destroy.c | 16 - .../dietlibc/libpthread/pthread_mutex_init.c | 18 - .../dietlibc/libpthread/pthread_mutex_lock.c | 33 - .../dietlibc/libpthread/pthread_mutex_trylock.c | 36 - .../dietlibc/libpthread/pthread_mutex_unlock.c | 34 - .../libpthread/pthread_mutexattr_getkind_np.c | 13 - .../dietlibc/libpthread/pthread_mutexattr_init.c | 15 - .../libpthread/pthread_mutexattr_setkind_np.c | 18 - mdk-stage1/dietlibc/libpthread/pthread_once.c | 9 - mdk-stage1/dietlibc/libpthread/pthread_self.c | 4 - .../dietlibc/libpthread/pthread_setcancelstate.c | 25 - .../dietlibc/libpthread/pthread_setcanceltype.c | 25 - .../dietlibc/libpthread/pthread_setspecific.c | 21 - mdk-stage1/dietlibc/libpthread/pthread_spinlock.c | 38 - mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c | 26 - mdk-stage1/dietlibc/libpthread/pthread_sys_close.c | 10 - .../dietlibc/libpthread/pthread_sys_create.c | 10 - mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c | 10 - mdk-stage1/dietlibc/libpthread/pthread_sys_fsync.c | 10 - .../dietlibc/libpthread/pthread_sys_logging.c | 31 - .../dietlibc/libpthread/pthread_sys_nanosleep.c | 11 - mdk-stage1/dietlibc/libpthread/pthread_sys_open.c | 12 - mdk-stage1/dietlibc/libpthread/pthread_sys_pause.c | 10 - mdk-stage1/dietlibc/libpthread/pthread_sys_read.c | 10 - .../dietlibc/libpthread/pthread_sys_sigsuspend.c | 10 - .../dietlibc/libpthread/pthread_sys_tcdrain.c | 10 - .../dietlibc/libpthread/pthread_sys_waitpid.c | 10 - mdk-stage1/dietlibc/libpthread/pthread_sys_write.c | 10 - .../dietlibc/libpthread/pthread_testcancel.c | 16 - mdk-stage1/dietlibc/libpthread/test.c | 72 - mdk-stage1/dietlibc/libpthread/thread_internal.c | 344 -- mdk-stage1/dietlibc/libpthread/thread_internal.h | 131 - mdk-stage1/dietlibc/libpthread/thread_key.c | 41 - mdk-stage1/dietlibc/libregex/rx.c | 434 -- mdk-stage1/dietlibc/librpc/auth_none.c | 128 - mdk-stage1/dietlibc/librpc/auth_unix.c | 313 -- mdk-stage1/dietlibc/librpc/authunix_prot.c | 69 - mdk-stage1/dietlibc/librpc/bindresvport.c | 79 - mdk-stage1/dietlibc/librpc/clnt_generic.c | 112 - mdk-stage1/dietlibc/librpc/clnt_perror.c | 302 -- mdk-stage1/dietlibc/librpc/clnt_raw.c | 230 - mdk-stage1/dietlibc/librpc/clnt_simple.c | 116 - mdk-stage1/dietlibc/librpc/clnt_tcp.c | 463 -- mdk-stage1/dietlibc/librpc/clnt_udp.c | 437 -- mdk-stage1/dietlibc/librpc/get_myaddress.c | 69 - mdk-stage1/dietlibc/librpc/getrpcent.c | 274 - mdk-stage1/dietlibc/librpc/getrpcport.c | 57 - mdk-stage1/dietlibc/librpc/pmap_clnt.c | 118 - mdk-stage1/dietlibc/librpc/pmap_getmaps.c | 85 - mdk-stage1/dietlibc/librpc/pmap_getport.c | 90 - mdk-stage1/dietlibc/librpc/pmap_prot.c | 58 - mdk-stage1/dietlibc/librpc/pmap_prot2.c | 116 - mdk-stage1/dietlibc/librpc/pmap_rmt.c | 403 -- mdk-stage1/dietlibc/librpc/rpc_callmsg.c | 189 - mdk-stage1/dietlibc/librpc/rpc_commondata.c | 42 - mdk-stage1/dietlibc/librpc/rpc_dtablesize.c | 50 - mdk-stage1/dietlibc/librpc/rpc_prot.c | 281 - mdk-stage1/dietlibc/librpc/svc.c | 479 -- mdk-stage1/dietlibc/librpc/svc_auth.c | 115 - mdk-stage1/dietlibc/librpc/svc_auth_unix.c | 136 - mdk-stage1/dietlibc/librpc/svc_raw.c | 159 - mdk-stage1/dietlibc/librpc/svc_run.c | 71 - mdk-stage1/dietlibc/librpc/svc_simple.c | 144 - mdk-stage1/dietlibc/librpc/svc_tcp.c | 406 -- mdk-stage1/dietlibc/librpc/svc_udp.c | 467 -- mdk-stage1/dietlibc/librpc/xdr.c | 536 -- mdk-stage1/dietlibc/librpc/xdr_array.c | 152 - mdk-stage1/dietlibc/librpc/xdr_float.c | 284 - mdk-stage1/dietlibc/librpc/xdr_mem.c | 180 - mdk-stage1/dietlibc/librpc/xdr_rec.c | 573 -- mdk-stage1/dietlibc/librpc/xdr_reference.c | 130 - mdk-stage1/dietlibc/librpc/xdr_stdio.c | 187 - mdk-stage1/dietlibc/libshell/fnmatch.c | 74 - mdk-stage1/dietlibc/libshell/glob.c | 350 -- mdk-stage1/dietlibc/libshell/realpath.c | 31 - mdk-stage1/dietlibc/libstdio/clearerr.c | 5 - mdk-stage1/dietlibc/libstdio/fclose.c | 24 - mdk-stage1/dietlibc/libstdio/fdglue.c | 49 - mdk-stage1/dietlibc/libstdio/fdopen.c | 21 - mdk-stage1/dietlibc/libstdio/feof.c | 9 - mdk-stage1/dietlibc/libstdio/ferror.c | 5 - mdk-stage1/dietlibc/libstdio/fflush.c | 62 - mdk-stage1/dietlibc/libstdio/fgetc.c | 40 - mdk-stage1/dietlibc/libstdio/fgets.c | 20 - mdk-stage1/dietlibc/libstdio/fileno.c | 5 - mdk-stage1/dietlibc/libstdio/fopen.c | 21 - mdk-stage1/dietlibc/libstdio/fprintf.c | 23 - mdk-stage1/dietlibc/libstdio/fputc.c | 19 - mdk-stage1/dietlibc/libstdio/fputs.c | 6 - mdk-stage1/dietlibc/libstdio/fread.c | 51 - mdk-stage1/dietlibc/libstdio/freopen.c | 9 - mdk-stage1/dietlibc/libstdio/fseek.c | 11 - mdk-stage1/dietlibc/libstdio/ftell.c | 7 - mdk-stage1/dietlibc/libstdio/fwrite.c | 30 - mdk-stage1/dietlibc/libstdio/printf.c | 29 - mdk-stage1/dietlibc/libstdio/putchar.c | 6 - mdk-stage1/dietlibc/libstdio/setvbuf.c | 18 - mdk-stage1/dietlibc/libstdio/stderr.c | 13 - mdk-stage1/dietlibc/libstdio/stdin.c | 13 - mdk-stage1/dietlibc/libstdio/stdout.c | 14 - mdk-stage1/dietlibc/libstdio/ungetc.c | 11 - mdk-stage1/dietlibc/libugly/asctime.c | 7 - mdk-stage1/dietlibc/libugly/asctime_r.c | 29 - mdk-stage1/dietlibc/libugly/asprintf.c | 22 - mdk-stage1/dietlibc/libugly/ctime.c | 5 - mdk-stage1/dietlibc/libugly/daemon.c | 35 - mdk-stage1/dietlibc/libugly/endmntent.c | 7 - mdk-stage1/dietlibc/libugly/facilitynames.c | 32 - mdk-stage1/dietlibc/libugly/getmntent.c | 30 - mdk-stage1/dietlibc/libugly/getprotoent.c | 130 - mdk-stage1/dietlibc/libugly/gmtime.c | 6 - mdk-stage1/dietlibc/libugly/gmtime_r.c | 35 - mdk-stage1/dietlibc/libugly/isleap.c | 6 - mdk-stage1/dietlibc/libugly/localtime.c | 6 - mdk-stage1/dietlibc/libugly/localtime_r.c | 21 - mdk-stage1/dietlibc/libugly/logging.c | 211 - mdk-stage1/dietlibc/libugly/mktime.c | 21 - mdk-stage1/dietlibc/libugly/pclose.c | 11 - mdk-stage1/dietlibc/libugly/popen.c | 32 - mdk-stage1/dietlibc/libugly/prioritynames.c | 22 - mdk-stage1/dietlibc/libugly/setenv.c | 17 - mdk-stage1/dietlibc/libugly/setmntent.c | 7 - mdk-stage1/dietlibc/libugly/strftime.c | 182 - mdk-stage1/dietlibc/libugly/strsignal.c | 92 - mdk-stage1/dietlibc/libugly/system.c | 69 - mdk-stage1/dietlibc/libugly/time_table_spd.c | 17 - mdk-stage1/dietlibc/libugly/tzfile.c | 86 - mdk-stage1/dietlibc/libugly/unsetenv.c | 6 - mdk-stage1/dietlibc/ppc/Makefile.add | 3 - mdk-stage1/dietlibc/ppc/__longjmp.S | 59 - mdk-stage1/dietlibc/ppc/__testandset.S | 11 - mdk-stage1/dietlibc/ppc/mmap.c | 37 - mdk-stage1/dietlibc/ppc/setjmp.S | 56 - mdk-stage1/dietlibc/ppc/start.S | 44 - mdk-stage1/dietlibc/ppc/unified.S | 21 - mdk-stage1/dietlibc/sparc/Makefile.add | 3 - mdk-stage1/dietlibc/sparc/__longjmp.S | 67 - mdk-stage1/dietlibc/sparc/__testandset.S | 6 - mdk-stage1/dietlibc/sparc/clone.S | 45 - mdk-stage1/dietlibc/sparc/fork.S | 25 - mdk-stage1/dietlibc/sparc/mmap.c | 43 - mdk-stage1/dietlibc/sparc/pipe.S | 26 - mdk-stage1/dietlibc/sparc/setjmp.S | 37 - mdk-stage1/dietlibc/sparc/shmat.c | 19 - mdk-stage1/dietlibc/sparc/start.S | 46 - mdk-stage1/dietlibc/sparc/udiv.S | 363 -- mdk-stage1/dietlibc/sparc/umul.S | 170 - mdk-stage1/dietlibc/sparc/unified.S | 28 - mdk-stage1/dietlibc/sparc/urem.S | 362 -- mdk-stage1/dietlibc/start.h | 14 - mdk-stage1/dietlibc/syscalls.c/_llseek.c | 5 - mdk-stage1/dietlibc/syscalls.c/_newselect.c | 6 - mdk-stage1/dietlibc/syscalls.c/access.c | 4 - mdk-stage1/dietlibc/syscalls.c/chdir.c | 3 - mdk-stage1/dietlibc/syscalls.c/chmod.c | 5 - mdk-stage1/dietlibc/syscalls.c/chown.c | 5 - mdk-stage1/dietlibc/syscalls.c/chroot.c | 4 - mdk-stage1/dietlibc/syscalls.c/clone.c | 1 - mdk-stage1/dietlibc/syscalls.c/close.c | 3 - mdk-stage1/dietlibc/syscalls.c/dup.c | 4 - mdk-stage1/dietlibc/syscalls.c/dup2.c | 4 - mdk-stage1/dietlibc/syscalls.c/execve.c | 4 - mdk-stage1/dietlibc/syscalls.c/exit.c | 3 - mdk-stage1/dietlibc/syscalls.c/fchdir.c | 3 - mdk-stage1/dietlibc/syscalls.c/fchmod.c | 5 - mdk-stage1/dietlibc/syscalls.c/fchown.c | 5 - mdk-stage1/dietlibc/syscalls.c/fcntl.c | 4 - mdk-stage1/dietlibc/syscalls.c/flock.c | 4 - mdk-stage1/dietlibc/syscalls.c/fork.c | 6 - mdk-stage1/dietlibc/syscalls.c/fsync.c | 4 - mdk-stage1/dietlibc/syscalls.c/ftruncate.c | 4 - mdk-stage1/dietlibc/syscalls.c/getcwd.c | 5 - mdk-stage1/dietlibc/syscalls.c/getdents.c | 4 - mdk-stage1/dietlibc/syscalls.c/getegid.c | 4 - mdk-stage1/dietlibc/syscalls.c/geteuid.c | 4 - mdk-stage1/dietlibc/syscalls.c/getgid.c | 4 - mdk-stage1/dietlibc/syscalls.c/getgroups.c | 4 - mdk-stage1/dietlibc/syscalls.c/getpgid.c | 4 - mdk-stage1/dietlibc/syscalls.c/getpid.c | 3 - mdk-stage1/dietlibc/syscalls.c/getppid.c | 3 - mdk-stage1/dietlibc/syscalls.c/getpriority.c | 4 - mdk-stage1/dietlibc/syscalls.c/getresgid.c | 8 - mdk-stage1/dietlibc/syscalls.c/getresuid.c | 8 - mdk-stage1/dietlibc/syscalls.c/getrlimit.c | 3 - mdk-stage1/dietlibc/syscalls.c/getrusage.c | 3 - mdk-stage1/dietlibc/syscalls.c/getsid.c | 4 - mdk-stage1/dietlibc/syscalls.c/gettimeofday.c | 5 - mdk-stage1/dietlibc/syscalls.c/getuid.c | 4 - mdk-stage1/dietlibc/syscalls.c/ioctl.c | 4 - mdk-stage1/dietlibc/syscalls.c/kill.c | 4 - mdk-stage1/dietlibc/syscalls.c/lchown.c | 5 - mdk-stage1/dietlibc/syscalls.c/link.c | 5 - mdk-stage1/dietlibc/syscalls.c/lseek.c | 4 - mdk-stage1/dietlibc/syscalls.c/mkdir.c | 4 - mdk-stage1/dietlibc/syscalls.c/mknod.c | 5 - mdk-stage1/dietlibc/syscalls.c/mount.c | 4 - mdk-stage1/dietlibc/syscalls.c/mprotect.c | 4 - mdk-stage1/dietlibc/syscalls.c/mremap.c | 5 - mdk-stage1/dietlibc/syscalls.c/munmap.c | 5 - mdk-stage1/dietlibc/syscalls.c/nanosleep.c | 5 - mdk-stage1/dietlibc/syscalls.c/open.c | 4 - mdk-stage1/dietlibc/syscalls.c/pipe.c | 4 - mdk-stage1/dietlibc/syscalls.c/poll.c | 4 - mdk-stage1/dietlibc/syscalls.c/read.c | 3 - mdk-stage1/dietlibc/syscalls.c/readlink.c | 5 - mdk-stage1/dietlibc/syscalls.c/reboot.c | 4 - mdk-stage1/dietlibc/syscalls.c/rename.c | 4 - mdk-stage1/dietlibc/syscalls.c/rmdir.c | 3 - mdk-stage1/dietlibc/syscalls.c/setdomainname.c | 4 - mdk-stage1/dietlibc/syscalls.c/setgid.c | 3 - mdk-stage1/dietlibc/syscalls.c/setgroups.c | 4 - mdk-stage1/dietlibc/syscalls.c/sethostname.c | 4 - mdk-stage1/dietlibc/syscalls.c/setitimer.c | 4 - mdk-stage1/dietlibc/syscalls.c/setpgid.c | 3 - mdk-stage1/dietlibc/syscalls.c/setpriority.c | 4 - mdk-stage1/dietlibc/syscalls.c/setregid.c | 4 - mdk-stage1/dietlibc/syscalls.c/setresgid.c | 8 - mdk-stage1/dietlibc/syscalls.c/setresuid.c | 8 - mdk-stage1/dietlibc/syscalls.c/setreuid.c | 4 - mdk-stage1/dietlibc/syscalls.c/setrlimit.c | 3 - mdk-stage1/dietlibc/syscalls.c/setsid.c | 4 - mdk-stage1/dietlibc/syscalls.c/setuid.c | 3 - mdk-stage1/dietlibc/syscalls.c/sigaction.c | 3 - mdk-stage1/dietlibc/syscalls.c/signal.c | 3 - mdk-stage1/dietlibc/syscalls.c/sigpending.c | 3 - mdk-stage1/dietlibc/syscalls.c/sigprocmask.c | 3 - mdk-stage1/dietlibc/syscalls.c/sigsuspend.c | 3 - mdk-stage1/dietlibc/syscalls.c/socketcall.c | 3 - mdk-stage1/dietlibc/syscalls.c/swapoff.c | 4 - mdk-stage1/dietlibc/syscalls.c/swapon.c | 4 - mdk-stage1/dietlibc/syscalls.c/symlink.c | 3 - mdk-stage1/dietlibc/syscalls.c/sync.c | 3 - mdk-stage1/dietlibc/syscalls.c/syslog.c | 3 - mdk-stage1/dietlibc/syscalls.c/time.c | 4 - mdk-stage1/dietlibc/syscalls.c/truncate.c | 4 - mdk-stage1/dietlibc/syscalls.c/umask.c | 5 - mdk-stage1/dietlibc/syscalls.c/umount.c | 3 - mdk-stage1/dietlibc/syscalls.c/uname.c | 5 - mdk-stage1/dietlibc/syscalls.c/unlink.c | 3 - mdk-stage1/dietlibc/syscalls.c/utime.c | 3 - mdk-stage1/dietlibc/syscalls.c/vhangup.c | 3 - mdk-stage1/dietlibc/syscalls.c/wait4.c | 4 - mdk-stage1/dietlibc/syscalls.c/waitpid.c | 4 - mdk-stage1/dietlibc/syscalls.c/write.c | 3 - mdk-stage1/dietlibc/syscalls.h | 142 - mdk-stage1/dietlibc/syscalls.s/__getpagesize.S | 5 - mdk-stage1/dietlibc/syscalls.s/__pread.S | 3 - mdk-stage1/dietlibc/syscalls.s/__reboot.S | 3 - mdk-stage1/dietlibc/syscalls.s/_llseek.S | 3 - mdk-stage1/dietlibc/syscalls.s/access.S | 3 - mdk-stage1/dietlibc/syscalls.s/brk.S | 3 - mdk-stage1/dietlibc/syscalls.s/chdir.S | 3 - mdk-stage1/dietlibc/syscalls.s/chmod.S | 3 - mdk-stage1/dietlibc/syscalls.s/chown.S | 3 - mdk-stage1/dietlibc/syscalls.s/chroot.S | 3 - mdk-stage1/dietlibc/syscalls.s/close.S | 3 - mdk-stage1/dietlibc/syscalls.s/dup.S | 3 - mdk-stage1/dietlibc/syscalls.s/dup2.S | 3 - mdk-stage1/dietlibc/syscalls.s/execve.S | 3 - mdk-stage1/dietlibc/syscalls.s/exit.S | 3 - mdk-stage1/dietlibc/syscalls.s/fchdir.S | 3 - mdk-stage1/dietlibc/syscalls.s/fchmod.S | 3 - mdk-stage1/dietlibc/syscalls.s/fchown.S | 3 - mdk-stage1/dietlibc/syscalls.s/fcntl.S | 3 - mdk-stage1/dietlibc/syscalls.s/flock.S | 3 - mdk-stage1/dietlibc/syscalls.s/fork.S | 3 - mdk-stage1/dietlibc/syscalls.s/fstat.S | 3 - mdk-stage1/dietlibc/syscalls.s/fstat64.S | 8 - mdk-stage1/dietlibc/syscalls.s/fstatfs.S | 3 - mdk-stage1/dietlibc/syscalls.s/fsync.S | 3 - mdk-stage1/dietlibc/syscalls.s/ftruncate.S | 3 - mdk-stage1/dietlibc/syscalls.s/getcwd.S | 3 - mdk-stage1/dietlibc/syscalls.s/getdents.S | 3 - mdk-stage1/dietlibc/syscalls.s/getdents64.S | 5 - mdk-stage1/dietlibc/syscalls.s/getegid.S | 3 - mdk-stage1/dietlibc/syscalls.s/geteuid.S | 3 - mdk-stage1/dietlibc/syscalls.s/getgid.S | 3 - mdk-stage1/dietlibc/syscalls.s/getgroups.S | 3 - mdk-stage1/dietlibc/syscalls.s/getitimer.S | 3 - mdk-stage1/dietlibc/syscalls.s/getpgid.S | 3 - mdk-stage1/dietlibc/syscalls.s/getpid.S | 3 - mdk-stage1/dietlibc/syscalls.s/getppid.S | 3 - mdk-stage1/dietlibc/syscalls.s/getpriority.S | 3 - mdk-stage1/dietlibc/syscalls.s/getresgid.S | 7 - mdk-stage1/dietlibc/syscalls.s/getresuid.S | 7 - mdk-stage1/dietlibc/syscalls.s/getrlimit.S | 3 - mdk-stage1/dietlibc/syscalls.s/getrusage.S | 3 - mdk-stage1/dietlibc/syscalls.s/getsid.S | 3 - mdk-stage1/dietlibc/syscalls.s/gettimeofday.S | 3 - mdk-stage1/dietlibc/syscalls.s/getuid.S | 3 - mdk-stage1/dietlibc/syscalls.s/ioctl.S | 3 - mdk-stage1/dietlibc/syscalls.s/ioperm.S | 3 - mdk-stage1/dietlibc/syscalls.s/iopl.S | 6 - mdk-stage1/dietlibc/syscalls.s/ipc.S | 3 - mdk-stage1/dietlibc/syscalls.s/kill.S | 3 - mdk-stage1/dietlibc/syscalls.s/lchown.S | 3 - mdk-stage1/dietlibc/syscalls.s/link.S | 3 - mdk-stage1/dietlibc/syscalls.s/llseek.S | 6 - mdk-stage1/dietlibc/syscalls.s/lseek.S | 3 - mdk-stage1/dietlibc/syscalls.s/lstat.S | 3 - mdk-stage1/dietlibc/syscalls.s/lstat64.S | 8 - mdk-stage1/dietlibc/syscalls.s/mkdir.S | 3 - mdk-stage1/dietlibc/syscalls.s/mknod.S | 3 - mdk-stage1/dietlibc/syscalls.s/mlockall.S | 3 - mdk-stage1/dietlibc/syscalls.s/mount.S | 3 - mdk-stage1/dietlibc/syscalls.s/mprotect.S | 3 - mdk-stage1/dietlibc/syscalls.s/mremap.S | 3 - mdk-stage1/dietlibc/syscalls.s/munlockall.S | 3 - mdk-stage1/dietlibc/syscalls.s/munmap.S | 3 - mdk-stage1/dietlibc/syscalls.s/nanosleep.S | 3 - mdk-stage1/dietlibc/syscalls.s/nice.S | 3 - mdk-stage1/dietlibc/syscalls.s/open.S | 3 - mdk-stage1/dietlibc/syscalls.s/pause.S | 3 - mdk-stage1/dietlibc/syscalls.s/personality.S | 5 - mdk-stage1/dietlibc/syscalls.s/pipe.S | 3 - mdk-stage1/dietlibc/syscalls.s/poll.S | 3 - mdk-stage1/dietlibc/syscalls.s/ptrace.s | 3 - mdk-stage1/dietlibc/syscalls.s/pwrite.S | 3 - mdk-stage1/dietlibc/syscalls.s/query_module.S | 5 - mdk-stage1/dietlibc/syscalls.s/read.S | 3 - mdk-stage1/dietlibc/syscalls.s/readlink.S | 3 - mdk-stage1/dietlibc/syscalls.s/readv.S | 3 - mdk-stage1/dietlibc/syscalls.s/rename.S | 3 - mdk-stage1/dietlibc/syscalls.s/rmdir.S | 3 - .../dietlibc/syscalls.s/sched_get_priority_max.S | 3 - .../dietlibc/syscalls.s/sched_get_priority_min.S | 3 - mdk-stage1/dietlibc/syscalls.s/sched_getparam.S | 3 - .../dietlibc/syscalls.s/sched_getscheduler.S | 3 - .../dietlibc/syscalls.s/sched_rr_get_interval.S | 3 - mdk-stage1/dietlibc/syscalls.s/sched_setparam.S | 3 - .../dietlibc/syscalls.s/sched_setscheduler.S | 3 - mdk-stage1/dietlibc/syscalls.s/sched_yield.S | 3 - mdk-stage1/dietlibc/syscalls.s/select.S | 3 - mdk-stage1/dietlibc/syscalls.s/sendfile.S | 6 - mdk-stage1/dietlibc/syscalls.s/setdomainname.S | 3 - mdk-stage1/dietlibc/syscalls.s/setgid.S | 3 - mdk-stage1/dietlibc/syscalls.s/setgroups.S | 3 - mdk-stage1/dietlibc/syscalls.s/sethostname.S | 3 - mdk-stage1/dietlibc/syscalls.s/setitimer.S | 3 - mdk-stage1/dietlibc/syscalls.s/setpgid.S | 3 - mdk-stage1/dietlibc/syscalls.s/setpriority.S | 3 - mdk-stage1/dietlibc/syscalls.s/setregid.S | 3 - mdk-stage1/dietlibc/syscalls.s/setresgid.S | 7 - mdk-stage1/dietlibc/syscalls.s/setresuid.S | 7 - mdk-stage1/dietlibc/syscalls.s/setreuid.S | 3 - mdk-stage1/dietlibc/syscalls.s/setrlimit.S | 3 - mdk-stage1/dietlibc/syscalls.s/setsid.S | 3 - mdk-stage1/dietlibc/syscalls.s/setuid.S | 3 - mdk-stage1/dietlibc/syscalls.s/sigaction.S | 3 - mdk-stage1/dietlibc/syscalls.s/sigaltstack.S | 3 - mdk-stage1/dietlibc/syscalls.s/signal.S | 3 - mdk-stage1/dietlibc/syscalls.s/sigpending.S | 3 - mdk-stage1/dietlibc/syscalls.s/sigprocmask.S | 3 - mdk-stage1/dietlibc/syscalls.s/sigsuspend.S | 3 - mdk-stage1/dietlibc/syscalls.s/socketcall.S | 3 - mdk-stage1/dietlibc/syscalls.s/stat.S | 3 - mdk-stage1/dietlibc/syscalls.s/stat64.S | 8 - mdk-stage1/dietlibc/syscalls.s/statfs.S | 3 - mdk-stage1/dietlibc/syscalls.s/stime.S | 3 - mdk-stage1/dietlibc/syscalls.s/swapoff.S | 3 - mdk-stage1/dietlibc/syscalls.s/swapon.S | 3 - mdk-stage1/dietlibc/syscalls.s/symlink.S | 3 - mdk-stage1/dietlibc/syscalls.s/sync.S | 3 - mdk-stage1/dietlibc/syscalls.s/sysctl.S | 5 - mdk-stage1/dietlibc/syscalls.s/sysinfo.S | 3 - mdk-stage1/dietlibc/syscalls.s/syslog.S | 3 - mdk-stage1/dietlibc/syscalls.s/time.S | 3 - mdk-stage1/dietlibc/syscalls.s/times.S | 3 - mdk-stage1/dietlibc/syscalls.s/truncate.S | 3 - mdk-stage1/dietlibc/syscalls.s/umask.S | 3 - mdk-stage1/dietlibc/syscalls.s/umount.S | 3 - mdk-stage1/dietlibc/syscalls.s/umount2.S | 3 - mdk-stage1/dietlibc/syscalls.s/uname.S | 3 - mdk-stage1/dietlibc/syscalls.s/unlink.S | 3 - mdk-stage1/dietlibc/syscalls.s/utime.S | 3 - mdk-stage1/dietlibc/syscalls.s/vhangup.S | 3 - mdk-stage1/dietlibc/syscalls.s/wait4.S | 3 - mdk-stage1/dietlibc/syscalls.s/waitpid.S | 3 - mdk-stage1/dietlibc/syscalls.s/write.S | 3 - mdk-stage1/dietlibc/syscalls.s/writev.S | 3 - mdk-stage1/disk.c | 243 - mdk-stage1/disk.h | 27 - mdk-stage1/dns.c | 213 - mdk-stage1/dns.h | 30 - mdk-stage1/doc/HACKING | 31 - mdk-stage1/doc/README | 185 - mdk-stage1/doc/TECH-INFOS | 45 - mdk-stage1/doc/WHY-DIETLIBC | 50 - mdk-stage1/doc/documented..frontend.h | 69 - mdk-stage1/frontend-common.c | 43 - mdk-stage1/frontend.h | 50 - mdk-stage1/init-data/emptyboot.img.bz2 | Bin 6342 -> 0 bytes .../init-data/msgboot-graphicallogo-2880.img.bz2 | Bin 30301 -> 0 bytes mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 | Bin 28868 -> 0 bytes mdk-stage1/init-data/msgboot.img.bz2 | Bin 30378 -> 0 bytes mdk-stage1/init-libc-headers.h | 44 - mdk-stage1/init.c | 464 -- mdk-stage1/insmod-busybox/.cvsignore | 2 - mdk-stage1/insmod-busybox/Config.h | 132 - mdk-stage1/insmod-busybox/Makefile | 65 - mdk-stage1/insmod-busybox/README | 8 - mdk-stage1/insmod-busybox/busybox.h | 467 -- mdk-stage1/insmod-busybox/insmod-frontend.c | 24 - mdk-stage1/insmod-busybox/insmod.c | 2951 ----------- mdk-stage1/insmod-busybox/loop.h | 5 - mdk-stage1/insmod-busybox/messages.c | 90 - mdk-stage1/insmod-busybox/utility.c | 1759 ------- mdk-stage1/insmod-modutils/Makefile | 63 - mdk-stage1/insmod-modutils/include/config.h | 105 - mdk-stage1/insmod-modutils/include/elf_alpha.h | 10 - mdk-stage1/insmod-modutils/include/elf_arm.h | 10 - mdk-stage1/insmod-modutils/include/elf_hppa.h | 9 - mdk-stage1/insmod-modutils/include/elf_hppa64.h | 9 - mdk-stage1/insmod-modutils/include/elf_i386.h | 10 - mdk-stage1/insmod-modutils/include/elf_ia64.h | 9 - mdk-stage1/insmod-modutils/include/elf_m68k.h | 10 - mdk-stage1/insmod-modutils/include/elf_mips.h | 24 - mdk-stage1/insmod-modutils/include/elf_ppc.h | 10 - mdk-stage1/insmod-modutils/include/elf_s390.h | 10 - mdk-stage1/insmod-modutils/include/elf_sparc.h | 10 - mdk-stage1/insmod-modutils/include/elf_sparc64.h | 27 - mdk-stage1/insmod-modutils/include/kallsyms.h | 131 - mdk-stage1/insmod-modutils/include/kerneld.h | 46 - mdk-stage1/insmod-modutils/include/modstat.h | 55 - mdk-stage1/insmod-modutils/include/module.h | 210 - mdk-stage1/insmod-modutils/include/obj.h | 275 - mdk-stage1/insmod-modutils/include/util.h | 101 - mdk-stage1/insmod-modutils/include/version.h | 1 - mdk-stage1/insmod-modutils/insmod-frontend.c | 24 - mdk-stage1/insmod-modutils/insmod.c | 1964 ------- mdk-stage1/insmod-modutils/obj/Makefile | 33 - mdk-stage1/insmod-modutils/obj/obj_alpha.c | 305 -- mdk-stage1/insmod-modutils/obj/obj_arm.c | 318 -- mdk-stage1/insmod-modutils/obj/obj_common.c | 399 -- mdk-stage1/insmod-modutils/obj/obj_hppa.c | 668 --- mdk-stage1/insmod-modutils/obj/obj_hppa64.c | 686 --- mdk-stage1/insmod-modutils/obj/obj_i386.c | 245 - mdk-stage1/insmod-modutils/obj/obj_ia64.c | 1065 ---- mdk-stage1/insmod-modutils/obj/obj_kallsyms.c | 292 -- mdk-stage1/insmod-modutils/obj/obj_load.c | 354 -- mdk-stage1/insmod-modutils/obj/obj_m68k.c | 147 - mdk-stage1/insmod-modutils/obj/obj_mips.c | 238 - mdk-stage1/insmod-modutils/obj/obj_ppc.c | 255 - mdk-stage1/insmod-modutils/obj/obj_reloc.c | 435 -- mdk-stage1/insmod-modutils/obj/obj_s390.c | 245 - mdk-stage1/insmod-modutils/obj/obj_sparc.c | 226 - mdk-stage1/insmod-modutils/obj/obj_sparc64.c | 352 -- mdk-stage1/insmod-modutils/util/Makefile | 42 - mdk-stage1/insmod-modutils/util/alias.h | 244 - mdk-stage1/insmod-modutils/util/arch64.c | 35 - mdk-stage1/insmod-modutils/util/config.c | 1591 ------ mdk-stage1/insmod-modutils/util/gzfiles.c | 74 - mdk-stage1/insmod-modutils/util/logger.c | 163 - mdk-stage1/insmod-modutils/util/meta_expand.c | 339 -- mdk-stage1/insmod-modutils/util/modstat.c | 419 -- mdk-stage1/insmod-modutils/util/snap_shot.c | 154 - mdk-stage1/insmod-modutils/util/sys_cm.c | 88 - mdk-stage1/insmod-modutils/util/sys_dm.c | 37 - mdk-stage1/insmod-modutils/util/sys_gks.c | 37 - mdk-stage1/insmod-modutils/util/sys_nim.c | 53 - mdk-stage1/insmod-modutils/util/sys_oim.c | 40 - mdk-stage1/insmod-modutils/util/sys_qm.c | 56 - mdk-stage1/insmod-modutils/util/xftw.c | 422 -- mdk-stage1/insmod-modutils/util/xmalloc.c | 39 - mdk-stage1/insmod-modutils/util/xrealloc.c | 39 - mdk-stage1/insmod-modutils/util/xstrcat.c | 40 - mdk-stage1/insmod-modutils/util/xstrdup.c | 41 - mdk-stage1/insmod-modutils/util/xsystem.c | 51 - mdk-stage1/insmod.h | 20 - mdk-stage1/linux-2.2/nfs.h | 226 - mdk-stage1/linux-2.2/nfs_mount.h | 53 - mdk-stage1/log.c | 85 - mdk-stage1/log.h | 34 - mdk-stage1/lomount.c | 171 - mdk-stage1/lomount.h | 21 - mdk-stage1/mar/.cvsignore | 1 - mdk-stage1/mar/Makefile | 61 - mdk-stage1/mar/mar-extract-only.c | 207 - mdk-stage1/mar/mar-extract-only.h | 32 - mdk-stage1/mar/mar-frontend.c | 199 - mdk-stage1/mar/mar.h | 70 - mdk-stage1/minilibc.c | 251 - mdk-stage1/minilibc.h | 144 - mdk-stage1/mkinitrd_helper/Makefile | 46 - mdk-stage1/mkinitrd_helper/mkinitrd_helper.c | 308 -- mdk-stage1/modules.c | 377 -- mdk-stage1/modules.h | 34 - mdk-stage1/modules_descr.h | 50 - mdk-stage1/mount.c | 179 - mdk-stage1/mount.h | 31 - mdk-stage1/mount_rpcgen.h | 208 - mdk-stage1/network.c | 823 --- mdk-stage1/network.h | 60 - mdk-stage1/newt-frontend.c | 390 -- mdk-stage1/newt/Makefile | 56 - mdk-stage1/newt/button.c | 190 - mdk-stage1/newt/buttonbar.c | 46 - mdk-stage1/newt/checkbox.c | 290 - mdk-stage1/newt/checkboxtree.c | 714 --- mdk-stage1/newt/entry.c | 376 -- mdk-stage1/newt/form.c | 712 --- mdk-stage1/newt/grid.c | 389 -- mdk-stage1/newt/label.c | 81 - mdk-stage1/newt/listbox.c | 752 --- mdk-stage1/newt/newt.c | 672 --- mdk-stage1/newt/newt.h | 362 -- mdk-stage1/newt/newt_pr.h | 82 - mdk-stage1/newt/scale.c | 72 - mdk-stage1/newt/scrollbar.c | 124 - mdk-stage1/newt/textbox.c | 409 -- mdk-stage1/newt/windows.c | 275 - mdk-stage1/nfsmount.c | 294 -- mdk-stage1/nfsmount.h | 328 -- mdk-stage1/pci-resource/.cvsignore | 1 - mdk-stage1/pci-resource/Makefile | 25 - mdk-stage1/pci-resource/update-pci-ids.pl | 65 - mdk-stage1/pcmcia/Makefile | 48 - mdk-stage1/pcmcia/bulkmem.h | 195 - mdk-stage1/pcmcia/cardmgr.c | 805 --- mdk-stage1/pcmcia/cardmgr.h | 107 - mdk-stage1/pcmcia/cirrus.h | 182 - mdk-stage1/pcmcia/cistpl.h | 604 --- mdk-stage1/pcmcia/config.h | 59 - mdk-stage1/pcmcia/cs.h | 464 -- mdk-stage1/pcmcia/cs_types.h | 65 - mdk-stage1/pcmcia/driver_ops.h | 82 - mdk-stage1/pcmcia/ds.h | 163 - mdk-stage1/pcmcia/i82365.h | 154 - mdk-stage1/pcmcia/lex_config.c | 2008 ------- mdk-stage1/pcmcia/pcmcia.h | 21 - mdk-stage1/pcmcia/pcmcia_probe.c | 401 -- mdk-stage1/pcmcia/tcic.h | 266 - mdk-stage1/pcmcia/version.h | 4 - mdk-stage1/pcmcia/vg468.h | 112 - mdk-stage1/pcmcia/yacc_config.c | 1017 ---- mdk-stage1/pcmcia/yacc_config.h | 37 - mdk-stage1/probing.c | 498 -- mdk-stage1/probing.h | 36 - mdk-stage1/slang/Makefile | 56 - mdk-stage1/slang/_slang.h | 743 --- mdk-stage1/slang/config.h | 163 - mdk-stage1/slang/jdmacros.h | 53 - mdk-stage1/slang/keywhash.c | 190 - mdk-stage1/slang/sl-feat.h | 60 - mdk-stage1/slang/slang.c | 5547 -------------------- mdk-stage1/slang/slang.h | 1930 ------- mdk-stage1/slang/slarith.c | 1656 ------ mdk-stage1/slang/slarith.inc | 783 --- mdk-stage1/slang/slarray.c | 3139 ----------- mdk-stage1/slang/slarrfun.c | 464 -- mdk-stage1/slang/slarrfun.inc | 257 - mdk-stage1/slang/slarrmis.c | 38 - mdk-stage1/slang/slassoc.c | 713 --- mdk-stage1/slang/slbstr.c | 615 --- mdk-stage1/slang/slclass.c | 1391 ----- mdk-stage1/slang/slcmd.c | 351 -- mdk-stage1/slang/slcmplex.c | 1142 ---- mdk-stage1/slang/slcompat.c | 34 - mdk-stage1/slang/slcurses.c | 972 ---- mdk-stage1/slang/slcurses.h | 353 -- mdk-stage1/slang/sldisply.c | 2596 --------- mdk-stage1/slang/slerr.c | 181 - mdk-stage1/slang/slerrno.c | 219 - mdk-stage1/slang/slgetkey.c | 306 -- mdk-stage1/slang/slimport.c | 281 - mdk-stage1/slang/slinclud.h | 26 - mdk-stage1/slang/slintall.c | 27 - mdk-stage1/slang/slistruc.c | 218 - mdk-stage1/slang/slkeymap.c | 596 --- mdk-stage1/slang/slkeypad.c | 163 - mdk-stage1/slang/sllimits.h | 64 - mdk-stage1/slang/slmalloc.c | 165 - mdk-stage1/slang/slmath.c | 565 -- mdk-stage1/slang/slmemchr.c | 47 - mdk-stage1/slang/slmemcmp.c | 76 - mdk-stage1/slang/slmemcpy.c | 49 - mdk-stage1/slang/slmemset.c | 39 - mdk-stage1/slang/slmisc.c | 330 -- mdk-stage1/slang/slnspace.c | 242 - mdk-stage1/slang/slospath.c | 73 - mdk-stage1/slang/slpack.c | 785 --- mdk-stage1/slang/slparse.c | 1970 ------- mdk-stage1/slang/slpath.c | 344 -- mdk-stage1/slang/slposdir.c | 1057 ---- mdk-stage1/slang/slposio.c | 568 -- mdk-stage1/slang/slprepr.c | 427 -- mdk-stage1/slang/slproc.c | 155 - mdk-stage1/slang/slregexp.c | 935 ---- mdk-stage1/slang/slrline.c | 836 --- mdk-stage1/slang/slscanf.c | 718 --- mdk-stage1/slang/slscroll.c | 450 -- mdk-stage1/slang/slsearch.c | 239 - mdk-stage1/slang/slsignal.c | 336 -- mdk-stage1/slang/slsmg.c | 1584 ------ mdk-stage1/slang/slstd.c | 724 --- mdk-stage1/slang/slstdio.c | 1050 ---- mdk-stage1/slang/slstring.c | 546 -- mdk-stage1/slang/slstrops.c | 1686 ------ mdk-stage1/slang/slstruct.c | 932 ---- mdk-stage1/slang/sltermin.c | 1155 ---- mdk-stage1/slang/sltime.c | 310 -- mdk-stage1/slang/sltoken.c | 1702 ------ mdk-stage1/slang/sltypes.c | 966 ---- mdk-stage1/slang/slutty.c | 596 --- mdk-stage1/slang/slxstrng.c | 43 - mdk-stage1/stage1-data/stage1-with-busybox.tar.bz2 | Bin 92142 -> 0 bytes mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 | Bin 345030 -> 0 bytes mdk-stage1/stage1-data/stage1.tar.bz2 | Bin 1957 -> 0 bytes mdk-stage1/stage1.c | 432 -- mdk-stage1/stage1.h | 54 - mdk-stage1/stdio-frontend.c | 361 -- mdk-stage1/tools.c | 425 -- mdk-stage1/tools.h | 53 - mdk-stage1/url.c | 501 -- mdk-stage1/url.h | 44 - 1079 files changed, 123098 deletions(-) delete mode 100644 mdk-stage1/.cvsignore delete mode 100644 mdk-stage1/Makefile delete mode 100644 mdk-stage1/Makefile.common delete mode 100644 mdk-stage1/Makefile.mkinitrd_helper delete mode 100644 mdk-stage1/adsl.c delete mode 100644 mdk-stage1/adsl.h delete mode 100644 mdk-stage1/automatic.c delete mode 100644 mdk-stage1/automatic.h delete mode 100644 mdk-stage1/bzlib/Makefile delete mode 100644 mdk-stage1/bzlib/blocksort.c delete mode 100644 mdk-stage1/bzlib/bzlib.c delete mode 100644 mdk-stage1/bzlib/bzlib_private.h delete mode 100644 mdk-stage1/bzlib/compress.c delete mode 100644 mdk-stage1/bzlib/crctable.c delete mode 100644 mdk-stage1/bzlib/decompress.c delete mode 100644 mdk-stage1/bzlib/huffman.c delete mode 100644 mdk-stage1/bzlib/randtable.c delete mode 100644 mdk-stage1/cdrom.c delete mode 100644 mdk-stage1/cdrom.h delete mode 100644 mdk-stage1/config-stage1.h delete mode 100644 mdk-stage1/dhcp.c delete mode 100644 mdk-stage1/dhcp.h delete mode 100644 mdk-stage1/dietlibc/.cvsignore delete mode 100644 mdk-stage1/dietlibc/AUTHOR delete mode 100644 mdk-stage1/dietlibc/Makefile delete mode 100644 mdk-stage1/dietlibc/README delete mode 100644 mdk-stage1/dietlibc/alpha/Makefile.add delete mode 100644 mdk-stage1/dietlibc/alpha/__longjmp.S delete mode 100644 mdk-stage1/dietlibc/alpha/__time.c delete mode 100644 mdk-stage1/dietlibc/alpha/accept.S delete mode 100644 mdk-stage1/dietlibc/alpha/bind.S delete mode 100644 mdk-stage1/dietlibc/alpha/clone.S delete mode 100644 mdk-stage1/dietlibc/alpha/connect.S delete mode 100644 mdk-stage1/dietlibc/alpha/divl.S delete mode 100644 mdk-stage1/dietlibc/alpha/divq.S delete mode 100644 mdk-stage1/dietlibc/alpha/getegid.S delete mode 100644 mdk-stage1/dietlibc/alpha/geteuid.S delete mode 100644 mdk-stage1/dietlibc/alpha/getgid.S delete mode 100644 mdk-stage1/dietlibc/alpha/getpeername.S delete mode 100644 mdk-stage1/dietlibc/alpha/getpid.S delete mode 100644 mdk-stage1/dietlibc/alpha/getppid.S delete mode 100644 mdk-stage1/dietlibc/alpha/getsockname.S delete mode 100644 mdk-stage1/dietlibc/alpha/getsockopt.S delete mode 100644 mdk-stage1/dietlibc/alpha/getuid.S delete mode 100644 mdk-stage1/dietlibc/alpha/listen.S delete mode 100644 mdk-stage1/dietlibc/alpha/mmap.S delete mode 100644 mdk-stage1/dietlibc/alpha/msgctl.S delete mode 100644 mdk-stage1/dietlibc/alpha/msgget.S delete mode 100644 mdk-stage1/dietlibc/alpha/msgrcv.S delete mode 100644 mdk-stage1/dietlibc/alpha/msgsnd.S delete mode 100644 mdk-stage1/dietlibc/alpha/pipe.S delete mode 100644 mdk-stage1/dietlibc/alpha/recv.S delete mode 100644 mdk-stage1/dietlibc/alpha/recvfrom.S delete mode 100644 mdk-stage1/dietlibc/alpha/recvmsg.S delete mode 100644 mdk-stage1/dietlibc/alpha/reml.S delete mode 100644 mdk-stage1/dietlibc/alpha/remq.S delete mode 100644 mdk-stage1/dietlibc/alpha/semctl.S delete mode 100644 mdk-stage1/dietlibc/alpha/semget.S delete mode 100644 mdk-stage1/dietlibc/alpha/semop.S delete mode 100644 mdk-stage1/dietlibc/alpha/send.S delete mode 100644 mdk-stage1/dietlibc/alpha/sendmsg.S delete mode 100644 mdk-stage1/dietlibc/alpha/sendto.S delete mode 100644 mdk-stage1/dietlibc/alpha/seteuid.c delete mode 100644 mdk-stage1/dietlibc/alpha/setjmp.S delete mode 100644 mdk-stage1/dietlibc/alpha/setsockopt.S delete mode 100644 mdk-stage1/dietlibc/alpha/shmat.S delete mode 100644 mdk-stage1/dietlibc/alpha/shmctl.S delete mode 100644 mdk-stage1/dietlibc/alpha/shmdt.S delete mode 100644 mdk-stage1/dietlibc/alpha/shmget.S delete mode 100644 mdk-stage1/dietlibc/alpha/shutdown.S delete mode 100644 mdk-stage1/dietlibc/alpha/signal.S delete mode 100644 mdk-stage1/dietlibc/alpha/sigprocmask.S delete mode 100644 mdk-stage1/dietlibc/alpha/socket.S delete mode 100644 mdk-stage1/dietlibc/alpha/socketcall.S delete mode 100644 mdk-stage1/dietlibc/alpha/start.S delete mode 100644 mdk-stage1/dietlibc/alpha/strlen.c delete mode 100644 mdk-stage1/dietlibc/alpha/time.S delete mode 100644 mdk-stage1/dietlibc/alpha/unified.S delete mode 100644 mdk-stage1/dietlibc/alpha/utime.S delete mode 100644 mdk-stage1/dietlibc/alpha/waitpid.S delete mode 100644 mdk-stage1/dietlibc/diet.c delete mode 100644 mdk-stage1/dietlibc/dietdirent.h delete mode 100644 mdk-stage1/dietlibc/dietfeatures.h delete mode 100644 mdk-stage1/dietlibc/dietstdarg.h delete mode 100644 mdk-stage1/dietlibc/dietstdio.h delete mode 100644 mdk-stage1/dietlibc/dietwarning.h delete mode 100644 mdk-stage1/dietlibc/dirstream.h delete mode 100644 mdk-stage1/dietlibc/i386/Makefile.add delete mode 100644 mdk-stage1/dietlibc/i386/__longjmp.S delete mode 100644 mdk-stage1/dietlibc/i386/__testandset.S delete mode 100644 mdk-stage1/dietlibc/i386/clone.S delete mode 100644 mdk-stage1/dietlibc/i386/mmap.c delete mode 100644 mdk-stage1/dietlibc/i386/select.S delete mode 100644 mdk-stage1/dietlibc/i386/setjmp.S delete mode 100644 mdk-stage1/dietlibc/i386/start.S delete mode 100644 mdk-stage1/dietlibc/i386/unified.S delete mode 100644 mdk-stage1/dietlibc/include/alloca.h delete mode 100644 mdk-stage1/dietlibc/include/arpa/inet.h delete mode 100644 mdk-stage1/dietlibc/include/arpa/nameser.h delete mode 100644 mdk-stage1/dietlibc/include/assert.h delete mode 100644 mdk-stage1/dietlibc/include/ctype.h delete mode 100644 mdk-stage1/dietlibc/include/daemon.h delete mode 100644 mdk-stage1/dietlibc/include/dirent.h delete mode 100644 mdk-stage1/dietlibc/include/dlfcn.h delete mode 100644 mdk-stage1/dietlibc/include/elf.h delete mode 100644 mdk-stage1/dietlibc/include/endian.h delete mode 100644 mdk-stage1/dietlibc/include/errno.h delete mode 100644 mdk-stage1/dietlibc/include/fcntl.h delete mode 100644 mdk-stage1/dietlibc/include/features.h delete mode 100644 mdk-stage1/dietlibc/include/fnmatch.h delete mode 100644 mdk-stage1/dietlibc/include/ftw.h delete mode 100644 mdk-stage1/dietlibc/include/getopt.h delete mode 100644 mdk-stage1/dietlibc/include/glob.h delete mode 100644 mdk-stage1/dietlibc/include/grp.h delete mode 100644 mdk-stage1/dietlibc/include/inttypes.h delete mode 100644 mdk-stage1/dietlibc/include/limits.h delete mode 100644 mdk-stage1/dietlibc/include/locale.h delete mode 100644 mdk-stage1/dietlibc/include/malloc.h delete mode 100644 mdk-stage1/dietlibc/include/math.h delete mode 100644 mdk-stage1/dietlibc/include/memory.h delete mode 100644 mdk-stage1/dietlibc/include/mntent.h delete mode 100644 mdk-stage1/dietlibc/include/net/if.h delete mode 100644 mdk-stage1/dietlibc/include/net/if_arp.h delete mode 100644 mdk-stage1/dietlibc/include/net/route.h delete mode 100644 mdk-stage1/dietlibc/include/netdb.h delete mode 100644 mdk-stage1/dietlibc/include/netinet/in.h delete mode 100644 mdk-stage1/dietlibc/include/netinet/in_systm.h delete mode 100644 mdk-stage1/dietlibc/include/netinet/ip.h delete mode 100644 mdk-stage1/dietlibc/include/paths.h delete mode 100644 mdk-stage1/dietlibc/include/pthread.h delete mode 100644 mdk-stage1/dietlibc/include/pwd.h delete mode 100644 mdk-stage1/dietlibc/include/regex.h delete mode 100644 mdk-stage1/dietlibc/include/resolv.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/auth.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/auth_des.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/auth_unix.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/clnt.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/des_crypt.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/key_prot.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/netdb.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/pmap_clnt.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/pmap_prot.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/pmap_rmt.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/rpc.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/rpc_des.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/rpc_msg.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/svc.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/svc_auth.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/types.h delete mode 100644 mdk-stage1/dietlibc/include/rpc/xdr.h delete mode 100644 mdk-stage1/dietlibc/include/sched.h delete mode 100644 mdk-stage1/dietlibc/include/scsi/scsi.h delete mode 100644 mdk-stage1/dietlibc/include/scsi/scsi_ioctl.h delete mode 100644 mdk-stage1/dietlibc/include/scsi/sg.h delete mode 100644 mdk-stage1/dietlibc/include/setjmp.h delete mode 100644 mdk-stage1/dietlibc/include/shadow.h delete mode 100644 mdk-stage1/dietlibc/include/signal.h delete mode 100644 mdk-stage1/dietlibc/include/stdint.h delete mode 100644 mdk-stage1/dietlibc/include/stdio.h delete mode 100644 mdk-stage1/dietlibc/include/stdlib.h delete mode 100644 mdk-stage1/dietlibc/include/string.h delete mode 100644 mdk-stage1/dietlibc/include/strings.h delete mode 100644 mdk-stage1/dietlibc/include/sys/cdefs.h delete mode 100644 mdk-stage1/dietlibc/include/sys/file.h delete mode 100644 mdk-stage1/dietlibc/include/sys/io.h delete mode 100644 mdk-stage1/dietlibc/include/sys/ioctl.h delete mode 100644 mdk-stage1/dietlibc/include/sys/ipc.h delete mode 100644 mdk-stage1/dietlibc/include/sys/kd.h delete mode 100644 mdk-stage1/dietlibc/include/sys/mman.h delete mode 100644 mdk-stage1/dietlibc/include/sys/mount.h delete mode 100644 mdk-stage1/dietlibc/include/sys/msg.h delete mode 100644 mdk-stage1/dietlibc/include/sys/mtio.h delete mode 100644 mdk-stage1/dietlibc/include/sys/param.h delete mode 100644 mdk-stage1/dietlibc/include/sys/poll.h delete mode 100644 mdk-stage1/dietlibc/include/sys/ptrace.h delete mode 100644 mdk-stage1/dietlibc/include/sys/reboot.h delete mode 100644 mdk-stage1/dietlibc/include/sys/resource.h delete mode 100644 mdk-stage1/dietlibc/include/sys/select.h delete mode 100644 mdk-stage1/dietlibc/include/sys/sem.h delete mode 100644 mdk-stage1/dietlibc/include/sys/sendfile.h delete mode 100644 mdk-stage1/dietlibc/include/sys/shm.h delete mode 100644 mdk-stage1/dietlibc/include/sys/signal.h delete mode 100644 mdk-stage1/dietlibc/include/sys/socket.h delete mode 100644 mdk-stage1/dietlibc/include/sys/stat.h delete mode 100644 mdk-stage1/dietlibc/include/sys/syscall.h delete mode 100644 mdk-stage1/dietlibc/include/sys/sysinfo.h delete mode 100644 mdk-stage1/dietlibc/include/sys/syslog.h delete mode 100644 mdk-stage1/dietlibc/include/sys/time.h delete mode 100644 mdk-stage1/dietlibc/include/sys/times.h delete mode 100644 mdk-stage1/dietlibc/include/sys/types.h delete mode 100644 mdk-stage1/dietlibc/include/sys/uio.h delete mode 100644 mdk-stage1/dietlibc/include/sys/un.h delete mode 100644 mdk-stage1/dietlibc/include/sys/utsname.h delete mode 100644 mdk-stage1/dietlibc/include/sys/vfs.h delete mode 100644 mdk-stage1/dietlibc/include/sys/wait.h delete mode 100644 mdk-stage1/dietlibc/include/syslog.h delete mode 100644 mdk-stage1/dietlibc/include/termios.h delete mode 100644 mdk-stage1/dietlibc/include/time.h delete mode 100644 mdk-stage1/dietlibc/include/unistd.h delete mode 100644 mdk-stage1/dietlibc/include/utime.h delete mode 100644 mdk-stage1/dietlibc/include/utmp.h delete mode 100644 mdk-stage1/dietlibc/lib/__dtostr.c delete mode 100644 mdk-stage1/dietlibc/lib/__fstat64.c delete mode 100644 mdk-stage1/dietlibc/lib/__getcwd.c delete mode 100644 mdk-stage1/dietlibc/lib/__isnan.c delete mode 100644 mdk-stage1/dietlibc/lib/__lltostr.c delete mode 100644 mdk-stage1/dietlibc/lib/__lstat64.c delete mode 100644 mdk-stage1/dietlibc/lib/__ltostr.c delete mode 100644 mdk-stage1/dietlibc/lib/__stat64.c delete mode 100644 mdk-stage1/dietlibc/lib/__stat64_cvt.c delete mode 100644 mdk-stage1/dietlibc/lib/__xmknod.c delete mode 100644 mdk-stage1/dietlibc/lib/_brk.c delete mode 100644 mdk-stage1/dietlibc/lib/abort.c delete mode 100644 mdk-stage1/dietlibc/lib/abs.c delete mode 100644 mdk-stage1/dietlibc/lib/accept.c delete mode 100644 mdk-stage1/dietlibc/lib/alarm.c delete mode 100644 mdk-stage1/dietlibc/lib/alloc.c delete mode 100644 mdk-stage1/dietlibc/lib/assert_fail.c delete mode 100644 mdk-stage1/dietlibc/lib/atexit.c delete mode 100644 mdk-stage1/dietlibc/lib/atof.c delete mode 100644 mdk-stage1/dietlibc/lib/atoi.c delete mode 100644 mdk-stage1/dietlibc/lib/atol.c delete mode 100644 mdk-stage1/dietlibc/lib/bind.c delete mode 100644 mdk-stage1/dietlibc/lib/bsearch.c delete mode 100644 mdk-stage1/dietlibc/lib/cfmakeraw.c delete mode 100644 mdk-stage1/dietlibc/lib/closedir.c delete mode 100644 mdk-stage1/dietlibc/lib/connect.c delete mode 100644 mdk-stage1/dietlibc/lib/creat.c delete mode 100644 mdk-stage1/dietlibc/lib/creat64.c delete mode 100644 mdk-stage1/dietlibc/lib/errlist.c delete mode 100644 mdk-stage1/dietlibc/lib/errno_location.c delete mode 100644 mdk-stage1/dietlibc/lib/exec_lib.c delete mode 100644 mdk-stage1/dietlibc/lib/exec_lib.h delete mode 100644 mdk-stage1/dietlibc/lib/execl.c delete mode 100644 mdk-stage1/dietlibc/lib/execlp.c delete mode 100644 mdk-stage1/dietlibc/lib/execv.c delete mode 100644 mdk-stage1/dietlibc/lib/execvp.c delete mode 100644 mdk-stage1/dietlibc/lib/ftw.c delete mode 100644 mdk-stage1/dietlibc/lib/getdomainname.c delete mode 100644 mdk-stage1/dietlibc/lib/getenv.c delete mode 100644 mdk-stage1/dietlibc/lib/gethostname.c delete mode 100644 mdk-stage1/dietlibc/lib/getopt.c delete mode 100644 mdk-stage1/dietlibc/lib/getpeername.c delete mode 100644 mdk-stage1/dietlibc/lib/getpgrp.c delete mode 100644 mdk-stage1/dietlibc/lib/getservent.c delete mode 100644 mdk-stage1/dietlibc/lib/getsockname.c delete mode 100644 mdk-stage1/dietlibc/lib/getsockopt.c delete mode 100644 mdk-stage1/dietlibc/lib/htonl.c delete mode 100644 mdk-stage1/dietlibc/lib/htons.c delete mode 100644 mdk-stage1/dietlibc/lib/if_indextoname.c delete mode 100644 mdk-stage1/dietlibc/lib/if_nametoindex.c delete mode 100644 mdk-stage1/dietlibc/lib/isalnum.c delete mode 100644 mdk-stage1/dietlibc/lib/isalpha.c delete mode 100644 mdk-stage1/dietlibc/lib/isascii.c delete mode 100644 mdk-stage1/dietlibc/lib/isatty.c delete mode 100644 mdk-stage1/dietlibc/lib/isblank.c delete mode 100644 mdk-stage1/dietlibc/lib/iscntrl.c delete mode 100644 mdk-stage1/dietlibc/lib/isdigit.c delete mode 100644 mdk-stage1/dietlibc/lib/isgraph.c delete mode 100644 mdk-stage1/dietlibc/lib/islower.c delete mode 100644 mdk-stage1/dietlibc/lib/isprint.c delete mode 100644 mdk-stage1/dietlibc/lib/ispunct.c delete mode 100644 mdk-stage1/dietlibc/lib/isspace.c delete mode 100644 mdk-stage1/dietlibc/lib/isupper.c delete mode 100644 mdk-stage1/dietlibc/lib/isxdigit.c delete mode 100644 mdk-stage1/dietlibc/lib/listen.c delete mode 100644 mdk-stage1/dietlibc/lib/lockf.c delete mode 100644 mdk-stage1/dietlibc/lib/longjmp.c delete mode 100644 mdk-stage1/dietlibc/lib/lseek64.c delete mode 100644 mdk-stage1/dietlibc/lib/memccmp.c delete mode 100644 mdk-stage1/dietlibc/lib/memccpy.c delete mode 100644 mdk-stage1/dietlibc/lib/memchr.c delete mode 100644 mdk-stage1/dietlibc/lib/memcmp.c delete mode 100644 mdk-stage1/dietlibc/lib/memcpy.c delete mode 100644 mdk-stage1/dietlibc/lib/memmove.c delete mode 100644 mdk-stage1/dietlibc/lib/memset.c delete mode 100644 mdk-stage1/dietlibc/lib/mkfifo.c delete mode 100644 mdk-stage1/dietlibc/lib/msgctl.c delete mode 100644 mdk-stage1/dietlibc/lib/msgget.c delete mode 100644 mdk-stage1/dietlibc/lib/msgrcv.c delete mode 100644 mdk-stage1/dietlibc/lib/msgsnd.c delete mode 100644 mdk-stage1/dietlibc/lib/nop.c delete mode 100644 mdk-stage1/dietlibc/lib/open64.c delete mode 100644 mdk-stage1/dietlibc/lib/opendir.c delete mode 100644 mdk-stage1/dietlibc/lib/perror.c delete mode 100644 mdk-stage1/dietlibc/lib/pread.c delete mode 100644 mdk-stage1/dietlibc/lib/pread64.c delete mode 100644 mdk-stage1/dietlibc/lib/putenv.c delete mode 100644 mdk-stage1/dietlibc/lib/puts.c delete mode 100644 mdk-stage1/dietlibc/lib/qsort.c delete mode 100644 mdk-stage1/dietlibc/lib/raise.c delete mode 100644 mdk-stage1/dietlibc/lib/rand.c delete mode 100644 mdk-stage1/dietlibc/lib/random.c delete mode 100644 mdk-stage1/dietlibc/lib/readdir.c delete mode 100644 mdk-stage1/dietlibc/lib/reboot.c delete mode 100644 mdk-stage1/dietlibc/lib/recv.c delete mode 100644 mdk-stage1/dietlibc/lib/recvfrom.c delete mode 100644 mdk-stage1/dietlibc/lib/recvmsg.c delete mode 100644 mdk-stage1/dietlibc/lib/remove.c delete mode 100644 mdk-stage1/dietlibc/lib/rewind.c delete mode 100644 mdk-stage1/dietlibc/lib/rewinddir.c delete mode 100644 mdk-stage1/dietlibc/lib/sbrk.c delete mode 100644 mdk-stage1/dietlibc/lib/seekdir.c delete mode 100644 mdk-stage1/dietlibc/lib/semctl.c delete mode 100644 mdk-stage1/dietlibc/lib/semget.c delete mode 100644 mdk-stage1/dietlibc/lib/semop.c delete mode 100644 mdk-stage1/dietlibc/lib/send.c delete mode 100644 mdk-stage1/dietlibc/lib/sendmsg.c delete mode 100644 mdk-stage1/dietlibc/lib/sendto.c delete mode 100644 mdk-stage1/dietlibc/lib/set_errno.c delete mode 100644 mdk-stage1/dietlibc/lib/setpgrp.c delete mode 100644 mdk-stage1/dietlibc/lib/setsockopt.c delete mode 100644 mdk-stage1/dietlibc/lib/shmat.c delete mode 100644 mdk-stage1/dietlibc/lib/shmctl.c delete mode 100644 mdk-stage1/dietlibc/lib/shmdt.c delete mode 100644 mdk-stage1/dietlibc/lib/shmget.c delete mode 100644 mdk-stage1/dietlibc/lib/shutdown.c delete mode 100644 mdk-stage1/dietlibc/lib/sigaddset.c delete mode 100644 mdk-stage1/dietlibc/lib/sigdelset.c delete mode 100644 mdk-stage1/dietlibc/lib/sigemptyset.c delete mode 100644 mdk-stage1/dietlibc/lib/sigfillset.c delete mode 100644 mdk-stage1/dietlibc/lib/sigismember.c delete mode 100644 mdk-stage1/dietlibc/lib/sigjmp.c delete mode 100644 mdk-stage1/dietlibc/lib/sleep.c delete mode 100644 mdk-stage1/dietlibc/lib/snprintf.c delete mode 100644 mdk-stage1/dietlibc/lib/socket.c delete mode 100644 mdk-stage1/dietlibc/lib/speed.c delete mode 100644 mdk-stage1/dietlibc/lib/sprintf.c delete mode 100644 mdk-stage1/dietlibc/lib/sscanf.c delete mode 100644 mdk-stage1/dietlibc/lib/strcasecmp.c delete mode 100644 mdk-stage1/dietlibc/lib/strcat.c delete mode 100644 mdk-stage1/dietlibc/lib/strchr.c delete mode 100644 mdk-stage1/dietlibc/lib/strcmp.c delete mode 100644 mdk-stage1/dietlibc/lib/strcpy.c delete mode 100644 mdk-stage1/dietlibc/lib/strcspn.c delete mode 100644 mdk-stage1/dietlibc/lib/strdup.c delete mode 100644 mdk-stage1/dietlibc/lib/strerror.c delete mode 100644 mdk-stage1/dietlibc/lib/strlcat.c delete mode 100644 mdk-stage1/dietlibc/lib/strlcpy.3 delete mode 100644 mdk-stage1/dietlibc/lib/strlcpy.c delete mode 100644 mdk-stage1/dietlibc/lib/strlen.c delete mode 100644 mdk-stage1/dietlibc/lib/strncasecmp.c delete mode 100644 mdk-stage1/dietlibc/lib/strncat.c delete mode 100644 mdk-stage1/dietlibc/lib/strncmp.c delete mode 100644 mdk-stage1/dietlibc/lib/strncpy.c delete mode 100644 mdk-stage1/dietlibc/lib/strpbrk.c delete mode 100644 mdk-stage1/dietlibc/lib/strrchr.c delete mode 100644 mdk-stage1/dietlibc/lib/strsep.c delete mode 100644 mdk-stage1/dietlibc/lib/strspn.c delete mode 100644 mdk-stage1/dietlibc/lib/strstr.c delete mode 100644 mdk-stage1/dietlibc/lib/strtod.c delete mode 100644 mdk-stage1/dietlibc/lib/strtok.c delete mode 100644 mdk-stage1/dietlibc/lib/strtok_r.c delete mode 100644 mdk-stage1/dietlibc/lib/strtol.c delete mode 100644 mdk-stage1/dietlibc/lib/strtoll.c delete mode 100644 mdk-stage1/dietlibc/lib/strtoul.c delete mode 100644 mdk-stage1/dietlibc/lib/strtoull.c delete mode 100644 mdk-stage1/dietlibc/lib/sys_siglist.c delete mode 100644 mdk-stage1/dietlibc/lib/tcdrain.c delete mode 100644 mdk-stage1/dietlibc/lib/tcflush.c delete mode 100644 mdk-stage1/dietlibc/lib/tcgetattr.c delete mode 100644 mdk-stage1/dietlibc/lib/tcgetpgrp.c delete mode 100644 mdk-stage1/dietlibc/lib/tcsetattr.c delete mode 100644 mdk-stage1/dietlibc/lib/tcsetpgrp.c delete mode 100644 mdk-stage1/dietlibc/lib/telldir.c delete mode 100644 mdk-stage1/dietlibc/lib/tolower.c delete mode 100644 mdk-stage1/dietlibc/lib/toupper.c delete mode 100644 mdk-stage1/dietlibc/lib/ttyname.c delete mode 100644 mdk-stage1/dietlibc/lib/usleep.c delete mode 100644 mdk-stage1/dietlibc/lib/vfork.c delete mode 100644 mdk-stage1/dietlibc/lib/vfprintf.c delete mode 100644 mdk-stage1/dietlibc/lib/vprintf.c delete mode 100644 mdk-stage1/dietlibc/lib/vsnprintf.c delete mode 100644 mdk-stage1/dietlibc/lib/vsprintf.c delete mode 100644 mdk-stage1/dietlibc/lib/vsscanf.c delete mode 100644 mdk-stage1/dietlibc/lib/wait.c delete mode 100644 mdk-stage1/dietlibc/lib/wait3.c delete mode 100644 mdk-stage1/dietlibc/libcruft/___div.c delete mode 100644 mdk-stage1/dietlibc/libcruft/dnscruft.c delete mode 100644 mdk-stage1/dietlibc/libcruft/dnscruft2.c delete mode 100644 mdk-stage1/dietlibc/libcruft/entlib.c delete mode 100644 mdk-stage1/dietlibc/libcruft/entlib.h delete mode 100644 mdk-stage1/dietlibc/libcruft/getdtablesize.c delete mode 100644 mdk-stage1/dietlibc/libcruft/getgrgid.c delete mode 100644 mdk-stage1/dietlibc/libcruft/getgrnam.c delete mode 100644 mdk-stage1/dietlibc/libcruft/gethostbyaddr.c delete mode 100644 mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c delete mode 100644 mdk-stage1/dietlibc/libcruft/gethostbyname.c delete mode 100644 mdk-stage1/dietlibc/libcruft/gethostbyname2.c delete mode 100644 mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c delete mode 100644 mdk-stage1/dietlibc/libcruft/gethostbyname_r.c delete mode 100644 mdk-stage1/dietlibc/libcruft/getlogin.c delete mode 100644 mdk-stage1/dietlibc/libcruft/getpagesize.c delete mode 100644 mdk-stage1/dietlibc/libcruft/getpass.c delete mode 100644 mdk-stage1/dietlibc/libcruft/getpwnam.c delete mode 100644 mdk-stage1/dietlibc/libcruft/getpwuid.c delete mode 100644 mdk-stage1/dietlibc/libcruft/getspnam.c delete mode 100644 mdk-stage1/dietlibc/libcruft/grent.c delete mode 100644 mdk-stage1/dietlibc/libcruft/h_errno.c delete mode 100644 mdk-stage1/dietlibc/libcruft/herrno_location.c delete mode 100644 mdk-stage1/dietlibc/libcruft/inet_addr.c delete mode 100644 mdk-stage1/dietlibc/libcruft/inet_aton.c delete mode 100644 mdk-stage1/dietlibc/libcruft/inet_ntoa.c delete mode 100644 mdk-stage1/dietlibc/libcruft/inet_ntoa_r.c delete mode 100644 mdk-stage1/dietlibc/libcruft/inet_ntop.c delete mode 100644 mdk-stage1/dietlibc/libcruft/inet_pton.c delete mode 100644 mdk-stage1/dietlibc/libcruft/initgroups.c delete mode 100644 mdk-stage1/dietlibc/libcruft/mkstemp.c delete mode 100644 mdk-stage1/dietlibc/libcruft/pwent.c delete mode 100644 mdk-stage1/dietlibc/libcruft/res_init.c delete mode 100644 mdk-stage1/dietlibc/libcruft/spent.c delete mode 100644 mdk-stage1/dietlibc/libcrypt/crypt.c delete mode 100644 mdk-stage1/dietlibc/libdl/Makefile delete mode 100644 mdk-stage1/dietlibc/libdl/README delete mode 100644 mdk-stage1/dietlibc/libdl/_dl_int.h delete mode 100644 mdk-stage1/dietlibc/libdl/_dl_jump.S delete mode 100644 mdk-stage1/dietlibc/libdl/_dl_open.c delete mode 100644 mdk-stage1/dietlibc/libdl/_dl_search.c delete mode 100644 mdk-stage1/dietlibc/libdl/dlclose.c delete mode 100644 mdk-stage1/dietlibc/libdl/dlerror.c delete mode 100644 mdk-stage1/dietlibc/libdl/dlopen.c delete mode 100644 mdk-stage1/dietlibc/libdl/dlsym.c delete mode 100644 mdk-stage1/dietlibc/libdl/elf_hash.c delete mode 100644 mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c delete mode 100644 mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c delete mode 100644 mdk-stage1/dietlibc/liblatin1/latin1-islower.c delete mode 100644 mdk-stage1/dietlibc/liblatin1/latin1-isprint.c delete mode 100644 mdk-stage1/dietlibc/liblatin1/latin1-isupper.c delete mode 100644 mdk-stage1/dietlibc/libpthread/CHANGES delete mode 100644 mdk-stage1/dietlibc/libpthread/Makefile delete mode 100644 mdk-stage1/dietlibc/libpthread/README delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_atfork.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_getdetachstate.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_getinheritsched.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_getschedparam.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_getschedpolicy.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_getscope.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_getstackaddr.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_getstacksize.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_init.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_setstackaddr.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_cancel.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_cleanup_pop.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_cleanup_push.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_cond_init.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_condattr.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_create.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_detach.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_exit.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_getspecific.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_join.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_key_create.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_key_delete.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_mutexattr_getkind_np.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_mutexattr_init.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_once.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_self.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_setspecific.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_spinlock.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_close.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_create.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_fsync.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_nanosleep.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_open.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_pause.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_read.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_sigsuspend.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_sys_write.c delete mode 100644 mdk-stage1/dietlibc/libpthread/pthread_testcancel.c delete mode 100644 mdk-stage1/dietlibc/libpthread/test.c delete mode 100644 mdk-stage1/dietlibc/libpthread/thread_internal.c delete mode 100644 mdk-stage1/dietlibc/libpthread/thread_internal.h delete mode 100644 mdk-stage1/dietlibc/libpthread/thread_key.c delete mode 100644 mdk-stage1/dietlibc/libregex/rx.c delete mode 100644 mdk-stage1/dietlibc/librpc/auth_none.c delete mode 100644 mdk-stage1/dietlibc/librpc/auth_unix.c delete mode 100644 mdk-stage1/dietlibc/librpc/authunix_prot.c delete mode 100644 mdk-stage1/dietlibc/librpc/bindresvport.c delete mode 100644 mdk-stage1/dietlibc/librpc/clnt_generic.c delete mode 100644 mdk-stage1/dietlibc/librpc/clnt_perror.c delete mode 100644 mdk-stage1/dietlibc/librpc/clnt_raw.c delete mode 100644 mdk-stage1/dietlibc/librpc/clnt_simple.c delete mode 100644 mdk-stage1/dietlibc/librpc/clnt_tcp.c delete mode 100644 mdk-stage1/dietlibc/librpc/clnt_udp.c delete mode 100644 mdk-stage1/dietlibc/librpc/get_myaddress.c delete mode 100644 mdk-stage1/dietlibc/librpc/getrpcent.c delete mode 100644 mdk-stage1/dietlibc/librpc/getrpcport.c delete mode 100644 mdk-stage1/dietlibc/librpc/pmap_clnt.c delete mode 100644 mdk-stage1/dietlibc/librpc/pmap_getmaps.c delete mode 100644 mdk-stage1/dietlibc/librpc/pmap_getport.c delete mode 100644 mdk-stage1/dietlibc/librpc/pmap_prot.c delete mode 100644 mdk-stage1/dietlibc/librpc/pmap_prot2.c delete mode 100644 mdk-stage1/dietlibc/librpc/pmap_rmt.c delete mode 100644 mdk-stage1/dietlibc/librpc/rpc_callmsg.c delete mode 100644 mdk-stage1/dietlibc/librpc/rpc_commondata.c delete mode 100644 mdk-stage1/dietlibc/librpc/rpc_dtablesize.c delete mode 100644 mdk-stage1/dietlibc/librpc/rpc_prot.c delete mode 100644 mdk-stage1/dietlibc/librpc/svc.c delete mode 100644 mdk-stage1/dietlibc/librpc/svc_auth.c delete mode 100644 mdk-stage1/dietlibc/librpc/svc_auth_unix.c delete mode 100644 mdk-stage1/dietlibc/librpc/svc_raw.c delete mode 100644 mdk-stage1/dietlibc/librpc/svc_run.c delete mode 100644 mdk-stage1/dietlibc/librpc/svc_simple.c delete mode 100644 mdk-stage1/dietlibc/librpc/svc_tcp.c delete mode 100644 mdk-stage1/dietlibc/librpc/svc_udp.c delete mode 100644 mdk-stage1/dietlibc/librpc/xdr.c delete mode 100644 mdk-stage1/dietlibc/librpc/xdr_array.c delete mode 100644 mdk-stage1/dietlibc/librpc/xdr_float.c delete mode 100644 mdk-stage1/dietlibc/librpc/xdr_mem.c delete mode 100644 mdk-stage1/dietlibc/librpc/xdr_rec.c delete mode 100644 mdk-stage1/dietlibc/librpc/xdr_reference.c delete mode 100644 mdk-stage1/dietlibc/librpc/xdr_stdio.c delete mode 100644 mdk-stage1/dietlibc/libshell/fnmatch.c delete mode 100644 mdk-stage1/dietlibc/libshell/glob.c delete mode 100644 mdk-stage1/dietlibc/libshell/realpath.c delete mode 100644 mdk-stage1/dietlibc/libstdio/clearerr.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fclose.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fdglue.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fdopen.c delete mode 100644 mdk-stage1/dietlibc/libstdio/feof.c delete mode 100644 mdk-stage1/dietlibc/libstdio/ferror.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fflush.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fgetc.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fgets.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fileno.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fopen.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fprintf.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fputc.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fputs.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fread.c delete mode 100644 mdk-stage1/dietlibc/libstdio/freopen.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fseek.c delete mode 100644 mdk-stage1/dietlibc/libstdio/ftell.c delete mode 100644 mdk-stage1/dietlibc/libstdio/fwrite.c delete mode 100644 mdk-stage1/dietlibc/libstdio/printf.c delete mode 100644 mdk-stage1/dietlibc/libstdio/putchar.c delete mode 100644 mdk-stage1/dietlibc/libstdio/setvbuf.c delete mode 100644 mdk-stage1/dietlibc/libstdio/stderr.c delete mode 100644 mdk-stage1/dietlibc/libstdio/stdin.c delete mode 100644 mdk-stage1/dietlibc/libstdio/stdout.c delete mode 100644 mdk-stage1/dietlibc/libstdio/ungetc.c delete mode 100644 mdk-stage1/dietlibc/libugly/asctime.c delete mode 100644 mdk-stage1/dietlibc/libugly/asctime_r.c delete mode 100644 mdk-stage1/dietlibc/libugly/asprintf.c delete mode 100644 mdk-stage1/dietlibc/libugly/ctime.c delete mode 100644 mdk-stage1/dietlibc/libugly/daemon.c delete mode 100644 mdk-stage1/dietlibc/libugly/endmntent.c delete mode 100644 mdk-stage1/dietlibc/libugly/facilitynames.c delete mode 100644 mdk-stage1/dietlibc/libugly/getmntent.c delete mode 100644 mdk-stage1/dietlibc/libugly/getprotoent.c delete mode 100644 mdk-stage1/dietlibc/libugly/gmtime.c delete mode 100644 mdk-stage1/dietlibc/libugly/gmtime_r.c delete mode 100644 mdk-stage1/dietlibc/libugly/isleap.c delete mode 100644 mdk-stage1/dietlibc/libugly/localtime.c delete mode 100644 mdk-stage1/dietlibc/libugly/localtime_r.c delete mode 100644 mdk-stage1/dietlibc/libugly/logging.c delete mode 100644 mdk-stage1/dietlibc/libugly/mktime.c delete mode 100644 mdk-stage1/dietlibc/libugly/pclose.c delete mode 100644 mdk-stage1/dietlibc/libugly/popen.c delete mode 100644 mdk-stage1/dietlibc/libugly/prioritynames.c delete mode 100644 mdk-stage1/dietlibc/libugly/setenv.c delete mode 100644 mdk-stage1/dietlibc/libugly/setmntent.c delete mode 100644 mdk-stage1/dietlibc/libugly/strftime.c delete mode 100644 mdk-stage1/dietlibc/libugly/strsignal.c delete mode 100644 mdk-stage1/dietlibc/libugly/system.c delete mode 100644 mdk-stage1/dietlibc/libugly/time_table_spd.c delete mode 100644 mdk-stage1/dietlibc/libugly/tzfile.c delete mode 100644 mdk-stage1/dietlibc/libugly/unsetenv.c delete mode 100644 mdk-stage1/dietlibc/ppc/Makefile.add delete mode 100644 mdk-stage1/dietlibc/ppc/__longjmp.S delete mode 100644 mdk-stage1/dietlibc/ppc/__testandset.S delete mode 100644 mdk-stage1/dietlibc/ppc/mmap.c delete mode 100644 mdk-stage1/dietlibc/ppc/setjmp.S delete mode 100644 mdk-stage1/dietlibc/ppc/start.S delete mode 100644 mdk-stage1/dietlibc/ppc/unified.S delete mode 100644 mdk-stage1/dietlibc/sparc/Makefile.add delete mode 100644 mdk-stage1/dietlibc/sparc/__longjmp.S delete mode 100644 mdk-stage1/dietlibc/sparc/__testandset.S delete mode 100644 mdk-stage1/dietlibc/sparc/clone.S delete mode 100644 mdk-stage1/dietlibc/sparc/fork.S delete mode 100644 mdk-stage1/dietlibc/sparc/mmap.c delete mode 100644 mdk-stage1/dietlibc/sparc/pipe.S delete mode 100644 mdk-stage1/dietlibc/sparc/setjmp.S delete mode 100644 mdk-stage1/dietlibc/sparc/shmat.c delete mode 100644 mdk-stage1/dietlibc/sparc/start.S delete mode 100644 mdk-stage1/dietlibc/sparc/udiv.S delete mode 100644 mdk-stage1/dietlibc/sparc/umul.S delete mode 100644 mdk-stage1/dietlibc/sparc/unified.S delete mode 100644 mdk-stage1/dietlibc/sparc/urem.S delete mode 100644 mdk-stage1/dietlibc/start.h delete mode 100644 mdk-stage1/dietlibc/syscalls.c/_llseek.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/_newselect.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/access.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/chdir.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/chmod.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/chown.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/chroot.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/clone.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/close.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/dup.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/dup2.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/execve.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/exit.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/fchdir.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/fchmod.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/fchown.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/fcntl.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/flock.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/fork.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/fsync.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/ftruncate.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getcwd.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getdents.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getegid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/geteuid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getgid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getgroups.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getpgid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getpid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getppid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getpriority.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getresgid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getresuid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getrlimit.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getrusage.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getsid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/gettimeofday.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/getuid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/ioctl.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/kill.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/lchown.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/link.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/lseek.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/mkdir.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/mknod.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/mount.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/mprotect.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/mremap.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/munmap.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/nanosleep.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/open.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/pipe.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/poll.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/read.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/readlink.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/reboot.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/rename.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/rmdir.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setdomainname.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setgid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setgroups.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/sethostname.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setitimer.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setpgid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setpriority.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setregid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setresgid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setresuid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setreuid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setrlimit.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setsid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/setuid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/sigaction.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/signal.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/sigpending.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/sigprocmask.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/sigsuspend.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/socketcall.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/swapoff.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/swapon.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/symlink.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/sync.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/syslog.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/time.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/truncate.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/umask.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/umount.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/uname.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/unlink.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/utime.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/vhangup.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/wait4.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/waitpid.c delete mode 100644 mdk-stage1/dietlibc/syscalls.c/write.c delete mode 100644 mdk-stage1/dietlibc/syscalls.h delete mode 100644 mdk-stage1/dietlibc/syscalls.s/__getpagesize.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/__pread.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/__reboot.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/_llseek.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/access.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/brk.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/chdir.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/chmod.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/chown.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/chroot.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/close.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/dup.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/dup2.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/execve.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/exit.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/fchdir.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/fchmod.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/fchown.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/fcntl.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/flock.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/fork.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/fstat.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/fstat64.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/fstatfs.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/fsync.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/ftruncate.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getcwd.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getdents.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getdents64.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getegid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/geteuid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getgid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getgroups.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getitimer.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getpgid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getpid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getppid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getpriority.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getresgid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getresuid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getrlimit.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getrusage.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getsid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/gettimeofday.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/getuid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/ioctl.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/ioperm.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/iopl.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/ipc.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/kill.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/lchown.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/link.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/llseek.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/lseek.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/lstat.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/lstat64.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/mkdir.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/mknod.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/mlockall.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/mount.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/mprotect.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/mremap.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/munlockall.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/munmap.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/nanosleep.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/nice.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/open.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/pause.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/personality.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/pipe.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/poll.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/ptrace.s delete mode 100644 mdk-stage1/dietlibc/syscalls.s/pwrite.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/query_module.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/read.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/readlink.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/readv.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/rename.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/rmdir.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sched_get_priority_max.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sched_get_priority_min.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sched_getparam.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sched_getscheduler.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sched_rr_get_interval.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sched_setparam.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sched_setscheduler.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sched_yield.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/select.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sendfile.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setdomainname.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setgid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setgroups.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sethostname.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setitimer.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setpgid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setpriority.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setregid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setresgid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setresuid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setreuid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setrlimit.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setsid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/setuid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sigaction.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sigaltstack.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/signal.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sigpending.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sigprocmask.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sigsuspend.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/socketcall.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/stat.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/stat64.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/statfs.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/stime.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/swapoff.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/swapon.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/symlink.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sync.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sysctl.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/sysinfo.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/syslog.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/time.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/times.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/truncate.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/umask.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/umount.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/umount2.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/uname.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/unlink.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/utime.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/vhangup.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/wait4.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/waitpid.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/write.S delete mode 100644 mdk-stage1/dietlibc/syscalls.s/writev.S delete mode 100644 mdk-stage1/disk.c delete mode 100644 mdk-stage1/disk.h delete mode 100644 mdk-stage1/dns.c delete mode 100644 mdk-stage1/dns.h delete mode 100644 mdk-stage1/doc/HACKING delete mode 100644 mdk-stage1/doc/README delete mode 100644 mdk-stage1/doc/TECH-INFOS delete mode 100644 mdk-stage1/doc/WHY-DIETLIBC delete mode 100644 mdk-stage1/doc/documented..frontend.h delete mode 100644 mdk-stage1/frontend-common.c delete mode 100644 mdk-stage1/frontend.h delete mode 100644 mdk-stage1/init-data/emptyboot.img.bz2 delete mode 100644 mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 delete mode 100644 mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 delete mode 100644 mdk-stage1/init-data/msgboot.img.bz2 delete mode 100644 mdk-stage1/init-libc-headers.h delete mode 100644 mdk-stage1/init.c delete mode 100644 mdk-stage1/insmod-busybox/.cvsignore delete mode 100644 mdk-stage1/insmod-busybox/Config.h delete mode 100644 mdk-stage1/insmod-busybox/Makefile delete mode 100644 mdk-stage1/insmod-busybox/README delete mode 100644 mdk-stage1/insmod-busybox/busybox.h delete mode 100644 mdk-stage1/insmod-busybox/insmod-frontend.c delete mode 100644 mdk-stage1/insmod-busybox/insmod.c delete mode 100644 mdk-stage1/insmod-busybox/loop.h delete mode 100644 mdk-stage1/insmod-busybox/messages.c delete mode 100644 mdk-stage1/insmod-busybox/utility.c delete mode 100644 mdk-stage1/insmod-modutils/Makefile delete mode 100644 mdk-stage1/insmod-modutils/include/config.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_alpha.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_arm.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_hppa.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_hppa64.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_i386.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_ia64.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_m68k.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_mips.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_ppc.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_s390.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_sparc.h delete mode 100644 mdk-stage1/insmod-modutils/include/elf_sparc64.h delete mode 100644 mdk-stage1/insmod-modutils/include/kallsyms.h delete mode 100644 mdk-stage1/insmod-modutils/include/kerneld.h delete mode 100644 mdk-stage1/insmod-modutils/include/modstat.h delete mode 100644 mdk-stage1/insmod-modutils/include/module.h delete mode 100644 mdk-stage1/insmod-modutils/include/obj.h delete mode 100644 mdk-stage1/insmod-modutils/include/util.h delete mode 100644 mdk-stage1/insmod-modutils/include/version.h delete mode 100644 mdk-stage1/insmod-modutils/insmod-frontend.c delete mode 100644 mdk-stage1/insmod-modutils/insmod.c delete mode 100644 mdk-stage1/insmod-modutils/obj/Makefile delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_alpha.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_arm.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_common.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_hppa.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_hppa64.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_i386.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_ia64.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_kallsyms.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_load.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_m68k.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_mips.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_ppc.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_reloc.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_s390.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_sparc.c delete mode 100644 mdk-stage1/insmod-modutils/obj/obj_sparc64.c delete mode 100644 mdk-stage1/insmod-modutils/util/Makefile delete mode 100644 mdk-stage1/insmod-modutils/util/alias.h delete mode 100644 mdk-stage1/insmod-modutils/util/arch64.c delete mode 100644 mdk-stage1/insmod-modutils/util/config.c delete mode 100644 mdk-stage1/insmod-modutils/util/gzfiles.c delete mode 100644 mdk-stage1/insmod-modutils/util/logger.c delete mode 100644 mdk-stage1/insmod-modutils/util/meta_expand.c delete mode 100644 mdk-stage1/insmod-modutils/util/modstat.c delete mode 100644 mdk-stage1/insmod-modutils/util/snap_shot.c delete mode 100644 mdk-stage1/insmod-modutils/util/sys_cm.c delete mode 100644 mdk-stage1/insmod-modutils/util/sys_dm.c delete mode 100644 mdk-stage1/insmod-modutils/util/sys_gks.c delete mode 100644 mdk-stage1/insmod-modutils/util/sys_nim.c delete mode 100644 mdk-stage1/insmod-modutils/util/sys_oim.c delete mode 100644 mdk-stage1/insmod-modutils/util/sys_qm.c delete mode 100644 mdk-stage1/insmod-modutils/util/xftw.c delete mode 100644 mdk-stage1/insmod-modutils/util/xmalloc.c delete mode 100644 mdk-stage1/insmod-modutils/util/xrealloc.c delete mode 100644 mdk-stage1/insmod-modutils/util/xstrcat.c delete mode 100644 mdk-stage1/insmod-modutils/util/xstrdup.c delete mode 100644 mdk-stage1/insmod-modutils/util/xsystem.c delete mode 100644 mdk-stage1/insmod.h delete mode 100644 mdk-stage1/linux-2.2/nfs.h delete mode 100644 mdk-stage1/linux-2.2/nfs_mount.h delete mode 100644 mdk-stage1/log.c delete mode 100644 mdk-stage1/log.h delete mode 100644 mdk-stage1/lomount.c delete mode 100644 mdk-stage1/lomount.h delete mode 100644 mdk-stage1/mar/.cvsignore delete mode 100644 mdk-stage1/mar/Makefile delete mode 100644 mdk-stage1/mar/mar-extract-only.c delete mode 100644 mdk-stage1/mar/mar-extract-only.h delete mode 100644 mdk-stage1/mar/mar-frontend.c delete mode 100644 mdk-stage1/mar/mar.h delete mode 100644 mdk-stage1/minilibc.c delete mode 100644 mdk-stage1/minilibc.h delete mode 100644 mdk-stage1/mkinitrd_helper/Makefile delete mode 100644 mdk-stage1/mkinitrd_helper/mkinitrd_helper.c delete mode 100644 mdk-stage1/modules.c delete mode 100644 mdk-stage1/modules.h delete mode 100644 mdk-stage1/modules_descr.h delete mode 100644 mdk-stage1/mount.c delete mode 100644 mdk-stage1/mount.h delete mode 100644 mdk-stage1/mount_rpcgen.h delete mode 100644 mdk-stage1/network.c delete mode 100644 mdk-stage1/network.h delete mode 100644 mdk-stage1/newt-frontend.c delete mode 100644 mdk-stage1/newt/Makefile delete mode 100644 mdk-stage1/newt/button.c delete mode 100644 mdk-stage1/newt/buttonbar.c delete mode 100644 mdk-stage1/newt/checkbox.c delete mode 100644 mdk-stage1/newt/checkboxtree.c delete mode 100644 mdk-stage1/newt/entry.c delete mode 100644 mdk-stage1/newt/form.c delete mode 100644 mdk-stage1/newt/grid.c delete mode 100644 mdk-stage1/newt/label.c delete mode 100644 mdk-stage1/newt/listbox.c delete mode 100644 mdk-stage1/newt/newt.c delete mode 100644 mdk-stage1/newt/newt.h delete mode 100644 mdk-stage1/newt/newt_pr.h delete mode 100644 mdk-stage1/newt/scale.c delete mode 100644 mdk-stage1/newt/scrollbar.c delete mode 100644 mdk-stage1/newt/textbox.c delete mode 100644 mdk-stage1/newt/windows.c delete mode 100644 mdk-stage1/nfsmount.c delete mode 100644 mdk-stage1/nfsmount.h delete mode 100644 mdk-stage1/pci-resource/.cvsignore delete mode 100644 mdk-stage1/pci-resource/Makefile delete mode 100755 mdk-stage1/pci-resource/update-pci-ids.pl delete mode 100644 mdk-stage1/pcmcia/Makefile delete mode 100644 mdk-stage1/pcmcia/bulkmem.h delete mode 100644 mdk-stage1/pcmcia/cardmgr.c delete mode 100644 mdk-stage1/pcmcia/cardmgr.h delete mode 100644 mdk-stage1/pcmcia/cirrus.h delete mode 100644 mdk-stage1/pcmcia/cistpl.h delete mode 100644 mdk-stage1/pcmcia/config.h delete mode 100644 mdk-stage1/pcmcia/cs.h delete mode 100644 mdk-stage1/pcmcia/cs_types.h delete mode 100644 mdk-stage1/pcmcia/driver_ops.h delete mode 100644 mdk-stage1/pcmcia/ds.h delete mode 100644 mdk-stage1/pcmcia/i82365.h delete mode 100644 mdk-stage1/pcmcia/lex_config.c delete mode 100644 mdk-stage1/pcmcia/pcmcia.h delete mode 100644 mdk-stage1/pcmcia/pcmcia_probe.c delete mode 100644 mdk-stage1/pcmcia/tcic.h delete mode 100644 mdk-stage1/pcmcia/version.h delete mode 100644 mdk-stage1/pcmcia/vg468.h delete mode 100644 mdk-stage1/pcmcia/yacc_config.c delete mode 100644 mdk-stage1/pcmcia/yacc_config.h delete mode 100644 mdk-stage1/probing.c delete mode 100644 mdk-stage1/probing.h delete mode 100644 mdk-stage1/slang/Makefile delete mode 100644 mdk-stage1/slang/_slang.h delete mode 100644 mdk-stage1/slang/config.h delete mode 100644 mdk-stage1/slang/jdmacros.h delete mode 100644 mdk-stage1/slang/keywhash.c delete mode 100644 mdk-stage1/slang/sl-feat.h delete mode 100644 mdk-stage1/slang/slang.c delete mode 100644 mdk-stage1/slang/slang.h delete mode 100644 mdk-stage1/slang/slarith.c delete mode 100644 mdk-stage1/slang/slarith.inc delete mode 100644 mdk-stage1/slang/slarray.c delete mode 100644 mdk-stage1/slang/slarrfun.c delete mode 100644 mdk-stage1/slang/slarrfun.inc delete mode 100644 mdk-stage1/slang/slarrmis.c delete mode 100644 mdk-stage1/slang/slassoc.c delete mode 100644 mdk-stage1/slang/slbstr.c delete mode 100644 mdk-stage1/slang/slclass.c delete mode 100644 mdk-stage1/slang/slcmd.c delete mode 100644 mdk-stage1/slang/slcmplex.c delete mode 100644 mdk-stage1/slang/slcompat.c delete mode 100644 mdk-stage1/slang/slcurses.c delete mode 100644 mdk-stage1/slang/slcurses.h delete mode 100644 mdk-stage1/slang/sldisply.c delete mode 100644 mdk-stage1/slang/slerr.c delete mode 100644 mdk-stage1/slang/slerrno.c delete mode 100644 mdk-stage1/slang/slgetkey.c delete mode 100644 mdk-stage1/slang/slimport.c delete mode 100644 mdk-stage1/slang/slinclud.h delete mode 100644 mdk-stage1/slang/slintall.c delete mode 100644 mdk-stage1/slang/slistruc.c delete mode 100644 mdk-stage1/slang/slkeymap.c delete mode 100644 mdk-stage1/slang/slkeypad.c delete mode 100644 mdk-stage1/slang/sllimits.h delete mode 100644 mdk-stage1/slang/slmalloc.c delete mode 100644 mdk-stage1/slang/slmath.c delete mode 100644 mdk-stage1/slang/slmemchr.c delete mode 100644 mdk-stage1/slang/slmemcmp.c delete mode 100644 mdk-stage1/slang/slmemcpy.c delete mode 100644 mdk-stage1/slang/slmemset.c delete mode 100644 mdk-stage1/slang/slmisc.c delete mode 100644 mdk-stage1/slang/slnspace.c delete mode 100644 mdk-stage1/slang/slospath.c delete mode 100644 mdk-stage1/slang/slpack.c delete mode 100644 mdk-stage1/slang/slparse.c delete mode 100644 mdk-stage1/slang/slpath.c delete mode 100644 mdk-stage1/slang/slposdir.c delete mode 100644 mdk-stage1/slang/slposio.c delete mode 100644 mdk-stage1/slang/slprepr.c delete mode 100644 mdk-stage1/slang/slproc.c delete mode 100644 mdk-stage1/slang/slregexp.c delete mode 100644 mdk-stage1/slang/slrline.c delete mode 100644 mdk-stage1/slang/slscanf.c delete mode 100644 mdk-stage1/slang/slscroll.c delete mode 100644 mdk-stage1/slang/slsearch.c delete mode 100644 mdk-stage1/slang/slsignal.c delete mode 100644 mdk-stage1/slang/slsmg.c delete mode 100644 mdk-stage1/slang/slstd.c delete mode 100644 mdk-stage1/slang/slstdio.c delete mode 100644 mdk-stage1/slang/slstring.c delete mode 100644 mdk-stage1/slang/slstrops.c delete mode 100644 mdk-stage1/slang/slstruct.c delete mode 100644 mdk-stage1/slang/sltermin.c delete mode 100644 mdk-stage1/slang/sltime.c delete mode 100644 mdk-stage1/slang/sltoken.c delete mode 100644 mdk-stage1/slang/sltypes.c delete mode 100644 mdk-stage1/slang/slutty.c delete mode 100644 mdk-stage1/slang/slxstrng.c delete mode 100644 mdk-stage1/stage1-data/stage1-with-busybox.tar.bz2 delete mode 100644 mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 delete mode 100644 mdk-stage1/stage1-data/stage1.tar.bz2 delete mode 100644 mdk-stage1/stage1.c delete mode 100644 mdk-stage1/stage1.h delete mode 100644 mdk-stage1/stdio-frontend.c delete mode 100644 mdk-stage1/tools.c delete mode 100644 mdk-stage1/tools.h delete mode 100644 mdk-stage1/url.c delete mode 100644 mdk-stage1/url.h (limited to 'mdk-stage1') diff --git a/mdk-stage1/.cvsignore b/mdk-stage1/.cvsignore deleted file mode 100644 index c2cd01c54..000000000 --- a/mdk-stage1/.cvsignore +++ /dev/null @@ -1,10 +0,0 @@ -init -stage1-full -stage1-cdrom -stage1-disk -stage1-network -debug.log -.depend -*.rdz* -mkinitrd_helper.tar.bz2 -hack_* diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile deleted file mode 100644 index d52b0f8da..000000000 --- a/mdk-stage1/Makefile +++ /dev/null @@ -1,240 +0,0 @@ - #****************************************************************************** - # - # mdk-stage1 - the program that will load second-stage install - # - # $Id$ - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - # Portions from Erik Troan (ewt@redhat.com) Copyright 1996 Red Hat Software - # - #***************************************************************************** - # - # Currently: - # - # ix86 - # init with minilibc - # stage1 with dietlibc except some targets - # - # ppc - # init with dietlibc - # stage1 with glibc - # - # ia64 - # init with glibc - # stage1 with glibc - # - #***************************************************************************** - - -VERSION = cooker - -top_dir = . - -include $(top_dir)/Makefile.common - - -DEFS = -DVERSION=\"$(VERSION)\" -DSPAWN_SHELL - -COMPILE = $(CC) $(DEFS) $(CFLAGS) - - - #- stage1 "loader" -ifeq (i386, $(ARCH)) -INITSRC = minilibc.c init.c -INIT_DEFS = -DINIT_HEADERS=\"minilibc.h\" -else -INITSRC = init.c -ifeq (ia64, $(ARCH)) -INIT_DEFS = -DINIT_HEADERS=\"init-libc-headers.h\" $(GLIBC_INCLUDES) -else -INIT_DEFS = -DINIT_HEADERS=\"init-libc-headers.h\" $(DIETLIBC_INCLUDES) -endif -endif - -INITOBJS = $(subst .c,.o,$(INITSRC)) - - - #- frontends -NEWT_FRONTEND_SRC = newt-frontend.c -GLIBC_NEWT_FRONTEND_LIBS = newt/libnewt.a slang/libslang.a -DIETLIBC_NEWT_FRONTEND_LIBS = $(subst .a,-DIET.a,$(GLIBC_NEWT_FRONTEND_LIBS)) - -STDIO_FRONTEND_SRC = stdio-frontend.c -GLIBC_STDIO_FRONTEND_LIBS = -DIETLIBC_STDIO_FRONTEND_LIBS = - - -FRONTEND_OBJS = $(subst .c,.o,$($(F)_FRONTEND_SRC)) - -FRONTEND_LINK = $(FRONTEND_OBJS) $($(L)_$(F)_FRONTEND_LIBS) - -ifeq (i386, $(ARCH)) -INSMOD = insmod-busybox -else -INSMOD = insmod-modutils -endif - -GLIBC_STAGE1_OWN_LIBS = $(INSMOD)/libinsmod.a mar/libmar.a bzlib/libbzlib.a -DIETLIBC_STAGE1_OWN_LIBS = $(subst .a,-DIET.a,$(GLIBC_STAGE1_OWN_LIBS)) -STAGE1_OWN_LIBS = $($(L)_STAGE1_OWN_LIBS) - - -ifeq (DIETLIBC, $(L)) -STAGE1_NETWORK_LIBS = $(top_dir)/dietlibc/bin-$(ARCH)/librpc.a -endif - -ifeq (GLIBC, $(L)) -STAGE1_NETWORK_LIBS = /usr/lib/libresolv.a -endif - - #- stage1 itself -STAGE1SRC = stage1.c log.c tools.c modules.c probing.c mount.c automatic.c frontend-common.c -CDROMSRC = cdrom.c -DISKSRC = disk.c lomount.c -NETWORKSRC = network.c nfsmount.c dhcp.c url.c dns.c adsl.c - -ALLSRC = $(INITSRC) $(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC) - - - -STAGE1OBJS-CDROM = $(subst .c,-CDROM.o,$(STAGE1SRC) $(CDROMSRC)) - -CDROM_DEFS = -DDISABLE_DISK -DDISABLE_NETWORK - - -STAGE1OBJS-DISK = $(subst .c,-DISK.o,$(STAGE1SRC) $(DISKSRC)) - -DISK_DEFS = -DDISABLE_CDROM -DDISABLE_NETWORK - - -STAGE1OBJS-NETWORK = $(subst .c,-NETWORK.o,$(STAGE1SRC) $(NETWORKSRC)) - -NETWORK_DEFS = -DDISABLE_CDROM -DDISABLE_DISK - - -STAGE1OBJS-FULL = $(subst .c,-FULL.o,$(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC)) - - -ifeq (i386, $(ARCH)) -LDFLAGS_INIT = -static -nostdlib /usr/lib/crt1.o -else -ifeq (ia64, $(ARCH)) -LDFLAGS_INIT = $(GLIBC_LDFLAGS_STAGE1) -INIT_LIBC = $(GLIBC_LIBC) -else -LDFLAGS_INIT = $(DIETLIBC_LDFLAGS_STAGE1) -INIT_LIBC = $(DIETLIBC_LIBC) -endif -endif - - -BINS = init stage1-full - -ifeq (i386, $(ARCH)) -BINS += stage1-cdrom stage1-disk stage1-network -endif - -ifneq (ia64, $(ARCH)) -DIRS = dietlibc -endif -DIRS += mar pci-resource bzlib $(INSMOD) slang newt -ifeq (i386,$(ARCH)) -DIRS += pcmcia -endif - - -ifeq (i386,$(ARCH)) -GLIBC_PCMCIA_LIB = pcmcia/libpcmcia.a -DIETLIBC_PCMCIA_LIB = $(subst .a,-DIET.a,$(GLIBC_PCMCIA_LIB)) -PCMCIA_LIB = $($(L)_PCMCIA_LIB) -PCMCIA_DEFS = -DENABLE_PCMCIA -endif - - -all: dirs $(BINS) - -dirs: - @for n in . $(DIRS); do \ - [ "$$n" = "." ] || make -C $$n ;\ - done - -init: $(INITOBJS) $(INIT_LIBC) - $(CC) $(LDFLAGS_INIT) -o $@ $^ - $(STRIPCMD) $@ - -stage1-cdrom: $(STAGE1OBJS-CDROM) $(STAGE1_OWN_LIBS) $(FRONTEND_LINK) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ - $(STRIPCMD) $@ - -stage1-disk: $(STAGE1OBJS-DISK) $(STAGE1_OWN_LIBS) $(FRONTEND_LINK) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ - $(STRIPCMD) $@ - -stage1-network: $(STAGE1OBJS-NETWORK) $(STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ - $(STRIPCMD) $@ - -stage1-full: $(STAGE1OBJS-FULL) $(STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) $(PCMCIA_LIB) $(STAGE1_LIBC) - $(CC) $(LDFLAGS_STAGE1) -o $@ $^ - $(STRIPCMD) $@ - - -$(INITOBJS): %.o: %.c - $(COMPILE) $(INIT_DEFS) -c $< - -$(STAGE1OBJS-CDROM): %-CDROM.o: %.c .depend - $(COMPILE) $(INCLUDES) $(CDROM_DEFS) -c $< -o $@ - -$(STAGE1OBJS-DISK): %-DISK.o: %.c .depend - $(COMPILE) $(INCLUDES) $(DISK_DEFS) -c $< -o $@ - -$(STAGE1OBJS-NETWORK): %-NETWORK.o: %.c .depend - $(COMPILE) $(INCLUDES) $(NETWORK_DEFS) -c $< -o $@ - -$(STAGE1OBJS-FULL): %-FULL.o: %.c .depend - $(COMPILE) $(INCLUDES) $(PCMCIA_DEFS) -c $< -o $@ - -.c.o: .depend - $(COMPILE) $(INCLUDES) -c $< - - -clean: - @for n in $(DIRS); do \ - (cd $$n; make clean) \ - done - rm -f *.o .depend *.rdz *.img $(BINS) - - -tar-mkinitrd_helper: clean - $(MAKE) -C mkinitrd_helper clean - rm -rf mkinitrd_helper-subdir - mkdir mkinitrd_helper-subdir - cd mkinitrd_helper-subdir ; cp -a ../dietlibc ../insmod-busybox ../mkinitrd_helper ../Makefile.common ../insmod.h ../log.h . ; \ - cp ../Makefile.mkinitrd_helper Makefile - tar cfj mkinitrd_helper.tar.bz2 mkinitrd_helper-subdir --exclude CVS - rm -rf mkinitrd_helper-subdir - - -.depend: - $(CPP) $(CFLAGS) -DHAVE_CONFIG_H -M $(ALLSRC) > .depend - -ifeq (.depend,$(wildcard .depend)) -include .depend -endif - - -*-CDROM.o: %-CDROM.o: %.o - -*-DISK.o: %-DISK.o: %.o - -*-NETWORK.o: %-NETWORK.o: %.o diff --git a/mdk-stage1/Makefile.common b/mdk-stage1/Makefile.common deleted file mode 100644 index 58b43bcd7..000000000 --- a/mdk-stage1/Makefile.common +++ /dev/null @@ -1,51 +0,0 @@ - # -*- makefile -*- - #****************************************************************************** - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - #***************************************************************************** - -ARCH := $(patsubst i%86,i386,$(shell uname -m)) -ARCH := $(patsubst sparc%,sparc,$(ARCH)) - - #- default lib is dietlibc (honoured by main Makefile whenever possible) -L = DIETLIBC -#L = GLIBC - - #- default frontend is newt (honoured by main Makefile whenever possible) -F = NEWT -# F = STDIO - - #- override in some situations -ifeq (ia64, $(ARCH)) -L = GLIBC -endif - - - #- flags used by all stuff -CFLAGS = -Os -pipe -Wall -Werror -fomit-frame-pointer - - -DIETLIBC_INCLUDES = -I$(top_dir)/dietlibc/include -I. -GLIBC_INCLUDES = -I. -INCLUDES = $($(L)_INCLUDES) - -GLIBC_LDFLAGS_STAGE1 = -static -DIETLIBC_LDFLAGS_STAGE1 = -nostdlib $(top_dir)/dietlibc/bin-$(ARCH)/start.o -LDFLAGS_STAGE1 = $($(L)_LDFLAGS_STAGE1) - -GLIBC_LIBC = -DIETLIBC_LIBC = $(top_dir)/dietlibc/bin-$(ARCH)/dietlibc.a -STAGE1_LIBC = $($(L)_LIBC) - -STRIPCMD = strip -R .note -R .comment - diff --git a/mdk-stage1/Makefile.mkinitrd_helper b/mdk-stage1/Makefile.mkinitrd_helper deleted file mode 100644 index 899fccb55..000000000 --- a/mdk-stage1/Makefile.mkinitrd_helper +++ /dev/null @@ -1,30 +0,0 @@ - #****************************************************************************** - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - #***************************************************************************** - - -DIRS = dietlibc insmod-busybox mkinitrd_helper - - -all: dirs - -dirs: - @for n in . $(DIRS); do \ - [ "$$n" = "." ] || make -C $$n ;\ - done - -clean: - @for n in $(DIRS); do \ - (cd $$n; make clean) \ - done diff --git a/mdk-stage1/adsl.c b/mdk-stage1/adsl.c deleted file mode 100644 index c1ecae32c..000000000 --- a/mdk-stage1/adsl.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "stage1.h" -#include "log.h" -#include "network.h" -#include "modules.h" -#include "tools.h" -#include "frontend.h" - -#include "adsl.h" - -enum return_type perform_adsl(struct interface_info * intf) -{ - char * pppd_launch[] = { "/sbin/pppd", "pty", "/sbin/pppoe -p /var/run/pppoe.conf-adsl.pid.pppoe -I eth0 -T 80 -U -m 1412", - "noipdefault", "noauth", "default-asyncmap", "defaultroute", "hide-password", "nodetach", "usepeerdns", - "local", "mtu", "1492", "mru", "1492", "noaccomp", "noccp", "nobsdcomp", "nodeflate", "nopcomp", - "novj", "novjccomp", "user", "netissimo@netissimo", "lcp-echo-interval", "20", "lcp-echo-failure", - "3", NULL }; - int fd; - - struct in_addr addr; - - if (strncmp(intf->device, "eth", 3)) { - stg1_error_message("ADSL available only for Ethernet networking (through PPPoE)."); - return RETURN_ERROR; - } - - inet_aton("10.0.0.10", &addr); - memcpy(&intf->ip, &addr, sizeof(addr)); - - inet_aton("255.255.255.0", &addr); - memcpy(&intf->netmask, &addr, sizeof(addr)); - - *((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) & - *((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask)); - - intf->is_ptp = 0; - - if (configure_net_device(intf)) { - stg1_error_message("Could not configure.."); - return RETURN_ERROR; - } - - my_insmod("ppp_generic", ANY_DRIVER_TYPE, NULL); - my_insmod("ppp_async", ANY_DRIVER_TYPE, NULL); - my_insmod("ppp_synctty", ANY_DRIVER_TYPE, NULL); - my_insmod("ppp", ANY_DRIVER_TYPE, NULL); - - stg1_info_message("Interface %s seems ready.", intf->device); - - - fd = open("/dev/tty6", O_RDWR); - if (fd == -1) { - log_message("cannot open /dev/tty6 -- no pppd"); - return RETURN_ERROR; - } - else if (access(pppd_launch[0], X_OK)) { - log_message("cannot open pppd - %s doesn't exist", pppd_launch[0]); - return RETURN_ERROR; - } - - if (!fork()) { - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - - close(fd); - setsid(); - if (ioctl(0, TIOCSCTTY, NULL)) - log_perror("could not set new controlling tty"); - - execve(pppd_launch[0], pppd_launch, grab_env()); - log_message("execve of %s failed: %s", pppd_launch[0], strerror(errno)); - } - - close(fd); - - stg1_info_message("Forked for %s.", intf->device); - - return RETURN_OK; - -} diff --git a/mdk-stage1/adsl.h b/mdk-stage1/adsl.h deleted file mode 100644 index 9d32cc631..000000000 --- a/mdk-stage1/adsl.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * View the homepage: http://us.mandrakesoft.com/~gc/html/stage1.html - * - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from GRUB -- GRand Unified Bootloader - * Copyright (C) 2000 Free Software Foundation, Inc. - * - * Itself based on etherboot-4.6.4 by Martin Renters. - * - */ - -#ifndef _ADSL_H_ -#define _ADSL_H_ - -#include "stage1.h" -#include "network.h" - -enum return_type perform_adsl(struct interface_info * intf); - -#endif diff --git a/mdk-stage1/automatic.c b/mdk-stage1/automatic.c deleted file mode 100644 index 486a829de..000000000 --- a/mdk-stage1/automatic.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * This is supposed to replace the redhat "kickstart", by name but - * also by design (less code pollution). - * - */ - - -#include -#include -#include -#include "tools.h" -#include "stage1.h" -#include "frontend.h" -#include "log.h" - -#include "automatic.h" - - -static struct param_elem * automatic_params; -static char * value_not_bound = ""; - -void grab_automatic_params(char * line) -{ - int i, p; - struct param_elem tmp_params[50]; - - i = 0; p = 0; - while (line[i] != '\0') { - char *name, *value; - int k; - int j = i; - while (line[i] != ':' && line[i] != '\0') - i++; - name = memdup(&line[j], i-j + 1); - name[i-j] = 0; - - k = i+1; - i++; - while (line[i] != ',' && line[i] != '\0') - i++; - value = memdup(&line[k], i-k + 1); - value[i-k] = 0; - - tmp_params[p].name = name; - tmp_params[p].value = value; - p++; - if (line[i] == '\0') - break; - i++; - } - - tmp_params[p++].name = NULL; - automatic_params = memdup(tmp_params, sizeof(struct param_elem) * p); - - log_message("AUTOMATIC MODE: got %d params", p-1); -} - - -char * get_auto_value(char * auto_param) -{ - struct param_elem * ptr = automatic_params; - - while (ptr->name) { - if (!strcmp(ptr->name, auto_param)) - return ptr->value; - ptr++; - } - - return value_not_bound; -} - - -enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, char * auto_param, char ** elems_auto) -{ - if (!IS_AUTOMATIC) - return ask_from_list(msg, elems, choice); - else { - char ** sav_elems = elems; - char * tmp = get_auto_value(auto_param); - while (elems && *elems) { - if (!strcmp(tmp, *elems_auto)) { - *choice = *elems; - log_message("AUTOMATIC: parameter %s for %s means returning %s", tmp, auto_param, *elems); - return RETURN_OK; - } - elems++; - elems_auto++; - } - unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ - return ask_from_list(msg, sav_elems, choice); - } -} - -enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** elems_comments, char ** choice, char * auto_param, char ** elems_auto) -{ - if (!IS_AUTOMATIC) - return ask_from_list_comments(msg, elems, elems_comments, choice); - else { - char ** sav_elems = elems; - char * tmp = get_auto_value(auto_param); - while (elems && *elems) { - if (!strcmp(tmp, *elems_auto)) { - *choice = *elems; - log_message("AUTOMATIC: parameter %s for %s means returning %s", tmp, auto_param, *elems); - return RETURN_OK; - } - elems++; - elems_auto++; - } - unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ - return ask_from_list_comments(msg, sav_elems, elems_comments, choice); - } -} - - -enum return_type ask_from_entries_auto(char *msg, char ** questions, char *** answers, int entry_size, char ** questions_auto, void (*callback_func)(char ** strings)) -{ - if (!IS_AUTOMATIC) - return ask_from_entries(msg, questions, answers, entry_size, callback_func); - else { - char * tmp_answers[50]; - int i = 0; - while (questions && *questions) { - tmp_answers[i] = get_auto_value(*questions_auto); - log_message("AUTOMATIC: question %s answers %s because of param %s", *questions, tmp_answers[i], *questions_auto); - i++; - questions++; - questions_auto++; - - } - *answers = memdup(tmp_answers, sizeof(char *) * i); - return RETURN_OK; - } -} diff --git a/mdk-stage1/automatic.h b/mdk-stage1/automatic.h deleted file mode 100644 index c2ac0a73d..000000000 --- a/mdk-stage1/automatic.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * This is supposed to replace the redhat "kickstart", by name but - * also by design (no code pollution). - * - */ - -#ifndef _AUTOMATIC_H_ -#define _AUTOMATIC_H_ - -#include "stage1.h" - -void grab_automatic_params(char * line); - -enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, char * auto_param, char ** elems_auto); -enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** elems_comments, char ** choice, char * auto_param, char ** elems_auto); -enum return_type ask_from_entries_auto(char *msg, char ** questions, char *** answers, int entry_size, char ** questions_auto, void (*callback_func)(char ** strings)); - -#endif diff --git a/mdk-stage1/bzlib/Makefile b/mdk-stage1/bzlib/Makefile deleted file mode 100644 index 6b4f29ffc..000000000 --- a/mdk-stage1/bzlib/Makefile +++ /dev/null @@ -1,55 +0,0 @@ - #****************************************************************************** - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -LIBNAME = libbzlib - -OBJS = blocksort.o bzlib.o compress.o crctable.o decompress.o huffman.o randtable.o - -DEFS = - -INCS = - - -TARGETS = $(LIBNAME).a - -ifeq (DIETLIBC, $(L)) -TARGETS += $(LIBNAME)-DIET.a -endif - -all: $(TARGETS) - -clean: - rm -f *.o *.a - -OBJS-DIET = $(subst .o,-DIET.o,$(OBJS)) - -$(LIBNAME).a: $(OBJS) - ar -cru $@ $^ - ranlib $@ - -$(LIBNAME)-DIET.a: $(OBJS-DIET) - ar -cru $@ $^ - ranlib $@ - -$(OBJS): %.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< -o $@ - -$(OBJS-DIET): %-DIET.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(DIETLIBC_INCLUDES) -c $< -o $@ diff --git a/mdk-stage1/bzlib/blocksort.c b/mdk-stage1/bzlib/blocksort.c deleted file mode 100644 index c1b78c483..000000000 --- a/mdk-stage1/bzlib/blocksort.c +++ /dev/null @@ -1,1138 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Block sorting machinery ---*/ -/*--- blocksort.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. - - To get some idea how the block sorting algorithms in this file - work, read my paper - On the Performance of BWT Sorting Algorithms - in Proceedings of the IEEE Data Compression Conference 2000, - Snowbird, Utah, USA, 27-30 March 2000. The main sort in this - file implements the algorithm called cache in the paper. ---*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - - -#include "bzlib_private.h" - -/*---------------------------------------------*/ -/*--- Fallback O(N log(N)^2) sorting ---*/ -/*--- algorithm, for repetitive blocks ---*/ -/*---------------------------------------------*/ - -/*---------------------------------------------*/ -static -__inline__ -void fallbackSimpleSort ( UInt32* fmap, - UInt32* eclass, - Int32 lo, - Int32 hi ) -{ - Int32 i, j, tmp; - UInt32 ec_tmp; - - if (lo == hi) return; - - if (hi - lo > 3) { - for ( i = hi-4; i >= lo; i-- ) { - tmp = fmap[i]; - ec_tmp = eclass[tmp]; - for ( j = i+4; j <= hi && ec_tmp > eclass[fmap[j]]; j += 4 ) - fmap[j-4] = fmap[j]; - fmap[j-4] = tmp; - } - } - - for ( i = hi-1; i >= lo; i-- ) { - tmp = fmap[i]; - ec_tmp = eclass[tmp]; - for ( j = i+1; j <= hi && ec_tmp > eclass[fmap[j]]; j++ ) - fmap[j-1] = fmap[j]; - fmap[j-1] = tmp; - } -} - - -/*---------------------------------------------*/ -#define fswap(zz1, zz2) \ - { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } - -#define fvswap(zzp1, zzp2, zzn) \ -{ \ - Int32 yyp1 = (zzp1); \ - Int32 yyp2 = (zzp2); \ - Int32 yyn = (zzn); \ - while (yyn > 0) { \ - fswap(fmap[yyp1], fmap[yyp2]); \ - yyp1++; yyp2++; yyn--; \ - } \ -} - - -#define fmin(a,b) ((a) < (b)) ? (a) : (b) - -#define fpush(lz,hz) { stackLo[sp] = lz; \ - stackHi[sp] = hz; \ - sp++; } - -#define fpop(lz,hz) { sp--; \ - lz = stackLo[sp]; \ - hz = stackHi[sp]; } - -#define FALLBACK_QSORT_SMALL_THRESH 10 -#define FALLBACK_QSORT_STACK_SIZE 100 - - -static -void fallbackQSort3 ( UInt32* fmap, - UInt32* eclass, - Int32 loSt, - Int32 hiSt ) -{ - Int32 unLo, unHi, ltLo, gtHi, n, m; - Int32 sp, lo, hi; - UInt32 med, r, r3; - Int32 stackLo[FALLBACK_QSORT_STACK_SIZE]; - Int32 stackHi[FALLBACK_QSORT_STACK_SIZE]; - - r = 0; - - sp = 0; - fpush ( loSt, hiSt ); - - while (sp > 0) { - - AssertH ( sp < FALLBACK_QSORT_STACK_SIZE, 1004 ); - - fpop ( lo, hi ); - if (hi - lo < FALLBACK_QSORT_SMALL_THRESH) { - fallbackSimpleSort ( fmap, eclass, lo, hi ); - continue; - } - - /* Random partitioning. Median of 3 sometimes fails to - avoid bad cases. Median of 9 seems to help but - looks rather expensive. This too seems to work but - is cheaper. Guidance for the magic constants - 7621 and 32768 is taken from Sedgewick's algorithms - book, chapter 35. - */ - r = ((r * 7621) + 1) % 32768; - r3 = r % 3; - if (r3 == 0) med = eclass[fmap[lo]]; else - if (r3 == 1) med = eclass[fmap[(lo+hi)>>1]]; else - med = eclass[fmap[hi]]; - - unLo = ltLo = lo; - unHi = gtHi = hi; - - while (1) { - while (1) { - if (unLo > unHi) break; - n = (Int32)eclass[fmap[unLo]] - (Int32)med; - if (n == 0) { - fswap(fmap[unLo], fmap[ltLo]); - ltLo++; unLo++; - continue; - }; - if (n > 0) break; - unLo++; - } - while (1) { - if (unLo > unHi) break; - n = (Int32)eclass[fmap[unHi]] - (Int32)med; - if (n == 0) { - fswap(fmap[unHi], fmap[gtHi]); - gtHi--; unHi--; - continue; - }; - if (n < 0) break; - unHi--; - } - if (unLo > unHi) break; - fswap(fmap[unLo], fmap[unHi]); unLo++; unHi--; - } - - AssertD ( unHi == unLo-1, "fallbackQSort3(2)" ); - - if (gtHi < ltLo) continue; - - n = fmin(ltLo-lo, unLo-ltLo); fvswap(lo, unLo-n, n); - m = fmin(hi-gtHi, gtHi-unHi); fvswap(unLo, hi-m+1, m); - - n = lo + unLo - ltLo - 1; - m = hi - (gtHi - unHi) + 1; - - if (n - lo > hi - m) { - fpush ( lo, n ); - fpush ( m, hi ); - } else { - fpush ( m, hi ); - fpush ( lo, n ); - } - } -} - -#undef fmin -#undef fpush -#undef fpop -#undef fswap -#undef fvswap -#undef FALLBACK_QSORT_SMALL_THRESH -#undef FALLBACK_QSORT_STACK_SIZE - - -/*---------------------------------------------*/ -/* Pre: - nblock > 0 - eclass exists for [0 .. nblock-1] - ((UChar*)eclass) [0 .. nblock-1] holds block - ptr exists for [0 .. nblock-1] - - Post: - ((UChar*)eclass) [0 .. nblock-1] holds block - All other areas of eclass destroyed - fmap [0 .. nblock-1] holds sorted order - bhtab [ 0 .. 2+(nblock/32) ] destroyed -*/ - -#define SET_BH(zz) bhtab[(zz) >> 5] |= (1 << ((zz) & 31)) -#define CLEAR_BH(zz) bhtab[(zz) >> 5] &= ~(1 << ((zz) & 31)) -#define ISSET_BH(zz) (bhtab[(zz) >> 5] & (1 << ((zz) & 31))) -#define WORD_BH(zz) bhtab[(zz) >> 5] -#define UNALIGNED_BH(zz) ((zz) & 0x01f) - -static -void fallbackSort ( UInt32* fmap, - UInt32* eclass, - UInt32* bhtab, - Int32 nblock, - Int32 verb ) -{ - Int32 ftab[257]; - Int32 ftabCopy[256]; - Int32 H, i, j, k, l, r, cc, cc1; - Int32 nNotDone; - Int32 nBhtab; - UChar* eclass8 = (UChar*)eclass; - - /*-- - Initial 1-char radix sort to generate - initial fmap and initial BH bits. - --*/ - if (verb >= 4) - VPrintf0 ( " bucket sorting ...\n" ); - for (i = 0; i < 257; i++) ftab[i] = 0; - for (i = 0; i < nblock; i++) ftab[eclass8[i]]++; - for (i = 0; i < 256; i++) ftabCopy[i] = ftab[i]; - for (i = 1; i < 257; i++) ftab[i] += ftab[i-1]; - - for (i = 0; i < nblock; i++) { - j = eclass8[i]; - k = ftab[j] - 1; - ftab[j] = k; - fmap[k] = i; - } - - nBhtab = 2 + (nblock / 32); - for (i = 0; i < nBhtab; i++) bhtab[i] = 0; - for (i = 0; i < 256; i++) SET_BH(ftab[i]); - - /*-- - Inductively refine the buckets. Kind-of an - "exponential radix sort" (!), inspired by the - Manber-Myers suffix array construction algorithm. - --*/ - - /*-- set sentinel bits for block-end detection --*/ - for (i = 0; i < 32; i++) { - SET_BH(nblock + 2*i); - CLEAR_BH(nblock + 2*i + 1); - } - - /*-- the log(N) loop --*/ - H = 1; - while (1) { - - if (verb >= 4) - VPrintf1 ( " depth %6d has ", H ); - - j = 0; - for (i = 0; i < nblock; i++) { - if (ISSET_BH(i)) j = i; - k = fmap[i] - H; if (k < 0) k += nblock; - eclass[k] = j; - } - - nNotDone = 0; - r = -1; - while (1) { - - /*-- find the next non-singleton bucket --*/ - k = r + 1; - while (ISSET_BH(k) && UNALIGNED_BH(k)) k++; - if (ISSET_BH(k)) { - while (WORD_BH(k) == 0xffffffff) k += 32; - while (ISSET_BH(k)) k++; - } - l = k - 1; - if (l >= nblock) break; - while (!ISSET_BH(k) && UNALIGNED_BH(k)) k++; - if (!ISSET_BH(k)) { - while (WORD_BH(k) == 0x00000000) k += 32; - while (!ISSET_BH(k)) k++; - } - r = k - 1; - if (r >= nblock) break; - - /*-- now [l, r] bracket current bucket --*/ - if (r > l) { - nNotDone += (r - l + 1); - fallbackQSort3 ( fmap, eclass, l, r ); - - /*-- scan bucket and generate header bits-- */ - cc = -1; - for (i = l; i <= r; i++) { - cc1 = eclass[fmap[i]]; - if (cc != cc1) { SET_BH(i); cc = cc1; }; - } - } - } - - if (verb >= 4) - VPrintf1 ( "%6d unresolved strings\n", nNotDone ); - - H *= 2; - if (H > nblock || nNotDone == 0) break; - } - - /*-- - Reconstruct the original block in - eclass8 [0 .. nblock-1], since the - previous phase destroyed it. - --*/ - if (verb >= 4) - VPrintf0 ( " reconstructing block ...\n" ); - j = 0; - for (i = 0; i < nblock; i++) { - while (ftabCopy[j] == 0) j++; - ftabCopy[j]--; - eclass8[fmap[i]] = (UChar)j; - } - AssertH ( j < 256, 1005 ); -} - -#undef SET_BH -#undef CLEAR_BH -#undef ISSET_BH -#undef WORD_BH -#undef UNALIGNED_BH - - -/*---------------------------------------------*/ -/*--- The main, O(N^2 log(N)) sorting ---*/ -/*--- algorithm. Faster for "normal" ---*/ -/*--- non-repetitive blocks. ---*/ -/*---------------------------------------------*/ - -/*---------------------------------------------*/ -static -__inline__ -Bool mainGtU ( UInt32 i1, - UInt32 i2, - UChar* block, - UInt16* quadrant, - UInt32 nblock, - Int32* budget ) -{ - Int32 k; - UChar c1, c2; - UInt16 s1, s2; - - AssertD ( i1 != i2, "mainGtU" ); - /* 1 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 2 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 3 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 4 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 5 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 6 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 7 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 8 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 9 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 10 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 11 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - /* 12 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - i1++; i2++; - - k = nblock + 8; - - do { - /* 1 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 2 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 3 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 4 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 5 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 6 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 7 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - /* 8 */ - c1 = block[i1]; c2 = block[i2]; - if (c1 != c2) return (c1 > c2); - s1 = quadrant[i1]; s2 = quadrant[i2]; - if (s1 != s2) return (s1 > s2); - i1++; i2++; - - if (i1 >= nblock) i1 -= nblock; - if (i2 >= nblock) i2 -= nblock; - - k -= 8; - (*budget)--; - } - while (k >= 0); - - return False; -} - - -/*---------------------------------------------*/ -/*-- - Knuth's increments seem to work better - than Incerpi-Sedgewick here. Possibly - because the number of elems to sort is - usually small, typically <= 20. ---*/ -static -Int32 incs[14] = { 1, 4, 13, 40, 121, 364, 1093, 3280, - 9841, 29524, 88573, 265720, - 797161, 2391484 }; - -static -void mainSimpleSort ( UInt32* ptr, - UChar* block, - UInt16* quadrant, - Int32 nblock, - Int32 lo, - Int32 hi, - Int32 d, - Int32* budget ) -{ - Int32 i, j, h, bigN, hp; - UInt32 v; - - bigN = hi - lo + 1; - if (bigN < 2) return; - - hp = 0; - while (incs[hp] < bigN) hp++; - hp--; - - for (; hp >= 0; hp--) { - h = incs[hp]; - - i = lo + h; - while (True) { - - /*-- copy 1 --*/ - if (i > hi) break; - v = ptr[i]; - j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget - ) ) { - ptr[j] = ptr[j-h]; - j = j - h; - if (j <= (lo + h - 1)) break; - } - ptr[j] = v; - i++; - - /*-- copy 2 --*/ - if (i > hi) break; - v = ptr[i]; - j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget - ) ) { - ptr[j] = ptr[j-h]; - j = j - h; - if (j <= (lo + h - 1)) break; - } - ptr[j] = v; - i++; - - /*-- copy 3 --*/ - if (i > hi) break; - v = ptr[i]; - j = i; - while ( mainGtU ( - ptr[j-h]+d, v+d, block, quadrant, nblock, budget - ) ) { - ptr[j] = ptr[j-h]; - j = j - h; - if (j <= (lo + h - 1)) break; - } - ptr[j] = v; - i++; - - if (*budget < 0) return; - } - } -} - - -/*---------------------------------------------*/ -/*-- - The following is an implementation of - an elegant 3-way quicksort for strings, - described in a paper "Fast Algorithms for - Sorting and Searching Strings", by Robert - Sedgewick and Jon L. Bentley. ---*/ - -#define mswap(zz1, zz2) \ - { Int32 zztmp = zz1; zz1 = zz2; zz2 = zztmp; } - -#define mvswap(zzp1, zzp2, zzn) \ -{ \ - Int32 yyp1 = (zzp1); \ - Int32 yyp2 = (zzp2); \ - Int32 yyn = (zzn); \ - while (yyn > 0) { \ - mswap(ptr[yyp1], ptr[yyp2]); \ - yyp1++; yyp2++; yyn--; \ - } \ -} - -static -__inline__ -UChar mmed3 ( UChar a, UChar b, UChar c ) -{ - UChar t; - if (a > b) { t = a; a = b; b = t; }; - if (b > c) { - b = c; - if (a > b) b = a; - } - return b; -} - -#define mmin(a,b) ((a) < (b)) ? (a) : (b) - -#define mpush(lz,hz,dz) { stackLo[sp] = lz; \ - stackHi[sp] = hz; \ - stackD [sp] = dz; \ - sp++; } - -#define mpop(lz,hz,dz) { sp--; \ - lz = stackLo[sp]; \ - hz = stackHi[sp]; \ - dz = stackD [sp]; } - - -#define mnextsize(az) (nextHi[az]-nextLo[az]) - -#define mnextswap(az,bz) \ - { Int32 tz; \ - tz = nextLo[az]; nextLo[az] = nextLo[bz]; nextLo[bz] = tz; \ - tz = nextHi[az]; nextHi[az] = nextHi[bz]; nextHi[bz] = tz; \ - tz = nextD [az]; nextD [az] = nextD [bz]; nextD [bz] = tz; } - - -#define MAIN_QSORT_SMALL_THRESH 20 -#define MAIN_QSORT_DEPTH_THRESH (BZ_N_RADIX + BZ_N_QSORT) -#define MAIN_QSORT_STACK_SIZE 100 - -static -void mainQSort3 ( UInt32* ptr, - UChar* block, - UInt16* quadrant, - Int32 nblock, - Int32 loSt, - Int32 hiSt, - Int32 dSt, - Int32* budget ) -{ - Int32 unLo, unHi, ltLo, gtHi, n, m, med; - Int32 sp, lo, hi, d; - - Int32 stackLo[MAIN_QSORT_STACK_SIZE]; - Int32 stackHi[MAIN_QSORT_STACK_SIZE]; - Int32 stackD [MAIN_QSORT_STACK_SIZE]; - - Int32 nextLo[3]; - Int32 nextHi[3]; - Int32 nextD [3]; - - sp = 0; - mpush ( loSt, hiSt, dSt ); - - while (sp > 0) { - - AssertH ( sp < MAIN_QSORT_STACK_SIZE, 1001 ); - - mpop ( lo, hi, d ); - if (hi - lo < MAIN_QSORT_SMALL_THRESH || - d > MAIN_QSORT_DEPTH_THRESH) { - mainSimpleSort ( ptr, block, quadrant, nblock, lo, hi, d, budget ); - if (*budget < 0) return; - continue; - } - - med = (Int32) - mmed3 ( block[ptr[ lo ]+d], - block[ptr[ hi ]+d], - block[ptr[ (lo+hi)>>1 ]+d] ); - - unLo = ltLo = lo; - unHi = gtHi = hi; - - while (True) { - while (True) { - if (unLo > unHi) break; - n = ((Int32)block[ptr[unLo]+d]) - med; - if (n == 0) { - mswap(ptr[unLo], ptr[ltLo]); - ltLo++; unLo++; continue; - }; - if (n > 0) break; - unLo++; - } - while (True) { - if (unLo > unHi) break; - n = ((Int32)block[ptr[unHi]+d]) - med; - if (n == 0) { - mswap(ptr[unHi], ptr[gtHi]); - gtHi--; unHi--; continue; - }; - if (n < 0) break; - unHi--; - } - if (unLo > unHi) break; - mswap(ptr[unLo], ptr[unHi]); unLo++; unHi--; - } - - AssertD ( unHi == unLo-1, "mainQSort3(2)" ); - - if (gtHi < ltLo) { - mpush(lo, hi, d+1 ); - continue; - } - - n = mmin(ltLo-lo, unLo-ltLo); mvswap(lo, unLo-n, n); - m = mmin(hi-gtHi, gtHi-unHi); mvswap(unLo, hi-m+1, m); - - n = lo + unLo - ltLo - 1; - m = hi - (gtHi - unHi) + 1; - - nextLo[0] = lo; nextHi[0] = n; nextD[0] = d; - nextLo[1] = m; nextHi[1] = hi; nextD[1] = d; - nextLo[2] = n+1; nextHi[2] = m-1; nextD[2] = d+1; - - if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); - if (mnextsize(1) < mnextsize(2)) mnextswap(1,2); - if (mnextsize(0) < mnextsize(1)) mnextswap(0,1); - - AssertD (mnextsize(0) >= mnextsize(1), "mainQSort3(8)" ); - AssertD (mnextsize(1) >= mnextsize(2), "mainQSort3(9)" ); - - mpush (nextLo[0], nextHi[0], nextD[0]); - mpush (nextLo[1], nextHi[1], nextD[1]); - mpush (nextLo[2], nextHi[2], nextD[2]); - } -} - -#undef mswap -#undef mvswap -#undef mpush -#undef mpop -#undef mmin -#undef mnextsize -#undef mnextswap -#undef MAIN_QSORT_SMALL_THRESH -#undef MAIN_QSORT_DEPTH_THRESH -#undef MAIN_QSORT_STACK_SIZE - - -/*---------------------------------------------*/ -/* Pre: - nblock > N_OVERSHOOT - block32 exists for [0 .. nblock-1 +N_OVERSHOOT] - ((UChar*)block32) [0 .. nblock-1] holds block - ptr exists for [0 .. nblock-1] - - Post: - ((UChar*)block32) [0 .. nblock-1] holds block - All other areas of block32 destroyed - ftab [0 .. 65536 ] destroyed - ptr [0 .. nblock-1] holds sorted order - if (*budget < 0), sorting was abandoned -*/ - -#define BIGFREQ(b) (ftab[((b)+1) << 8] - ftab[(b) << 8]) -#define SETMASK (1 << 21) -#define CLEARMASK (~(SETMASK)) - -static -void mainSort ( UInt32* ptr, - UChar* block, - UInt16* quadrant, - UInt32* ftab, - Int32 nblock, - Int32 verb, - Int32* budget ) -{ - Int32 i, j, k, ss, sb; - Int32 runningOrder[256]; - Bool bigDone[256]; - Int32 copyStart[256]; - Int32 copyEnd [256]; - UChar c1; - Int32 numQSorted; - UInt16 s; - if (verb >= 4) VPrintf0 ( " main sort initialise ...\n" ); - - /*-- set up the 2-byte frequency table --*/ - for (i = 65536; i >= 0; i--) ftab[i] = 0; - - j = block[0] << 8; - i = nblock-1; - for (; i >= 3; i -= 4) { - quadrant[i] = 0; - j = (j >> 8) | ( ((UInt16)block[i]) << 8); - ftab[j]++; - quadrant[i-1] = 0; - j = (j >> 8) | ( ((UInt16)block[i-1]) << 8); - ftab[j]++; - quadrant[i-2] = 0; - j = (j >> 8) | ( ((UInt16)block[i-2]) << 8); - ftab[j]++; - quadrant[i-3] = 0; - j = (j >> 8) | ( ((UInt16)block[i-3]) << 8); - ftab[j]++; - } - for (; i >= 0; i--) { - quadrant[i] = 0; - j = (j >> 8) | ( ((UInt16)block[i]) << 8); - ftab[j]++; - } - - /*-- (emphasises close relationship of block & quadrant) --*/ - for (i = 0; i < BZ_N_OVERSHOOT; i++) { - block [nblock+i] = block[i]; - quadrant[nblock+i] = 0; - } - - if (verb >= 4) VPrintf0 ( " bucket sorting ...\n" ); - - /*-- Complete the initial radix sort --*/ - for (i = 1; i <= 65536; i++) ftab[i] += ftab[i-1]; - - s = block[0] << 8; - i = nblock-1; - for (; i >= 3; i -= 4) { - s = (s >> 8) | (block[i] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i; - s = (s >> 8) | (block[i-1] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i-1; - s = (s >> 8) | (block[i-2] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i-2; - s = (s >> 8) | (block[i-3] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i-3; - } - for (; i >= 0; i--) { - s = (s >> 8) | (block[i] << 8); - j = ftab[s] -1; - ftab[s] = j; - ptr[j] = i; - } - - /*-- - Now ftab contains the first loc of every small bucket. - Calculate the running order, from smallest to largest - big bucket. - --*/ - for (i = 0; i <= 255; i++) { - bigDone [i] = False; - runningOrder[i] = i; - } - - { - Int32 vv; - Int32 h = 1; - do h = 3 * h + 1; while (h <= 256); - do { - h = h / 3; - for (i = h; i <= 255; i++) { - vv = runningOrder[i]; - j = i; - while ( BIGFREQ(runningOrder[j-h]) > BIGFREQ(vv) ) { - runningOrder[j] = runningOrder[j-h]; - j = j - h; - if (j <= (h - 1)) goto zero; - } - zero: - runningOrder[j] = vv; - } - } while (h != 1); - } - - /*-- - The main sorting loop. - --*/ - - numQSorted = 0; - - for (i = 0; i <= 255; i++) { - - /*-- - Process big buckets, starting with the least full. - Basically this is a 3-step process in which we call - mainQSort3 to sort the small buckets [ss, j], but - also make a big effort to avoid the calls if we can. - --*/ - ss = runningOrder[i]; - - /*-- - Step 1: - Complete the big bucket [ss] by quicksorting - any unsorted small buckets [ss, j], for j != ss. - Hopefully previous pointer-scanning phases have already - completed many of the small buckets [ss, j], so - we don't have to sort them at all. - --*/ - for (j = 0; j <= 255; j++) { - if (j != ss) { - sb = (ss << 8) + j; - if ( ! (ftab[sb] & SETMASK) ) { - Int32 lo = ftab[sb] & CLEARMASK; - Int32 hi = (ftab[sb+1] & CLEARMASK) - 1; - if (hi > lo) { - if (verb >= 4) - VPrintf4 ( " qsort [0x%x, 0x%x] " - "done %d this %d\n", - ss, j, numQSorted, hi - lo + 1 ); - mainQSort3 ( - ptr, block, quadrant, nblock, - lo, hi, BZ_N_RADIX, budget - ); - numQSorted += (hi - lo + 1); - if (*budget < 0) return; - } - } - ftab[sb] |= SETMASK; - } - } - - AssertH ( !bigDone[ss], 1006 ); - - /*-- - Step 2: - Now scan this big bucket [ss] so as to synthesise the - sorted order for small buckets [t, ss] for all t, - including, magically, the bucket [ss,ss] too. - This will avoid doing Real Work in subsequent Step 1's. - --*/ - { - for (j = 0; j <= 255; j++) { - copyStart[j] = ftab[(j << 8) + ss] & CLEARMASK; - copyEnd [j] = (ftab[(j << 8) + ss + 1] & CLEARMASK) - 1; - } - for (j = ftab[ss << 8] & CLEARMASK; j < copyStart[ss]; j++) { - k = ptr[j]-1; if (k < 0) k += nblock; - c1 = block[k]; - if (!bigDone[c1]) - ptr[ copyStart[c1]++ ] = k; - } - for (j = (ftab[(ss+1) << 8] & CLEARMASK) - 1; j > copyEnd[ss]; j--) { - k = ptr[j]-1; if (k < 0) k += nblock; - c1 = block[k]; - if (!bigDone[c1]) - ptr[ copyEnd[c1]-- ] = k; - } - } - - AssertH ( copyStart[ss]-1 == copyEnd[ss], 1007 ); - - for (j = 0; j <= 255; j++) ftab[(j << 8) + ss] |= SETMASK; - - /*-- - Step 3: - The [ss] big bucket is now done. Record this fact, - and update the quadrant descriptors. Remember to - update quadrants in the overshoot area too, if - necessary. The "if (i < 255)" test merely skips - this updating for the last bucket processed, since - updating for the last bucket is pointless. - - The quadrant array provides a way to incrementally - cache sort orderings, as they appear, so as to - make subsequent comparisons in fullGtU() complete - faster. For repetitive blocks this makes a big - difference (but not big enough to be able to avoid - the fallback sorting mechanism, exponential radix sort). - - The precise meaning is: at all times: - - for 0 <= i < nblock and 0 <= j <= nblock - - if block[i] != block[j], - - then the relative values of quadrant[i] and - quadrant[j] are meaningless. - - else { - if quadrant[i] < quadrant[j] - then the string starting at i lexicographically - precedes the string starting at j - - else if quadrant[i] > quadrant[j] - then the string starting at j lexicographically - precedes the string starting at i - - else - the relative ordering of the strings starting - at i and j has not yet been determined. - } - --*/ - bigDone[ss] = True; - - if (i < 255) { - Int32 bbStart = ftab[ss << 8] & CLEARMASK; - Int32 bbSize = (ftab[(ss+1) << 8] & CLEARMASK) - bbStart; - Int32 shifts = 0; - - while ((bbSize >> shifts) > 65534) shifts++; - - for (j = bbSize-1; j >= 0; j--) { - Int32 a2update = ptr[bbStart + j]; - UInt16 qVal = (UInt16)(j >> shifts); - quadrant[a2update] = qVal; - if (a2update < BZ_N_OVERSHOOT) - quadrant[a2update + nblock] = qVal; - } - AssertH ( ((bbSize-1) >> shifts) <= 65535, 1002 ); - } - - } - - if (verb >= 4) - VPrintf3 ( " %d pointers, %d sorted, %d scanned\n", - nblock, numQSorted, nblock - numQSorted ); -} - -#undef BIGFREQ -#undef SETMASK -#undef CLEARMASK - - -/*---------------------------------------------*/ -/* Pre: - nblock > 0 - arr2 exists for [0 .. nblock-1 +N_OVERSHOOT] - ((UChar*)arr2) [0 .. nblock-1] holds block - arr1 exists for [0 .. nblock-1] - - Post: - ((UChar*)arr2) [0 .. nblock-1] holds block - All other areas of block destroyed - ftab [ 0 .. 65536 ] destroyed - arr1 [0 .. nblock-1] holds sorted order -*/ -void BZ2_blockSort ( EState* s ) -{ - UInt32* ptr = s->ptr; - UChar* block = s->block; - UInt32* ftab = s->ftab; - Int32 nblock = s->nblock; - Int32 verb = s->verbosity; - Int32 wfact = s->workFactor; - UInt16* quadrant; - Int32 budget; - Int32 budgetInit; - Int32 i; - - if (nblock < 10000) { - fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); - } else { - /* Calculate the location for quadrant, remembering to get - the alignment right. Assumes that &(block[0]) is at least - 2-byte aligned -- this should be ok since block is really - the first section of arr2. - */ - i = nblock+BZ_N_OVERSHOOT; - if (i & 1) i++; - quadrant = (UInt16*)(&(block[i])); - - /* (wfact-1) / 3 puts the default-factor-30 - transition point at very roughly the same place as - with v0.1 and v0.9.0. - Not that it particularly matters any more, since the - resulting compressed stream is now the same regardless - of whether or not we use the main sort or fallback sort. - */ - if (wfact < 1 ) wfact = 1; - if (wfact > 100) wfact = 100; - budgetInit = nblock * ((wfact-1) / 3); - budget = budgetInit; - - mainSort ( ptr, block, quadrant, ftab, nblock, verb, &budget ); - if (verb >= 3) - VPrintf3 ( " %d work, %d block, ratio %5.2f\n", - budgetInit - budget, - nblock, - (float)(budgetInit - budget) / - (float)(nblock==0 ? 1 : nblock) ); - if (budget < 0) { - if (verb >= 2) - VPrintf0 ( " too repetitive; using fallback" - " sorting algorithm\n" ); - fallbackSort ( s->arr1, s->arr2, ftab, nblock, verb ); - } - } - - s->origPtr = -1; - for (i = 0; i < s->nblock; i++) - if (ptr[i] == 0) - { s->origPtr = i; break; }; - - AssertH( s->origPtr != -1, 1003 ); -} - - -/*-------------------------------------------------------------*/ -/*--- end blocksort.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/bzlib.c b/mdk-stage1/bzlib/bzlib.c deleted file mode 100644 index ebf6e269b..000000000 --- a/mdk-stage1/bzlib/bzlib.c +++ /dev/null @@ -1,1567 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Library top-level functions. ---*/ -/*--- bzlib.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -/*-- - CHANGES - ~~~~~~~ - 0.9.0 -- original version. - - 0.9.0a/b -- no changes in this file. - - 0.9.0c - * made zero-length BZ_FLUSH work correctly in bzCompress(). - * fixed bzWrite/bzRead to ignore zero-length requests. - * fixed bzread to correctly handle read requests after EOF. - * wrong parameter order in call to bzDecompressInit in - bzBuffToBuffDecompress. Fixed. ---*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - - - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -/*--- Compression stuff ---*/ -/*---------------------------------------------------*/ - - -/*---------------------------------------------------*/ -#ifndef BZ_NO_STDIO -void BZ2_bz__AssertH__fail ( int errcode ) -{ - fprintf(stderr, - "\n\nbzip2/libbzip2: internal error number %d.\n" - "This is a bug in bzip2/libbzip2, %s.\n" - "Please report it to me at: jseward@acm.org. If this happened\n" - "when you were using some program which uses libbzip2 as a\n" - "component, you should also report this bug to the author(s)\n" - "of that program. Please make an effort to report this bug;\n" - "timely and accurate bug reports eventually lead to higher\n" - "quality software. Thanks. Julian Seward, 21 March 2000.\n\n", - errcode, - BZ2_bzlibVersion() - ); - exit(3); -} -#endif - - -/*---------------------------------------------------*/ -static -int bz_config_ok ( void ) -{ - if (sizeof(int) != 4) return 0; - if (sizeof(short) != 2) return 0; - if (sizeof(char) != 1) return 0; - return 1; -} - - -/*---------------------------------------------------*/ -static -void* default_bzalloc ( void* opaque, Int32 items, Int32 size ) -{ - void* v = malloc ( items * size ); - return v; -} - -static -void default_bzfree ( void* opaque, void* addr ) -{ - if (addr != NULL) free ( addr ); -} - - -/*---------------------------------------------------*/ -static -void prepare_new_block ( EState* s ) -{ - Int32 i; - s->nblock = 0; - s->numZ = 0; - s->state_out_pos = 0; - BZ_INITIALISE_CRC ( s->blockCRC ); - for (i = 0; i < 256; i++) s->inUse[i] = False; - s->blockNo++; -} - - -/*---------------------------------------------------*/ -static -void init_RL ( EState* s ) -{ - s->state_in_ch = 256; - s->state_in_len = 0; -} - - -static -Bool isempty_RL ( EState* s ) -{ - if (s->state_in_ch < 256 && s->state_in_len > 0) - return False; else - return True; -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzCompressInit) - ( bz_stream* strm, - int blockSize100k, - int verbosity, - int workFactor ) -{ - Int32 n; - EState* s; - - if (!bz_config_ok()) return BZ_CONFIG_ERROR; - - if (strm == NULL || - blockSize100k < 1 || blockSize100k > 9 || - workFactor < 0 || workFactor > 250) - return BZ_PARAM_ERROR; - - if (workFactor == 0) workFactor = 30; - if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; - if (strm->bzfree == NULL) strm->bzfree = default_bzfree; - - s = BZALLOC( sizeof(EState) ); - if (s == NULL) return BZ_MEM_ERROR; - s->strm = strm; - - s->arr1 = NULL; - s->arr2 = NULL; - s->ftab = NULL; - - n = 100000 * blockSize100k; - s->arr1 = BZALLOC( n * sizeof(UInt32) ); - s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) ); - s->ftab = BZALLOC( 65537 * sizeof(UInt32) ); - - if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) { - if (s->arr1 != NULL) BZFREE(s->arr1); - if (s->arr2 != NULL) BZFREE(s->arr2); - if (s->ftab != NULL) BZFREE(s->ftab); - if (s != NULL) BZFREE(s); - return BZ_MEM_ERROR; - } - - s->blockNo = 0; - s->state = BZ_S_INPUT; - s->mode = BZ_M_RUNNING; - s->combinedCRC = 0; - s->blockSize100k = blockSize100k; - s->nblockMAX = 100000 * blockSize100k - 19; - s->verbosity = verbosity; - s->workFactor = workFactor; - - s->block = (UChar*)s->arr2; - s->mtfv = (UInt16*)s->arr1; - s->zbits = NULL; - s->ptr = (UInt32*)s->arr1; - - strm->state = s; - strm->total_in_lo32 = 0; - strm->total_in_hi32 = 0; - strm->total_out_lo32 = 0; - strm->total_out_hi32 = 0; - init_RL ( s ); - prepare_new_block ( s ); - return BZ_OK; -} - - -/*---------------------------------------------------*/ -static -void add_pair_to_block ( EState* s ) -{ - Int32 i; - UChar ch = (UChar)(s->state_in_ch); - for (i = 0; i < s->state_in_len; i++) { - BZ_UPDATE_CRC( s->blockCRC, ch ); - } - s->inUse[s->state_in_ch] = True; - switch (s->state_in_len) { - case 1: - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - case 2: - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - case 3: - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - break; - default: - s->inUse[s->state_in_len-4] = True; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = (UChar)ch; s->nblock++; - s->block[s->nblock] = ((UChar)(s->state_in_len-4)); - s->nblock++; - break; - } -} - - -/*---------------------------------------------------*/ -static -void flush_RL ( EState* s ) -{ - if (s->state_in_ch < 256) add_pair_to_block ( s ); - init_RL ( s ); -} - - -/*---------------------------------------------------*/ -#define ADD_CHAR_TO_BLOCK(zs,zchh0) \ -{ \ - UInt32 zchh = (UInt32)(zchh0); \ - /*-- fast track the common case --*/ \ - if (zchh != zs->state_in_ch && \ - zs->state_in_len == 1) { \ - UChar ch = (UChar)(zs->state_in_ch); \ - BZ_UPDATE_CRC( zs->blockCRC, ch ); \ - zs->inUse[zs->state_in_ch] = True; \ - zs->block[zs->nblock] = (UChar)ch; \ - zs->nblock++; \ - zs->state_in_ch = zchh; \ - } \ - else \ - /*-- general, uncommon cases --*/ \ - if (zchh != zs->state_in_ch || \ - zs->state_in_len == 255) { \ - if (zs->state_in_ch < 256) \ - add_pair_to_block ( zs ); \ - zs->state_in_ch = zchh; \ - zs->state_in_len = 1; \ - } else { \ - zs->state_in_len++; \ - } \ -} - - -/*---------------------------------------------------*/ -static -Bool copy_input_until_stop ( EState* s ) -{ - Bool progress_in = False; - - if (s->mode == BZ_M_RUNNING) { - - /*-- fast track the common case --*/ - while (True) { - /*-- block full? --*/ - if (s->nblock >= s->nblockMAX) break; - /*-- no input? --*/ - if (s->strm->avail_in == 0) break; - progress_in = True; - ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); - s->strm->next_in++; - s->strm->avail_in--; - s->strm->total_in_lo32++; - if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; - } - - } else { - - /*-- general, uncommon case --*/ - while (True) { - /*-- block full? --*/ - if (s->nblock >= s->nblockMAX) break; - /*-- no input? --*/ - if (s->strm->avail_in == 0) break; - /*-- flush/finish end? --*/ - if (s->avail_in_expect == 0) break; - progress_in = True; - ADD_CHAR_TO_BLOCK ( s, (UInt32)(*((UChar*)(s->strm->next_in))) ); - s->strm->next_in++; - s->strm->avail_in--; - s->strm->total_in_lo32++; - if (s->strm->total_in_lo32 == 0) s->strm->total_in_hi32++; - s->avail_in_expect--; - } - } - return progress_in; -} - - -/*---------------------------------------------------*/ -static -Bool copy_output_until_stop ( EState* s ) -{ - Bool progress_out = False; - - while (True) { - - /*-- no output space? --*/ - if (s->strm->avail_out == 0) break; - - /*-- block done? --*/ - if (s->state_out_pos >= s->numZ) break; - - progress_out = True; - *(s->strm->next_out) = s->zbits[s->state_out_pos]; - s->state_out_pos++; - s->strm->avail_out--; - s->strm->next_out++; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - return progress_out; -} - - -/*---------------------------------------------------*/ -static -Bool handle_compress ( bz_stream* strm ) -{ - Bool progress_in = False; - Bool progress_out = False; - EState* s = strm->state; - - while (True) { - - if (s->state == BZ_S_OUTPUT) { - progress_out |= copy_output_until_stop ( s ); - if (s->state_out_pos < s->numZ) break; - if (s->mode == BZ_M_FINISHING && - s->avail_in_expect == 0 && - isempty_RL(s)) break; - prepare_new_block ( s ); - s->state = BZ_S_INPUT; - if (s->mode == BZ_M_FLUSHING && - s->avail_in_expect == 0 && - isempty_RL(s)) break; - } - - if (s->state == BZ_S_INPUT) { - progress_in |= copy_input_until_stop ( s ); - if (s->mode != BZ_M_RUNNING && s->avail_in_expect == 0) { - flush_RL ( s ); - BZ2_compressBlock ( s, (Bool)(s->mode == BZ_M_FINISHING) ); - s->state = BZ_S_OUTPUT; - } - else - if (s->nblock >= s->nblockMAX) { - BZ2_compressBlock ( s, False ); - s->state = BZ_S_OUTPUT; - } - else - if (s->strm->avail_in == 0) { - break; - } - } - - } - - return progress_in || progress_out; -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action ) -{ - Bool progress; - EState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - preswitch: - switch (s->mode) { - - case BZ_M_IDLE: - return BZ_SEQUENCE_ERROR; - - case BZ_M_RUNNING: - if (action == BZ_RUN) { - progress = handle_compress ( strm ); - return progress ? BZ_RUN_OK : BZ_PARAM_ERROR; - } - else - if (action == BZ_FLUSH) { - s->avail_in_expect = strm->avail_in; - s->mode = BZ_M_FLUSHING; - goto preswitch; - } - else - if (action == BZ_FINISH) { - s->avail_in_expect = strm->avail_in; - s->mode = BZ_M_FINISHING; - goto preswitch; - } - else - return BZ_PARAM_ERROR; - - case BZ_M_FLUSHING: - if (action != BZ_FLUSH) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect != s->strm->avail_in) - return BZ_SEQUENCE_ERROR; - progress = handle_compress ( strm ); - if (s->avail_in_expect > 0 || !isempty_RL(s) || - s->state_out_pos < s->numZ) return BZ_FLUSH_OK; - s->mode = BZ_M_RUNNING; - return BZ_RUN_OK; - - case BZ_M_FINISHING: - if (action != BZ_FINISH) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect != s->strm->avail_in) - return BZ_SEQUENCE_ERROR; - progress = handle_compress ( strm ); - if (!progress) return BZ_SEQUENCE_ERROR; - if (s->avail_in_expect > 0 || !isempty_RL(s) || - s->state_out_pos < s->numZ) return BZ_FINISH_OK; - s->mode = BZ_M_IDLE; - return BZ_STREAM_END; - } - return BZ_OK; /*--not reached--*/ -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm ) -{ - EState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - if (s->arr1 != NULL) BZFREE(s->arr1); - if (s->arr2 != NULL) BZFREE(s->arr2); - if (s->ftab != NULL) BZFREE(s->ftab); - BZFREE(strm->state); - - strm->state = NULL; - - return BZ_OK; -} - - -/*---------------------------------------------------*/ -/*--- Decompression stuff ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompressInit) - ( bz_stream* strm, - int verbosity, - int small ) -{ - DState* s; - - if (!bz_config_ok()) return BZ_CONFIG_ERROR; - - if (strm == NULL) return BZ_PARAM_ERROR; - if (small != 0 && small != 1) return BZ_PARAM_ERROR; - if (verbosity < 0 || verbosity > 4) return BZ_PARAM_ERROR; - - if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc; - if (strm->bzfree == NULL) strm->bzfree = default_bzfree; - - s = BZALLOC( sizeof(DState) ); - if (s == NULL) return BZ_MEM_ERROR; - s->strm = strm; - strm->state = s; - s->state = BZ_X_MAGIC_1; - s->bsLive = 0; - s->bsBuff = 0; - s->calculatedCombinedCRC = 0; - strm->total_in_lo32 = 0; - strm->total_in_hi32 = 0; - strm->total_out_lo32 = 0; - strm->total_out_hi32 = 0; - s->smallDecompress = (Bool)small; - s->ll4 = NULL; - s->ll16 = NULL; - s->tt = NULL; - s->currBlockNo = 0; - s->verbosity = verbosity; - - return BZ_OK; -} - - -/*---------------------------------------------------*/ -static -void unRLE_obuf_to_output_FAST ( DState* s ) -{ - UChar k1; - - if (s->blockRandomised) { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return; - - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_FAST(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_FAST(s->k0); BZ_RAND_UPD_MASK; - s->k0 ^= BZ_RAND_MASK; s->nblock_used++; - } - - } else { - - /* restore */ - UInt32 c_calculatedBlockCRC = s->calculatedBlockCRC; - UChar c_state_out_ch = s->state_out_ch; - Int32 c_state_out_len = s->state_out_len; - Int32 c_nblock_used = s->nblock_used; - Int32 c_k0 = s->k0; - UInt32* c_tt = s->tt; - UInt32 c_tPos = s->tPos; - char* cs_next_out = s->strm->next_out; - unsigned int cs_avail_out = s->strm->avail_out; - /* end restore */ - - UInt32 avail_out_INIT = cs_avail_out; - Int32 s_save_nblockPP = s->save_nblock+1; - unsigned int total_out_lo32_old; - - while (True) { - - /* try to finish existing run */ - if (c_state_out_len > 0) { - while (True) { - if (cs_avail_out == 0) goto return_notr; - if (c_state_out_len == 1) break; - *( (UChar*)(cs_next_out) ) = c_state_out_ch; - BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); - c_state_out_len--; - cs_next_out++; - cs_avail_out--; - } - s_state_out_len_eq_one: - { - if (cs_avail_out == 0) { - c_state_out_len = 1; goto return_notr; - }; - *( (UChar*)(cs_next_out) ) = c_state_out_ch; - BZ_UPDATE_CRC ( c_calculatedBlockCRC, c_state_out_ch ); - cs_next_out++; - cs_avail_out--; - } - } - /* can a new run be started? */ - if (c_nblock_used == s_save_nblockPP) { - c_state_out_len = 0; goto return_notr; - }; - c_state_out_ch = c_k0; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (k1 != c_k0) { - c_k0 = k1; goto s_state_out_len_eq_one; - }; - if (c_nblock_used == s_save_nblockPP) - goto s_state_out_len_eq_one; - - c_state_out_len = 2; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (c_nblock_used == s_save_nblockPP) continue; - if (k1 != c_k0) { c_k0 = k1; continue; }; - - c_state_out_len = 3; - BZ_GET_FAST_C(k1); c_nblock_used++; - if (c_nblock_used == s_save_nblockPP) continue; - if (k1 != c_k0) { c_k0 = k1; continue; }; - - BZ_GET_FAST_C(k1); c_nblock_used++; - c_state_out_len = ((Int32)k1) + 4; - BZ_GET_FAST_C(c_k0); c_nblock_used++; - } - - return_notr: - total_out_lo32_old = s->strm->total_out_lo32; - s->strm->total_out_lo32 += (avail_out_INIT - cs_avail_out); - if (s->strm->total_out_lo32 < total_out_lo32_old) - s->strm->total_out_hi32++; - - /* save */ - s->calculatedBlockCRC = c_calculatedBlockCRC; - s->state_out_ch = c_state_out_ch; - s->state_out_len = c_state_out_len; - s->nblock_used = c_nblock_used; - s->k0 = c_k0; - s->tt = c_tt; - s->tPos = c_tPos; - s->strm->next_out = cs_next_out; - s->strm->avail_out = cs_avail_out; - /* end save */ - } -} - - - -/*---------------------------------------------------*/ -__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab ) -{ - Int32 nb, na, mid; - nb = 0; - na = 256; - do { - mid = (nb + na) >> 1; - if (indx >= cftab[mid]) nb = mid; else na = mid; - } - while (na - nb != 1); - return nb; -} - - -/*---------------------------------------------------*/ -static -void unRLE_obuf_to_output_SMALL ( DState* s ) -{ - UChar k1; - - if (s->blockRandomised) { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return; - - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_SMALL(k1); BZ_RAND_UPD_MASK; - k1 ^= BZ_RAND_MASK; s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_SMALL(s->k0); BZ_RAND_UPD_MASK; - s->k0 ^= BZ_RAND_MASK; s->nblock_used++; - } - - } else { - - while (True) { - /* try to finish existing run */ - while (True) { - if (s->strm->avail_out == 0) return; - if (s->state_out_len == 0) break; - *( (UChar*)(s->strm->next_out) ) = s->state_out_ch; - BZ_UPDATE_CRC ( s->calculatedBlockCRC, s->state_out_ch ); - s->state_out_len--; - s->strm->next_out++; - s->strm->avail_out--; - s->strm->total_out_lo32++; - if (s->strm->total_out_lo32 == 0) s->strm->total_out_hi32++; - } - - /* can a new run be started? */ - if (s->nblock_used == s->save_nblock+1) return; - - s->state_out_len = 1; - s->state_out_ch = s->k0; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 2; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - s->state_out_len = 3; - BZ_GET_SMALL(k1); s->nblock_used++; - if (s->nblock_used == s->save_nblock+1) continue; - if (k1 != s->k0) { s->k0 = k1; continue; }; - - BZ_GET_SMALL(k1); s->nblock_used++; - s->state_out_len = ((Int32)k1) + 4; - BZ_GET_SMALL(s->k0); s->nblock_used++; - } - - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompress) ( bz_stream *strm ) -{ - DState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - while (True) { - if (s->state == BZ_X_IDLE) return BZ_SEQUENCE_ERROR; - if (s->state == BZ_X_OUTPUT) { - if (s->smallDecompress) - unRLE_obuf_to_output_SMALL ( s ); else - unRLE_obuf_to_output_FAST ( s ); - if (s->nblock_used == s->save_nblock+1 && s->state_out_len == 0) { - BZ_FINALISE_CRC ( s->calculatedBlockCRC ); - if (s->verbosity >= 3) - VPrintf2 ( " {0x%x, 0x%x}", s->storedBlockCRC, - s->calculatedBlockCRC ); - if (s->verbosity >= 2) VPrintf0 ( "]" ); - if (s->calculatedBlockCRC != s->storedBlockCRC) - return BZ_DATA_ERROR; - s->calculatedCombinedCRC - = (s->calculatedCombinedCRC << 1) | - (s->calculatedCombinedCRC >> 31); - s->calculatedCombinedCRC ^= s->calculatedBlockCRC; - s->state = BZ_X_BLKHDR_1; - } else { - return BZ_OK; - } - } - if (s->state >= BZ_X_MAGIC_1) { - Int32 r = BZ2_decompress ( s ); - if (r == BZ_STREAM_END) { - if (s->verbosity >= 3) - VPrintf2 ( "\n combined CRCs: stored = 0x%x, computed = 0x%x", - s->storedCombinedCRC, s->calculatedCombinedCRC ); - if (s->calculatedCombinedCRC != s->storedCombinedCRC) - return BZ_DATA_ERROR; - return r; - } - if (s->state != BZ_X_OUTPUT) return r; - } - } - - AssertH ( 0, 6001 ); - - return 0; /*NOTREACHED*/ -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm ) -{ - DState* s; - if (strm == NULL) return BZ_PARAM_ERROR; - s = strm->state; - if (s == NULL) return BZ_PARAM_ERROR; - if (s->strm != strm) return BZ_PARAM_ERROR; - - if (s->tt != NULL) BZFREE(s->tt); - if (s->ll16 != NULL) BZFREE(s->ll16); - if (s->ll4 != NULL) BZFREE(s->ll4); - - BZFREE(strm->state); - strm->state = NULL; - - return BZ_OK; -} - - -#ifndef BZ_NO_STDIO -/*---------------------------------------------------*/ -/*--- File I/O stuff ---*/ -/*---------------------------------------------------*/ - -#define BZ_SETERR(eee) \ -{ \ - if (bzerror != NULL) *bzerror = eee; \ - if (bzf != NULL) bzf->lastErr = eee; \ -} - -typedef - struct { - FILE* handle; - Char buf[BZ_MAX_UNUSED]; - Int32 bufN; - Bool writing; - bz_stream strm; - Int32 lastErr; - Bool initialisedOk; - } - bzFile; - - -/*---------------------------------------------*/ -static Bool myfeof ( FILE* f ) -{ - return feof(f) ? True : False; -} - - -/*---------------------------------------------------*/ -BZFILE* BZ_API(BZ2_bzWriteOpen) - ( int* bzerror, - FILE* f, - int blockSize100k, - int verbosity, - int workFactor ) -{ - Int32 ret; - bzFile* bzf = NULL; - - BZ_SETERR(BZ_OK); - - if (f == NULL || - (blockSize100k < 1 || blockSize100k > 9) || - (workFactor < 0 || workFactor > 250) || - (verbosity < 0 || verbosity > 4)) - { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; - - if (ferror(f)) - { BZ_SETERR(BZ_IO_ERROR); return NULL; }; - - bzf = malloc ( sizeof(bzFile) ); - if (bzf == NULL) - { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; - - BZ_SETERR(BZ_OK); - bzf->initialisedOk = False; - bzf->bufN = 0; - bzf->handle = f; - bzf->writing = True; - bzf->strm.bzalloc = NULL; - bzf->strm.bzfree = NULL; - bzf->strm.opaque = NULL; - - if (workFactor == 0) workFactor = 30; - ret = BZ2_bzCompressInit ( &(bzf->strm), blockSize100k, - verbosity, workFactor ); - if (ret != BZ_OK) - { BZ_SETERR(ret); free(bzf); return NULL; }; - - bzf->strm.avail_in = 0; - bzf->initialisedOk = True; - return bzf; -} - - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzWrite) - ( int* bzerror, - BZFILE* b, - void* buf, - int len ) -{ - Int32 n, n2, ret; - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - if (bzf == NULL || buf == NULL || len < 0) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - if (!(bzf->writing)) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - - if (len == 0) - { BZ_SETERR(BZ_OK); return; }; - - bzf->strm.avail_in = len; - bzf->strm.next_in = buf; - - while (True) { - bzf->strm.avail_out = BZ_MAX_UNUSED; - bzf->strm.next_out = bzf->buf; - ret = BZ2_bzCompress ( &(bzf->strm), BZ_RUN ); - if (ret != BZ_RUN_OK) - { BZ_SETERR(ret); return; }; - - if (bzf->strm.avail_out < BZ_MAX_UNUSED) { - n = BZ_MAX_UNUSED - bzf->strm.avail_out; - n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), - n, bzf->handle ); - if (n != n2 || ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (bzf->strm.avail_in == 0) - { BZ_SETERR(BZ_OK); return; }; - } -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzWriteClose) - ( int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in, - unsigned int* nbytes_out ) -{ - BZ2_bzWriteClose64 ( bzerror, b, abandon, - nbytes_in, NULL, nbytes_out, NULL ); -} - - -void BZ_API(BZ2_bzWriteClose64) - ( int* bzerror, - BZFILE* b, - int abandon, - unsigned int* nbytes_in_lo32, - unsigned int* nbytes_in_hi32, - unsigned int* nbytes_out_lo32, - unsigned int* nbytes_out_hi32 ) -{ - Int32 n, n2, ret; - bzFile* bzf = (bzFile*)b; - - if (bzf == NULL) - { BZ_SETERR(BZ_OK); return; }; - if (!(bzf->writing)) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - - if (nbytes_in_lo32 != NULL) *nbytes_in_lo32 = 0; - if (nbytes_in_hi32 != NULL) *nbytes_in_hi32 = 0; - if (nbytes_out_lo32 != NULL) *nbytes_out_lo32 = 0; - if (nbytes_out_hi32 != NULL) *nbytes_out_hi32 = 0; - - if ((!abandon) && bzf->lastErr == BZ_OK) { - while (True) { - bzf->strm.avail_out = BZ_MAX_UNUSED; - bzf->strm.next_out = bzf->buf; - ret = BZ2_bzCompress ( &(bzf->strm), BZ_FINISH ); - if (ret != BZ_FINISH_OK && ret != BZ_STREAM_END) - { BZ_SETERR(ret); return; }; - - if (bzf->strm.avail_out < BZ_MAX_UNUSED) { - n = BZ_MAX_UNUSED - bzf->strm.avail_out; - n2 = fwrite ( (void*)(bzf->buf), sizeof(UChar), - n, bzf->handle ); - if (n != n2 || ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (ret == BZ_STREAM_END) break; - } - } - - if ( !abandon && !ferror ( bzf->handle ) ) { - fflush ( bzf->handle ); - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return; }; - } - - if (nbytes_in_lo32 != NULL) - *nbytes_in_lo32 = bzf->strm.total_in_lo32; - if (nbytes_in_hi32 != NULL) - *nbytes_in_hi32 = bzf->strm.total_in_hi32; - if (nbytes_out_lo32 != NULL) - *nbytes_out_lo32 = bzf->strm.total_out_lo32; - if (nbytes_out_hi32 != NULL) - *nbytes_out_hi32 = bzf->strm.total_out_hi32; - - BZ_SETERR(BZ_OK); - BZ2_bzCompressEnd ( &(bzf->strm) ); - free ( bzf ); -} - - -/*---------------------------------------------------*/ -BZFILE* BZ_API(BZ2_bzReadOpen) - ( int* bzerror, - FILE* f, - int verbosity, - int small, - void* unused, - int nUnused ) -{ - bzFile* bzf = NULL; - int ret; - - BZ_SETERR(BZ_OK); - - if (f == NULL || - (small != 0 && small != 1) || - (verbosity < 0 || verbosity > 4) || - (unused == NULL && nUnused != 0) || - (unused != NULL && (nUnused < 0 || nUnused > BZ_MAX_UNUSED))) - { BZ_SETERR(BZ_PARAM_ERROR); return NULL; }; - - if (ferror(f)) - { BZ_SETERR(BZ_IO_ERROR); return NULL; }; - - bzf = malloc ( sizeof(bzFile) ); - if (bzf == NULL) - { BZ_SETERR(BZ_MEM_ERROR); return NULL; }; - - BZ_SETERR(BZ_OK); - - bzf->initialisedOk = False; - bzf->handle = f; - bzf->bufN = 0; - bzf->writing = False; - bzf->strm.bzalloc = NULL; - bzf->strm.bzfree = NULL; - bzf->strm.opaque = NULL; - - while (nUnused > 0) { - bzf->buf[bzf->bufN] = *((UChar*)(unused)); bzf->bufN++; - unused = ((void*)( 1 + ((UChar*)(unused)) )); - nUnused--; - } - - ret = BZ2_bzDecompressInit ( &(bzf->strm), verbosity, small ); - if (ret != BZ_OK) - { BZ_SETERR(ret); free(bzf); return NULL; }; - - bzf->strm.avail_in = bzf->bufN; - bzf->strm.next_in = bzf->buf; - - bzf->initialisedOk = True; - return bzf; -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzReadClose) ( int *bzerror, BZFILE *b ) -{ - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - if (bzf == NULL) - { BZ_SETERR(BZ_OK); return; }; - - if (bzf->writing) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - - if (bzf->initialisedOk) - (void)BZ2_bzDecompressEnd ( &(bzf->strm) ); - free ( bzf ); -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzRead) - ( int* bzerror, - BZFILE* b, - void* buf, - int len ) -{ - Int32 n, ret; - bzFile* bzf = (bzFile*)b; - - BZ_SETERR(BZ_OK); - - if (bzf == NULL || buf == NULL || len < 0) - { BZ_SETERR(BZ_PARAM_ERROR); return 0; }; - - if (bzf->writing) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return 0; }; - - if (len == 0) - { BZ_SETERR(BZ_OK); return 0; }; - - bzf->strm.avail_out = len; - bzf->strm.next_out = buf; - - while (True) { - - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return 0; }; - - if (bzf->strm.avail_in == 0 && !myfeof(bzf->handle)) { - n = fread ( bzf->buf, sizeof(UChar), - BZ_MAX_UNUSED, bzf->handle ); - if (ferror(bzf->handle)) - { BZ_SETERR(BZ_IO_ERROR); return 0; }; - bzf->bufN = n; - bzf->strm.avail_in = bzf->bufN; - bzf->strm.next_in = bzf->buf; - } - - ret = BZ2_bzDecompress ( &(bzf->strm) ); - - if (ret != BZ_OK && ret != BZ_STREAM_END) - { BZ_SETERR(ret); return 0; }; - - if (ret == BZ_OK && myfeof(bzf->handle) && - bzf->strm.avail_in == 0 && bzf->strm.avail_out > 0) - { BZ_SETERR(BZ_UNEXPECTED_EOF); return 0; }; - - if (ret == BZ_STREAM_END) - { BZ_SETERR(BZ_STREAM_END); - return len - bzf->strm.avail_out; }; - if (bzf->strm.avail_out == 0) - { BZ_SETERR(BZ_OK); return len; }; - - } - - return 0; /*not reached*/ -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzReadGetUnused) - ( int* bzerror, - BZFILE* b, - void** unused, - int* nUnused ) -{ - bzFile* bzf = (bzFile*)b; - if (bzf == NULL) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - if (bzf->lastErr != BZ_STREAM_END) - { BZ_SETERR(BZ_SEQUENCE_ERROR); return; }; - if (unused == NULL || nUnused == NULL) - { BZ_SETERR(BZ_PARAM_ERROR); return; }; - - BZ_SETERR(BZ_OK); - *nUnused = bzf->strm.avail_in; - *unused = bzf->strm.next_in; -} -#endif - - -/*---------------------------------------------------*/ -/*--- Misc convenience stuff ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzBuffToBuffCompress) - ( char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int blockSize100k, - int verbosity, - int workFactor ) -{ - bz_stream strm; - int ret; - - if (dest == NULL || destLen == NULL || - source == NULL || - blockSize100k < 1 || blockSize100k > 9 || - verbosity < 0 || verbosity > 4 || - workFactor < 0 || workFactor > 250) - return BZ_PARAM_ERROR; - - if (workFactor == 0) workFactor = 30; - strm.bzalloc = NULL; - strm.bzfree = NULL; - strm.opaque = NULL; - ret = BZ2_bzCompressInit ( &strm, blockSize100k, - verbosity, workFactor ); - if (ret != BZ_OK) return ret; - - strm.next_in = source; - strm.next_out = dest; - strm.avail_in = sourceLen; - strm.avail_out = *destLen; - - ret = BZ2_bzCompress ( &strm, BZ_FINISH ); - if (ret == BZ_FINISH_OK) goto output_overflow; - if (ret != BZ_STREAM_END) goto errhandler; - - /* normal termination */ - *destLen -= strm.avail_out; - BZ2_bzCompressEnd ( &strm ); - return BZ_OK; - - output_overflow: - BZ2_bzCompressEnd ( &strm ); - return BZ_OUTBUFF_FULL; - - errhandler: - BZ2_bzCompressEnd ( &strm ); - return ret; -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzBuffToBuffDecompress) - ( char* dest, - unsigned int* destLen, - char* source, - unsigned int sourceLen, - int small, - int verbosity ) -{ - bz_stream strm; - int ret; - - if (dest == NULL || destLen == NULL || - source == NULL || - (small != 0 && small != 1) || - verbosity < 0 || verbosity > 4) - return BZ_PARAM_ERROR; - - strm.bzalloc = NULL; - strm.bzfree = NULL; - strm.opaque = NULL; - ret = BZ2_bzDecompressInit ( &strm, verbosity, small ); - if (ret != BZ_OK) return ret; - - strm.next_in = source; - strm.next_out = dest; - strm.avail_in = sourceLen; - strm.avail_out = *destLen; - - ret = BZ2_bzDecompress ( &strm ); - if (ret == BZ_OK) goto output_overflow_or_eof; - if (ret != BZ_STREAM_END) goto errhandler; - - /* normal termination */ - *destLen -= strm.avail_out; - BZ2_bzDecompressEnd ( &strm ); - return BZ_OK; - - output_overflow_or_eof: - if (strm.avail_out > 0) { - BZ2_bzDecompressEnd ( &strm ); - return BZ_UNEXPECTED_EOF; - } else { - BZ2_bzDecompressEnd ( &strm ); - return BZ_OUTBUFF_FULL; - }; - - errhandler: - BZ2_bzDecompressEnd ( &strm ); - return ret; -} - - -/*---------------------------------------------------*/ -/*-- - Code contributed by Yoshioka Tsuneo - (QWF00133@niftyserve.or.jp/tsuneo-y@is.aist-nara.ac.jp), - to support better zlib compatibility. - This code is not _officially_ part of libbzip2 (yet); - I haven't tested it, documented it, or considered the - threading-safeness of it. - If this code breaks, please contact both Yoshioka and me. ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -/*-- - return version like "0.9.0c". ---*/ -const char * BZ_API(BZ2_bzlibVersion)(void) -{ - return BZ_VERSION; -} - - -#ifndef BZ_NO_STDIO -/*---------------------------------------------------*/ - -#if defined(_WIN32) || defined(OS2) || defined(MSDOS) -# include -# include -# define SET_BINARY_MODE(file) setmode(fileno(file),O_BINARY) -#else -# define SET_BINARY_MODE(file) -#endif -static -BZFILE * bzopen_or_bzdopen - ( const char *path, /* no use when bzdopen */ - int fd, /* no use when bzdopen */ - const char *mode, - int open_mode) /* bzopen: 0, bzdopen:1 */ -{ - int bzerr; - char unused[BZ_MAX_UNUSED]; - int blockSize100k = 9; - int writing = 0; - char mode2[10] = ""; - FILE *fp = NULL; - BZFILE *bzfp = NULL; - int verbosity = 0; - int workFactor = 30; - int smallMode = 0; - int nUnused = 0; - - if (mode == NULL) return NULL; - while (*mode) { - switch (*mode) { - case 'r': - writing = 0; break; - case 'w': - writing = 1; break; - case 's': - smallMode = 1; break; - default: - if (isdigit((int)(*mode))) { - blockSize100k = *mode-'0'; - } - } - mode++; - } - strcat(mode2, writing ? "w" : "r" ); - strcat(mode2,"b"); /* binary mode */ - - if (open_mode==0) { - if (path==NULL || strcmp(path,"")==0) { - fp = (writing ? stdout : stdin); - SET_BINARY_MODE(fp); - } else { - fp = fopen(path,mode2); - } - } else { -#ifdef BZ_STRICT_ANSI - fp = NULL; -#else - fp = fdopen(fd,mode2); -#endif - } - if (fp == NULL) return NULL; - - if (writing) { - /* Guard against total chaos and anarchy -- JRS */ - if (blockSize100k < 1) blockSize100k = 1; - if (blockSize100k > 9) blockSize100k = 9; - bzfp = BZ2_bzWriteOpen(&bzerr,fp,blockSize100k, - verbosity,workFactor); - } else { - bzfp = BZ2_bzReadOpen(&bzerr,fp,verbosity,smallMode, - unused,nUnused); - } - if (bzfp == NULL) { - if (fp != stdin && fp != stdout) fclose(fp); - return NULL; - } - return bzfp; -} - - -/*---------------------------------------------------*/ -/*-- - open file for read or write. - ex) bzopen("file","w9") - case path="" or NULL => use stdin or stdout. ---*/ -BZFILE * BZ_API(BZ2_bzopen) - ( const char *path, - const char *mode ) -{ - return bzopen_or_bzdopen(path,-1,mode,/*bzopen*/0); -} - - -/*---------------------------------------------------*/ -BZFILE * BZ_API(BZ2_bzdopen) - ( int fd, - const char *mode ) -{ - return bzopen_or_bzdopen(NULL,fd,mode,/*bzdopen*/1); -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzread) (BZFILE* b, void* buf, int len ) -{ - int bzerr, nread; - if (((bzFile*)b)->lastErr == BZ_STREAM_END) return 0; - nread = BZ2_bzRead(&bzerr,b,buf,len); - if (bzerr == BZ_OK || bzerr == BZ_STREAM_END) { - return nread; - } else { - return -1; - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzwrite) (BZFILE* b, void* buf, int len ) -{ - int bzerr; - - BZ2_bzWrite(&bzerr,b,buf,len); - if(bzerr == BZ_OK){ - return len; - }else{ - return -1; - } -} - - -/*---------------------------------------------------*/ -int BZ_API(BZ2_bzflush) (BZFILE *b) -{ - /* do nothing now... */ - return 0; -} - - -/*---------------------------------------------------*/ -void BZ_API(BZ2_bzclose) (BZFILE* b) -{ - int bzerr; - FILE *fp = ((bzFile *)b)->handle; - - if (b==NULL) {return;} - if(((bzFile*)b)->writing){ - BZ2_bzWriteClose(&bzerr,b,0,NULL,NULL); - if(bzerr != BZ_OK){ - BZ2_bzWriteClose(NULL,b,1,NULL,NULL); - } - }else{ - BZ2_bzReadClose(&bzerr,b); - } - if(fp!=stdin && fp!=stdout){ - fclose(fp); - } -} - - -/*---------------------------------------------------*/ -/*-- - return last error code ---*/ -static char *bzerrorstrings[] = { - "OK" - ,"SEQUENCE_ERROR" - ,"PARAM_ERROR" - ,"MEM_ERROR" - ,"DATA_ERROR" - ,"DATA_ERROR_MAGIC" - ,"IO_ERROR" - ,"UNEXPECTED_EOF" - ,"OUTBUFF_FULL" - ,"CONFIG_ERROR" - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ - ,"???" /* for future */ -}; - - -const char * BZ_API(BZ2_bzerror) (BZFILE *b, int *errnum) -{ - int err = ((bzFile *)b)->lastErr; - - if(err>0) err = 0; - *errnum = err; - return bzerrorstrings[err*-1]; -} -#endif - - -/*-------------------------------------------------------------*/ -/*--- end bzlib.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/bzlib_private.h b/mdk-stage1/bzlib/bzlib_private.h deleted file mode 100644 index fb51c7a1d..000000000 --- a/mdk-stage1/bzlib/bzlib_private.h +++ /dev/null @@ -1,530 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Private header file for the library. ---*/ -/*--- bzlib_private.h ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - - -#ifndef _BZLIB_PRIVATE_H -#define _BZLIB_PRIVATE_H - -#include - -#ifndef BZ_NO_STDIO -#include -#include -#include -#endif - -#include "bzlib.h" - - - -/*-- General stuff. --*/ - -#define BZ_VERSION "1.0.1, 23-June-2000" - -typedef char Char; -typedef unsigned char Bool; -typedef unsigned char UChar; -typedef int Int32; -typedef unsigned int UInt32; -typedef short Int16; -typedef unsigned short UInt16; - -#define True ((Bool)1) -#define False ((Bool)0) - -#ifndef __GNUC__ -#define __inline__ /* */ -#endif - -#ifndef BZ_NO_STDIO -extern void BZ2_bz__AssertH__fail ( int errcode ); -#define AssertH(cond,errcode) \ - { if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); } -#if BZ_DEBUG -#define AssertD(cond,msg) \ - { if (!(cond)) { \ - fprintf ( stderr, \ - "\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\ - exit(1); \ - }} -#else -#define AssertD(cond,msg) /* */ -#endif -#define VPrintf0(zf) \ - fprintf(stderr,zf) -#define VPrintf1(zf,za1) \ - fprintf(stderr,zf,za1) -#define VPrintf2(zf,za1,za2) \ - fprintf(stderr,zf,za1,za2) -#define VPrintf3(zf,za1,za2,za3) \ - fprintf(stderr,zf,za1,za2,za3) -#define VPrintf4(zf,za1,za2,za3,za4) \ - fprintf(stderr,zf,za1,za2,za3,za4) -#define VPrintf5(zf,za1,za2,za3,za4,za5) \ - fprintf(stderr,zf,za1,za2,za3,za4,za5) -#else -extern void bz_internal_error ( int errcode ); -#define AssertH(cond,errcode) \ - { if (!(cond)) bz_internal_error ( errcode ); } -#define AssertD(cond,msg) /* */ -#define VPrintf0(zf) /* */ -#define VPrintf1(zf,za1) /* */ -#define VPrintf2(zf,za1,za2) /* */ -#define VPrintf3(zf,za1,za2,za3) /* */ -#define VPrintf4(zf,za1,za2,za3,za4) /* */ -#define VPrintf5(zf,za1,za2,za3,za4,za5) /* */ -#endif - - -#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1) -#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp)) - - -/*-- Constants for the back end. --*/ - -#define BZ_MAX_ALPHA_SIZE 258 -#define BZ_MAX_CODE_LEN 23 - -#define BZ_RUNA 0 -#define BZ_RUNB 1 - -#define BZ_N_GROUPS 6 -#define BZ_G_SIZE 50 -#define BZ_N_ITERS 4 - -#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE)) - - - -/*-- Stuff for randomising repetitive blocks. --*/ - -extern Int32 BZ2_rNums[512]; - -#define BZ_RAND_DECLS \ - Int32 rNToGo; \ - Int32 rTPos \ - -#define BZ_RAND_INIT_MASK \ - s->rNToGo = 0; \ - s->rTPos = 0 \ - -#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0) - -#define BZ_RAND_UPD_MASK \ - if (s->rNToGo == 0) { \ - s->rNToGo = BZ2_rNums[s->rTPos]; \ - s->rTPos++; \ - if (s->rTPos == 512) s->rTPos = 0; \ - } \ - s->rNToGo--; - - - -/*-- Stuff for doing CRCs. --*/ - -extern UInt32 BZ2_crc32Table[256]; - -#define BZ_INITIALISE_CRC(crcVar) \ -{ \ - crcVar = 0xffffffffL; \ -} - -#define BZ_FINALISE_CRC(crcVar) \ -{ \ - crcVar = ~(crcVar); \ -} - -#define BZ_UPDATE_CRC(crcVar,cha) \ -{ \ - crcVar = (crcVar << 8) ^ \ - BZ2_crc32Table[(crcVar >> 24) ^ \ - ((UChar)cha)]; \ -} - - - -/*-- States and modes for compression. --*/ - -#define BZ_M_IDLE 1 -#define BZ_M_RUNNING 2 -#define BZ_M_FLUSHING 3 -#define BZ_M_FINISHING 4 - -#define BZ_S_OUTPUT 1 -#define BZ_S_INPUT 2 - -#define BZ_N_RADIX 2 -#define BZ_N_QSORT 12 -#define BZ_N_SHELL 18 -#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2) - - - - -/*-- Structure holding all the compression-side stuff. --*/ - -typedef - struct { - /* pointer back to the struct bz_stream */ - bz_stream* strm; - - /* mode this stream is in, and whether inputting */ - /* or outputting data */ - Int32 mode; - Int32 state; - - /* remembers avail_in when flush/finish requested */ - UInt32 avail_in_expect; - - /* for doing the block sorting */ - UInt32* arr1; - UInt32* arr2; - UInt32* ftab; - Int32 origPtr; - - /* aliases for arr1 and arr2 */ - UInt32* ptr; - UChar* block; - UInt16* mtfv; - UChar* zbits; - - /* for deciding when to use the fallback sorting algorithm */ - Int32 workFactor; - - /* run-length-encoding of the input */ - UInt32 state_in_ch; - Int32 state_in_len; - BZ_RAND_DECLS; - - /* input and output limits and current posns */ - Int32 nblock; - Int32 nblockMAX; - Int32 numZ; - Int32 state_out_pos; - - /* map of bytes used in block */ - Int32 nInUse; - Bool inUse[256]; - UChar unseqToSeq[256]; - - /* the buffer for bit stream creation */ - UInt32 bsBuff; - Int32 bsLive; - - /* block and combined CRCs */ - UInt32 blockCRC; - UInt32 combinedCRC; - - /* misc administratium */ - Int32 verbosity; - Int32 blockNo; - Int32 blockSize100k; - - /* stuff for coding the MTF values */ - Int32 nMTF; - Int32 mtfFreq [BZ_MAX_ALPHA_SIZE]; - UChar selector [BZ_MAX_SELECTORS]; - UChar selectorMtf[BZ_MAX_SELECTORS]; - - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - /* second dimension: only 3 needed; 4 makes index calculations faster */ - UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4]; - - } - EState; - - - -/*-- externs for compression. --*/ - -extern void -BZ2_blockSort ( EState* ); - -extern void -BZ2_compressBlock ( EState*, Bool ); - -extern void -BZ2_bsInitWrite ( EState* ); - -extern void -BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 ); - -extern void -BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 ); - - - -/*-- states for decompression. --*/ - -#define BZ_X_IDLE 1 -#define BZ_X_OUTPUT 2 - -#define BZ_X_MAGIC_1 10 -#define BZ_X_MAGIC_2 11 -#define BZ_X_MAGIC_3 12 -#define BZ_X_MAGIC_4 13 -#define BZ_X_BLKHDR_1 14 -#define BZ_X_BLKHDR_2 15 -#define BZ_X_BLKHDR_3 16 -#define BZ_X_BLKHDR_4 17 -#define BZ_X_BLKHDR_5 18 -#define BZ_X_BLKHDR_6 19 -#define BZ_X_BCRC_1 20 -#define BZ_X_BCRC_2 21 -#define BZ_X_BCRC_3 22 -#define BZ_X_BCRC_4 23 -#define BZ_X_RANDBIT 24 -#define BZ_X_ORIGPTR_1 25 -#define BZ_X_ORIGPTR_2 26 -#define BZ_X_ORIGPTR_3 27 -#define BZ_X_MAPPING_1 28 -#define BZ_X_MAPPING_2 29 -#define BZ_X_SELECTOR_1 30 -#define BZ_X_SELECTOR_2 31 -#define BZ_X_SELECTOR_3 32 -#define BZ_X_CODING_1 33 -#define BZ_X_CODING_2 34 -#define BZ_X_CODING_3 35 -#define BZ_X_MTF_1 36 -#define BZ_X_MTF_2 37 -#define BZ_X_MTF_3 38 -#define BZ_X_MTF_4 39 -#define BZ_X_MTF_5 40 -#define BZ_X_MTF_6 41 -#define BZ_X_ENDHDR_2 42 -#define BZ_X_ENDHDR_3 43 -#define BZ_X_ENDHDR_4 44 -#define BZ_X_ENDHDR_5 45 -#define BZ_X_ENDHDR_6 46 -#define BZ_X_CCRC_1 47 -#define BZ_X_CCRC_2 48 -#define BZ_X_CCRC_3 49 -#define BZ_X_CCRC_4 50 - - - -/*-- Constants for the fast MTF decoder. --*/ - -#define MTFA_SIZE 4096 -#define MTFL_SIZE 16 - - - -/*-- Structure holding all the decompression-side stuff. --*/ - -typedef - struct { - /* pointer back to the struct bz_stream */ - bz_stream* strm; - - /* state indicator for this stream */ - Int32 state; - - /* for doing the final run-length decoding */ - UChar state_out_ch; - Int32 state_out_len; - Bool blockRandomised; - BZ_RAND_DECLS; - - /* the buffer for bit stream reading */ - UInt32 bsBuff; - Int32 bsLive; - - /* misc administratium */ - Int32 blockSize100k; - Bool smallDecompress; - Int32 currBlockNo; - Int32 verbosity; - - /* for undoing the Burrows-Wheeler transform */ - Int32 origPtr; - UInt32 tPos; - Int32 k0; - Int32 unzftab[256]; - Int32 nblock_used; - Int32 cftab[257]; - Int32 cftabCopy[257]; - - /* for undoing the Burrows-Wheeler transform (FAST) */ - UInt32 *tt; - - /* for undoing the Burrows-Wheeler transform (SMALL) */ - UInt16 *ll16; - UChar *ll4; - - /* stored and calculated CRCs */ - UInt32 storedBlockCRC; - UInt32 storedCombinedCRC; - UInt32 calculatedBlockCRC; - UInt32 calculatedCombinedCRC; - - /* map of bytes used in block */ - Int32 nInUse; - Bool inUse[256]; - Bool inUse16[16]; - UChar seqToUnseq[256]; - - /* for decoding the MTF values */ - UChar mtfa [MTFA_SIZE]; - Int32 mtfbase[256 / MTFL_SIZE]; - UChar selector [BZ_MAX_SELECTORS]; - UChar selectorMtf[BZ_MAX_SELECTORS]; - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - - Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 minLens[BZ_N_GROUPS]; - - /* save area for scalars in the main decompress code */ - Int32 save_i; - Int32 save_j; - Int32 save_t; - Int32 save_alphaSize; - Int32 save_nGroups; - Int32 save_nSelectors; - Int32 save_EOB; - Int32 save_groupNo; - Int32 save_groupPos; - Int32 save_nextSym; - Int32 save_nblockMAX; - Int32 save_nblock; - Int32 save_es; - Int32 save_N; - Int32 save_curr; - Int32 save_zt; - Int32 save_zn; - Int32 save_zvec; - Int32 save_zj; - Int32 save_gSel; - Int32 save_gMinlen; - Int32* save_gLimit; - Int32* save_gBase; - Int32* save_gPerm; - - } - DState; - - - -/*-- Macros for decompression. --*/ - -#define BZ_GET_FAST(cccc) \ - s->tPos = s->tt[s->tPos]; \ - cccc = (UChar)(s->tPos & 0xff); \ - s->tPos >>= 8; - -#define BZ_GET_FAST_C(cccc) \ - c_tPos = c_tt[c_tPos]; \ - cccc = (UChar)(c_tPos & 0xff); \ - c_tPos >>= 8; - -#define SET_LL4(i,n) \ - { if (((i) & 0x1) == 0) \ - s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \ - s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \ - } - -#define GET_LL4(i) \ - ((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF) - -#define SET_LL(i,n) \ - { s->ll16[i] = (UInt16)(n & 0x0000ffff); \ - SET_LL4(i, n >> 16); \ - } - -#define GET_LL(i) \ - (((UInt32)s->ll16[i]) | (GET_LL4(i) << 16)) - -#define BZ_GET_SMALL(cccc) \ - cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \ - s->tPos = GET_LL(s->tPos); - - -/*-- externs for decompression. --*/ - -extern Int32 -BZ2_indexIntoF ( Int32, Int32* ); - -extern Int32 -BZ2_decompress ( DState* ); - -extern void -BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*, - Int32, Int32, Int32 ); - - -#endif - - -/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/ - -#ifdef BZ_NO_STDIO -#ifndef NULL -#define NULL 0 -#endif -#endif - - -/*-------------------------------------------------------------*/ -/*--- end bzlib_private.h ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/compress.c b/mdk-stage1/bzlib/compress.c deleted file mode 100644 index 58d5abe7c..000000000 --- a/mdk-stage1/bzlib/compress.c +++ /dev/null @@ -1,720 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Compression machinery (not incl block sorting) ---*/ -/*--- compress.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -/*-- - CHANGES - ~~~~~~~ - 0.9.0 -- original version. - - 0.9.0a/b -- no changes in this file. - - 0.9.0c - * changed setting of nGroups in sendMTFValues() so as to - do a bit better on small files ---*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - - - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -/*--- Bit stream I/O ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -void BZ2_bsInitWrite ( EState* s ) -{ - s->bsLive = 0; - s->bsBuff = 0; -} - - -/*---------------------------------------------------*/ -static -void bsFinishWrite ( EState* s ) -{ - while (s->bsLive > 0) { - s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24); - s->numZ++; - s->bsBuff <<= 8; - s->bsLive -= 8; - } -} - - -/*---------------------------------------------------*/ -#define bsNEEDW(nz) \ -{ \ - while (s->bsLive >= 8) { \ - s->zbits[s->numZ] \ - = (UChar)(s->bsBuff >> 24); \ - s->numZ++; \ - s->bsBuff <<= 8; \ - s->bsLive -= 8; \ - } \ -} - - -/*---------------------------------------------------*/ -static -__inline__ -void bsW ( EState* s, Int32 n, UInt32 v ) -{ - bsNEEDW ( n ); - s->bsBuff |= (v << (32 - s->bsLive - n)); - s->bsLive += n; -} - - -/*---------------------------------------------------*/ -static -void bsPutUInt32 ( EState* s, UInt32 u ) -{ - bsW ( s, 8, (u >> 24) & 0xffL ); - bsW ( s, 8, (u >> 16) & 0xffL ); - bsW ( s, 8, (u >> 8) & 0xffL ); - bsW ( s, 8, u & 0xffL ); -} - - -/*---------------------------------------------------*/ -static -void bsPutUChar ( EState* s, UChar c ) -{ - bsW( s, 8, (UInt32)c ); -} - - -/*---------------------------------------------------*/ -/*--- The back end proper ---*/ -/*---------------------------------------------------*/ - -/*---------------------------------------------------*/ -static -void makeMaps_e ( EState* s ) -{ - Int32 i; - s->nInUse = 0; - for (i = 0; i < 256; i++) - if (s->inUse[i]) { - s->unseqToSeq[i] = s->nInUse; - s->nInUse++; - } -} - - -/*---------------------------------------------------*/ -static -void generateMTFValues ( EState* s ) -{ - UChar yy[256]; - Int32 i, j; - Int32 zPend; - Int32 wr; - Int32 EOB; - - /* - After sorting (eg, here), - s->arr1 [ 0 .. s->nblock-1 ] holds sorted order, - and - ((UChar*)s->arr2) [ 0 .. s->nblock-1 ] - holds the original block data. - - The first thing to do is generate the MTF values, - and put them in - ((UInt16*)s->arr1) [ 0 .. s->nblock-1 ]. - Because there are strictly fewer or equal MTF values - than block values, ptr values in this area are overwritten - with MTF values only when they are no longer needed. - - The final compressed bitstream is generated into the - area starting at - (UChar*) (&((UChar*)s->arr2)[s->nblock]) - - These storage aliases are set up in bzCompressInit(), - except for the last one, which is arranged in - compressBlock(). - */ - UInt32* ptr = s->ptr; - UChar* block = s->block; - UInt16* mtfv = s->mtfv; - - makeMaps_e ( s ); - EOB = s->nInUse+1; - - for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0; - - wr = 0; - zPend = 0; - for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i; - - for (i = 0; i < s->nblock; i++) { - UChar ll_i; - AssertD ( wr <= i, "generateMTFValues(1)" ); - j = ptr[i]-1; if (j < 0) j += s->nblock; - ll_i = s->unseqToSeq[block[j]]; - AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" ); - - if (yy[0] == ll_i) { - zPend++; - } else { - - if (zPend > 0) { - zPend--; - while (True) { - if (zPend & 1) { - mtfv[wr] = BZ_RUNB; wr++; - s->mtfFreq[BZ_RUNB]++; - } else { - mtfv[wr] = BZ_RUNA; wr++; - s->mtfFreq[BZ_RUNA]++; - } - if (zPend < 2) break; - zPend = (zPend - 2) / 2; - }; - zPend = 0; - } - { - register UChar rtmp; - register UChar* ryy_j; - register UChar rll_i; - rtmp = yy[1]; - yy[1] = yy[0]; - ryy_j = &(yy[1]); - rll_i = ll_i; - while ( rll_i != rtmp ) { - register UChar rtmp2; - ryy_j++; - rtmp2 = rtmp; - rtmp = *ryy_j; - *ryy_j = rtmp2; - }; - yy[0] = rtmp; - j = ryy_j - &(yy[0]); - mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++; - } - - } - } - - if (zPend > 0) { - zPend--; - while (True) { - if (zPend & 1) { - mtfv[wr] = BZ_RUNB; wr++; - s->mtfFreq[BZ_RUNB]++; - } else { - mtfv[wr] = BZ_RUNA; wr++; - s->mtfFreq[BZ_RUNA]++; - } - if (zPend < 2) break; - zPend = (zPend - 2) / 2; - }; - zPend = 0; - } - - mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++; - - s->nMTF = wr; -} - - -/*---------------------------------------------------*/ -#define BZ_LESSER_ICOST 0 -#define BZ_GREATER_ICOST 15 - -static -void sendMTFValues ( EState* s ) -{ - Int32 v, t, i, j, gs, ge, totc, bt, bc, iter; - Int32 nSelectors, alphaSize, minLen, maxLen, selCtr; - Int32 nGroups, nBytes; - - /*-- - UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - is a global since the decoder also needs it. - - Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE]; - are also globals only used in this proc. - Made global to keep stack frame size small. - --*/ - - - UInt16 cost[BZ_N_GROUPS]; - Int32 fave[BZ_N_GROUPS]; - - UInt16* mtfv = s->mtfv; - - if (s->verbosity >= 3) - VPrintf3( " %d in block, %d after MTF & 1-2 coding, " - "%d+2 syms in use\n", - s->nblock, s->nMTF, s->nInUse ); - - alphaSize = s->nInUse+2; - for (t = 0; t < BZ_N_GROUPS; t++) - for (v = 0; v < alphaSize; v++) - s->len[t][v] = BZ_GREATER_ICOST; - - /*--- Decide how many coding tables to use ---*/ - AssertH ( s->nMTF > 0, 3001 ); - if (s->nMTF < 200) nGroups = 2; else - if (s->nMTF < 600) nGroups = 3; else - if (s->nMTF < 1200) nGroups = 4; else - if (s->nMTF < 2400) nGroups = 5; else - nGroups = 6; - - /*--- Generate an initial set of coding tables ---*/ - { - Int32 nPart, remF, tFreq, aFreq; - - nPart = nGroups; - remF = s->nMTF; - gs = 0; - while (nPart > 0) { - tFreq = remF / nPart; - ge = gs-1; - aFreq = 0; - while (aFreq < tFreq && ge < alphaSize-1) { - ge++; - aFreq += s->mtfFreq[ge]; - } - - if (ge > gs - && nPart != nGroups && nPart != 1 - && ((nGroups-nPart) % 2 == 1)) { - aFreq -= s->mtfFreq[ge]; - ge--; - } - - if (s->verbosity >= 3) - VPrintf5( " initial group %d, [%d .. %d], " - "has %d syms (%4.1f%%)\n", - nPart, gs, ge, aFreq, - (100.0 * (float)aFreq) / (float)(s->nMTF) ); - - for (v = 0; v < alphaSize; v++) - if (v >= gs && v <= ge) - s->len[nPart-1][v] = BZ_LESSER_ICOST; else - s->len[nPart-1][v] = BZ_GREATER_ICOST; - - nPart--; - gs = ge+1; - remF -= aFreq; - } - } - - /*--- - Iterate up to BZ_N_ITERS times to improve the tables. - ---*/ - for (iter = 0; iter < BZ_N_ITERS; iter++) { - - for (t = 0; t < nGroups; t++) fave[t] = 0; - - for (t = 0; t < nGroups; t++) - for (v = 0; v < alphaSize; v++) - s->rfreq[t][v] = 0; - - /*--- - Set up an auxiliary length table which is used to fast-track - the common case (nGroups == 6). - ---*/ - if (nGroups == 6) { - for (v = 0; v < alphaSize; v++) { - s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v]; - s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v]; - s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v]; - } - } - - nSelectors = 0; - totc = 0; - gs = 0; - while (True) { - - /*--- Set group start & end marks. --*/ - if (gs >= s->nMTF) break; - ge = gs + BZ_G_SIZE - 1; - if (ge >= s->nMTF) ge = s->nMTF-1; - - /*-- - Calculate the cost of this group as coded - by each of the coding tables. - --*/ - for (t = 0; t < nGroups; t++) cost[t] = 0; - - if (nGroups == 6 && 50 == ge-gs+1) { - /*--- fast track the common case ---*/ - register UInt32 cost01, cost23, cost45; - register UInt16 icv; - cost01 = cost23 = cost45 = 0; - -# define BZ_ITER(nn) \ - icv = mtfv[gs+(nn)]; \ - cost01 += s->len_pack[icv][0]; \ - cost23 += s->len_pack[icv][1]; \ - cost45 += s->len_pack[icv][2]; \ - - BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4); - BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9); - BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14); - BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19); - BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24); - BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29); - BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34); - BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39); - BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44); - BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49); - -# undef BZ_ITER - - cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16; - cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16; - cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16; - - } else { - /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) { - UInt16 icv = mtfv[i]; - for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv]; - } - } - - /*-- - Find the coding table which is best for this group, - and record its identity in the selector table. - --*/ - bc = 999999999; bt = -1; - for (t = 0; t < nGroups; t++) - if (cost[t] < bc) { bc = cost[t]; bt = t; }; - totc += bc; - fave[bt]++; - s->selector[nSelectors] = bt; - nSelectors++; - - /*-- - Increment the symbol frequencies for the selected table. - --*/ - if (nGroups == 6 && 50 == ge-gs+1) { - /*--- fast track the common case ---*/ - -# define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++ - - BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4); - BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9); - BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14); - BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19); - BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24); - BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29); - BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34); - BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39); - BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44); - BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49); - -# undef BZ_ITUR - - } else { - /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) - s->rfreq[bt][ mtfv[i] ]++; - } - - gs = ge+1; - } - if (s->verbosity >= 3) { - VPrintf2 ( " pass %d: size is %d, grp uses are ", - iter+1, totc/8 ); - for (t = 0; t < nGroups; t++) - VPrintf1 ( "%d ", fave[t] ); - VPrintf0 ( "\n" ); - } - - /*-- - Recompute the tables based on the accumulated frequencies. - --*/ - for (t = 0; t < nGroups; t++) - BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]), - alphaSize, 20 ); - } - - - AssertH( nGroups < 8, 3002 ); - AssertH( nSelectors < 32768 && - nSelectors <= (2 + (900000 / BZ_G_SIZE)), - 3003 ); - - - /*--- Compute MTF values for the selectors. ---*/ - { - UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp; - for (i = 0; i < nGroups; i++) pos[i] = i; - for (i = 0; i < nSelectors; i++) { - ll_i = s->selector[i]; - j = 0; - tmp = pos[j]; - while ( ll_i != tmp ) { - j++; - tmp2 = tmp; - tmp = pos[j]; - pos[j] = tmp2; - }; - pos[0] = tmp; - s->selectorMtf[i] = j; - } - }; - - /*--- Assign actual codes for the tables. --*/ - for (t = 0; t < nGroups; t++) { - minLen = 32; - maxLen = 0; - for (i = 0; i < alphaSize; i++) { - if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; - if (s->len[t][i] < minLen) minLen = s->len[t][i]; - } - AssertH ( !(maxLen > 20), 3004 ); - AssertH ( !(minLen < 1), 3005 ); - BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]), - minLen, maxLen, alphaSize ); - } - - /*--- Transmit the mapping table. ---*/ - { - Bool inUse16[16]; - for (i = 0; i < 16; i++) { - inUse16[i] = False; - for (j = 0; j < 16; j++) - if (s->inUse[i * 16 + j]) inUse16[i] = True; - } - - nBytes = s->numZ; - for (i = 0; i < 16; i++) - if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0); - - for (i = 0; i < 16; i++) - if (inUse16[i]) - for (j = 0; j < 16; j++) { - if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0); - } - - if (s->verbosity >= 3) - VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes ); - } - - /*--- Now the selectors. ---*/ - nBytes = s->numZ; - bsW ( s, 3, nGroups ); - bsW ( s, 15, nSelectors ); - for (i = 0; i < nSelectors; i++) { - for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1); - bsW(s,1,0); - } - if (s->verbosity >= 3) - VPrintf1( "selectors %d, ", s->numZ-nBytes ); - - /*--- Now the coding tables. ---*/ - nBytes = s->numZ; - - for (t = 0; t < nGroups; t++) { - Int32 curr = s->len[t][0]; - bsW ( s, 5, curr ); - for (i = 0; i < alphaSize; i++) { - while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ }; - while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ }; - bsW ( s, 1, 0 ); - } - } - - if (s->verbosity >= 3) - VPrintf1 ( "code lengths %d, ", s->numZ-nBytes ); - - /*--- And finally, the block data proper ---*/ - nBytes = s->numZ; - selCtr = 0; - gs = 0; - while (True) { - if (gs >= s->nMTF) break; - ge = gs + BZ_G_SIZE - 1; - if (ge >= s->nMTF) ge = s->nMTF-1; - AssertH ( s->selector[selCtr] < nGroups, 3006 ); - - if (nGroups == 6 && 50 == ge-gs+1) { - /*--- fast track the common case ---*/ - UInt16 mtfv_i; - UChar* s_len_sel_selCtr - = &(s->len[s->selector[selCtr]][0]); - Int32* s_code_sel_selCtr - = &(s->code[s->selector[selCtr]][0]); - -# define BZ_ITAH(nn) \ - mtfv_i = mtfv[gs+(nn)]; \ - bsW ( s, \ - s_len_sel_selCtr[mtfv_i], \ - s_code_sel_selCtr[mtfv_i] ) - - BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4); - BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9); - BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14); - BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19); - BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24); - BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29); - BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34); - BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39); - BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44); - BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49); - -# undef BZ_ITAH - - } else { - /*--- slow version which correctly handles all situations ---*/ - for (i = gs; i <= ge; i++) { - bsW ( s, - s->len [s->selector[selCtr]] [mtfv[i]], - s->code [s->selector[selCtr]] [mtfv[i]] ); - } - } - - - gs = ge+1; - selCtr++; - } - AssertH( selCtr == nSelectors, 3007 ); - - if (s->verbosity >= 3) - VPrintf1( "codes %d\n", s->numZ-nBytes ); -} - - -/*---------------------------------------------------*/ -void BZ2_compressBlock ( EState* s, Bool is_last_block ) -{ - if (s->nblock > 0) { - - BZ_FINALISE_CRC ( s->blockCRC ); - s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31); - s->combinedCRC ^= s->blockCRC; - if (s->blockNo > 1) s->numZ = 0; - - if (s->verbosity >= 2) - VPrintf4( " block %d: crc = 0x%8x, " - "combined CRC = 0x%8x, size = %d\n", - s->blockNo, s->blockCRC, s->combinedCRC, s->nblock ); - - BZ2_blockSort ( s ); - } - - s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]); - - /*-- If this is the first block, create the stream header. --*/ - if (s->blockNo == 1) { - BZ2_bsInitWrite ( s ); - bsPutUChar ( s, 'B' ); - bsPutUChar ( s, 'Z' ); - bsPutUChar ( s, 'h' ); - bsPutUChar ( s, (UChar)('0' + s->blockSize100k) ); - } - - if (s->nblock > 0) { - - bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 ); - bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 ); - bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 ); - - /*-- Now the block's CRC, so it is in a known place. --*/ - bsPutUInt32 ( s, s->blockCRC ); - - /*-- - Now a single bit indicating (non-)randomisation. - As of version 0.9.5, we use a better sorting algorithm - which makes randomisation unnecessary. So always set - the randomised bit to 'no'. Of course, the decoder - still needs to be able to handle randomised blocks - so as to maintain backwards compatibility with - older versions of bzip2. - --*/ - bsW(s,1,0); - - bsW ( s, 24, s->origPtr ); - generateMTFValues ( s ); - sendMTFValues ( s ); - } - - - /*-- If this is the last block, add the stream trailer. --*/ - if (is_last_block) { - - bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 ); - bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 ); - bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 ); - bsPutUInt32 ( s, s->combinedCRC ); - if (s->verbosity >= 2) - VPrintf1( " final combined CRC = 0x%x\n ", s->combinedCRC ); - bsFinishWrite ( s ); - } -} - - -/*-------------------------------------------------------------*/ -/*--- end compress.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/crctable.c b/mdk-stage1/bzlib/crctable.c deleted file mode 100644 index c0ea3f769..000000000 --- a/mdk-stage1/bzlib/crctable.c +++ /dev/null @@ -1,148 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Table for doing CRCs ---*/ -/*--- crctable.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - - -#include "bzlib_private.h" - -/*-- - I think this is an implementation of the AUTODIN-II, - Ethernet & FDDI 32-bit CRC standard. Vaguely derived - from code by Rob Warnock, in Section 51 of the - comp.compression FAQ. ---*/ - -UInt32 BZ2_crc32Table[256] = { - - /*-- Ugly, innit? --*/ - - 0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L, - 0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L, - 0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L, - 0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL, - 0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L, - 0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L, - 0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L, - 0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL, - 0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L, - 0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L, - 0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L, - 0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL, - 0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L, - 0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L, - 0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L, - 0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL, - 0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL, - 0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L, - 0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L, - 0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL, - 0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL, - 0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L, - 0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L, - 0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL, - 0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL, - 0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L, - 0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L, - 0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL, - 0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL, - 0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L, - 0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L, - 0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL, - 0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L, - 0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL, - 0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL, - 0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L, - 0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L, - 0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL, - 0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL, - 0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L, - 0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L, - 0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL, - 0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL, - 0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L, - 0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L, - 0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL, - 0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL, - 0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L, - 0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L, - 0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL, - 0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L, - 0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L, - 0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L, - 0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL, - 0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L, - 0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L, - 0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L, - 0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL, - 0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L, - 0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L, - 0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L, - 0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL, - 0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L, - 0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L -}; - - -/*-------------------------------------------------------------*/ -/*--- end crctable.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/decompress.c b/mdk-stage1/bzlib/decompress.c deleted file mode 100644 index 65cf75d8f..000000000 --- a/mdk-stage1/bzlib/decompress.c +++ /dev/null @@ -1,664 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Decompression machinery ---*/ -/*--- decompress.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - - -#include "bzlib_private.h" - - -/*---------------------------------------------------*/ -static -void makeMaps_d ( DState* s ) -{ - Int32 i; - s->nInUse = 0; - for (i = 0; i < 256; i++) - if (s->inUse[i]) { - s->seqToUnseq[s->nInUse] = i; - s->nInUse++; - } -} - - -/*---------------------------------------------------*/ -#define RETURN(rrr) \ - { retVal = rrr; goto save_state_and_return; }; - -#define GET_BITS(lll,vvv,nnn) \ - case lll: s->state = lll; \ - while (True) { \ - if (s->bsLive >= nnn) { \ - UInt32 v; \ - v = (s->bsBuff >> \ - (s->bsLive-nnn)) & ((1 << nnn)-1); \ - s->bsLive -= nnn; \ - vvv = v; \ - break; \ - } \ - if (s->strm->avail_in == 0) RETURN(BZ_OK); \ - s->bsBuff \ - = (s->bsBuff << 8) | \ - ((UInt32) \ - (*((UChar*)(s->strm->next_in)))); \ - s->bsLive += 8; \ - s->strm->next_in++; \ - s->strm->avail_in--; \ - s->strm->total_in_lo32++; \ - if (s->strm->total_in_lo32 == 0) \ - s->strm->total_in_hi32++; \ - } - -#define GET_UCHAR(lll,uuu) \ - GET_BITS(lll,uuu,8) - -#define GET_BIT(lll,uuu) \ - GET_BITS(lll,uuu,1) - -/*---------------------------------------------------*/ -#define GET_MTF_VAL(label1,label2,lval) \ -{ \ - if (groupPos == 0) { \ - groupNo++; \ - if (groupNo >= nSelectors) \ - RETURN(BZ_DATA_ERROR); \ - groupPos = BZ_G_SIZE; \ - gSel = s->selector[groupNo]; \ - gMinlen = s->minLens[gSel]; \ - gLimit = &(s->limit[gSel][0]); \ - gPerm = &(s->perm[gSel][0]); \ - gBase = &(s->base[gSel][0]); \ - } \ - groupPos--; \ - zn = gMinlen; \ - GET_BITS(label1, zvec, zn); \ - while (1) { \ - if (zn > 20 /* the longest code */) \ - RETURN(BZ_DATA_ERROR); \ - if (zvec <= gLimit[zn]) break; \ - zn++; \ - GET_BIT(label2, zj); \ - zvec = (zvec << 1) | zj; \ - }; \ - if (zvec - gBase[zn] < 0 \ - || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \ - RETURN(BZ_DATA_ERROR); \ - lval = gPerm[zvec - gBase[zn]]; \ -} - - -/*---------------------------------------------------*/ -Int32 BZ2_decompress ( DState* s ) -{ - UChar uc; - Int32 retVal; - Int32 minLen, maxLen; - bz_stream* strm = s->strm; - - /* stuff that needs to be saved/restored */ - Int32 i; - Int32 j; - Int32 t; - Int32 alphaSize; - Int32 nGroups; - Int32 nSelectors; - Int32 EOB; - Int32 groupNo; - Int32 groupPos; - Int32 nextSym; - Int32 nblockMAX; - Int32 nblock; - Int32 es; - Int32 N; - Int32 curr; - Int32 zt; - Int32 zn; - Int32 zvec; - Int32 zj; - Int32 gSel; - Int32 gMinlen; - Int32* gLimit; - Int32* gBase; - Int32* gPerm; - - if (s->state == BZ_X_MAGIC_1) { - /*initialise the save area*/ - s->save_i = 0; - s->save_j = 0; - s->save_t = 0; - s->save_alphaSize = 0; - s->save_nGroups = 0; - s->save_nSelectors = 0; - s->save_EOB = 0; - s->save_groupNo = 0; - s->save_groupPos = 0; - s->save_nextSym = 0; - s->save_nblockMAX = 0; - s->save_nblock = 0; - s->save_es = 0; - s->save_N = 0; - s->save_curr = 0; - s->save_zt = 0; - s->save_zn = 0; - s->save_zvec = 0; - s->save_zj = 0; - s->save_gSel = 0; - s->save_gMinlen = 0; - s->save_gLimit = NULL; - s->save_gBase = NULL; - s->save_gPerm = NULL; - } - - /*restore from the save area*/ - i = s->save_i; - j = s->save_j; - t = s->save_t; - alphaSize = s->save_alphaSize; - nGroups = s->save_nGroups; - nSelectors = s->save_nSelectors; - EOB = s->save_EOB; - groupNo = s->save_groupNo; - groupPos = s->save_groupPos; - nextSym = s->save_nextSym; - nblockMAX = s->save_nblockMAX; - nblock = s->save_nblock; - es = s->save_es; - N = s->save_N; - curr = s->save_curr; - zt = s->save_zt; - zn = s->save_zn; - zvec = s->save_zvec; - zj = s->save_zj; - gSel = s->save_gSel; - gMinlen = s->save_gMinlen; - gLimit = s->save_gLimit; - gBase = s->save_gBase; - gPerm = s->save_gPerm; - - retVal = BZ_OK; - - switch (s->state) { - - GET_UCHAR(BZ_X_MAGIC_1, uc); - if (uc != 'B') RETURN(BZ_DATA_ERROR_MAGIC); - - GET_UCHAR(BZ_X_MAGIC_2, uc); - if (uc != 'Z') RETURN(BZ_DATA_ERROR_MAGIC); - - GET_UCHAR(BZ_X_MAGIC_3, uc) - if (uc != 'h') RETURN(BZ_DATA_ERROR_MAGIC); - - GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8) - if (s->blockSize100k < '1' || - s->blockSize100k > '9') RETURN(BZ_DATA_ERROR_MAGIC); - s->blockSize100k -= '0'; - - if (s->smallDecompress) { - s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) ); - s->ll4 = BZALLOC( - ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) - ); - if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR); - } else { - s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) ); - if (s->tt == NULL) RETURN(BZ_MEM_ERROR); - } - - GET_UCHAR(BZ_X_BLKHDR_1, uc); - - if (uc == 0x17) goto endhdr_2; - if (uc != 0x31) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_2, uc); - if (uc != 0x41) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_3, uc); - if (uc != 0x59) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_4, uc); - if (uc != 0x26) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_5, uc); - if (uc != 0x53) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_BLKHDR_6, uc); - if (uc != 0x59) RETURN(BZ_DATA_ERROR); - - s->currBlockNo++; - if (s->verbosity >= 2) - VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo ); - - s->storedBlockCRC = 0; - GET_UCHAR(BZ_X_BCRC_1, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_2, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_3, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_BCRC_4, uc); - s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc); - - GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1); - - s->origPtr = 0; - GET_UCHAR(BZ_X_ORIGPTR_1, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - GET_UCHAR(BZ_X_ORIGPTR_2, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - GET_UCHAR(BZ_X_ORIGPTR_3, uc); - s->origPtr = (s->origPtr << 8) | ((Int32)uc); - - if (s->origPtr < 0) - RETURN(BZ_DATA_ERROR); - if (s->origPtr > 10 + 100000*s->blockSize100k) - RETURN(BZ_DATA_ERROR); - - /*--- Receive the mapping table ---*/ - for (i = 0; i < 16; i++) { - GET_BIT(BZ_X_MAPPING_1, uc); - if (uc == 1) - s->inUse16[i] = True; else - s->inUse16[i] = False; - } - - for (i = 0; i < 256; i++) s->inUse[i] = False; - - for (i = 0; i < 16; i++) - if (s->inUse16[i]) - for (j = 0; j < 16; j++) { - GET_BIT(BZ_X_MAPPING_2, uc); - if (uc == 1) s->inUse[i * 16 + j] = True; - } - makeMaps_d ( s ); - if (s->nInUse == 0) RETURN(BZ_DATA_ERROR); - alphaSize = s->nInUse+2; - - /*--- Now the selectors ---*/ - GET_BITS(BZ_X_SELECTOR_1, nGroups, 3); - if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR); - GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15); - if (nSelectors < 1) RETURN(BZ_DATA_ERROR); - for (i = 0; i < nSelectors; i++) { - j = 0; - while (True) { - GET_BIT(BZ_X_SELECTOR_3, uc); - if (uc == 0) break; - j++; - if (j >= nGroups) RETURN(BZ_DATA_ERROR); - } - s->selectorMtf[i] = j; - } - - /*--- Undo the MTF values for the selectors. ---*/ - { - UChar pos[BZ_N_GROUPS], tmp, v; - for (v = 0; v < nGroups; v++) pos[v] = v; - - for (i = 0; i < nSelectors; i++) { - v = s->selectorMtf[i]; - tmp = pos[v]; - while (v > 0) { pos[v] = pos[v-1]; v--; } - pos[0] = tmp; - s->selector[i] = tmp; - } - } - - /*--- Now the coding tables ---*/ - for (t = 0; t < nGroups; t++) { - GET_BITS(BZ_X_CODING_1, curr, 5); - for (i = 0; i < alphaSize; i++) { - while (True) { - if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR); - GET_BIT(BZ_X_CODING_2, uc); - if (uc == 0) break; - GET_BIT(BZ_X_CODING_3, uc); - if (uc == 0) curr++; else curr--; - } - s->len[t][i] = curr; - } - } - - /*--- Create the Huffman decoding tables ---*/ - for (t = 0; t < nGroups; t++) { - minLen = 32; - maxLen = 0; - for (i = 0; i < alphaSize; i++) { - if (s->len[t][i] > maxLen) maxLen = s->len[t][i]; - if (s->len[t][i] < minLen) minLen = s->len[t][i]; - } - BZ2_hbCreateDecodeTables ( - &(s->limit[t][0]), - &(s->base[t][0]), - &(s->perm[t][0]), - &(s->len[t][0]), - minLen, maxLen, alphaSize - ); - s->minLens[t] = minLen; - } - - /*--- Now the MTF values ---*/ - - EOB = s->nInUse+1; - nblockMAX = 100000 * s->blockSize100k; - groupNo = -1; - groupPos = 0; - - for (i = 0; i <= 255; i++) s->unzftab[i] = 0; - - /*-- MTF init --*/ - { - Int32 ii, jj, kk; - kk = MTFA_SIZE-1; - for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) { - for (jj = MTFL_SIZE-1; jj >= 0; jj--) { - s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj); - kk--; - } - s->mtfbase[ii] = kk + 1; - } - } - /*-- end MTF init --*/ - - nblock = 0; - GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym); - - while (True) { - - if (nextSym == EOB) break; - - if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) { - - es = -1; - N = 1; - do { - if (nextSym == BZ_RUNA) es = es + (0+1) * N; else - if (nextSym == BZ_RUNB) es = es + (1+1) * N; - N = N * 2; - GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym); - } - while (nextSym == BZ_RUNA || nextSym == BZ_RUNB); - - es++; - uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ]; - s->unzftab[uc] += es; - - if (s->smallDecompress) - while (es > 0) { - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - s->ll16[nblock] = (UInt16)uc; - nblock++; - es--; - } - else - while (es > 0) { - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - s->tt[nblock] = (UInt32)uc; - nblock++; - es--; - }; - - continue; - - } else { - - if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR); - - /*-- uc = MTF ( nextSym-1 ) --*/ - { - Int32 ii, jj, kk, pp, lno, off; - UInt32 nn; - nn = (UInt32)(nextSym - 1); - - if (nn < MTFL_SIZE) { - /* avoid general-case expense */ - pp = s->mtfbase[0]; - uc = s->mtfa[pp+nn]; - while (nn > 3) { - Int32 z = pp+nn; - s->mtfa[(z) ] = s->mtfa[(z)-1]; - s->mtfa[(z)-1] = s->mtfa[(z)-2]; - s->mtfa[(z)-2] = s->mtfa[(z)-3]; - s->mtfa[(z)-3] = s->mtfa[(z)-4]; - nn -= 4; - } - while (nn > 0) { - s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; - }; - s->mtfa[pp] = uc; - } else { - /* general case */ - lno = nn / MTFL_SIZE; - off = nn % MTFL_SIZE; - pp = s->mtfbase[lno] + off; - uc = s->mtfa[pp]; - while (pp > s->mtfbase[lno]) { - s->mtfa[pp] = s->mtfa[pp-1]; pp--; - }; - s->mtfbase[lno]++; - while (lno > 0) { - s->mtfbase[lno]--; - s->mtfa[s->mtfbase[lno]] - = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1]; - lno--; - } - s->mtfbase[0]--; - s->mtfa[s->mtfbase[0]] = uc; - if (s->mtfbase[0] == 0) { - kk = MTFA_SIZE-1; - for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) { - for (jj = MTFL_SIZE-1; jj >= 0; jj--) { - s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj]; - kk--; - } - s->mtfbase[ii] = kk + 1; - } - } - } - } - /*-- end uc = MTF ( nextSym-1 ) --*/ - - s->unzftab[s->seqToUnseq[uc]]++; - if (s->smallDecompress) - s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else - s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]); - nblock++; - - GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym); - continue; - } - } - - /* Now we know what nblock is, we can do a better sanity - check on s->origPtr. - */ - if (s->origPtr < 0 || s->origPtr >= nblock) - RETURN(BZ_DATA_ERROR); - - s->state_out_len = 0; - s->state_out_ch = 0; - BZ_INITIALISE_CRC ( s->calculatedBlockCRC ); - s->state = BZ_X_OUTPUT; - if (s->verbosity >= 2) VPrintf0 ( "rt+rld" ); - - /*-- Set up cftab to facilitate generation of T^(-1) --*/ - s->cftab[0] = 0; - for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1]; - for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1]; - - if (s->smallDecompress) { - - /*-- Make a copy of cftab, used in generation of T --*/ - for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i]; - - /*-- compute the T vector --*/ - for (i = 0; i < nblock; i++) { - uc = (UChar)(s->ll16[i]); - SET_LL(i, s->cftabCopy[uc]); - s->cftabCopy[uc]++; - } - - /*-- Compute T^(-1) by pointer reversal on T --*/ - i = s->origPtr; - j = GET_LL(i); - do { - Int32 tmp = GET_LL(j); - SET_LL(j, i); - i = j; - j = tmp; - } - while (i != s->origPtr); - - s->tPos = s->origPtr; - s->nblock_used = 0; - if (s->blockRandomised) { - BZ_RAND_INIT_MASK; - BZ_GET_SMALL(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; - } else { - BZ_GET_SMALL(s->k0); s->nblock_used++; - } - - } else { - - /*-- compute the T^(-1) vector --*/ - for (i = 0; i < nblock; i++) { - uc = (UChar)(s->tt[i] & 0xff); - s->tt[s->cftab[uc]] |= (i << 8); - s->cftab[uc]++; - } - - s->tPos = s->tt[s->origPtr] >> 8; - s->nblock_used = 0; - if (s->blockRandomised) { - BZ_RAND_INIT_MASK; - BZ_GET_FAST(s->k0); s->nblock_used++; - BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; - } else { - BZ_GET_FAST(s->k0); s->nblock_used++; - } - - } - - RETURN(BZ_OK); - - - - endhdr_2: - - GET_UCHAR(BZ_X_ENDHDR_2, uc); - if (uc != 0x72) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_3, uc); - if (uc != 0x45) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_4, uc); - if (uc != 0x38) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_5, uc); - if (uc != 0x50) RETURN(BZ_DATA_ERROR); - GET_UCHAR(BZ_X_ENDHDR_6, uc); - if (uc != 0x90) RETURN(BZ_DATA_ERROR); - - s->storedCombinedCRC = 0; - GET_UCHAR(BZ_X_CCRC_1, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_2, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_3, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - GET_UCHAR(BZ_X_CCRC_4, uc); - s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc); - - s->state = BZ_X_IDLE; - RETURN(BZ_STREAM_END); - - default: AssertH ( False, 4001 ); - } - - AssertH ( False, 4002 ); - - save_state_and_return: - - s->save_i = i; - s->save_j = j; - s->save_t = t; - s->save_alphaSize = alphaSize; - s->save_nGroups = nGroups; - s->save_nSelectors = nSelectors; - s->save_EOB = EOB; - s->save_groupNo = groupNo; - s->save_groupPos = groupPos; - s->save_nextSym = nextSym; - s->save_nblockMAX = nblockMAX; - s->save_nblock = nblock; - s->save_es = es; - s->save_N = N; - s->save_curr = curr; - s->save_zt = zt; - s->save_zn = zn; - s->save_zvec = zvec; - s->save_zj = zj; - s->save_gSel = gSel; - s->save_gMinlen = gMinlen; - s->save_gLimit = gLimit; - s->save_gBase = gBase; - s->save_gPerm = gPerm; - - return retVal; -} - - -/*-------------------------------------------------------------*/ -/*--- end decompress.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/huffman.c b/mdk-stage1/bzlib/huffman.c deleted file mode 100644 index 8994f0bb9..000000000 --- a/mdk-stage1/bzlib/huffman.c +++ /dev/null @@ -1,232 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Huffman coding low-level stuff ---*/ -/*--- huffman.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - - -#include "bzlib_private.h" - -/*---------------------------------------------------*/ -#define WEIGHTOF(zz0) ((zz0) & 0xffffff00) -#define DEPTHOF(zz1) ((zz1) & 0x000000ff) -#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3)) - -#define ADDWEIGHTS(zw1,zw2) \ - (WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \ - (1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2))) - -#define UPHEAP(z) \ -{ \ - Int32 zz, tmp; \ - zz = z; tmp = heap[zz]; \ - while (weight[tmp] < weight[heap[zz >> 1]]) { \ - heap[zz] = heap[zz >> 1]; \ - zz >>= 1; \ - } \ - heap[zz] = tmp; \ -} - -#define DOWNHEAP(z) \ -{ \ - Int32 zz, yy, tmp; \ - zz = z; tmp = heap[zz]; \ - while (True) { \ - yy = zz << 1; \ - if (yy > nHeap) break; \ - if (yy < nHeap && \ - weight[heap[yy+1]] < weight[heap[yy]]) \ - yy++; \ - if (weight[tmp] < weight[heap[yy]]) break; \ - heap[zz] = heap[yy]; \ - zz = yy; \ - } \ - heap[zz] = tmp; \ -} - - -/*---------------------------------------------------*/ -void BZ2_hbMakeCodeLengths ( UChar *len, - Int32 *freq, - Int32 alphaSize, - Int32 maxLen ) -{ - /*-- - Nodes and heap entries run from 1. Entry 0 - for both the heap and nodes is a sentinel. - --*/ - Int32 nNodes, nHeap, n1, n2, i, j, k; - Bool tooLong; - - Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ]; - Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ]; - Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ]; - - for (i = 0; i < alphaSize; i++) - weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8; - - while (True) { - - nNodes = alphaSize; - nHeap = 0; - - heap[0] = 0; - weight[0] = 0; - parent[0] = -2; - - for (i = 1; i <= alphaSize; i++) { - parent[i] = -1; - nHeap++; - heap[nHeap] = i; - UPHEAP(nHeap); - } - - AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 ); - - while (nHeap > 1) { - n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); - n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1); - nNodes++; - parent[n1] = parent[n2] = nNodes; - weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]); - parent[nNodes] = -1; - nHeap++; - heap[nHeap] = nNodes; - UPHEAP(nHeap); - } - - AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 ); - - tooLong = False; - for (i = 1; i <= alphaSize; i++) { - j = 0; - k = i; - while (parent[k] >= 0) { k = parent[k]; j++; } - len[i-1] = j; - if (j > maxLen) tooLong = True; - } - - if (! tooLong) break; - - for (i = 1; i < alphaSize; i++) { - j = weight[i] >> 8; - j = 1 + (j / 2); - weight[i] = j << 8; - } - } -} - - -/*---------------------------------------------------*/ -void BZ2_hbAssignCodes ( Int32 *code, - UChar *length, - Int32 minLen, - Int32 maxLen, - Int32 alphaSize ) -{ - Int32 n, vec, i; - - vec = 0; - for (n = minLen; n <= maxLen; n++) { - for (i = 0; i < alphaSize; i++) - if (length[i] == n) { code[i] = vec; vec++; }; - vec <<= 1; - } -} - - -/*---------------------------------------------------*/ -void BZ2_hbCreateDecodeTables ( Int32 *limit, - Int32 *base, - Int32 *perm, - UChar *length, - Int32 minLen, - Int32 maxLen, - Int32 alphaSize ) -{ - Int32 pp, i, j, vec; - - pp = 0; - for (i = minLen; i <= maxLen; i++) - for (j = 0; j < alphaSize; j++) - if (length[j] == i) { perm[pp] = j; pp++; }; - - for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0; - for (i = 0; i < alphaSize; i++) base[length[i]+1]++; - - for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1]; - - for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0; - vec = 0; - - for (i = minLen; i <= maxLen; i++) { - vec += (base[i+1] - base[i]); - limit[i] = vec-1; - vec <<= 1; - } - for (i = minLen + 1; i <= maxLen; i++) - base[i] = ((limit[i-1] + 1) << 1) - base[i]; -} - - -/*-------------------------------------------------------------*/ -/*--- end huffman.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/bzlib/randtable.c b/mdk-stage1/bzlib/randtable.c deleted file mode 100644 index a1fc82cfb..000000000 --- a/mdk-stage1/bzlib/randtable.c +++ /dev/null @@ -1,128 +0,0 @@ - -/*-------------------------------------------------------------*/ -/*--- Table for randomising repetitive blocks ---*/ -/*--- randtable.c ---*/ -/*-------------------------------------------------------------*/ - -/*-- - This file is a part of bzip2 and/or libbzip2, a program and - library for lossless, block-sorting data compression. - - Copyright (C) 1996-2000 Julian R Seward. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - - 3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS - OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE - GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Julian Seward, Cambridge, UK. - jseward@acm.org - bzip2/libbzip2 version 1.0 of 21 March 2000 - - This program is based on (at least) the work of: - Mike Burrows - David Wheeler - Peter Fenwick - Alistair Moffat - Radford Neal - Ian H. Witten - Robert Sedgewick - Jon L. Bentley - - For more information on these sources, see the manual. ---*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - - -#include "bzlib_private.h" - - -/*---------------------------------------------*/ -Int32 BZ2_rNums[512] = { - 619, 720, 127, 481, 931, 816, 813, 233, 566, 247, - 985, 724, 205, 454, 863, 491, 741, 242, 949, 214, - 733, 859, 335, 708, 621, 574, 73, 654, 730, 472, - 419, 436, 278, 496, 867, 210, 399, 680, 480, 51, - 878, 465, 811, 169, 869, 675, 611, 697, 867, 561, - 862, 687, 507, 283, 482, 129, 807, 591, 733, 623, - 150, 238, 59, 379, 684, 877, 625, 169, 643, 105, - 170, 607, 520, 932, 727, 476, 693, 425, 174, 647, - 73, 122, 335, 530, 442, 853, 695, 249, 445, 515, - 909, 545, 703, 919, 874, 474, 882, 500, 594, 612, - 641, 801, 220, 162, 819, 984, 589, 513, 495, 799, - 161, 604, 958, 533, 221, 400, 386, 867, 600, 782, - 382, 596, 414, 171, 516, 375, 682, 485, 911, 276, - 98, 553, 163, 354, 666, 933, 424, 341, 533, 870, - 227, 730, 475, 186, 263, 647, 537, 686, 600, 224, - 469, 68, 770, 919, 190, 373, 294, 822, 808, 206, - 184, 943, 795, 384, 383, 461, 404, 758, 839, 887, - 715, 67, 618, 276, 204, 918, 873, 777, 604, 560, - 951, 160, 578, 722, 79, 804, 96, 409, 713, 940, - 652, 934, 970, 447, 318, 353, 859, 672, 112, 785, - 645, 863, 803, 350, 139, 93, 354, 99, 820, 908, - 609, 772, 154, 274, 580, 184, 79, 626, 630, 742, - 653, 282, 762, 623, 680, 81, 927, 626, 789, 125, - 411, 521, 938, 300, 821, 78, 343, 175, 128, 250, - 170, 774, 972, 275, 999, 639, 495, 78, 352, 126, - 857, 956, 358, 619, 580, 124, 737, 594, 701, 612, - 669, 112, 134, 694, 363, 992, 809, 743, 168, 974, - 944, 375, 748, 52, 600, 747, 642, 182, 862, 81, - 344, 805, 988, 739, 511, 655, 814, 334, 249, 515, - 897, 955, 664, 981, 649, 113, 974, 459, 893, 228, - 433, 837, 553, 268, 926, 240, 102, 654, 459, 51, - 686, 754, 806, 760, 493, 403, 415, 394, 687, 700, - 946, 670, 656, 610, 738, 392, 760, 799, 887, 653, - 978, 321, 576, 617, 626, 502, 894, 679, 243, 440, - 680, 879, 194, 572, 640, 724, 926, 56, 204, 700, - 707, 151, 457, 449, 797, 195, 791, 558, 945, 679, - 297, 59, 87, 824, 713, 663, 412, 693, 342, 606, - 134, 108, 571, 364, 631, 212, 174, 643, 304, 329, - 343, 97, 430, 751, 497, 314, 983, 374, 822, 928, - 140, 206, 73, 263, 980, 736, 876, 478, 430, 305, - 170, 514, 364, 692, 829, 82, 855, 953, 676, 246, - 369, 970, 294, 750, 807, 827, 150, 790, 288, 923, - 804, 378, 215, 828, 592, 281, 565, 555, 710, 82, - 896, 831, 547, 261, 524, 462, 293, 465, 502, 56, - 661, 821, 976, 991, 658, 869, 905, 758, 745, 193, - 768, 550, 608, 933, 378, 286, 215, 979, 792, 961, - 61, 688, 793, 644, 986, 403, 106, 366, 905, 644, - 372, 567, 466, 434, 645, 210, 389, 550, 919, 135, - 780, 773, 635, 389, 707, 100, 626, 958, 165, 504, - 920, 176, 193, 713, 857, 265, 203, 50, 668, 108, - 645, 990, 626, 197, 510, 357, 358, 850, 858, 364, - 936, 638 -}; - - -/*-------------------------------------------------------------*/ -/*--- end randtable.c ---*/ -/*-------------------------------------------------------------*/ diff --git a/mdk-stage1/cdrom.c b/mdk-stage1/cdrom.c deleted file mode 100644 index d99877b7f..000000000 --- a/mdk-stage1/cdrom.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include -#include -#include -#include -#include -#include "stage1.h" -#include "frontend.h" -#include "modules.h" -#include "probing.h" -#include "log.h" -#include "mount.h" - -#include "cdrom.h" - - -static int mount_that_cd_device(char * dev_name) -{ - char device_fullname[50]; - - strcpy(device_fullname, "/dev/"); - strcat(device_fullname, dev_name); - - return my_mount(device_fullname, IMAGE_LOCATION, "iso9660"); -} - - -static int test_that_cd() -{ - return access(IMAGE_LOCATION LIVE_LOCATION, R_OK); -} - - -static enum return_type try_with_device(char * dev_name, char * dev_model); - -static enum return_type do_with_device(char * dev_name, char * dev_model) -{ - if (test_that_cd()) { - enum return_type results; - umount(IMAGE_LOCATION); - results = ask_yes_no("That CDROM disc does not seem to be a " DISTRIB_NAME " Installation CDROM.\nRetry with another disc?"); - if (results == RETURN_OK) - return try_with_device(dev_name, dev_model); - return results; - } - - log_message("found a " DISTRIB_NAME " CDROM, good news!"); - - if (IS_SPECIAL_STAGE2 || ramdisk_possible()) - load_ramdisk(); /* we don't care about return code, we'll do it live if we failed */ - - if (IS_RESCUE) - umount(IMAGE_LOCATION); - - method_name = strdup("cdrom"); - return RETURN_OK; -} - -static enum return_type try_with_device(char * dev_name, char * dev_model) -{ - wait_message("Trying to access a CDROM disc (drive %s)", dev_model); - - if (mount_that_cd_device(dev_name) == -1) { - enum return_type results; - char msg[500]; - unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ - remove_wait_message(); - - snprintf(msg, sizeof(msg), "I can't access a " DISTRIB_NAME " Installation disc in your CDROM drive (%s).\nRetry?", dev_model); - results = ask_yes_no(msg); - if (results == RETURN_OK) - return try_with_device(dev_name, dev_model); - return results; - } - remove_wait_message(); - - return do_with_device(dev_name, dev_model); -} - -enum return_type cdrom_prepare(void) -{ - char ** medias, ** ptr, ** medias_models; - char * choice; - int i, count = 0; - enum return_type results; - - my_insmod("ide-cd", ANY_DRIVER_TYPE, NULL); - my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL); - - get_medias(CDROM, &medias, &medias_models); - - ptr = medias; - while (ptr && *ptr) { - count++; - ptr++; - } - - if (count == 0) { - stg1_error_message("No CDROM device found."); - i = ask_insmod(SCSI_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return cdrom_prepare(); - } - - if (count == 1) { - results = try_with_device(*medias, *medias_models); - if (results == RETURN_OK) - return RETURN_OK; - i = ask_insmod(SCSI_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return cdrom_prepare(); - } - - if (IS_AUTOMATIC) { - char ** model = medias_models; - ptr = medias; - while (ptr && *ptr) { - wait_message("Trying to access " DISTRIB_NAME " CDROM disc (drive %s)", *model); - if (mount_that_cd_device(*ptr) != -1) { - if (!test_that_cd()) { - remove_wait_message(); - return do_with_device(*ptr, *model); - } - else - umount(IMAGE_LOCATION); - } - remove_wait_message(); - ptr++; - model++; - } - unset_param(MODE_AUTOMATIC); - return cdrom_prepare(); - } - else { - results = ask_from_list_comments("Please choose the CDROM drive to use for the installation.", medias, medias_models, &choice); - if (results == RETURN_OK) { - char ** model = medias_models; - ptr = medias; - while (ptr && *ptr && model && *model) { - if (!strcmp(*ptr, choice)) - break; - ptr++; - model++; - } - results = try_with_device(choice, *model); - } else - return results; - } - - if (results == RETURN_OK) - return RETURN_OK; - if (results == RETURN_BACK) - return cdrom_prepare(); - - i = ask_insmod(SCSI_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return cdrom_prepare(); -} diff --git a/mdk-stage1/cdrom.h b/mdk-stage1/cdrom.h deleted file mode 100644 index 639487eed..000000000 --- a/mdk-stage1/cdrom.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#ifndef _CDROM_H_ -#define _CDROM_H_ - -#include "stage1.h" - -enum return_type cdrom_prepare(void); - -#endif diff --git a/mdk-stage1/config-stage1.h b/mdk-stage1/config-stage1.h deleted file mode 100644 index 11150314b..000000000 --- a/mdk-stage1/config-stage1.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _CONFIG_STAGE1_H_ -#define _CONFIG_STAGE1_H_ - -#define _GNU_SOURCE 1 - - -/* If we have more than that amount of memory (in Mbytes), we assume we can load the second stage as a ramdisk */ -#define MEM_LIMIT_RAMDISK 52 - -#define DISTRIB_NAME "Linux-Mandrake" - -#define RAMDISK_COMPRESSION_RATIO 1.95 - -#define LIVE_LOCATION "/Mandrake/mdkinst/" -#define RAMDISK_LOCATION "/Mandrake/base/" -#define IMAGE_LOCATION "/tmp/image" -#define STAGE2_LOCATION "/tmp/stage2" - -/* user-definable (in Makefile): DISABLE_NETWORK, DISABLE_DISK, DISABLE_CDROM, DISABLE_PCMCIA */ - - -/* some factorizing for disabling more features */ - -#ifdef DISABLE_DISK -#ifdef DISABLE_CDROM -#define DISABLE_MEDIAS -#endif -#endif - - -#endif diff --git a/mdk-stage1/dhcp.c b/mdk-stage1/dhcp.c deleted file mode 100644 index 78a0712f9..000000000 --- a/mdk-stage1/dhcp.c +++ /dev/null @@ -1,614 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -/* - * Portions from GRUB -- GRand Unified Bootloader - * Copyright (C) 2000 Free Software Foundation, Inc. - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "stage1.h" -#include "log.h" -#include "network.h" -#include "frontend.h" - -#include "dhcp.h" - - -typedef int bp_int32; -typedef short bp_int16; - -#define BOOTP_OPTION_NETMASK 1 -#define BOOTP_OPTION_GATEWAY 3 -#define BOOTP_OPTION_DNS 6 -#define BOOTP_OPTION_HOSTNAME 12 -#define BOOTP_OPTION_DOMAIN 15 -#define BOOTP_OPTION_BROADCAST 28 - -#define DHCP_OPTION_REQADDR 50 -#define DHCP_OPTION_LEASE 51 -#define DHCP_OPTION_TYPE 53 -#define DHCP_OPTION_SERVER 54 -#define DHCP_OPTION_OPTIONREQ 55 -#define DHCP_OPTION_MAXSIZE 57 - -#define BOOTP_CLIENT_PORT 68 -#define BOOTP_SERVER_PORT 67 - -#define BOOTP_OPCODE_REQUEST 1 -#define BOOTP_OPCODE_REPLY 2 - -#define DHCP_TYPE_DISCOVER 1 -#define DHCP_TYPE_OFFER 2 -#define DHCP_TYPE_REQUEST 3 -#define DHCP_TYPE_ACK 5 -#define DHCP_TYPE_RELEASE 7 - -#define BOOTP_VENDOR_LENGTH 64 -#define DHCP_VENDOR_LENGTH 340 - -struct bootp_request { - char opcode; - char hw; - char hwlength; - char hopcount; - bp_int32 id; - bp_int16 secs; - bp_int16 flags; - bp_int32 ciaddr, yiaddr, server_ip, bootp_gw_ip; - char hwaddr[16]; - char servername[64]; - char bootfile[128]; - char vendor[DHCP_VENDOR_LENGTH]; -} ; - -static const char vendor_cookie[] = { 99, 130, 83, 99, 255 }; - - -static unsigned int verify_checksum(void * buf2, int length2) -{ - unsigned int csum = 0; - unsigned short * sp; - - for (sp = (unsigned short *) buf2; length2 > 0; (length2 -= 2), sp++) - csum += *sp; - - while (csum >> 16) - csum = (csum & 0xffff) + (csum >> 16); - - return (csum == 0xffff); -} - - -static int initial_setup_interface(char * device, int s) { - struct sockaddr_in * addrp; - struct ifreq req; - struct rtentry route; - int true = 1; - - addrp = (struct sockaddr_in *) &req.ifr_addr; - - strcpy(req.ifr_name, device); - addrp->sin_family = AF_INET; - addrp->sin_port = 0; - memset(&addrp->sin_addr, 0, sizeof(addrp->sin_addr)); - - req.ifr_flags = 0; /* take it down */ - if (ioctl(s, SIOCSIFFLAGS, &req)) { - log_perror("SIOCSIFFLAGS (downing)"); - return -1; - } - - addrp->sin_family = AF_INET; - addrp->sin_addr.s_addr = htonl(0); - if (ioctl(s, SIOCSIFADDR, &req)) { - log_perror("SIOCSIFADDR"); - return -1; - } - - req.ifr_flags = IFF_UP | IFF_BROADCAST | IFF_RUNNING; - if (ioctl(s, SIOCSIFFLAGS, &req)) { - log_perror("SIOCSIFFLAGS (upping)"); - return -1; - } - - memset(&route, 0, sizeof(route)); - memcpy(&route.rt_gateway, addrp, sizeof(*addrp)); - - addrp->sin_family = AF_INET; - addrp->sin_port = 0; - addrp->sin_addr.s_addr = INADDR_ANY; - memcpy(&route.rt_dst, addrp, sizeof(*addrp)); - memcpy(&route.rt_genmask, addrp, sizeof(*addrp)); - - route.rt_dev = device; - route.rt_flags = RTF_UP; - route.rt_metric = 0; - - if (ioctl(s, SIOCADDRT, &route)) { - if (errno != EEXIST) { - close(s); - log_perror("SIOCADDRT"); - return -1; - } - } - - if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &true, sizeof(true))) { - close(s); - log_perror("setsockopt"); - return -1; - } - - /* I need to sleep a bit in order for kernel to finish init of the - network device; this would allow to not send further multiple - dhcp requests when only one is needed. */ - wait_message("Bringing up networking..."); - sleep(2); - remove_wait_message(); - - return 0; -} - - -void set_missing_ip_info(struct interface_info * intf) -{ - bp_int32 ipNum = *((bp_int32 *) &intf->ip); - bp_int32 nmNum; - - if (intf->netmask.s_addr == 0) - inet_aton(guess_netmask(inet_ntoa(intf->ip)), &intf->netmask); - - nmNum = *((bp_int32 *) &intf->netmask); - - if (intf->broadcast.s_addr == 0) - *((bp_int32 *) &intf->broadcast) = (ipNum & nmNum) | ~(nmNum); - - if (intf->network.s_addr == 0) - *((bp_int32 *) &intf->network) = ipNum & nmNum; -} - -static void parse_reply(struct bootp_request * breq, struct interface_info * intf) -{ - unsigned char * chptr; - unsigned char option, length; - - memcpy(&intf->ip, &breq->yiaddr, 4); - - chptr = breq->vendor; - chptr += 4; - while (*chptr != 0xFF && (void *) chptr < (void *) breq->vendor + DHCP_VENDOR_LENGTH) { - char tmp_str[500]; - option = *chptr++; - if (!option) - continue; - length = *chptr++; - - switch (option) { - case BOOTP_OPTION_DNS: - memcpy(&dns_server, chptr, sizeof(dns_server)); - log_message("got dns %s", inet_ntoa(dns_server)); - if (length >= sizeof(dns_server)*2) { - memcpy(&dns_server2, chptr+sizeof(dns_server), sizeof(dns_server2)); - log_message("got dns2 %s", inet_ntoa(dns_server2)); - } - break; - - case BOOTP_OPTION_NETMASK: - memcpy(&intf->netmask, chptr, sizeof(intf->netmask)); - log_message("got netmask %s", inet_ntoa(intf->netmask)); - break; - - case BOOTP_OPTION_DOMAIN: - memcpy(tmp_str, chptr, length); - tmp_str[length] = '\0'; - domain = strdup(tmp_str); - log_message("got domain %s", domain); - break; - - case BOOTP_OPTION_BROADCAST: - memcpy(&intf->broadcast, chptr, sizeof(intf->broadcast)); - log_message("got broadcast %s", inet_ntoa(intf->broadcast)); - break; - - case BOOTP_OPTION_GATEWAY: - memcpy(&gateway, chptr, sizeof(gateway)); - log_message("got gateway %s", inet_ntoa(gateway)); - break; - - case BOOTP_OPTION_HOSTNAME: - memcpy(tmp_str, chptr, length); - tmp_str[length] = '\0'; - hostname = strdup(tmp_str); - log_message("got hostname %s", hostname); - break; - - } - - chptr += length; - } - - set_missing_ip_info(intf); -} - - -static void init_vendor_codes(struct bootp_request * breq) { - memcpy(breq->vendor, vendor_cookie, sizeof(vendor_cookie)); -} - -static char gen_hwaddr[16]; - -static int prepare_request(struct bootp_request * breq, int sock, char * device) -{ - struct ifreq req; - - memset(breq, 0, sizeof(*breq)); - - breq->opcode = BOOTP_OPCODE_REQUEST; - - strcpy(req.ifr_name, device); - if (ioctl(sock, SIOCGIFHWADDR, &req)) { - log_perror("SIOCSIFHWADDR"); - return -1; - } - - breq->hw = 1; /* ethernet */ - breq->hwlength = IFHWADDRLEN; - memcpy(breq->hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); - memcpy(gen_hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); - - breq->hopcount = 0; - - init_vendor_codes(breq); - - return 0; -} - -static int get_vendor_code(struct bootp_request * bresp, unsigned char option, void * data) -{ - unsigned char * chptr; - unsigned int length, theOption; - - chptr = bresp->vendor + 4; - while (*chptr != 0xFF && *chptr != option) { - theOption = *chptr++; - if (!theOption) - continue; - length = *chptr++; - chptr += length; - } - - if (*chptr++ == 0xff) - return 1; - - length = *chptr++; - memcpy(data, chptr, length); - - return 0; -} - - -static int currticks(void) -{ - struct timeval tv; - long csecs; - int ticks_per_csec, ticks_per_usec; - - /* Note: 18.2 ticks/sec. */ - - gettimeofday (&tv, 0); - csecs = tv.tv_sec / 10; - ticks_per_csec = csecs * 182; - ticks_per_usec = (((tv.tv_sec - csecs * 10) * 1000000 + tv.tv_usec) * 182 / 10000000); - return ticks_per_csec + ticks_per_usec; -} - - -#define BACKOFF_LIMIT 7 -#define TICKS_PER_SEC 18 -#define MAX_ARP_RETRIES 4 - -static void rfc951_sleep(int exp) -{ - static long seed = 0; - long q; - unsigned long tmo; - - if (exp > BACKOFF_LIMIT) - exp = BACKOFF_LIMIT; - - if (!seed) - /* Initialize linear congruential generator. */ - seed = (currticks () + *(long *) &gen_hwaddr + ((short *) gen_hwaddr)[2]); - - /* Simplified version of the LCG given in Bruce Scheier's - "Applied Cryptography". */ - q = seed / 53668; - if ((seed = 40014 * (seed - 53668 * q) - 12211 * q) < 0) - seed += 2147483563l; - - /* Compute mask. */ - for (tmo = 63; tmo <= 60 * TICKS_PER_SEC && --exp > 0; tmo = 2 * tmo + 1) - ; - - /* Sleep. */ - log_message(""); - - for (tmo = (tmo & seed) + currticks (); currticks () < tmo;); -} - - -static int handle_transaction(int s, struct bootp_request * breq, struct bootp_request * bresp, - struct sockaddr_in * server_addr, int dhcp_type) -{ - struct pollfd polls; - int i, j; - int retry = 1; - int sin; - char eth_packet[ETH_FRAME_LEN]; - struct iphdr * ip_hdr; - struct udphdr * udp_hdr; - unsigned char type; - unsigned long starttime; - int timeout = 1; - - breq->id = starttime = currticks(); - breq->secs = 0; - - sin = socket(AF_PACKET, SOCK_DGRAM, ntohs(ETH_P_IP)); - if (sin < 0) { - log_perror("af_packet socket"); - return -1; - } - - while (retry <= MAX_ARP_RETRIES) { - i = sizeof(*breq); - - if (sendto(s, breq, i, 0, (struct sockaddr *) server_addr, sizeof(*server_addr)) != i) { - close(s); - log_perror("sendto"); - return -1; - } - - polls.fd = sin; - polls.events = POLLIN; - - while (poll(&polls, 1, timeout*1000) == 1) { - - if ((j = recv(sin, eth_packet, sizeof(eth_packet), 0)) == -1) { - log_perror("recv"); - continue; - } - - /* We need to do some basic sanity checking of the header */ - if (j < (sizeof(*ip_hdr) + sizeof(*udp_hdr))) - continue; - - ip_hdr = (void *) eth_packet; - if (!verify_checksum(ip_hdr, sizeof(*ip_hdr))) - continue; - - if (ntohs(ip_hdr->tot_len) > j) - continue; - - j = ntohs(ip_hdr->tot_len); - - if (ip_hdr->protocol != IPPROTO_UDP) - continue; - - udp_hdr = (void *) (eth_packet + sizeof(*ip_hdr)); - - if (ntohs(udp_hdr->source) != BOOTP_SERVER_PORT) - continue; - - if (ntohs(udp_hdr->dest) != BOOTP_CLIENT_PORT) - continue; - /* Go on with this packet; it looks sane */ - - /* Originally copied sizeof (*bresp) - this is a security - problem due to a potential underflow of the source - buffer. Also, it trusted that the packet was properly - 0xFF terminated, which is not true in the case of the - DHCP server on Cisco 800 series ISDN router. */ - - memset (bresp, 0xFF, sizeof (*bresp)); - memcpy (bresp, (char *) udp_hdr + sizeof (*udp_hdr), j - sizeof (*ip_hdr) - sizeof (*udp_hdr)); - - /* sanity checks */ - if (bresp->id != breq->id) - continue; - if (bresp->opcode != BOOTP_OPCODE_REPLY) - continue; - if (bresp->hwlength != breq->hwlength) - continue; - if (memcmp(bresp->hwaddr, breq->hwaddr, bresp->hwlength)) - continue; - if (get_vendor_code(bresp, DHCP_OPTION_TYPE, &type) || type != dhcp_type) - continue; - if (memcmp(bresp->vendor, vendor_cookie, 4)) - continue; - return 0; - } - rfc951_sleep(retry); - breq->secs = htons ((currticks () - starttime) / 20); - retry++; - timeout *= 2; - if (timeout > 5) - timeout = 5; - } - - stg1_error_message("No DHCP reply received."); - return -1; -} - -static void add_vendor_code(struct bootp_request * breq, unsigned char option, unsigned char length, void * data) -{ - unsigned char * chptr; - int theOption, theLength; - - chptr = breq->vendor; - chptr += 4; - while (*chptr != 0xFF && *chptr != option) { - theOption = *chptr++; - if (!theOption) continue; - theLength = *chptr++; - chptr += theLength; - } - - *chptr++ = option; - *chptr++ = length; - memcpy(chptr, data, length); - chptr[length] = 0xff; -} - - - -enum return_type perform_dhcp(struct interface_info * intf) -{ - int s, i; - struct sockaddr_in server_addr; - struct sockaddr_in client_addr; - struct sockaddr_in broadcast_addr; - struct bootp_request breq, bresp; - unsigned char messageType; - unsigned int lease; - short aShort; - int num_options; - char requested_options[50]; - - if (strncmp(intf->device, "eth", 3)) { - stg1_error_message("DHCP available only for Ethernet networking."); - return RETURN_ERROR; - } - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - log_perror("socket"); - return RETURN_ERROR; - } - - if (initial_setup_interface(intf->device, s) != 0) { - close(s); - return RETURN_ERROR; - } - - if (prepare_request(&breq, s, intf->device) != 0) { - close(s); - return RETURN_ERROR; - } - - messageType = DHCP_TYPE_DISCOVER; - add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType); - - memset(&client_addr.sin_addr, 0, sizeof(&client_addr.sin_addr)); - client_addr.sin_family = AF_INET; - client_addr.sin_port = htons(BOOTP_CLIENT_PORT); /* bootp client */ - - if (bind(s, (struct sockaddr *) &client_addr, sizeof(client_addr))) { - log_perror("bind"); - return RETURN_ERROR; - } - - broadcast_addr.sin_family = AF_INET; - broadcast_addr.sin_port = htons(BOOTP_SERVER_PORT); /* bootp server */ - memset(&broadcast_addr.sin_addr, 0xff, sizeof(broadcast_addr.sin_addr)); /* broadcast */ - - log_message("DHCP: sending DISCOVER"); - - wait_message("Sending DHCP request..."); - i = handle_transaction(s, &breq, &bresp, &broadcast_addr, DHCP_TYPE_OFFER); - remove_wait_message(); - - if (i != 0) { - close(s); - return RETURN_ERROR; - } - - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(BOOTP_SERVER_PORT); /* bootp server */ - if (get_vendor_code(&bresp, DHCP_OPTION_SERVER, &server_addr.sin_addr)) { - close(s); - log_message("DHCPOFFER didn't include server address"); - return RETURN_ERROR; - } - - init_vendor_codes(&breq); - messageType = DHCP_TYPE_REQUEST; - add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType); - add_vendor_code(&breq, DHCP_OPTION_SERVER, 4, &server_addr.sin_addr); - add_vendor_code(&breq, DHCP_OPTION_REQADDR, 4, &bresp.yiaddr); - - aShort = ntohs(sizeof(struct bootp_request)); - add_vendor_code(&breq, DHCP_OPTION_MAXSIZE, 2, &aShort); - - num_options = 0; - requested_options[num_options++] = BOOTP_OPTION_NETMASK; - requested_options[num_options++] = BOOTP_OPTION_GATEWAY; - requested_options[num_options++] = BOOTP_OPTION_DNS; - requested_options[num_options++] = BOOTP_OPTION_DOMAIN; - requested_options[num_options++] = BOOTP_OPTION_BROADCAST; - add_vendor_code(&breq, DHCP_OPTION_OPTIONREQ, num_options, requested_options); - - /* request a lease of 1 hour */ - i = htonl(60 * 60); - add_vendor_code(&breq, DHCP_OPTION_LEASE, 4, &i); - - log_message("DHCP: sending REQUEST"); - - i = handle_transaction(s, &breq, &bresp, &broadcast_addr, DHCP_TYPE_ACK); - - if (i != 0) { - close(s); - return RETURN_ERROR; - } - - if (get_vendor_code(&bresp, DHCP_OPTION_LEASE, &lease)) { - log_message("failed to get lease time\n"); - return RETURN_ERROR; - } - lease = ntohl(lease); - - close(s); - - intf->netmask.s_addr = 0; - intf->broadcast.s_addr = 0; - intf->network.s_addr = 0; - - parse_reply(&bresp, intf); - - return RETURN_OK; -} diff --git a/mdk-stage1/dhcp.h b/mdk-stage1/dhcp.h deleted file mode 100644 index 6fb121ea4..000000000 --- a/mdk-stage1/dhcp.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * View the homepage: http://us.mandrakesoft.com/~gc/html/stage1.html - * - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from GRUB -- GRand Unified Bootloader - * Copyright (C) 2000 Free Software Foundation, Inc. - * - * Itself based on etherboot-4.6.4 by Martin Renters. - * - */ - -#ifndef _DHCP_H_ -#define _DHCP_H_ - -#include "stage1.h" -#include "network.h" - -enum return_type perform_dhcp(struct interface_info * intf); - -#endif diff --git a/mdk-stage1/dietlibc/.cvsignore b/mdk-stage1/dietlibc/.cvsignore deleted file mode 100644 index 7c88cb004..000000000 --- a/mdk-stage1/dietlibc/.cvsignore +++ /dev/null @@ -1,12 +0,0 @@ -t -elftrunc -mapfile -t1 -load -compile -bin-alpha -bin-arm -bin-i386 -bin-mips -bin-ppc -bin-sparc diff --git a/mdk-stage1/dietlibc/AUTHOR b/mdk-stage1/dietlibc/AUTHOR deleted file mode 100644 index 6d8ab1a05..000000000 --- a/mdk-stage1/dietlibc/AUTHOR +++ /dev/null @@ -1 +0,0 @@ -Felix von Leitner diff --git a/mdk-stage1/dietlibc/Makefile b/mdk-stage1/dietlibc/Makefile deleted file mode 100644 index 81ef7a2e6..000000000 --- a/mdk-stage1/dietlibc/Makefile +++ /dev/null @@ -1,148 +0,0 @@ -ARCH=$(shell uname -m | sed 's/i[4-9]86/i386/') - -OBJDIR=bin-$(ARCH) - -all: $(OBJDIR) $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a $(OBJDIR)/liblatin1.a $(OBJDIR)/librpc.a $(OBJDIR)/diet - -CFLAGS=-pipe -CROSS= - -CC=gcc - -VPATH=lib:libstdio:libugly:libcruft:libcrypt:libshell:liblatin1:librpc:libregex:syscalls.c - -SYSCALLOBJ=$(patsubst syscalls.s/%.S,$(OBJDIR)/%.o,$(wildcard syscalls.s/*.S)) - -LIBOBJ=$(patsubst lib/%.c,$(OBJDIR)/%.o,$(wildcard lib/*.c)) -LIBUGLYOBJ=$(patsubst libugly/%.c,$(OBJDIR)/%.o,$(wildcard libugly/*.c)) -LIBSTDIOOBJ=$(patsubst libstdio/%.c,$(OBJDIR)/%.o,$(wildcard libstdio/*.c)) -LIBCRUFTOBJ=$(patsubst libcruft/%.c,$(OBJDIR)/%.o,$(wildcard libcruft/*.c)) -LIBCRYPTOBJ=$(patsubst libcrypt/%.c,$(OBJDIR)/%.o,$(wildcard libcrypt/*.c)) -LIBSHELLOBJ=$(patsubst libshell/%.c,$(OBJDIR)/%.o,$(wildcard libshell/*.c)) - -LIBRPCOBJ=$(patsubst librpc/%.c,$(OBJDIR)/%.o,$(wildcard librpc/*.c)) -LIBREGEXOBJ=$(patsubst libregex/%.c,$(OBJDIR)/%.o,$(wildcard libregex/*.c)) - -include $(ARCH)/Makefile.add - -ifeq ($(CFLAGS),-pipe) -CFLAGS+=-O -fomit-frame-pointer -endif - -ifneq ($(DEBUG),) -CFLAGS = -g -COMMENT = : -endif -CFLAGS += -Wall -Wno-switch - -PWD=$(shell pwd) - -.SUFFIXES: -.SUFFIXES: .S .c - -$(OBJDIR): - mkdir $@ - -% :: %,v - -$(OBJDIR)/%.o: %.S - $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< -o $@ - -$(OBJDIR)/%.o: %.c - $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< -o $@ - $(COMMENT) $(CROSS)strip -x -R .comment -R .note $@ - -DIETLIBC_OBJ = $(SYSCALLOBJ) $(LIBOBJ) $(LIBSTDIOOBJ) $(LIBUGLYOBJ) \ -$(LIBCRUFTOBJ) $(LIBCRYPTOBJ) $(LIBSHELLOBJ) $(LIBREGEXOBJ) \ -$(OBJDIR)/__longjmp.o $(OBJDIR)/setjmp.o $(OBJDIR)/unified.o \ -$(OBJDIR)/mmap.o $(OBJDIR)/clone.o - -$(OBJDIR)/dietlibc.a: $(DIETLIBC_OBJ) $(OBJDIR)/start.o - $(CROSS)ar cru $@ $(DIETLIBC_OBJ) - -$(OBJDIR)/librpc.a: $(LIBRPCOBJ) - $(CROSS)ar cru $@ $(LIBRPCOBJ) - -LIBLATIN1_OBJS=$(patsubst liblatin1/%.c,$(OBJDIR)/%.o,$(wildcard liblatin1/*.c)) -$(OBJDIR)/liblatin1.a: $(LIBLATIN1_OBJS) - $(CROSS)ar cru $@ $^ - -$(OBJDIR)/libdietc.so: $(OBJDIR)/dietlibc.a - $(CROSS)ld -whole-archive -shared -o $@ $^ - -$(SYSCALLOBJ): syscalls.h - -$(OBJDIR)/diet: diet.c $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a - $(CROSS)$(CC) -Iinclude $(CFLAGS) -nostdlib -o $@ $^ -DDIETHOME=\"$(PWD)\" - $(CROSS)strip -R .comment -R .note $@ - -$(OBJDIR)/djb: $(OBJDIR)/compile $(OBJDIR)/load - -$(OBJDIR)/compile: - echo 'exec gcc $(CFLAGS) -I$(PWD)/$(OBJDIR)/include -c $${1+"$$@"}' > $@ - chmod 755 $@ - -$(OBJDIR)/load: - echo 'main="$$1"; shift; exec gcc -nostdlib -o "$$main" $(PWD)/$(OBJDIR)/start.o "$$main".o $${1+"$$@"} $(PWD)/$(OBJDIR)/dietlibc.a -lgcc' > $@ - chmod 755 $@ - -clean: - rm -f *.o *.a t t1 compile load exports mapfile libdietc.so - rm -rf bin-* - -tar: clean - rm -f armv4l - ln -sf arm armv4l - cd ..; tar cvvf dietlibc.tar.bz2 dietlibc --use=bzip2 --exclude CVS - -$(OBJDIR)/exports: $(OBJDIR)/dietlibc.a - nm -g $(OBJDIR)/dietlibc.a | grep -w T | awk '{ print $$3 }' | sort -u > $(OBJDIR)/exports - -.PHONY: t t1 -t: - $(CROSS)$(CC) -g $(CFLAGS) -fno-builtin -nostdlib -Iinclude -o t t.c $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a -lgcc -Wl,-Map,mapfile - -t1: - $(CROSS)$(CC) -g -o t1 t.c - -install: $(OBJDIR)/start.o $(OBJDIR)/dietlibc.a $(OBJDIR)/liblatin1.a $(OBJDIR)/diet - cp $(OBJDIR)/start.o $(INSTALLPREFIX)$(prefix)/lib/dietstart.o - cp $(OBJDIR)/dietlibc.a $(INSTALLPREFIX)$(prefix)/lib/libdietc.a - cp $(OBJDIR)/liblatin1.a $(INSTALLPREFIX)$(prefix)/lib/libdietlatin1.a - cp $(OBJDIR)/diet $(INSTALLPREFIX)$(prefix)/bin/diet - -.PHONY: sparc ppc mips arm alpha i386 - -arm sparc ppc alpha i386: - $(MAKE) ARCH=$@ CROSS=$@-linux- all t bin-$@/libdietc.so - -mips: - $(MAKE) ARCH=$@ CROSS=$@-linux-gnu- all t bin-$@/libdietc.so - -cross: - $(MAKE) arm sparc ppc alpha i386 mips - - -# these depend on dietfeatures.h for large file backward compatibility -$(OBJDIR)/__fstat64.o $(OBJDIR)/__lstat64.o $(OBJDIR)/__stat64.o: dietfeatures.h - -# these depend on dietfeatures.h for thread support -$(OBJDIR)/alloc.o $(OBJDIR)/perror.o $(OBJDIR)/logging.o $(OBJDIR)/unified.o: dietfeatures.h - -# these depend on dietfeatures.h for linker warnings -$(OBJDIR)/assert_fail.o $(OBJDIR)/sprintf.o $(OBJDIR)/vsnprintf.o $(OBJDIR)/___div.o $(OBJDIR)/fflush.o $(OBJDIR)/setvbuf.o $(OBJDIR)/system.o $(OBJDIR)/sendfile.o $(OBJDIR)/setenv.o: dietfeatures.h - -# these depend on dietfeatures.h for buffered stdio -fclose.o $(OBJDIR)/fdglue.o $(OBJDIR)/fflush.o $(OBJDIR)/fgetc.o $(OBJDIR)/fputc.o $(OBJDIR)/fread.o $(OBJDIR)/fseek.o $(OBJDIR)/printf.o $(OBJDIR)/setvbuf.o $(OBJDIR)/stderr.o $(OBJDIR)/stdin.o $(OBJDIR)/stdout.o $(OBJDIR)/fwrite.o $(OBJDIR)/puts.o: dietfeatures.h - -# these depend on dietfeatures.h for fast string routines -strcasecmp.o $(OBJDIR)/strcat.o $(OBJDIR)/strchr.o $(OBJDIR)/strcmp.o $(OBJDIR)/strcpy.o $(OBJDIR)/strlen.o $(OBJDIR)/strncasecmp.o $(OBJDIR)/strncat.o $(OBJDIR)/strrchr.o: dietfeatures.h - -# these depend on dietfeatures.h for /proc -$(OBJDIR)/tty.o: dietfeatures.h - -# these depend on dietfeatures.h for ungetc support ;-) -$(OBJDIR)/ungetc.o: dietfeatures.h - -# these depend on dietfeatures.h for WANT_TZFILE_PARSER -$(OBJDIR)/localtime_r.o: dietfeatures.h diff --git a/mdk-stage1/dietlibc/README b/mdk-stage1/dietlibc/README deleted file mode 100644 index ce9838832..000000000 --- a/mdk-stage1/dietlibc/README +++ /dev/null @@ -1,43 +0,0 @@ -diet libc to statically link programs that don't need all the bloat -from glibc. - -malloc, printf and scanf contributed from Olaf Dreesen. - -To compile: - - $ make - -make should compile the diet libc itself without warnings. In addition -to the diet libc, the default make target includes t, which is a test -program and probably contains code which produces warnings. You can -safely ignore them. - -When make is done, it will have created dietlibc.a in bin-i386 (or -bin-ppc, bin-alpha, bin-sparc, bin-ppc or bin-arm, depending on your -architecture). In that directory you will also find a program called -"diet", which you need to copy in a directory in your $PATH: - - # install bin-i386/diet /usr/local/bin - -Then you can compile programs by prepending diet to the command line, -i.e. - - $ diet gcc -s -Os -pipe -o t t.c - -diet is cross-compiler friendly and can also be used like this: - - $ diet sparc-linux-gcc -o t t.c - -diet will then link against dietlibc.a from bin-sparc, of course. -diet comes with a man page (diet.1), which you can copy to an -appropriate location, too: - - # cp diet.1 /usr/local/man/man1 - -After you compiled the diet libc successfully, I invite you to check out -the embedded utils (http://www.fefe.de/embutils/) and the diet libc -binary repository (ftp://foobar.math.fu-berlin.de/pub/dietlibc/), too. -The embedded utils are small replacements for common utilities like mv, -chown, ls, and even a small tar that can extract tar files. The binary -repository contains a few utilities I linked against the diet libc, for -example gzip, bzip2 and fdisk. diff --git a/mdk-stage1/dietlibc/alpha/Makefile.add b/mdk-stage1/dietlibc/alpha/Makefile.add deleted file mode 100644 index 10ff0faef..000000000 --- a/mdk-stage1/dietlibc/alpha/Makefile.add +++ /dev/null @@ -1,5 +0,0 @@ - -CFLAGS+=-Os -Iinclude -fomit-frame-pointer -fstrict-aliasing -VPATH:=alpha:syscalls.s:$(VPATH) - -LIBOBJ+=$(patsubst %,$(OBJDIR)/%,divq.o divl.o remq.o reml.o seteuid.o __time.o) diff --git a/mdk-stage1/dietlibc/alpha/__longjmp.S b/mdk-stage1/dietlibc/alpha/__longjmp.S deleted file mode 100644 index d86d76717..000000000 --- a/mdk-stage1/dietlibc/alpha/__longjmp.S +++ /dev/null @@ -1,38 +0,0 @@ -#ifdef __alpha__ - -#include - -.text -.align 2 - -.global __longjmp -__longjmp: - mov $17, $0 /* a1 -> v0 */ - - ldq $9, (JB_S0*8) ($16) /* s0 */ - ldq $10, (JB_S1*8) ($16) /* s1 */ - ldq $11, (JB_S2*8) ($16) /* s2 */ - ldq $12, (JB_S3*8) ($16) /* s3 */ - ldq $13, (JB_S4*8) ($16) /* s4 */ - ldq $14, (JB_S5*8) ($16) /* s5 */ - - ldq $26, (JB_PC*8) ($16) /* ra */ - ldq $fp, (JB_FP*8) ($16) /* fp */ - ldq $1, (JB_SP*8) ($16) /* sp */ - - ldt $f2, (JB_F2*8) ($16) /* f2 */ - ldt $f3, (JB_F3*8) ($16) /* f3 */ - ldt $f4, (JB_F4*8) ($16) /* f4 */ - ldt $f5, (JB_F5*8) ($16) /* f5 */ - ldt $f6, (JB_F6*8) ($16) /* f6 */ - ldt $f7, (JB_F7*8) ($16) /* f7 */ - ldt $f8, (JB_F8*8) ($16) /* f8 */ - ldt $f9, (JB_F9*8) ($16) /* f9 */ - - cmoveq $0, 0x1, $0 - mov $1, $sp - - ret $31, ($26), 1 - - -#endif diff --git a/mdk-stage1/dietlibc/alpha/__time.c b/mdk-stage1/dietlibc/alpha/__time.c deleted file mode 100644 index 07275e0e3..000000000 --- a/mdk-stage1/dietlibc/alpha/__time.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -time_t time(time_t *foo) { - struct timeval tv; - time_t tmp=(time_t)-1; - if (gettimeofday(&tv,0)==0) - tmp=(time_t)tv.tv_sec; - if (foo) *foo=tmp; - return tmp; -} diff --git a/mdk-stage1/dietlibc/alpha/accept.S b/mdk-stage1/dietlibc/alpha/accept.S deleted file mode 100644 index 459c45d7a..000000000 --- a/mdk-stage1/dietlibc/alpha/accept.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(accept,accept,__libc_accept) diff --git a/mdk-stage1/dietlibc/alpha/bind.S b/mdk-stage1/dietlibc/alpha/bind.S deleted file mode 100644 index 86a04cb70..000000000 --- a/mdk-stage1/dietlibc/alpha/bind.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(bind,bind) diff --git a/mdk-stage1/dietlibc/alpha/clone.S b/mdk-stage1/dietlibc/alpha/clone.S deleted file mode 100644 index b7e32d707..000000000 --- a/mdk-stage1/dietlibc/alpha/clone.S +++ /dev/null @@ -1,42 +0,0 @@ -#include "syscalls.h" -#include - -.text -.align 2 -.weak clone -clone: -.global __clone -.type __clone,@function -__clone: - ldiq $0, EINVAL - beq $16, .Lerror - beq $17, .Lerror - - subq $17, 16, $17 - stq $16, 0($17) - stq $19, 8($17) - mov $18, $16 - - lda $0, __NR_clone($31) - callsys - bne $19, .Lerror - - beq $0, .Lstart_thread - - ret $31, ($26), 0x01 - -.Lerror: - jmp error_unified_syscall - -.Lstart_thread: - clr $fp - - ldq $27, 0($sp) - ldq $16, 8($sp) - - jsr $26, ($27), 0x04 - - ldgp $gp, 0($26) - mov $0, $16 - jsr $26, exit - diff --git a/mdk-stage1/dietlibc/alpha/connect.S b/mdk-stage1/dietlibc/alpha/connect.S deleted file mode 100644 index c191ca808..000000000 --- a/mdk-stage1/dietlibc/alpha/connect.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(connect,connect,__libc_connect) diff --git a/mdk-stage1/dietlibc/alpha/divl.S b/mdk-stage1/dietlibc/alpha/divl.S deleted file mode 100644 index 3af22a5e8..000000000 --- a/mdk-stage1/dietlibc/alpha/divl.S +++ /dev/null @@ -1,101 +0,0 @@ -/* taken from glibc 2.2 */ - - .set noreorder - .set noat - - .ent __divlu - .globl __divlu - - .align 3 -__divlu : - lda $30 , - 48 ($30 ) - .frame $30 , 48 , $23 , 0 - .prologue 0 -.Ludiv: - stq $1 , 0($30 ) - zapnot $25 ,15, $1 - stq $2 , 8($30 ) - zapnot $24 ,15, $2 - stq $0 , 16($30 ) - clr $27 - stq $3 , 24($30 ) - ldiq $0 , 1 - stq $4 ,32($30 ) - beq $1 , .Ldivbyzero - - .align 3 - - -1: cmpult $1 , $2 , $at - s8addq $1 , $31 , $1 - s8addq $0 , $31 , $0 - bne $at , 1b - - - -3: addq $27 ,$0 , $4 - srl $0 , 1, $0 - cmpule $1 , $2 , $at - subq $2 , $1 , $3 - cmovne $at ,$4 , $27 - srl $1 , 1, $1 - cmovne $at , $3 , $2 - bne $0 , 3b - -.Ldone: ldq $1 , 0($30 ) - ldq $2 , 8($30 ) - ldq $0 , 16($30 ) - ldq $3 , 24($30 ) - ldq $4 ,32($30 ) - lda $30 , 48 ($30 ) - ret $31 , ($23 ), 1 - -.Ldivbyzero: - mov $16 , $3 - ldiq $16 , -2 - call_pal 170 - mov $3 , $16 - clr $27 - br .Ldone - - .end __divlu - - .ent __divl - .globl __divl - - .align 3 -__divl : - lda $30 , - 48 ($30 ) - .frame $30 , 48 , $23 , 0 - .prologue 0 - or $24 , $25 , $at - sextl $at , $at - bge $at , .Ludiv - - - stq $24 , 0($30 ) - negl $24 , $at - stq $25 , 8($30 ) - cmovge $at , $at , $24 - stq $23 , 16($30 ) - negl $25 , $at - stq $3 , 24($30 ) - cmovge $at , $at , $25 - - - bsr $23 , __divlu - - - ldq $24 , 0($30 ) - ldq $25 , 8($30 ) - xor $24 , $25 , $at - negl $27 , $3 - sextl $at , $at - ldq $23 , 16($30 ) - cmovlt $at , $3 , $27 - ldq $3 , 24($30 ) - - lda $30 , 48 ($30 ) - ret $31 , ($23 ), 1 - - .end __divl diff --git a/mdk-stage1/dietlibc/alpha/divq.S b/mdk-stage1/dietlibc/alpha/divq.S deleted file mode 100644 index cf70862c4..000000000 --- a/mdk-stage1/dietlibc/alpha/divq.S +++ /dev/null @@ -1,102 +0,0 @@ -/* taken from glibc 2.2 */ - - .set noreorder - .set noat - - .ent __divqu - .globl __divqu - - .align 3 -__divqu : - lda $30 , - 48 ($30 ) - .frame $30 , 48 , $23 , 0 - .prologue 0 -$udiv: - stq $1 , 0($30 ) - mov $25 , $1 - stq $2 , 8($30 ) - mov $24 , $2 - stq $0 , 16($30 ) - clr $27 - stq $3 , 24($30 ) - ldiq $0 , 1 - stq $4 ,32($30 ) - beq $1 , $divbyzero - - .align 3 - - -1: cmpult $1 , $2 , $at - blt $1 , 2f - addq $1 , $1 , $1 - addq $0 , $0 , $0 - bne $at , 1b - unop -2: -3: addq $27 ,$0 , $4 - srl $0 , 1, $0 - cmpule $1 , $2 , $at - subq $2 , $1 , $3 - cmovne $at ,$4 , $27 - srl $1 , 1, $1 - cmovne $at , $3 , $2 - bne $0 , 3b - -$done: ldq $1 , 0($30 ) - ldq $2 , 8($30 ) - ldq $0 , 16($30 ) - ldq $3 , 24($30 ) - ldq $4 ,32($30 ) - lda $30 , 48 ($30 ) - ret $31 , ($23 ), 1 - -$divbyzero: - mov $16 , $3 - ldiq $16 , -2 - call_pal 170 - mov $3 , $16 - clr $27 - br $done - - .end __divqu - - .ent __divq - .globl __divq - - .align 3 -__divq : - lda $30 , - 48 ($30 ) - .frame $30 , 48 , $23 , 0 - .prologue 0 - or $24 , $25 , $at - - bge $at , $udiv - - - stq $24 , 0($30 ) - negq $24 , $at - stq $25 , 8($30 ) - cmovge $at , $at , $24 - stq $23 , 16($30 ) - negq $25 , $at - stq $3 , 24($30 ) - cmovge $at , $at , $25 - - - bsr $23 , __divqu - - - ldq $24 , 0($30 ) - ldq $25 , 8($30 ) - xor $24 , $25 , $at - negq $27 , $3 - - ldq $23 , 16($30 ) - cmovlt $at , $3 , $27 - ldq $3 , 24($30 ) - - lda $30 , 48 ($30 ) - ret $31 , ($23 ), 1 - - .end __divq - diff --git a/mdk-stage1/dietlibc/alpha/getegid.S b/mdk-stage1/dietlibc/alpha/getegid.S deleted file mode 100644 index 89c35d45e..000000000 --- a/mdk-stage1/dietlibc/alpha/getegid.S +++ /dev/null @@ -1,11 +0,0 @@ -.text -.align 2 -.global getegid -getegid: - lda $sp,-8($sp) - stq $26, 0($sp) - jsr getgid - ldq $26, 0($sp) - lda $sp, 8($sp) - cmovge $0, $20, $0 - ret diff --git a/mdk-stage1/dietlibc/alpha/geteuid.S b/mdk-stage1/dietlibc/alpha/geteuid.S deleted file mode 100644 index 087ca7348..000000000 --- a/mdk-stage1/dietlibc/alpha/geteuid.S +++ /dev/null @@ -1,11 +0,0 @@ -.text -.align 2 -.global geteuid -geteuid: - lda $sp,-8($sp) - stq $26, 0($sp) - jsr getuid - ldq $26, 0($sp) - lda $sp, 8($sp) - cmovge $0, $20, $0 - ret diff --git a/mdk-stage1/dietlibc/alpha/getgid.S b/mdk-stage1/dietlibc/alpha/getgid.S deleted file mode 100644 index 7350082f3..000000000 --- a/mdk-stage1/dietlibc/alpha/getgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getxgid,getgid) diff --git a/mdk-stage1/dietlibc/alpha/getpeername.S b/mdk-stage1/dietlibc/alpha/getpeername.S deleted file mode 100644 index 3b3f48b1a..000000000 --- a/mdk-stage1/dietlibc/alpha/getpeername.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getpeername,getpeername) diff --git a/mdk-stage1/dietlibc/alpha/getpid.S b/mdk-stage1/dietlibc/alpha/getpid.S deleted file mode 100644 index d8b3523b2..000000000 --- a/mdk-stage1/dietlibc/alpha/getpid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getxpid,getpid) diff --git a/mdk-stage1/dietlibc/alpha/getppid.S b/mdk-stage1/dietlibc/alpha/getppid.S deleted file mode 100644 index e181268c3..000000000 --- a/mdk-stage1/dietlibc/alpha/getppid.S +++ /dev/null @@ -1,11 +0,0 @@ -.text -.align 2 -.global getppid -getppid: - lda $sp,-8($sp) - stq $26, 0($sp) - jsr getpid - ldq $26, 0($sp) - lda $sp, 8($sp) - cmovge $0, $20, $0 - ret diff --git a/mdk-stage1/dietlibc/alpha/getsockname.S b/mdk-stage1/dietlibc/alpha/getsockname.S deleted file mode 100644 index 2727d88da..000000000 --- a/mdk-stage1/dietlibc/alpha/getsockname.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getsockname,getsockname) diff --git a/mdk-stage1/dietlibc/alpha/getsockopt.S b/mdk-stage1/dietlibc/alpha/getsockopt.S deleted file mode 100644 index 44b4a910a..000000000 --- a/mdk-stage1/dietlibc/alpha/getsockopt.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getsockopt,getsockopt) diff --git a/mdk-stage1/dietlibc/alpha/getuid.S b/mdk-stage1/dietlibc/alpha/getuid.S deleted file mode 100644 index fcb5570c2..000000000 --- a/mdk-stage1/dietlibc/alpha/getuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getxuid,getuid) diff --git a/mdk-stage1/dietlibc/alpha/listen.S b/mdk-stage1/dietlibc/alpha/listen.S deleted file mode 100644 index 1102831d4..000000000 --- a/mdk-stage1/dietlibc/alpha/listen.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(listen,listen) diff --git a/mdk-stage1/dietlibc/alpha/mmap.S b/mdk-stage1/dietlibc/alpha/mmap.S deleted file mode 100644 index 2e57fbb74..000000000 --- a/mdk-stage1/dietlibc/alpha/mmap.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mmap,mmap) diff --git a/mdk-stage1/dietlibc/alpha/msgctl.S b/mdk-stage1/dietlibc/alpha/msgctl.S deleted file mode 100644 index d7caed2cc..000000000 --- a/mdk-stage1/dietlibc/alpha/msgctl.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(msgctl,msgctl) diff --git a/mdk-stage1/dietlibc/alpha/msgget.S b/mdk-stage1/dietlibc/alpha/msgget.S deleted file mode 100644 index 518d67ac4..000000000 --- a/mdk-stage1/dietlibc/alpha/msgget.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(msgget,msgget) diff --git a/mdk-stage1/dietlibc/alpha/msgrcv.S b/mdk-stage1/dietlibc/alpha/msgrcv.S deleted file mode 100644 index ab62e6c30..000000000 --- a/mdk-stage1/dietlibc/alpha/msgrcv.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(msgrcv,msgrcv) diff --git a/mdk-stage1/dietlibc/alpha/msgsnd.S b/mdk-stage1/dietlibc/alpha/msgsnd.S deleted file mode 100644 index 890a996a2..000000000 --- a/mdk-stage1/dietlibc/alpha/msgsnd.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(msgsnd,msgsnd) diff --git a/mdk-stage1/dietlibc/alpha/pipe.S b/mdk-stage1/dietlibc/alpha/pipe.S deleted file mode 100644 index 3dfef10bf..000000000 --- a/mdk-stage1/dietlibc/alpha/pipe.S +++ /dev/null @@ -1,17 +0,0 @@ -#include "syscalls.h" - -.text -.align 2 -.global pipe -.type pipe,@function -pipe: - lda $0, __NR_pipe($31) - callsys - bne $19, .Lerror - stl $0, 0($16) - stl $20, 4($16) - clr $0 - ret $31, ($26), 0x01 -.Lerror: - br error_unified_syscall - diff --git a/mdk-stage1/dietlibc/alpha/recv.S b/mdk-stage1/dietlibc/alpha/recv.S deleted file mode 100644 index 17664f2e2..000000000 --- a/mdk-stage1/dietlibc/alpha/recv.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(recv,recv,__libc_recv) diff --git a/mdk-stage1/dietlibc/alpha/recvfrom.S b/mdk-stage1/dietlibc/alpha/recvfrom.S deleted file mode 100644 index d8e3922af..000000000 --- a/mdk-stage1/dietlibc/alpha/recvfrom.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(recvfrom,recvfrom,__libc_recvfrom) diff --git a/mdk-stage1/dietlibc/alpha/recvmsg.S b/mdk-stage1/dietlibc/alpha/recvmsg.S deleted file mode 100644 index 6ce87eebb..000000000 --- a/mdk-stage1/dietlibc/alpha/recvmsg.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(recvmsg,recvmsg) diff --git a/mdk-stage1/dietlibc/alpha/reml.S b/mdk-stage1/dietlibc/alpha/reml.S deleted file mode 100644 index 2d89e3280..000000000 --- a/mdk-stage1/dietlibc/alpha/reml.S +++ /dev/null @@ -1,101 +0,0 @@ -/* taken from glibc 2.2 */ - - .set noreorder - .set noat - - .ent __remlu - .globl __remlu - - .align 3 -__remlu : - lda $30 , -32($30) - .frame $30 , 32 , $23 , 0 - .prologue 0 -.Ludiv: - stq $1 , 0($30) - zapnot $25 , 15 , $1 - stq $2 , 8($30) - zapnot $24 , 15 , $27 - stq $0 , 16($30) - clr $2 - stq $3 , 24($30) - ldiq $0 , 1 - - beq $1 , .Ldivbyzero - - .align 3 - - -1: cmpult $1 , $27 , $at - s8addq $1 , $31 , $1 - s8addq $0 , $31 , $0 - bne $at , 1b - - - -3: - srl $0 , 1 , $0 - cmpule $1 , $27 , $at - subq $27 , $1 , $3 - - srl $1 , 1 , $1 - cmovne $at , $3 , $27 - bne $0 , 3b - -.Ldone: ldq $1 , 0($30) - ldq $2 , 8($30) - ldq $0 , 16($30) - ldq $3 , 24($30) - - lda $30 , 32($30) - ret $31 , ($23), 1 - -.Ldivbyzero: - mov $16 , $3 - ldiq $16 , -2 - call_pal 170 - mov $3 , $16 - clr $27 - br .Ldone - - .end __remlu - - .ent __reml - .globl __reml - - .align 3 -__reml : - lda $30 , - 32 ($30 ) - .frame $30 , 32 , $23 , 0 - .prologue 0 - or $24 , $25 , $at - sextl $at , $at - bge $at , .Ludiv - - - stq $24 , 0($30 ) - negl $24 , $at - stq $25 , 8($30 ) - cmovge $at , $at , $24 - stq $23 , 16($30 ) - negl $25 , $at - stq $3 , 24($30 ) - cmovge $at , $at , $25 - - - bsr $23 , __remlu - - - ldq $24 , 0($30 ) - ldq $25 , 8($30 ) - mov $24 , $at - negl $27 , $3 - sextl $at , $at - ldq $23 , 16($30 ) - cmovlt $at , $3 , $27 - ldq $3 , 24($30 ) - - lda $30 , 32 ($30 ) - ret $31 , ($23 ), 1 - - .end __reml diff --git a/mdk-stage1/dietlibc/alpha/remq.S b/mdk-stage1/dietlibc/alpha/remq.S deleted file mode 100644 index 713484da3..000000000 --- a/mdk-stage1/dietlibc/alpha/remq.S +++ /dev/null @@ -1,97 +0,0 @@ -/* taken from glibc 2.2 */ - - .set noreorder - .set noat - - .ent __remqu - .globl __remqu - - .align 3 -__remqu : - lda $30 , - 32 ($30 ) - .frame $30 , 32 , $23 , 0 - .prologue 0 -.Ludiv: - stq $1 , 0($30 ) - mov $25 , $1 - stq $2 , 8($30 ) - mov $24 , $27 - stq $0 , 16($30 ) - clr $2 - stq $3 , 24($30 ) - ldiq $0 , 1 - - beq $1 , .Ldivbyzero - - .align 3 - -1: cmpult $1 , $27 , $at - blt $1 , 2f - addq $1 , $1 , $1 - addq $0 , $0 , $0 - bne $at , 1b - unop -2: -3: - srl $0 , 1, $0 - cmpule $1 , $27 , $at - subq $27 , $1 , $3 - - srl $1 , 1, $1 - cmovne $at , $3 , $27 - bne $0 , 3b - -.Ldone: ldq $1 , 0($30 ) - ldq $2 , 8($30 ) - ldq $0 , 16($30 ) - ldq $3 , 24($30 ) - - lda $30 , 32 ($30 ) - ret $31 , ($23 ), 1 - -.Ldivbyzero: - mov $16 , $3 - ldiq $16 , -2 - call_pal 170 - mov $3 , $16 - clr $27 - br .Ldone - - .end __remqu - - .ent __remq - .globl __remq - - .align 3 -__remq : - lda $30 , - 32 ($30 ) - .frame $30 , 32 , $23 , 0 - .prologue 0 - or $24 , $25 , $at - - bge $at , .Ludiv - - stq $24 , 0($30 ) - negq $24 , $at - stq $25 , 8($30 ) - cmovge $at , $at , $24 - stq $23 , 16($30 ) - negq $25 , $at - stq $3 , 24($30 ) - cmovge $at , $at , $25 - - bsr $23 , __remqu - - ldq $24 , 0($30 ) - ldq $25 , 8($30 ) - mov $24 , $at - negq $27 , $3 - - ldq $23 , 16($30 ) - cmovlt $at , $3 , $27 - ldq $3 , 24($30 ) - - lda $30 , 32 ($30 ) - ret $31 , ($23 ), 1 - - .end __remq diff --git a/mdk-stage1/dietlibc/alpha/semctl.S b/mdk-stage1/dietlibc/alpha/semctl.S deleted file mode 100644 index e215ed955..000000000 --- a/mdk-stage1/dietlibc/alpha/semctl.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(semctl,semctl) diff --git a/mdk-stage1/dietlibc/alpha/semget.S b/mdk-stage1/dietlibc/alpha/semget.S deleted file mode 100644 index 67f488546..000000000 --- a/mdk-stage1/dietlibc/alpha/semget.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(semget,semget) diff --git a/mdk-stage1/dietlibc/alpha/semop.S b/mdk-stage1/dietlibc/alpha/semop.S deleted file mode 100644 index 81b6fc606..000000000 --- a/mdk-stage1/dietlibc/alpha/semop.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(semop,semop) diff --git a/mdk-stage1/dietlibc/alpha/send.S b/mdk-stage1/dietlibc/alpha/send.S deleted file mode 100644 index cfd11be2a..000000000 --- a/mdk-stage1/dietlibc/alpha/send.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(send,send,__libc_send) diff --git a/mdk-stage1/dietlibc/alpha/sendmsg.S b/mdk-stage1/dietlibc/alpha/sendmsg.S deleted file mode 100644 index 14646ad68..000000000 --- a/mdk-stage1/dietlibc/alpha/sendmsg.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sendmsg,sendmsg) diff --git a/mdk-stage1/dietlibc/alpha/sendto.S b/mdk-stage1/dietlibc/alpha/sendto.S deleted file mode 100644 index 17a033011..000000000 --- a/mdk-stage1/dietlibc/alpha/sendto.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(sendto,sendto,__libc_sendto) diff --git a/mdk-stage1/dietlibc/alpha/seteuid.c b/mdk-stage1/dietlibc/alpha/seteuid.c deleted file mode 100644 index a7cf47893..000000000 --- a/mdk-stage1/dietlibc/alpha/seteuid.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -#undef seteuid -int seteuid(uid_t euid) { - return setreuid(-1,euid); -} diff --git a/mdk-stage1/dietlibc/alpha/setjmp.S b/mdk-stage1/dietlibc/alpha/setjmp.S deleted file mode 100644 index 3768056be..000000000 --- a/mdk-stage1/dietlibc/alpha/setjmp.S +++ /dev/null @@ -1,46 +0,0 @@ -#include - -.text -.global __sigsetjmp -__sigsetjmp: - ldgp $gp, 0($gp) - - mov $sp, $1 - lda $sp, -16($sp) - - stq $26, 0($sp) /* save ra */ - - stq $9, (JB_S0*8) ($16) /* s0 */ - stq $10, (JB_S1*8) ($16) /* s1 */ - stq $11, (JB_S2*8) ($16) /* s2 */ - stq $12, (JB_S3*8) ($16) /* s3 */ - stq $13, (JB_S4*8) ($16) /* s4 */ - stq $14, (JB_S5*8) ($16) /* s5 */ - - stq $26, (JB_PC*8) ($16) /* ra */ - stq $fp, (JB_FP*8) ($16) /* fp */ - stq $1, (JB_SP*8) ($16) /* sp */ - - stt $f2, (JB_F2*8) ($16) /* f2 */ - stt $f3, (JB_F3*8) ($16) /* f3 */ - stt $f4, (JB_F4*8) ($16) /* f4 */ - stt $f5, (JB_F5*8) ($16) /* f5 */ - stt $f6, (JB_F6*8) ($16) /* f6 */ - stt $f7, (JB_F7*8) ($16) /* f7 */ - stt $f8, (JB_F8*8) ($16) /* f8 */ - stt $f9, (JB_F9*8) ($16) /* f9 */ - - br $26, __sigjmp_save /* call __sigjmp_save */ - - ldq $26, 0($sp) /* restore ra */ - - lda $sp, 16($sp) - ret $31, ($26), 1 /* back to caller */ - -.weak setjmp -setjmp: -.weak __setjmp -__setjmp: - ldgp $gp, 0($gp) - mov 0, $17 - br __sigsetjmp diff --git a/mdk-stage1/dietlibc/alpha/setsockopt.S b/mdk-stage1/dietlibc/alpha/setsockopt.S deleted file mode 100644 index e3fe1d321..000000000 --- a/mdk-stage1/dietlibc/alpha/setsockopt.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setsockopt,setsockopt) diff --git a/mdk-stage1/dietlibc/alpha/shmat.S b/mdk-stage1/dietlibc/alpha/shmat.S deleted file mode 100644 index 51248173d..000000000 --- a/mdk-stage1/dietlibc/alpha/shmat.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(shmat,shmat) diff --git a/mdk-stage1/dietlibc/alpha/shmctl.S b/mdk-stage1/dietlibc/alpha/shmctl.S deleted file mode 100644 index d56caace4..000000000 --- a/mdk-stage1/dietlibc/alpha/shmctl.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(shmctl,shmctl) diff --git a/mdk-stage1/dietlibc/alpha/shmdt.S b/mdk-stage1/dietlibc/alpha/shmdt.S deleted file mode 100644 index d9812a799..000000000 --- a/mdk-stage1/dietlibc/alpha/shmdt.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(shmdt,shmdt) diff --git a/mdk-stage1/dietlibc/alpha/shmget.S b/mdk-stage1/dietlibc/alpha/shmget.S deleted file mode 100644 index 82914223f..000000000 --- a/mdk-stage1/dietlibc/alpha/shmget.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(shmget,shmget) diff --git a/mdk-stage1/dietlibc/alpha/shutdown.S b/mdk-stage1/dietlibc/alpha/shutdown.S deleted file mode 100644 index 9b5139325..000000000 --- a/mdk-stage1/dietlibc/alpha/shutdown.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(shutdown,shutdown) diff --git a/mdk-stage1/dietlibc/alpha/signal.S b/mdk-stage1/dietlibc/alpha/signal.S deleted file mode 100644 index ceca0f02d..000000000 --- a/mdk-stage1/dietlibc/alpha/signal.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(osf_signal,signal) diff --git a/mdk-stage1/dietlibc/alpha/sigprocmask.S b/mdk-stage1/dietlibc/alpha/sigprocmask.S deleted file mode 100644 index d9da836c2..000000000 --- a/mdk-stage1/dietlibc/alpha/sigprocmask.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(osf_sigprocmask,sigprocmask,__sigprocmask) diff --git a/mdk-stage1/dietlibc/alpha/socket.S b/mdk-stage1/dietlibc/alpha/socket.S deleted file mode 100644 index 85401f56e..000000000 --- a/mdk-stage1/dietlibc/alpha/socket.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(socket,socket) diff --git a/mdk-stage1/dietlibc/alpha/socketcall.S b/mdk-stage1/dietlibc/alpha/socketcall.S deleted file mode 100644 index b150bd5d5..000000000 --- a/mdk-stage1/dietlibc/alpha/socketcall.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -/* - * Doesn't exist on alpha ( accept, bind, ... are SYSCALLS !?! ) - */ diff --git a/mdk-stage1/dietlibc/alpha/start.S b/mdk-stage1/dietlibc/alpha/start.S deleted file mode 100644 index 00b8e950d..000000000 --- a/mdk-stage1/dietlibc/alpha/start.S +++ /dev/null @@ -1,35 +0,0 @@ -#include "start.h" - -#ifdef __alpha__ - -.text -.align 2 - .set noreorder - -.global __start -__start: -.global _start -_start: - clr $fp /* clear frame pointer */ - - br $gp,.Lstart /* set global pointer */ -.Lstart: - ldgp $gp, 0($gp) - -/* prepare to call main */ - ldl $16, 0($sp) /* argc */ - - lda $17, 8($sp) /* argv */ - - addq $16, 1, $18 /* argp */ - s8addq $18, $17, $18 /* (8*(argc+1))+argv -> argp */ - - stq $18, environ - - mov $0, $21 /* mov v0(dynload) to a5 */ - - jsr $26, main - mov $0, $16 - jsr $26, exit /* YES, CALL! for threads and atexit ! (+4 byte) */ - -#endif diff --git a/mdk-stage1/dietlibc/alpha/strlen.c b/mdk-stage1/dietlibc/alpha/strlen.c deleted file mode 100644 index ac532254a..000000000 --- a/mdk-stage1/dietlibc/alpha/strlen.c +++ /dev/null @@ -1,32 +0,0 @@ -#include - -static const unsigned long long magic = 0x0101010101010101LL; - -size_t strlen(const char *s) -{ - const char *t = s; - unsigned long long word; - - if (!s) return 0; - - /* Byte compare up until 64 bit word boundary */ - for (; ((unsigned long long) t & 7); t++) - if (!*t) return t - s; - - /* Word compare */ - do { - word = *((unsigned long long *) t); t += 8; - word = (word - magic) &~ word; - word &= (magic << 7); - } while (word == 0); - - /* word & 0x8080808080808080 == word */ - word = (word - 1) & (magic << 8); - word += (word << 32); - word += (word << 16); - word += (word << 8); - t += word >> 56; - return ((const char *) t) - 8 - s; -} - - diff --git a/mdk-stage1/dietlibc/alpha/time.S b/mdk-stage1/dietlibc/alpha/time.S deleted file mode 100644 index e69de29bb..000000000 diff --git a/mdk-stage1/dietlibc/alpha/unified.S b/mdk-stage1/dietlibc/alpha/unified.S deleted file mode 100644 index 02a1c9bcd..000000000 --- a/mdk-stage1/dietlibc/alpha/unified.S +++ /dev/null @@ -1,29 +0,0 @@ -#include - -.global __unified_syscall -__unified_syscall: - callsys - bne $19, .Lerror - ret $31, ($26), 0x01 - -.Lerror: -.global error_unified_syscall -error_unified_syscall: -#ifdef WANT_THREAD_SAVE - lda $sp, -16($sp) /* alloc 2 qwords on stack */ - stq $26, 0($sp) /* save ra to stack */ - stq $0, 8($sp) /* save v0 to stack */ - - jsr $26, __errno_location /* call __errno_location */ - - ldq $1, 8($sp) /* write old v0 to errno */ - stl $1, 0($0) - - lda $0, -1($31) /* new return value is -1 */ - ldq $26, 0($sp) /* restore return address */ - lda $sp, 16($sp) /* free 2 qwords on stack */ -#else - lda $1, errno - stl $0, 0($1) -#endif - ret $31, ($26), 0x01 /* return */ diff --git a/mdk-stage1/dietlibc/alpha/utime.S b/mdk-stage1/dietlibc/alpha/utime.S deleted file mode 100644 index a9a8aada6..000000000 --- a/mdk-stage1/dietlibc/alpha/utime.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(utimes,utime) diff --git a/mdk-stage1/dietlibc/alpha/waitpid.S b/mdk-stage1/dietlibc/alpha/waitpid.S deleted file mode 100644 index 6dc1c99db..000000000 --- a/mdk-stage1/dietlibc/alpha/waitpid.S +++ /dev/null @@ -1,10 +0,0 @@ -#include - -.text -.align 2 -.weak waitpid -waitpid: -.global __libc_waitpid -__libc_waitpid: - clr $19 - br wait4 diff --git a/mdk-stage1/dietlibc/diet.c b/mdk-stage1/dietlibc/diet.c deleted file mode 100644 index 1de6befc8..000000000 --- a/mdk-stage1/dietlibc/diet.c +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include -#include -#include - -/* goal: - * when invoked as - * "diet gcc -c t.c" - * exec - * "gcc -I/path/to/dietlibc/include -c t.c" - * - * when invoked as - * "diet sparc-linux-gcc -o t t.o" - * exec - * "sparc-linux-gcc -nostdlib -static -o t t.o /path/to/dietlibc/bin-sparc/start.o /path/to/dietlibc/bin-sparc/dietlibc.a" -*/ - -void error(const char *message) { - write(2,message,strlen(message)); - exit(1); -} - -int main(int argc,char *argv[]) { - int link=0; - int compile=0; - char diethome[]=DIETHOME; - char platform[1000]=DIETHOME "/bin-"; - char *nostdlib="-nostdlib"; - char *libgcc="-lgcc"; - char dashL[1000]="-L"; - int i; - - if (argc<2) { - error("usage: diet [gcc command line]\n" - "e.g. diet gcc -c t.c\n" - "or diet sparc-linux-gcc -o foo foo.c bar.o\n"); - } - { - char *tmp=strchr(argv[1],0)-2; - char *tmp2; - char *cc=argv[1]; - if (tmp90) error("platform name too long!\n"); - memmove(platform+len,argv[1],tmp2-cc); - platform[tmp2-cc+len]=0; -/* printf("found platform %s\n",platform); */ - } else { -#ifdef __sparc__ - strcat(platform,"sparc"); -#endif -#ifdef __ppc__ - strcat(platform,"ppc"); -#endif -#ifdef __i386__ - strcat(platform,"i386"); -#endif -#ifdef __alpha__ - strcat(platform,"alpha"); -#endif -#ifdef __arm__ - strcat(platform,"arm"); -#endif -#ifdef __mips__ - strcat(platform,"mips"); -#endif - } - strcat(dashL,platform); - if (!strcmp(tmp,"cc")) { - char **newargv; - char **dest; - char *a,*b,*c; -/* we need to add -I... if the command line contains -c, -S or -E */ - for (i=2; i - -/* this assumes that va_copy() will be a macro, it is on gcc */ -#ifndef va_copy -# ifdef __va_copy -# define va_copy(x, y) __va_copy(x, y) -# else -/* assume copying it works... */ -# define va_copy(x, y) x = y -# endif -#endif - diff --git a/mdk-stage1/dietlibc/dietstdio.h b/mdk-stage1/dietlibc/dietstdio.h deleted file mode 100644 index a1cbeba83..000000000 --- a/mdk-stage1/dietlibc/dietstdio.h +++ /dev/null @@ -1,81 +0,0 @@ -/* diet stdio -- no buffering ;-} */ - -#include "dietfeatures.h" -#include -#ifdef WANT_THREAD_SAVE -#include -#endif - -#define BUFSIZE 128 - -typedef struct __file { - int fd; - int flags; -#ifdef WANT_BUFFERED_STDIO - unsigned int bs; /* read: bytes in buffer */ - unsigned int bm; /* position in buffer */ - char buf[BUFSIZE]; - struct __file *next; /* for fflush */ -#endif - pid_t popen_kludge; -#ifdef WANT_UNGETC - char ungetbuf; - char ungotten; -#endif -#ifdef WANT_THREAD_SAVE - pthread_mutex_t m; -#endif -} FILE; - -extern FILE *__stdio_root; - -#define ERRORINDICATOR 1 -#define EOFINDICATOR 2 -#define BUFINPUT 4 -#define BUFLINEWISE 8 -#define NOBUF 16 -#define UNSEEKABLE 32 - -#define _IONBF 0 -#define _IOLBF 1 -#define _IOFBF 2 - -/* internal function to flush buffer. - * However, if next is BUFINPUT and the buffer is an input buffer, it - * will not be flushed. Vice versa for output */ -extern int __fflush4(FILE *stream,int next); - -FILE *fopen (const char *path, const char *mode); -FILE *fdopen (int fildes, const char *mode); -FILE *freopen (const char *path, const char *mode, FILE *stream); - -int fgetc(FILE *stream); -char *fgets(char *s, int size, FILE *stream); -int getc(FILE *stream); -int getchar(void); -char *gets(char *s); -int ungetc(int c, FILE *stream); - -int fputc(int c, FILE *stream); -int fputs(const char *s, FILE *stream); -int putc(int c, FILE *stream); -int putchar(int c); -int puts(const char *s); - -long fseek( FILE *stream, long offset, int whence); -long ftell( FILE *stream); -void rewind( FILE *stream); -int fgetpos( FILE *stream, fpos_t *pos); -int fsetpos( FILE *stream, fpos_t *pos); - -size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream); - -size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream); - -int fflush(FILE *stream); - -int fclose(FILE *stream); - -extern FILE *stdout, *stderr, *stdin; - -#define EOF (int)(-1) diff --git a/mdk-stage1/dietlibc/dietwarning.h b/mdk-stage1/dietlibc/dietwarning.h deleted file mode 100644 index f7c67a175..000000000 --- a/mdk-stage1/dietlibc/dietwarning.h +++ /dev/null @@ -1,23 +0,0 @@ -#include "dietfeatures.h" - -#ifdef WANT_LINKER_WARNINGS - -#ifndef __ASSEMBLER__ - -#define link_warning(symbol,msg) \ - asm (".section .gnu.warning." symbol "\n\t.string \"" msg "\"\n\t.previous"); - -#else - -#define link_warning(symbol,msg) \ - .section .gnu.warning.##symbol ;\ - .string msg ;\ - .previous - -#endif - -#else - -#define link_warning(foo,bar) - -#endif diff --git a/mdk-stage1/dietlibc/dirstream.h b/mdk-stage1/dietlibc/dirstream.h deleted file mode 100644 index dc8fba79c..000000000 --- a/mdk-stage1/dietlibc/dirstream.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. -This file is part of the GNU C Library. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the, 1992 Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -/* - * POSIX Standard: 5.1.2 Directory Operations - */ - -#ifndef _DIRSTREAM_H - -#define _DIRSTREAM_H 1 - -#include -#include -#ifdef _POSIX_THREADS -#include -#endif - -/* For now, syscall readdir () only supports one entry at a time. It - * will be changed in the future. -#define NUMENT 3 -*/ -#ifndef NUMENT -#define NUMENT 1 -#endif - -#define SINGLE_READDIR 11 -#define MULTI_READDIR 12 -#define NEW_READDIR 13 - -/* Directory stream type. */ -struct __dirstream { - /* file descriptor */ - int dd_fd; - - /* offset of the next dir entry in buffer */ - off_t dd_nextloc; - - /* bytes of valid entries in buffer */ - size_t dd_size; - - /* -> directory buffer */ - struct dirent *dd_buf; - - /* we have to convert */ - struct dirent convbuf; - - /* offset of the next dir entry in directory. */ - off_t dd_nextoff; - - /* total size of buffer */ - size_t dd_max; - - enum {unknown, have_getdents, no_getdents} dd_getdents; - - /* lock */ -#ifdef _POSIX_THREADS - pthread_mutex_t *dd_lock; -#else - void *dd_lock; -#endif -}; /* stream data from opendir() */ - -#endif /* dirent.h */ diff --git a/mdk-stage1/dietlibc/i386/Makefile.add b/mdk-stage1/dietlibc/i386/Makefile.add deleted file mode 100644 index b685cc360..000000000 --- a/mdk-stage1/dietlibc/i386/Makefile.add +++ /dev/null @@ -1,3 +0,0 @@ - -CFLAGS+=-march=i386 -mcpu=i386 -Os -fomit-frame-pointer -VPATH:=i386:syscalls.s:$(VPATH) diff --git a/mdk-stage1/dietlibc/i386/__longjmp.S b/mdk-stage1/dietlibc/i386/__longjmp.S deleted file mode 100644 index 098275037..000000000 --- a/mdk-stage1/dietlibc/i386/__longjmp.S +++ /dev/null @@ -1,18 +0,0 @@ -#include - -.text -.global __longjmp -__longjmp: - movl 4(%esp), %ecx /* User's jmp_buf in %ecx. */ - movl 8(%esp), %eax /* Second argument is return value. */ - /* Save the return address now. */ - movl (JB_PC*4)(%ecx), %edx - /* Restore registers. */ - movl (JB_BX*4)(%ecx), %ebx - movl (JB_SI*4)(%ecx), %esi - movl (JB_DI*4)(%ecx), %edi - movl (JB_BP*4)(%ecx), %ebp - movl (JB_SP*4)(%ecx), %esp - /* Jump to saved PC. */ - jmp *%edx -.size __longjmp,.-__longjmp; diff --git a/mdk-stage1/dietlibc/i386/__testandset.S b/mdk-stage1/dietlibc/i386/__testandset.S deleted file mode 100644 index af7b4d5a0..000000000 --- a/mdk-stage1/dietlibc/i386/__testandset.S +++ /dev/null @@ -1,8 +0,0 @@ -.text -.global __testandset -__testandset: - xorl %eax, %eax - movl 0x4(%esp),%edx - incl %eax - xchgl %eax,(%edx) - ret diff --git a/mdk-stage1/dietlibc/i386/clone.S b/mdk-stage1/dietlibc/i386/clone.S deleted file mode 100644 index ac02eb468..000000000 --- a/mdk-stage1/dietlibc/i386/clone.S +++ /dev/null @@ -1,51 +0,0 @@ -#include - -.text -.weak clone -clone: -.global __clone -__clone: - movl 4(%esp), %ecx /* have non null thread_funcion */ - testl %ecx, %ecx - je .Lclone_error - - movl 8(%esp), %ecx /* have non null child_stack pointer */ - testl %ecx, %ecx - je .Lclone_error - - /* put the parameter on thread stack */ - subl $8, %ecx - - movl 16(%esp), %eax /* arg */ - movl %eax, 4(%ecx) - - movl 4(%esp), %eax /* thread_func */ - movl %eax, 0(%ecx) - - /* the syscall */ - pushl %ebx - movl 16(%esp), %ebx /* flags */ - movl $__NR_clone, %eax - int $0x80 - popl %ebx - - testl %eax, %eax - jl .Lclone_error - je .Lstart_thread - ret - -.Lstart_thread: - xorl %ebp,%ebp - call *%ebx - pushl %eax - call _exit - -.Lclone_error: - negl %eax - pushl %eax - call __errno_location - popl %ecx - movl %ecx, (%eax) - xorl %eax, %eax - decl %eax - ret diff --git a/mdk-stage1/dietlibc/i386/mmap.c b/mdk-stage1/dietlibc/i386/mmap.c deleted file mode 100644 index 26ecb55c0..000000000 --- a/mdk-stage1/dietlibc/i386/mmap.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -#define __NR__mmap __NR_mmap -_syscall1(int,_mmap,unsigned long *,buffer) - -char *mmap(char *addr, size_t len, int prot, int flags, int fd, unsigned long off) { - unsigned long buffer[6]; - buffer[0] = (unsigned long)addr; - buffer[1] = (unsigned long)len; - buffer[2] = (unsigned long)prot; - buffer[3] = (unsigned long)flags; - buffer[4] = (unsigned long)fd; - buffer[5] = (unsigned long)off; - return (char*) _mmap(buffer); -} diff --git a/mdk-stage1/dietlibc/i386/select.S b/mdk-stage1/dietlibc/i386/select.S deleted file mode 100644 index 9e7066eae..000000000 --- a/mdk-stage1/dietlibc/i386/select.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(_newselect,select,__libc_select) diff --git a/mdk-stage1/dietlibc/i386/setjmp.S b/mdk-stage1/dietlibc/i386/setjmp.S deleted file mode 100644 index 9bfecf565..000000000 --- a/mdk-stage1/dietlibc/i386/setjmp.S +++ /dev/null @@ -1,62 +0,0 @@ -#include - -/* setjmp for i386. - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -.section .rodata -.text -.weak setjmp -setjmp: -.globl __setjmp -__setjmp: - popl %eax /* Pop return address. */ - popl %ecx /* Pop jmp_buf. */ - pushl $0 /* Push zero argument. */ - pushl %ecx /* Push jmp_buf. */ - pushl %eax /* Push back return address. */ - -.globl __sigsetjmp -__sigsetjmp: - movl 4(%esp), %eax /* User's jmp_buf in %eax. */ - /* Save registers. */ - movl %ebx, (JB_BX*4)(%eax) - movl %esi, (JB_SI*4)(%eax) - movl %edi, (JB_DI*4)(%eax) - movl %ebp, (JB_BP*4)(%eax) - leal 4(%esp), %ecx /* Save SP as it will be after we return. */ - movl %ecx, (JB_SP*4)(%eax) - movl 0(%esp), %ecx /* Save PC we are returning to now. */ - movl %ecx, (JB_PC*4)(%eax) - - /* Make a tail call to __sigjmp_save; it takes the same args. */ -#ifdef PIC - /* We cannot use the PLT, because it requires that %ebx be set, but - we can't save and restore our caller's value. Instead, we do an - indirect jump through the GOT, using for the temporary register - %ecx, which is call-clobbered. */ - call L(here) -L(here): - popl %ecx - addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ecx - movl C_SYMBOL_NAME(__sigjmp_save@GOT)(%ecx), %ecx - jmp *%ecx -#else - jmp __sigjmp_save -#endif -.size __sigsetjmp,.-__sigsetjmp; diff --git a/mdk-stage1/dietlibc/i386/start.S b/mdk-stage1/dietlibc/i386/start.S deleted file mode 100644 index 167bb779c..000000000 --- a/mdk-stage1/dietlibc/i386/start.S +++ /dev/null @@ -1,42 +0,0 @@ -#include "start.h" - -#ifdef __i386__ -.text -.globl _start -_start: -#if 0 - popl %ecx - movl %esp, %esi - leal 4(%esp,%ecx,4),%eax -#else - movl (%esp),%ecx /* %ecx = argc */ - leal 4(%esp),%esi /* %esi = argv */ - - leal 4(%esi,%ecx,4),%eax /* eax = 4*ecx+4 = envp */ -#endif - pushl %eax - pushl %esi - pushl %ecx - movl %eax,environ - -#ifdef WANT_DYNAMIC -/* in %edx we have the dynamic _fini ( register this if non null ) */ - test %edx, %edx - je .Linit - push %edx - call atexit - pop %edx -.Linit: - call _init - push $_fini - call atexit - pop %edx -#endif - - call main - pushl %eax - call exit -.Lfefe: - .size _start,.Lfefe-_start -#endif - diff --git a/mdk-stage1/dietlibc/i386/unified.S b/mdk-stage1/dietlibc/i386/unified.S deleted file mode 100644 index f182bdb4b..000000000 --- a/mdk-stage1/dietlibc/i386/unified.S +++ /dev/null @@ -1,34 +0,0 @@ -#include - -.text -.global __unified_syscall -__unified_syscall: - movzbl %al, %eax - push %edi - push %esi - push %ebx - movl %esp,%edi - movl 0x10(%edi),%ebx - movl 0x14(%edi),%ecx - movl 0x18(%edi),%edx - movl 0x1c(%edi),%esi - movl 0x20(%edi),%edi - int $0x80 - cmp $-124,%eax - jbe .Lnoerror -#ifdef WANT_THREAD_SAVE - movl %eax,%ebx - call __errno_location - neg %ebx - movl %ebx,(%eax) -#else - neg %eax - mov %eax,errno -#endif - xor %eax,%eax - dec %eax -.Lnoerror: - pop %ebx - pop %esi - pop %edi - ret diff --git a/mdk-stage1/dietlibc/include/alloca.h b/mdk-stage1/dietlibc/include/alloca.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/mdk-stage1/dietlibc/include/arpa/inet.h b/mdk-stage1/dietlibc/include/arpa/inet.h deleted file mode 100644 index 6d5a6dc35..000000000 --- a/mdk-stage1/dietlibc/include/arpa/inet.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _ARPA_INET_H -#define _ARPA_INET_H - -#include -#include -#include - -int inet_aton(const char *cp, struct in_addr *inp) __THROW; -unsigned long int inet_addr(const char *cp) __THROW; -unsigned long int inet_network(const char *cp) __THROW; -char *inet_ntoa(struct in_addr in) __THROW; -struct in_addr inet_makeaddr(int net, int host) __THROW; -unsigned long int inet_lnaof(struct in_addr in) __THROW; -unsigned long int inet_netof(struct in_addr in) __THROW; - -int inet_pton (int AF, const char* CP, void* BUF) __THROW; -const char* inet_ntop (int AF, const void* CP, char* BUF, size_t LEN) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/arpa/nameser.h b/mdk-stage1/dietlibc/include/arpa/nameser.h deleted file mode 100644 index 1ee048d66..000000000 --- a/mdk-stage1/dietlibc/include/arpa/nameser.h +++ /dev/null @@ -1,217 +0,0 @@ -#ifndef _ARPA_NAMESER_H -#define _ARPA_NAMESER_H - -#include - -#define NS_PACKETSZ 512 /* maximum packet size */ -#define NS_MAXDNAME 1025 /* maximum domain name */ -#define NS_MAXCDNAME 255 /* maximum compressed domain name */ -#define NS_MAXLABEL 63 /* maximum length of domain label */ -#define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */ -#define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */ -#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */ -#define NS_INT32SZ 4 /* #/bytes of data in a u_int32_t */ -#define NS_INT16SZ 2 /* #/bytes of data in a u_int16_t */ -#define NS_INT8SZ 1 /* #/bytes of data in a u_int8_t */ -#define NS_INADDRSZ 4 /* IPv4 T_A */ -#define NS_IN6ADDRSZ 16 /* IPv6 T_AAAA */ -#define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */ -#define NS_DEFAULTPORT 53 /* For both TCP and UDP. */ - -/* - * Currently defined type values for resources and queries. - */ -typedef enum __ns_type { - ns_t_invalid = 0, /* Cookie. */ - ns_t_a = 1, /* Host address. */ - ns_t_ns = 2, /* Authoritative server. */ - ns_t_md = 3, /* Mail destination. */ - ns_t_mf = 4, /* Mail forwarder. */ - ns_t_cname = 5, /* Canonical name. */ - ns_t_soa = 6, /* Start of authority zone. */ - ns_t_mb = 7, /* Mailbox domain name. */ - ns_t_mg = 8, /* Mail group member. */ - ns_t_mr = 9, /* Mail rename name. */ - ns_t_null = 10, /* Null resource record. */ - ns_t_wks = 11, /* Well known service. */ - ns_t_ptr = 12, /* Domain name pointer. */ - ns_t_hinfo = 13, /* Host information. */ - ns_t_minfo = 14, /* Mailbox information. */ - ns_t_mx = 15, /* Mail routing information. */ - ns_t_txt = 16, /* Text strings. */ - ns_t_rp = 17, /* Responsible person. */ - ns_t_afsdb = 18, /* AFS cell database. */ - ns_t_x25 = 19, /* X_25 calling address. */ - ns_t_isdn = 20, /* ISDN calling address. */ - ns_t_rt = 21, /* Router. */ - ns_t_nsap = 22, /* NSAP address. */ - ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */ - ns_t_sig = 24, /* Security signature. */ - ns_t_key = 25, /* Security key. */ - ns_t_px = 26, /* X.400 mail mapping. */ - ns_t_gpos = 27, /* Geographical position (withdrawn). */ - ns_t_aaaa = 28, /* Ip6 Address. */ - ns_t_loc = 29, /* Location Information. */ - ns_t_nxt = 30, /* Next domain (security). */ - ns_t_eid = 31, /* Endpoint identifier. */ - ns_t_nimloc = 32, /* Nimrod Locator. */ - ns_t_srv = 33, /* Server Selection. */ - ns_t_atma = 34, /* ATM Address */ - ns_t_naptr = 35, /* Naming Authority PoinTeR */ - ns_t_kx = 36, /* Key Exchange */ - ns_t_cert = 37, /* Certification record */ - ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */ - ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */ - ns_t_sink = 40, /* Kitchen sink (experimentatl) */ - ns_t_opt = 41, /* EDNS0 option (meta-RR) */ - ns_t_tsig = 250, /* Transaction signature. */ - ns_t_ixfr = 251, /* Incremental zone transfer. */ - ns_t_axfr = 252, /* Transfer zone of authority. */ - ns_t_mailb = 253, /* Transfer mailbox records. */ - ns_t_maila = 254, /* Transfer mail agent records. */ - ns_t_any = 255, /* Wildcard match. */ - ns_t_zxfr = 256, /* BIND-specific, nonstandard. */ - ns_t_max = 65536 -} ns_type; - -/* - * Values for class field - */ -typedef enum __ns_class { - ns_c_invalid = 0, /* Cookie. */ - ns_c_in = 1, /* Internet. */ - ns_c_2 = 2, /* unallocated/unsupported. */ - ns_c_chaos = 3, /* MIT Chaos-net. */ - ns_c_hs = 4, /* MIT Hesiod. */ - /* Query class values which do not appear in resource records */ - ns_c_none = 254, /* for prereq. sections in update requests */ - ns_c_any = 255, /* Wildcard match. */ - ns_c_max = 65536 -} ns_class; - -typedef struct { - unsigned id :16; /* query identification number */ -#if BYTE_ORDER == BIG_ENDIAN - /* fields in third byte */ - unsigned qr: 1; /* response flag */ - unsigned opcode: 4; /* purpose of message */ - unsigned aa: 1; /* authoritive answer */ - unsigned tc: 1; /* truncated message */ - unsigned rd: 1; /* recursion desired */ - /* fields in fourth byte */ - unsigned ra: 1; /* recursion available */ - unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned ad: 1; /* authentic data from named */ - unsigned cd: 1; /* checking disabled by resolver */ - unsigned rcode :4; /* response code */ -#endif -#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN - /* fields in third byte */ - unsigned rd :1; /* recursion desired */ - unsigned tc :1; /* truncated message */ - unsigned aa :1; /* authoritive answer */ - unsigned opcode :4; /* purpose of message */ - unsigned qr :1; /* response flag */ - /* fields in fourth byte */ - unsigned rcode :4; /* response code */ - unsigned cd: 1; /* checking disabled by resolver */ - unsigned ad: 1; /* authentic data from named */ - unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ - unsigned ra :1; /* recursion available */ -#endif - /* remaining bytes */ - unsigned qdcount :16; /* number of question entries */ - unsigned ancount :16; /* number of answer entries */ - unsigned nscount :16; /* number of authority entries */ - unsigned arcount :16; /* number of resource entries */ -} HEADER; - -#define PACKETSZ NS_PACKETSZ -#define MAXDNAME NS_MAXDNAME -#define MAXCDNAME NS_MAXCDNAME -#define MAXLABEL NS_MAXLABEL -#define HFIXEDSZ NS_HFIXEDSZ -#define QFIXEDSZ NS_QFIXEDSZ -#define RRFIXEDSZ NS_RRFIXEDSZ -#define INT32SZ NS_INT32SZ -#define INT16SZ NS_INT16SZ -#define INADDRSZ NS_INADDRSZ -#define IN6ADDRSZ NS_IN6ADDRSZ -#define INDIR_MASK NS_CMPRSFLGS -#define NAMESERVER_PORT NS_DEFAULTPORT - -#define S_ZONE ns_s_zn -#define S_PREREQ ns_s_pr -#define S_UPDATE ns_s_ud -#define S_ADDT ns_s_ar - -#define QUERY ns_o_query -#define IQUERY ns_o_iquery -#define STATUS ns_o_status -#define NS_NOTIFY_OP ns_o_notify -#define NS_UPDATE_OP ns_o_update - -#define NOERROR ns_r_noerror -#define FORMERR ns_r_formerr -#define SERVFAIL ns_r_servfail -#define NXDOMAIN ns_r_nxdomain -#define NOTIMP ns_r_notimpl -#define REFUSED ns_r_refused -#define YXDOMAIN ns_r_yxdomain -#define YXRRSET ns_r_yxrrset -#define NXRRSET ns_r_nxrrset -#define NOTAUTH ns_r_notauth -#define NOTZONE ns_r_notzone - -#define DELETE ns_uop_delete -#define ADD ns_uop_add - -#define T_A ns_t_a -#define T_NS ns_t_ns -#define T_MD ns_t_md -#define T_MF ns_t_mf -#define T_CNAME ns_t_cname -#define T_SOA ns_t_soa -#define T_MB ns_t_mb -#define T_MG ns_t_mg -#define T_MR ns_t_mr -#define T_NULL ns_t_null -#define T_WKS ns_t_wks -#define T_PTR ns_t_ptr -#define T_HINFO ns_t_hinfo -#define T_MINFO ns_t_minfo -#define T_MX ns_t_mx -#define T_TXT ns_t_txt -#define T_RP ns_t_rp -#define T_AFSDB ns_t_afsdb -#define T_X25 ns_t_x25 -#define T_ISDN ns_t_isdn -#define T_RT ns_t_rt -#define T_NSAP ns_t_nsap -#define T_NSAP_PTR ns_t_nsap_ptr -#define T_SIG ns_t_sig -#define T_KEY ns_t_key -#define T_PX ns_t_px -#define T_GPOS ns_t_gpos -#define T_AAAA ns_t_aaaa -#define T_LOC ns_t_loc -#define T_NXT ns_t_nxt -#define T_EID ns_t_eid -#define T_NIMLOC ns_t_nimloc -#define T_SRV ns_t_srv -#define T_ATMA ns_t_atma -#define T_NAPTR ns_t_naptr -#define T_TSIG ns_t_tsig -#define T_IXFR ns_t_ixfr -#define T_AXFR ns_t_axfr -#define T_MAILB ns_t_mailb -#define T_MAILA ns_t_maila -#define T_ANY ns_t_any - -#define C_IN ns_c_in -#define C_CHAOS ns_c_chaos -#define C_HS ns_c_hs -#define C_NONE ns_c_none -#define C_ANY ns_c_any - -#endif diff --git a/mdk-stage1/dietlibc/include/assert.h b/mdk-stage1/dietlibc/include/assert.h deleted file mode 100644 index bb573d0f2..000000000 --- a/mdk-stage1/dietlibc/include/assert.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _ASSERT_H -#define _ASSERT_H - -#include - -/* This prints an "Assertion failed" message and aborts. */ -extern void __assert_fail (__const char *__assertion, __const char *__file, - unsigned int __line, __const char *__function) - __THROW __attribute__ ((__noreturn__)); - -#ifdef __PRETTY_FUNCTION__ -#define __ASSERT_FUNCTION __PRETTY_FUNCTION__ -#else -#define __ASSERT_FUNCTION __func__ -#endif - -#undef assert -#ifdef NDEBUG -#define assert(expr) -#else -# define assert(expr) \ - ((void) ((expr) ? 0 : \ - (__assert_fail (#expr, \ - __FILE__, __LINE__, __ASSERT_FUNCTION), 0))) -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/ctype.h b/mdk-stage1/dietlibc/include/ctype.h deleted file mode 100644 index 9322e8c7b..000000000 --- a/mdk-stage1/dietlibc/include/ctype.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _CTYPE_H -#define _CTYPE_H - -#include - -extern int isascii (int c) __THROW __attribute__ ((__const__)); -extern int isblank (int c) __THROW __attribute__ ((__const__)); -extern int isalnum (int c) __THROW __attribute__ ((__const__)); -extern int isalpha (int c) __THROW __attribute__ ((__const__)); -extern int isdigit (int c) __THROW __attribute__ ((__const__)); -extern int isspace (int c) __THROW __attribute__ ((__const__)); - -extern int isupper (int c) __THROW __attribute__ ((__const__)); -extern int islower (int c) __THROW __attribute__ ((__const__)); - -extern int tolower(int c) __THROW __attribute__ ((__const__)); -extern int toupper(int c) __THROW __attribute__ ((__const__)); - -extern int isprint(int c) __THROW __attribute__ ((__const__)); -extern int ispunct(int c) __THROW __attribute__ ((__const__)); -extern int iscntrl(int c) __THROW __attribute__ ((__const__)); - -/* fscking GNU extensions! */ -extern int isxdigit(int c) __THROW __attribute__ ((__const__)); - -extern int isgraph(int c) __THROW __attribute__ ((__const__)); - -#endif diff --git a/mdk-stage1/dietlibc/include/daemon.h b/mdk-stage1/dietlibc/include/daemon.h deleted file mode 100644 index 9049f367d..000000000 --- a/mdk-stage1/dietlibc/include/daemon.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _DAEMON_H -#define _DAEMON_H - -extern int daemon (int nochdir,int noclose); - -#endif diff --git a/mdk-stage1/dietlibc/include/dirent.h b/mdk-stage1/dietlibc/include/dirent.h deleted file mode 100644 index b0ad4f5ec..000000000 --- a/mdk-stage1/dietlibc/include/dirent.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _DIRENT_H -#define _DIRENT_H 1 - -#include -#include - -#include - -#define d_fileno d_ino /* Backwards compatibility. */ - -#undef _DIRENT_HAVE_D_NAMLEN -#define _DIRENT_HAVE_D_RECLEN -#define _DIRENT_HAVE_D_OFF -#define _DIRENT_HAVE_D_TYPE - -typedef struct __dirstream DIR; - -DIR *opendir (const char *__name) __THROW; -int closedir (DIR *__dirp) __THROW; -struct dirent *readdir (DIR *__dirp) __THROW; -struct dirent64 *readdir64 (DIR *__dirp) __THROW; -void rewinddir (DIR *__dirp) __THROW; -void seekdir (DIR *__dirp, long int __pos) __THROW; -long int telldir (DIR *__dirp) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/dlfcn.h b/mdk-stage1/dietlibc/include/dlfcn.h deleted file mode 100644 index b96f8f615..000000000 --- a/mdk-stage1/dietlibc/include/dlfcn.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _DLFCN_H -#define _DLFCN_H 1 - -#define RTLD_LAZY 0x00000 -#define RTLD_NOW 0x00001 - -#define RTLD_LOCAL 0x00000 -#define RTLD_GLOBAL 0x10000 - -void *dlopen (const char *filename, int flag); -const char *dlerror(void); -void *dlsym(void *handle, char *symbol); -int dlclose (void *handle); - -#endif diff --git a/mdk-stage1/dietlibc/include/elf.h b/mdk-stage1/dietlibc/include/elf.h deleted file mode 100644 index be09dbee4..000000000 --- a/mdk-stage1/dietlibc/include/elf.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/mdk-stage1/dietlibc/include/endian.h b/mdk-stage1/dietlibc/include/endian.h deleted file mode 100644 index 463c24fff..000000000 --- a/mdk-stage1/dietlibc/include/endian.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _ENDIAN_H -#define _ENDIAN_H - -#define __LITTLE_ENDIAN 1234 -#define __BIG_ENDIAN 4321 - -#ifdef __i386__ -#define __BYTE_ORDER __LITTLE_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#endif - -#ifdef __sparc__ -#define __BYTE_ORDER __BIG_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#endif - -#ifdef __mips__ -#ifdef __MIPSEB__ -#define __BIG_ENDIAN__ -#endif -#endif - -#ifndef __BYTE_ORDER -#ifdef __BIG_ENDIAN__ -#define __BYTE_ORDER __BIG_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#else -#define __BYTE_ORDER __LITTLE_ENDIAN -#define __FLOAT_WORD_ORDER __BYTE_ORDER -#endif -#endif - -#define LITTLE_ENDIAN __LITTLE_ENDIAN -#define BIG_ENDIAN __BIG_ENDIAN -#define BYTE_ORDER __BYTE_ORDER - -#if __BYTE_ORDER == __LITTLE_ENDIAN -# define __LONG_LONG_PAIR(HI, LO) LO, HI -#elif __BYTE_ORDER == __BIG_ENDIAN -# define __LONG_LONG_PAIR(HI, LO) HI, LO -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/errno.h b/mdk-stage1/dietlibc/include/errno.h deleted file mode 100644 index d1c68f39c..000000000 --- a/mdk-stage1/dietlibc/include/errno.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _ERRNO_H -#define _ERRNO_H - -extern int errno; - -#include - -extern int *__errno_location(void); -extern void __set_errno(int error); - -#endif diff --git a/mdk-stage1/dietlibc/include/fcntl.h b/mdk-stage1/dietlibc/include/fcntl.h deleted file mode 100644 index b792502c1..000000000 --- a/mdk-stage1/dietlibc/include/fcntl.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _FCNTL_H -#define _FCNTL_H - -#include - -#include -#include - -#include - -extern int fcntl (int __fd, int __cmd, ...) __THROW; -extern int open (const char *__file, int __oflag, ...) __THROW; -extern int open64 (const char *__file, int __oflag, ...) __THROW; -extern int creat (const char *__file, mode_t __mode) __THROW; -extern int creat64 (const char *__file, mode_t __mode) __THROW; -extern int lockf (int __fd, int __cmd, off_t __len) __THROW; -extern int lockf64 (int __fd, int __cmd, off64_t __len) __THROW; - -#define F_ULOCK 0 /* Unlock a previously locked region. */ -#define F_LOCK 1 /* Lock a region for exclusive use. */ -#define F_TLOCK 2 /* Test and lock a region for exclusive use. */ -#define F_TEST 3 /* Test a region for other processes locks. */ - -#endif diff --git a/mdk-stage1/dietlibc/include/features.h b/mdk-stage1/dietlibc/include/features.h deleted file mode 100644 index 5b0283f20..000000000 --- a/mdk-stage1/dietlibc/include/features.h +++ /dev/null @@ -1,3 +0,0 @@ -#warning "someone included features.h, apparently someone is including glibc headers!" - -#define __dietlibc__ diff --git a/mdk-stage1/dietlibc/include/fnmatch.h b/mdk-stage1/dietlibc/include/fnmatch.h deleted file mode 100644 index 762b43ff7..000000000 --- a/mdk-stage1/dietlibc/include/fnmatch.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef _FNMATCH_H -#define _FNMATCH_H - -#include - -int fnmatch(const char *pattern, const char *string, int flags) __THROW; - -#define FNM_NOESCAPE 1 -#define FNM_PATHNAME 2 -#define FNM_FILE_NAME 2 -#define FNM_PERIOD 4 -#define FNM_LEADING_DIR 8 -#define FNM_CASEFOLD 16 - -#endif diff --git a/mdk-stage1/dietlibc/include/ftw.h b/mdk-stage1/dietlibc/include/ftw.h deleted file mode 100644 index c888f0021..000000000 --- a/mdk-stage1/dietlibc/include/ftw.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef _FTW_H -#define _FTW_H - -#include -#include - -struct FTW - { - int base; - int level; - }; - -int ftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag), int depth) __THROW; -int nftw (const char *dir, int (*fn)(const char *file, const struct stat *sb, int flag, struct FTW *s), int depth, int flags) __THROW; - -enum -{ - FTW_F, /* Regular file. */ -#define FTW_F FTW_F - FTW_D, /* Directory. */ -#define FTW_D FTW_D - FTW_DNR, /* Unreadable directory. */ -#define FTW_DNR FTW_DNR - FTW_NS, /* Unstatable file. */ -#define FTW_NS FTW_NS - FTW_SL, /* Symbolic link. */ -# define FTW_SL FTW_SL -/* These flags are only passed from the `nftw' function. */ - FTW_DP, /* Directory, all subdirs have been visited. */ -# define FTW_DP FTW_DP - FTW_SLN /* Symbolic link naming non-existing file. */ -# define FTW_SLN FTW_SLN -}; - -typedef int (*__ftw_func_t) (__const char *__filename, - __const struct stat *__status, int __flag) __THROW; - -typedef int (*__nftw_func_t) (__const char *__filename, - __const struct stat *__status, int __flag, - struct FTW *__info) __THROW; - -#ifndef __NO_STAT64 -typedef int (*__ftw64_func_t) (__const char *__filename, - __const struct stat64 *__status, int __flag) __THROW; - -typedef int (*__nftw64_func_t) (__const char *__filename, - __const struct stat64 *__status, - int __flag, struct FTW *__info) __THROW; -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/getopt.h b/mdk-stage1/dietlibc/include/getopt.h deleted file mode 100644 index ebfc5522d..000000000 --- a/mdk-stage1/dietlibc/include/getopt.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __GETOPT_H__ -#define __GETOPT_H__ - -extern int optind,opterr; -extern char *optarg; -int getopt(int argc, char *argv[], char *options); - -/* the following was taken from GNU getopt, it's not actually supported - * by the diet libc! */ -extern int optopt; - -struct option { - const char* name; - int has_arg; - int* flag; - int val; -}; - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -extern int getopt_long(int argc, char *const *argv, - const char *shortopts, const struct option *longopts, - int *longind); - -extern int getopt_long_only(int argc, char *const *argv, - const char *shortopts, const struct option *longopts, - int *longind); - - -#endif diff --git a/mdk-stage1/dietlibc/include/glob.h b/mdk-stage1/dietlibc/include/glob.h deleted file mode 100644 index 80febbccf..000000000 --- a/mdk-stage1/dietlibc/include/glob.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef _GLOB_H -#define _GLOB_H - - -typedef struct { - size_t gl_pathc; /* Count of paths matched so far */ - char **gl_pathv; /* List of matched pathnames. */ - size_t gl_offs; /* Slots to reserve in `gl_pathv'. */ - int gl_flags; /* Set to FLAGS, maybe | GLOB_MAGCHAR. */ -} glob_t; - - -int glob(const char *pattern, int flags, - int errfunc(const char * epath, int eerrno), - glob_t *pglob) __THROW; - -void globfree(glob_t *pglob) __THROW; - - - -/* Bits set in the FLAGS argument to `glob'. */ -#define GLOB_ERR (1 << 0)/* Return on read errors. */ -#define GLOB_MARK (1 << 1)/* Append a slash to each name. */ -#define GLOB_NOSORT (1 << 2)/* Don't sort the names. */ -#define GLOB_DOOFFS (1 << 3)/* Insert PGLOB->gl_offs NULLs. */ -#define GLOB_NOCHECK (1 << 4)/* If nothing matches, return the pattern. */ -#define GLOB_APPEND (1 << 5)/* Append to results of a previous call. */ -#define GLOB_NOESCAPE (1 << 6)/* Backslashes don't quote metacharacters. */ -#define GLOB_PERIOD (1 << 7)/* Leading `.' can be matched by metachars. */ - -#define GLOB_MAGCHAR (1 << 8)/* Set in gl_flags if any metachars seen. */ -#define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */ -#define GLOB_BRACE (1 << 10)/* Expand "{a,b}" to "a" "b". */ -#define GLOB_NOMAGIC (1 << 11)/* If no magic chars, return the pattern. */ -#define GLOB_TILDE (1 << 12)/* Expand ~user and ~ to home directories. */ -#define GLOB_ONLYDIR (1 << 13)/* Match only directories. */ -#define GLOB_TILDE_CHECK (1 << 14)/* Like GLOB_TILDE but return an error - if the user name is not available. */ -#define __GLOB_FLAGS (GLOB_ERR|GLOB_MARK|GLOB_NOSORT|GLOB_DOOFFS| \ - GLOB_NOESCAPE|GLOB_NOCHECK|GLOB_APPEND| \ - GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE| \ - GLOB_NOMAGIC|GLOB_TILDE|GLOB_ONLYDIR|GLOB_TILDE_CHECK) - - -/* Error returns from `glob'. */ -#define GLOB_NOSPACE 1 /* Ran out of memory. */ -#define GLOB_ABORTED 2 /* Read error. */ -#define GLOB_NOMATCH 3 /* No matches found. */ -#define GLOB_NOSYS 4 /* Not implemented. */ -/* Previous versions of this file defined GLOB_ABEND instead of - GLOB_ABORTED. Provide a compatibility definition here. */ -#define GLOB_ABEND GLOB_ABORTED - - -#endif diff --git a/mdk-stage1/dietlibc/include/grp.h b/mdk-stage1/dietlibc/include/grp.h deleted file mode 100644 index 32bf49afc..000000000 --- a/mdk-stage1/dietlibc/include/grp.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef _GRP_H -#define _GRP_H - -#include -#include - -struct group - { - char *gr_name; /* Group name. */ - char *gr_passwd; /* Password. */ - gid_t gr_gid; /* Group ID. */ - char **gr_mem; /* Member list. */ - }; - -extern struct group *getgrgid (gid_t uid) __THROW; -extern struct group *getgrnam (const char *name) __THROW; - -extern struct group *getgrent(void) __THROW; -extern void setgrent(void) __THROW; -extern void endgrent(void) __THROW; - -extern int setgroups(size_t n, const gid_t *groups) __THROW; -extern int initgroups(const char *user, gid_t group) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/inttypes.h b/mdk-stage1/dietlibc/include/inttypes.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/mdk-stage1/dietlibc/include/limits.h b/mdk-stage1/dietlibc/include/limits.h deleted file mode 100644 index a333debfd..000000000 --- a/mdk-stage1/dietlibc/include/limits.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef _LIMITS_H -#define _LIMITS_H - -#include - -#define __WORDSIZE 32 - -#ifdef __alpha__ -#undef __WORDSIZE -#define __WORDSIZE 64 -#endif - -#ifndef PATH_MAX -#define PATH_MAX 4096 -#endif - -#define CHAR_BIT 8 - -#define SCHAR_MIN (-128) -#define SCHAR_MAX 0x7f -#define UCHAR_MAX 0xff - -#define SHRT_MIN (-SHRT_MAX-1) -#define SHRT_MAX 0x7fff -#define USHRT_MAX 0xffff - -#define INT_MIN (-INT_MAX-1) -#define INT_MAX 0x7fffffff -#define UINT_MAX 0xffffffff - -#if __WORDSIZE == 64 -#define LONG_MAX 9223372036854775807L -#define ULONG_MAX 18446744073709551615UL -#else -#define LONG_MAX 2147483647L -#define ULONG_MAX 4294967295UL -#endif -#define LONG_MIN (-LONG_MAX - 1L) - -#define LLONG_MAX 9223372036854775807LL -#define LLONG_MIN (-LLONG_MAX - 1LL) - -/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */ -#define ULLONG_MAX 18446744073709551615ULL - -#define PASS_MAX 256 - -#endif diff --git a/mdk-stage1/dietlibc/include/locale.h b/mdk-stage1/dietlibc/include/locale.h deleted file mode 100644 index acbeec8c1..000000000 --- a/mdk-stage1/dietlibc/include/locale.h +++ /dev/null @@ -1,6 +0,0 @@ -#warning "there is no locale support for diet libc yet" - -#define setlocale(a,b) 0 -#define bindtextdomain -#define textdomain - diff --git a/mdk-stage1/dietlibc/include/malloc.h b/mdk-stage1/dietlibc/include/malloc.h deleted file mode 100644 index c8b49f26d..000000000 --- a/mdk-stage1/dietlibc/include/malloc.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/mdk-stage1/dietlibc/include/math.h b/mdk-stage1/dietlibc/include/math.h deleted file mode 100644 index 2f4f2e33f..000000000 --- a/mdk-stage1/dietlibc/include/math.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef _MATH_H -#define _MATH_H - -#include - -#define M_E 2.7182818284590452354 /* e */ -#define M_LOG2E 1.4426950408889634074 /* log_2 e */ -#define M_LOG10E 0.43429448190325182765 /* log_10 e */ -#define M_LN2 0.69314718055994530942 /* log_e 2 */ -#define M_LN10 2.30258509299404568402 /* log_e 10 */ -#define M_PI 3.14159265358979323846 /* pi */ -#define M_PI_2 1.57079632679489661923 /* pi/2 */ -#define M_PI_4 0.78539816339744830962 /* pi/4 */ -#define M_1_PI 0.31830988618379067154 /* 1/pi */ -#define M_2_PI 0.63661977236758134308 /* 2/pi */ -#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */ -#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */ -#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */ - -#define M_El 2.7182818284590452353602874713526625L /* e */ -#define M_LOG2El 1.4426950408889634073599246810018922L /* log_2 e */ -#define M_LOG10El 0.4342944819032518276511289189166051L /* log_10 e */ -#define M_LN2l 0.6931471805599453094172321214581766L /* log_e 2 */ -#define M_LN10l 2.3025850929940456840179914546843642L /* log_e 10 */ -#define M_PIl 3.1415926535897932384626433832795029L /* pi */ -#define M_PI_2l 1.5707963267948966192313216916397514L /* pi/2 */ -#define M_PI_4l 0.7853981633974483096156608458198757L /* pi/4 */ -#define M_1_PIl 0.3183098861837906715377675267450287L /* 1/pi */ -#define M_2_PIl 0.6366197723675813430755350534900574L /* 2/pi */ -#define M_2_SQRTPIl 1.1283791670955125738961589031215452L /* 2/sqrt(pi) */ -#define M_SQRT2l 1.4142135623730950488016887242096981L /* sqrt(2) */ -#define M_SQRT1_2l 0.7071067811865475244008443621048490L /* 1/sqrt(2) */ - -double sin(double d) __THROW __attribute__((__const__)); -double cos(double d) __THROW __attribute__((__const__)); -double tan(double d) __THROW __attribute__((__const__)); - -double sinh(double d) __THROW __attribute__((__const__)); -double cosh(double d) __THROW __attribute__((__const__)); -double tanh(double d) __THROW __attribute__((__const__)); - -double asin(double d) __THROW __attribute__((__const__)); -double acos(double d) __THROW __attribute__((__const__)); -double atan(double d) __THROW __attribute__((__const__)); - -double asinh(double d) __THROW __attribute__((__const__)); -double acosh(double d) __THROW __attribute__((__const__)); -double atanh(double d) __THROW __attribute__((__const__)); - -double exp(double d) __THROW __attribute__((__const__)); -double log(double d) __THROW __attribute__((__const__)); -double log10(double d) __THROW __attribute__((__const__)); - -double pow(double x, double y) __THROW __attribute__((__const__)); - -double sqrt(double x) __THROW __attribute__((__const__)); -double fabs(double x) __THROW __attribute__((__const__)); -double fmod(double x, double y) __THROW __attribute__((__const__)); - - -#endif diff --git a/mdk-stage1/dietlibc/include/memory.h b/mdk-stage1/dietlibc/include/memory.h deleted file mode 100644 index 39adee705..000000000 --- a/mdk-stage1/dietlibc/include/memory.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _MEMORY_H -#define _MEMORY_H - -#include - -#endif diff --git a/mdk-stage1/dietlibc/include/mntent.h b/mdk-stage1/dietlibc/include/mntent.h deleted file mode 100644 index 301403224..000000000 --- a/mdk-stage1/dietlibc/include/mntent.h +++ /dev/null @@ -1,72 +0,0 @@ -#ifndef _MNTENT_H -#define _MNTENT_H - -#include -#include -#include - -#define MNTTAB _PATH_MNTTAB /* Deprecated alias. */ -#define MOUNTED _PATH_MOUNTED /* Deprecated alias. */ - -/* General filesystem types. */ -#define MNTTYPE_IGNORE "ignore" /* Ignore this entry. */ -#define MNTTYPE_NFS "nfs" /* Network file system. */ -#define MNTTYPE_SWAP "swap" /* Swap device. */ - - -/* Generic mount options. */ -#define MNTOPT_DEFAULTS "defaults" /* Use all default options. */ -#define MNTOPT_RO "ro" /* Read only. */ -#define MNTOPT_RW "rw" /* Read/write. */ -#define MNTOPT_SUID "suid" /* Set uid allowed. */ -#define MNTOPT_NOSUID "nosuid" /* No set uid allowed. */ -#define MNTOPT_NOAUTO "noauto" /* Do not auto mount. */ - -__BEGIN_DECLS - -/* Structure describing a mount table entry. */ -struct mntent - { - char *mnt_fsname; /* Device or server for filesystem. */ - char *mnt_dir; /* Directory mounted on. */ - char *mnt_type; /* Type of filesystem: ufs, nfs, etc. */ - char *mnt_opts; /* Comma-separated options for fs. */ - int mnt_freq; /* Dump frequency (in days). */ - int mnt_passno; /* Pass number for `fsck'. */ - }; - - -/* Prepare to begin reading and/or writing mount table entries from the - beginning of FILE. MODE is as for `fopen'. */ -extern FILE *setmntent (const char *file, const char *mode) __THROW; - -/* Read one mount table entry from STREAM. Returns a pointer to storage - reused on the next call, or null for EOF or error (use feof/ferror to - check). */ -extern struct mntent *getmntent (FILE* stream) __THROW; - -#ifdef __USE_MISC -/* Reentrant version of the above function. */ -extern struct mntent *getmntent_r (FILE* stream, - struct mntent* result, - char* buffer, - int bufsize) __THROW; -#endif - -/* Write the mount table entry described by MNT to STREAM. - Return zero on success, nonzero on failure. */ -extern int addmntent (FILE* stream, - const struct mntent* mnt) __THROW; - -/* Close a stream opened with `setmntent'. */ -extern int endmntent (FILE *stream) __THROW; - -/* Search MNT->mnt_opts for an option matching OPT. - Returns the address of the substring, or null if none found. */ -extern char *hasmntopt (const struct mntent *__mnt, - const char *opt) __THROW; - - -__END_DECLS - -#endif /* mntent.h */ diff --git a/mdk-stage1/dietlibc/include/net/if.h b/mdk-stage1/dietlibc/include/net/if.h deleted file mode 100644 index 88f386f46..000000000 --- a/mdk-stage1/dietlibc/include/net/if.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _NET_IF_H -#define _NET_IF_H - -#include - -#include - -unsigned int if_nametoindex (const char *ifname) __THROW; -char *if_indextoname (unsigned int ifindex, char *ifname) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/net/if_arp.h b/mdk-stage1/dietlibc/include/net/if_arp.h deleted file mode 100644 index fe37a22dc..000000000 --- a/mdk-stage1/dietlibc/include/net/if_arp.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _NET_IF_ARP_H -#define _NET_IF_ARP_H - -#include - -#endif diff --git a/mdk-stage1/dietlibc/include/net/route.h b/mdk-stage1/dietlibc/include/net/route.h deleted file mode 100644 index 5e5db7b1a..000000000 --- a/mdk-stage1/dietlibc/include/net/route.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _NET_IF_ROUTE_H -#define _NET_IF_ROUTE_H - -#include - -#endif diff --git a/mdk-stage1/dietlibc/include/netdb.h b/mdk-stage1/dietlibc/include/netdb.h deleted file mode 100644 index e90ea81ac..000000000 --- a/mdk-stage1/dietlibc/include/netdb.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef _NETDB_H -#define _NETDB_H - -#include -#include - -/* Absolute file name for network data base files. */ -#define _PATH_HEQUIV "/etc/hosts.equiv" -#define _PATH_HOSTS "/etc/hosts" -#define _PATH_NETWORKS "/etc/networks" -#define _PATH_NSSWITCH_CONF "/etc/nsswitch.conf" -#define _PATH_PROTOCOLS "/etc/protocols" -#define _PATH_SERVICES "/etc/services" - -/* Description of data base entry for a single service. */ -struct servent -{ - char *s_name; /* Official service name. */ - char **s_aliases; /* Alias list. */ - int s_port; /* Port number. */ - char *s_proto; /* Protocol to use. */ -}; - -extern void endservent (void) __THROW; -extern struct servent *getservent (void) __THROW; -extern struct servent *getservbyname (const char *__name, - const char *__proto) __THROW; -extern struct servent *getservbyport (int __port, const char *__proto) - __THROW; - -struct hostent -{ - char *h_name; /* Official name of host. */ - char **h_aliases; /* Alias list. */ - int h_addrtype; /* Host address type. */ - socklen_t h_length; /* Length of address. */ - char **h_addr_list; /* List of addresses from name server. */ -#define h_addr h_addr_list[0] /* Address, for backward compatibility. */ -}; - -extern void endhostent (void) __THROW; -extern struct hostent *gethostent (void) __THROW; -extern struct hostent *gethostbyaddr (const void *__addr, socklen_t __len, - int __type) __THROW; -extern struct hostent *gethostbyname (const char *__name) __THROW; -extern struct hostent *gethostbyname2 (const char *__name, int __af) __THROW; - -/* this glibc "invention" is so ugly, I'm going to throw up any minute - * now */ -extern int gethostbyname_r(const char* NAME, struct hostent* RESULT_BUF,char* BUF, - size_t BUFLEN, struct hostent** RESULT, - int* H_ERRNOP) __THROW; - -#define HOST_NOT_FOUND 1 -#define TRY_AGAIN 2 -#define NO_RECOVERY 3 -#define NO_ADDRESS 4 - -extern int gethostbyaddr_r(const char* addr, size_t length, int format, - struct hostent* result, char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop) __THROW; - -struct protoent { - char *p_name; /* official protocol name */ - char **p_aliases; /* alias list */ - int p_proto; /* protocol number */ -}; - -struct protoent *getprotoent(void) __THROW; -struct protoent *getprotobyname(const char *name) __THROW; -struct protoent *getprotobynumber(int proto) __THROW; -void setprotoent(int stayopen) __THROW; -void endprotoent(void) __THROW; - - -/* Description of data base entry for a single network. NOTE: here a - poor assumption is made. The network number is expected to fit - into an unsigned long int variable. */ -struct netent -{ - char *n_name; /* Official name of network. */ - char **n_aliases; /* Alias list. */ - int n_addrtype; /* Net address type. */ - uint32_t n_net; /* Network number. */ -}; - -extern struct netent *getnetbyname (__const char *__name) __THROW; - - -#endif diff --git a/mdk-stage1/dietlibc/include/netinet/in.h b/mdk-stage1/dietlibc/include/netinet/in.h deleted file mode 100644 index 0569c8289..000000000 --- a/mdk-stage1/dietlibc/include/netinet/in.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _NETINET_IN_H -#define _NETINET_IN_H - -#include -#include - -#define IPPORT_RESERVED 1024 - -#endif diff --git a/mdk-stage1/dietlibc/include/netinet/in_systm.h b/mdk-stage1/dietlibc/include/netinet/in_systm.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/mdk-stage1/dietlibc/include/netinet/ip.h b/mdk-stage1/dietlibc/include/netinet/ip.h deleted file mode 100644 index 35bf9cc42..000000000 --- a/mdk-stage1/dietlibc/include/netinet/ip.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _NETINET_IP_H -#define _NETINET_IP_H - -#include - -#endif diff --git a/mdk-stage1/dietlibc/include/paths.h b/mdk-stage1/dietlibc/include/paths.h deleted file mode 100644 index 0e36bb10e..000000000 --- a/mdk-stage1/dietlibc/include/paths.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _PATHS_H -#define _PATHS_H - -#define _PATH_BSHELL "/bin/sh" -#define _PATH_DEFPATH "/bin:/usr/bin:" - -#define _PATH_DEVNULL "/dev/null" - -#define _PATH_CONSOLE "/dev/console" -#define _PATH_MOUNTED "/etc/mtab" - -#define _PATH_PASSWD "/etc/passwd" -#define _PATH_GROUP "/etc/group" -#define _PATH_SHADOW "/etc/shadow" - -#endif diff --git a/mdk-stage1/dietlibc/include/pthread.h b/mdk-stage1/dietlibc/include/pthread.h deleted file mode 100644 index e922ab28b..000000000 --- a/mdk-stage1/dietlibc/include/pthread.h +++ /dev/null @@ -1,227 +0,0 @@ -#ifndef _PTHREAD_H -#define _PTHREAD_H 1 - -#include -#include -#include - -/* arg... kernel haeder... */ -#define ENOTSUP 524 /* Operation is not supported */ - -#define PTHREAD_STACK_SIZE 16384 - -#define PTHREAD_THREADS_MAX 128 - -#define MAX_SPIN_COUNT 50 -#define SPIN_SLEEP_DURATION 2000001 - -#define PTHREAD_KEYS_MAX 7 -#define PTHREAD_DESTRUCTOR_ITERATIONS 10 - -typedef struct _pthread_descr_struct *_pthread_descr; -typedef unsigned long int pthread_t; - -/* Fast locks */ -struct _pthread_fastlock { - int __spinlock; -}; - -/* Mutexes */ -typedef struct { - struct _pthread_fastlock lock; - _pthread_descr owner; - int kind; - unsigned int count; -} pthread_mutex_t; - -enum { - PTHREAD_MUTEX_FAST_NP, - PTHREAD_MUTEX_RECURSIVE_NP, - PTHREAD_MUTEX_ERRORCHECK_NP, -}; - -enum -{ - PTHREAD_PROCESS_PRIVATE, -#define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE - PTHREAD_PROCESS_SHARED -#define PTHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED -}; - -#define PTHREAD_MUTEX_INITIALIZER \ -{{0}, 0, PTHREAD_MUTEX_FAST_NP, 0} - -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ -{{0}, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0} - -#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \ -{{0}, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0} - -typedef struct { - int __mutexkind; -} pthread_mutexattr_t; - -int pthread_mutex_init(pthread_mutex_t *mutex, - const pthread_mutexattr_t *mutexattr); -int pthread_mutex_lock(pthread_mutex_t *mutex); -int pthread_mutex_unlock(pthread_mutex_t *mutex); -int pthread_mutex_trylock(pthread_mutex_t *mutex); -int pthread_mutex_destroy(pthread_mutex_t *mutex); - -/* Conditions */ -typedef void* pthread_condattr_t; - -typedef struct { - struct _pthread_fastlock lock; - _pthread_descr wait_chain; -} pthread_cond_t; - -#define PTHREAD_COND_INITIALIZER \ -{{0},0} - -int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); -int pthread_cond_destroy(pthread_cond_t *cond); -int pthread_cond_signal(pthread_cond_t *cond); -int pthread_cond_broadcast(pthread_cond_t *cond); -int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, - const struct timespec *abstime); -int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); - -/* only for completeness (always return NULL) */ -int pthread_condattr_init(pthread_condattr_t *attr); -int pthread_condattr_destroy(pthread_condattr_t *attr); -int pthread_condattr_getpshared(const pthread_condattr_t *attr, int *pshared); -int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared); - -/* thread specific variables */ -typedef unsigned int pthread_key_t; - -int pthread_key_create(pthread_key_t *key, void (*destructor)(const void*)); -int pthread_key_delete(pthread_key_t key); -int pthread_setspecific(pthread_key_t key, const void *value); -const void *pthread_getspecific(pthread_key_t key); - - -/* Attributes for threads. */ -typedef struct -{ - int __detachstate; - int __schedpolicy; - struct sched_param __schedparam; - int __inheritsched; - int __scope; - void * __stackaddr; - unsigned long __stacksize; -} pthread_attr_t; - -enum -{ - PTHREAD_CREATE_JOINABLE, -#define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLE - PTHREAD_CREATE_DETACHED -#define PTHREAD_CREATE_DETACHED PTHREAD_CREATE_DETACHED -}; - -enum -{ - PTHREAD_EXPLICIT_SCHED, -#define PTHREAD_EXPLICIT_SCHED PTHREAD_EXPLICIT_SCHED - PTHREAD_INHERIT_SCHED -#define PTHREAD_INHERIT_SCHED PTHREAD_INHERIT_SCHED -}; - -enum /* for completeness */ -{ - PTHREAD_SCOPE_SYSTEM, -#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_SYSTEM - PTHREAD_SCOPE_PROCESS -#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_PROCESS -}; - -int pthread_attr_init(pthread_attr_t *attr); -int pthread_attr_destroy(pthread_attr_t *attr); - -int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); -int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate); - -int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); -int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy); - -int pthread_attr_setschedparam(pthread_attr_t *attr, - const struct sched_param *param); -int pthread_attr_getschedparam(const pthread_attr_t *attr, - struct sched_param *param); - -int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit); -int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit); - -int pthread_attr_setscope(pthread_attr_t *attr, int scope); -int pthread_attr_getscope(const pthread_attr_t *attr, int *scope); - -int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stack); -int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stack); - -int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); -int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize); - -/* ONCE */ -typedef int pthread_once_t; -#define PTHREAD_ONCE_INIT 0 - -int __pthread_once(pthread_once_t* once_control, void (*init_routine)(void)); -int pthread_once(pthread_once_t* once_control, void (*init_routine)(void)); - -/* CANCEL */ - -enum { - PTHREAD_CANCEL_ENABLE, -#define PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_ENABLE - PTHREAD_CANCEL_DISABLE, -#define PTHREAD_CANCEL_DISABLE PTHREAD_CANCEL_DISABLE -}; - -enum { - PTHREAD_CANCEL_ASYNCHRONOUS, -#define PTHREAD_CANCEL_ASYNCHRONOUS PTHREAD_CANCEL_ASYNCHRONOUS - PTHREAD_CANCEL_DEFERRED, -#define PTHREAD_CANCEL_DEFERRED PTHREAD_CANCEL_DEFERRED -}; - -#define PTHREAD_CANCELED ((void *) -1) - -int pthread_cancel(pthread_t thread); -int pthread_setcancelstate(int state, int *oldstate); - -int pthread_setcanceltype(int type, int *oldtype); - -void pthread_testcancel(void); - -/* CLEANUP */ - -void pthread_cleanup_push(void (*routine)(void*), void *arg); -void pthread_cleanup_pop (int execute); - -void pthread_cleanup_push_defer_np(void (*routine)(void *), void *arg); -void pthread_cleanup_pop_restore_np(int execute); - -/* FORK */ - -pid_t pthread_atfork(void (*prepare)(void), void (*parent)(void), - void (*child)(void)); - -/* THREADS */ -int pthread_create (pthread_t *__thread, - const pthread_attr_t *__attr, - void *(*__start_routine) (void *), - void *__arg); - -void pthread_exit (void *__retval) __attribute__ ((__noreturn__)); - -int pthread_join (pthread_t __th, void **__thread_return); - -int pthread_detach (pthread_t __th); - -pthread_t pthread_self (void); -int pthread_equal (pthread_t __thread1, pthread_t __thread2); - -#endif diff --git a/mdk-stage1/dietlibc/include/pwd.h b/mdk-stage1/dietlibc/include/pwd.h deleted file mode 100644 index e6fb5d0be..000000000 --- a/mdk-stage1/dietlibc/include/pwd.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _PWD_H -#define _PWD_H - -#include -#include - -struct passwd { - char *pw_name; /* Username. */ - char *pw_passwd; /* Password. */ - uid_t pw_uid; /* User ID. */ - gid_t pw_gid; /* Group ID. */ - char *pw_gecos; /* Real name. */ - char *pw_dir; /* Home directory. */ - char *pw_shell; /* Shell program. */ -}; - -extern struct passwd *getpwuid (uid_t __uid) __THROW; -extern struct passwd *getpwnam (const char *__name) __THROW; - -extern struct passwd *getpwent(void) __THROW; -extern void setpwent(void) __THROW; -extern void endpwent(void) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/regex.h b/mdk-stage1/dietlibc/include/regex.h deleted file mode 100644 index be609d9db..000000000 --- a/mdk-stage1/dietlibc/include/regex.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef _REGEX_H -#define _REGEX_H - -#include -#include - -typedef ptrdiff_t regoff_t; - -typedef struct { - regoff_t rm_so; - regoff_t rm_eo; -} regmatch_t; - -#define REG_EXTENDED 1 -#define REG_ICASE 2 -#define REG_NOSUB 4 -#define REG_NEWLINE 8 - -#define REG_NOTBOL 1 -#define REG_NOTEOL 2 - -#define REG_NOMATCH -1 - -#define RE_DUP_MAX 255 - -struct __regex_t; - -typedef int (*matcher)(void*,const char*,int ofs,struct __regex_t *t,int plus,int eflags); - -typedef struct __regex_t { - struct regex { - matcher m; - void* next; - int pieces; - int num; - struct branch *b; - } r; - int brackets,cflags; - regmatch_t *l; -} regex_t; - -int regcomp(regex_t *preg, const char *regex, int cflags) __THROW; -int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags) __THROW; -size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) __THROW; -void regfree(regex_t *preg) __THROW; - -enum __regex_errors { - REG_NOERROR, - REG_BADRPT, /* Invalid use of repetition operators such as using `*' as the first character. */ - REG_BADBR, /* Invalid use of back reference operator. */ - REG_EBRACE, /* Un-matched brace interval operators. */ - REG_EBRACK, /* Un-matched bracket list operators. */ - REG_ERANGE, /* Invalid use of the range operator, eg. the ending point of the - range occurs prior to the starting point. */ - REG_ECTYPE, /* Unknown character class name. */ - REG_ECOLLATE, /* Invalid collating element. */ - REG_EPAREN, /* Un-matched parenthesis group operators. */ - REG_ESUBREG, /* Invalid back reference to a subexpression. */ - REG_EEND, /* Non specific error. This is not defined by POSIX.2. */ - REG_EESCAPE, /* Trailing backslash. */ - REG_BADPAT, /* Invalid use of pattern operators such as group or list. */ - REG_ESIZE, /* Compiled regular expression requires a pattern buffer - larger than 64Kb. This is not defined by POSIX.2. */ - REG_ESPACE, /* regcomp ran out of space */ -}; - -#endif diff --git a/mdk-stage1/dietlibc/include/resolv.h b/mdk-stage1/dietlibc/include/resolv.h deleted file mode 100644 index 4e90799c2..000000000 --- a/mdk-stage1/dietlibc/include/resolv.h +++ /dev/null @@ -1 +0,0 @@ -void res_init(void); diff --git a/mdk-stage1/dietlibc/include/rpc/auth.h b/mdk-stage1/dietlibc/include/rpc/auth.h deleted file mode 100644 index 4aa7d21ce..000000000 --- a/mdk-stage1/dietlibc/include/rpc/auth.h +++ /dev/null @@ -1,213 +0,0 @@ -/* @(#)auth.h 2.3 88/08/07 4.0 RPCSRC; from 1.17 88/02/08 SMI */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * auth.h, Authentication interface. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * The data structures are completely opaque to the client. The client - * is required to pass a AUTH * to routines that create rpc - * "sessions". - */ - -#ifndef _RPC_AUTH_H - -#define _RPC_AUTH_H 1 -#include -#include - -__BEGIN_DECLS - -#define MAX_AUTH_BYTES 400 -#define MAXNETNAMELEN 255 /* maximum length of network user's name */ - -/* - * Status returned from authentication check - */ -enum auth_stat { - AUTH_OK=0, - /* - * failed at remote end - */ - AUTH_BADCRED=1, /* bogus credentials (seal broken) */ - AUTH_REJECTEDCRED=2, /* client should begin new session */ - AUTH_BADVERF=3, /* bogus verifier (seal broken) */ - AUTH_REJECTEDVERF=4, /* verifier expired or was replayed */ - AUTH_TOOWEAK=5, /* rejected due to security reasons */ - /* - * failed locally - */ - AUTH_INVALIDRESP=6, /* bogus response verifier */ - AUTH_FAILED=7 /* some unknown reason */ -}; - -union des_block { - struct { - u_int32_t high; - u_int32_t low; - } key; - char c[8]; -}; -typedef union des_block des_block; -extern bool_t xdr_des_block (XDR *__xdrs, des_block *__blkp) __THROW; - -/* - * Authentication info. Opaque to client. - */ -struct opaque_auth { - enum_t oa_flavor; /* flavor of auth */ - caddr_t oa_base; /* address of more auth stuff */ - u_int oa_length; /* not to exceed MAX_AUTH_BYTES */ -}; - -/* - * Auth handle, interface to client side authenticators. - */ -typedef struct AUTH AUTH; -struct AUTH { - struct opaque_auth ah_cred; - struct opaque_auth ah_verf; - union des_block ah_key; - struct auth_ops { - void (*ah_nextverf) (AUTH *); - int (*ah_marshal) (AUTH *, XDR *); /* nextverf & serialize */ - int (*ah_validate) (AUTH *, struct opaque_auth *); - /* validate verifier */ - int (*ah_refresh) (AUTH *); /* refresh credentials */ - void (*ah_destroy) (AUTH *); /* destroy this structure */ - } *ah_ops; - caddr_t ah_private; -}; - - -/* - * Authentication ops. - * The ops and the auth handle provide the interface to the authenticators. - * - * AUTH *auth; - * XDR *xdrs; - * struct opaque_auth verf; - */ -#define AUTH_NEXTVERF(auth) \ - ((*((auth)->ah_ops->ah_nextverf))(auth)) -#define auth_nextverf(auth) \ - ((*((auth)->ah_ops->ah_nextverf))(auth)) - -#define AUTH_MARSHALL(auth, xdrs) \ - ((*((auth)->ah_ops->ah_marshal))(auth, xdrs)) -#define auth_marshall(auth, xdrs) \ - ((*((auth)->ah_ops->ah_marshal))(auth, xdrs)) - -#define AUTH_VALIDATE(auth, verfp) \ - ((*((auth)->ah_ops->ah_validate))((auth), verfp)) -#define auth_validate(auth, verfp) \ - ((*((auth)->ah_ops->ah_validate))((auth), verfp)) - -#define AUTH_REFRESH(auth) \ - ((*((auth)->ah_ops->ah_refresh))(auth)) -#define auth_refresh(auth) \ - ((*((auth)->ah_ops->ah_refresh))(auth)) - -#define AUTH_DESTROY(auth) \ - ((*((auth)->ah_ops->ah_destroy))(auth)) -#define auth_destroy(auth) \ - ((*((auth)->ah_ops->ah_destroy))(auth)) - - -extern struct opaque_auth _null_auth; - - -/* - * These are the various implementations of client side authenticators. - */ - -/* - * Unix style authentication - * AUTH *authunix_create(machname, uid, gid, len, aup_gids) - * char *machname; - * int uid; - * int gid; - * int len; - * int *aup_gids; - */ -extern AUTH *authunix_create (char *__machname,uid_t __uid, gid_t __gid, - int __len, gid_t *__aup_gids) __THROW; -extern AUTH *authunix_create_default (void) __THROW; -extern AUTH *authnone_create (void) __THROW; -extern AUTH *authdes_create (const char *__servername, u_int __window, - struct sockaddr *__syncaddr, des_block *__ckey) - __THROW; -extern AUTH *authdes_pk_create (const char *, netobj *, u_int, - struct sockaddr *, des_block *) __THROW; - - -#define AUTH_NONE 0 /* no authentication */ -#define AUTH_NULL 0 /* backward compatibility */ -#define AUTH_SYS 1 /* unix style (uid, gids) */ -#define AUTH_UNIX AUTH_SYS -#define AUTH_SHORT 2 /* short hand unix style */ -#define AUTH_DES 3 /* des style (encrypted timestamps) */ -#define AUTH_DH AUTH_DES /* Diffie-Hellman (this is DES) */ -#define AUTH_KERB 4 /* kerberos style */ - -/* - * Netname manipulating functions - * - */ -extern int getnetname (char *) __THROW; -extern int host2netname (char *, __const char *, __const char *) __THROW; -extern int user2netname (char *, __const uid_t, __const char *) __THROW; -extern int netname2user (__const char *, uid_t *, gid_t *, int *, gid_t *) - __THROW; -extern int netname2host (__const char *, char *, __const int) __THROW; - -/* - * - * These routines interface to the keyserv daemon - * - */ -extern int key_decryptsession (char *, des_block *) __THROW; -extern int key_decryptsession_pk (char *, netobj *, des_block *) __THROW; -extern int key_encryptsession (char *, des_block *) __THROW; -extern int key_encryptsession_pk (char *, netobj *, des_block *) __THROW; -extern int key_gendes (des_block *) __THROW; -extern int key_setsecret (char *) __THROW; -extern int key_secretkey_is_set (void) __THROW; -extern int key_get_conv (char *, des_block *) __THROW; - -/* - * XDR an opaque authentication struct. - */ -extern bool_t xdr_opaque_auth (XDR *, struct opaque_auth *) __THROW; - -__END_DECLS - -#endif /* rpc/auth.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/auth_des.h b/mdk-stage1/dietlibc/include/rpc/auth_des.h deleted file mode 100644 index 198b299e7..000000000 --- a/mdk-stage1/dietlibc/include/rpc/auth_des.h +++ /dev/null @@ -1,112 +0,0 @@ -/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _RPC_AUTH_DES_H -#define _RPC_AUTH_DES_H 1 - -#include -#include - -__BEGIN_DECLS - -/* There are two kinds of "names": fullnames and nicknames */ -enum authdes_namekind - { - ADN_FULLNAME, - ADN_NICKNAME - }; - -/* A fullname contains the network name of the client, - a conversation key and the window */ -struct authdes_fullname - { - char *name; /* network name of client, up to MAXNETNAMELEN */ - des_block key; /* conversation key */ - uint32_t window; /* associated window */ - }; - -/* A credential */ -struct authdes_cred - { - enum authdes_namekind adc_namekind; - struct authdes_fullname adc_fullname; - uint32_t adc_nickname; - }; - -/* A timeval replacement for !32bit platforms */ -struct rpc_timeval - { - uint32_t tv_sec; /* Seconds. */ - uint32_t tv_usec; /* Microseconds. */ - }; - -/* A des authentication verifier */ -struct authdes_verf - { - union - { - struct rpc_timeval adv_ctime; /* clear time */ - des_block adv_xtime; /* crypt time */ - } - adv_time_u; - uint32_t adv_int_u; - }; - -/* des authentication verifier: client variety - - adv_timestamp is the current time. - adv_winverf is the credential window + 1. - Both are encrypted using the conversation key. */ -#define adv_timestamp adv_time_u.adv_ctime -#define adv_xtimestamp adv_time_u.adv_xtime -#define adv_winverf adv_int_u - -/* des authentication verifier: server variety - - adv_timeverf is the client's timestamp + client's window - adv_nickname is the server's nickname for the client. - adv_timeverf is encrypted using the conversation key. */ -#define adv_timeverf adv_time_u.adv_ctime -#define adv_xtimeverf adv_time_u.adv_xtime -#define adv_nickname adv_int_u - -/* Map a des credential into a unix cred. */ -extern int authdes_getucred (__const struct authdes_cred * __adc, - uid_t * __uid, gid_t * __gid, - short *__grouplen, gid_t * __groups) __THROW; - -/* Get the public key for NAME and place it in KEY. NAME can only be - up to MAXNETNAMELEN bytes long and the destination buffer KEY should - have HEXKEYBYTES + 1 bytes long to fit all characters from the key. */ -extern int getpublickey (__const char *__name, char *__key) __THROW; - -/* Get the secret key for NAME and place it in KEY. PASSWD is used to - decrypt the encrypted key stored in the database. NAME can only be - up to MAXNETNAMELEN bytes long and the destination buffer KEY - should have HEXKEYBYTES + 1 bytes long to fit all characters from - the key. */ -extern int getsecretkey (__const char *__name, char *__key, - __const char *__passwd) __THROW; - -extern int rtime (struct sockaddr_in *__addrp, struct rpc_timeval *__timep, - struct rpc_timeval *__timeout) __THROW; - -__END_DECLS - - -#endif /* rpc/auth_des.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/auth_unix.h b/mdk-stage1/dietlibc/include/rpc/auth_unix.h deleted file mode 100644 index 7a1bfa9f0..000000000 --- a/mdk-stage1/dietlibc/include/rpc/auth_unix.h +++ /dev/null @@ -1,90 +0,0 @@ -/* @(#)auth_unix.h 2.2 88/07/29 4.0 RPCSRC; from 1.8 88/02/08 SMI */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -/* @(#)auth_unix.h 1.5 86/07/16 SMI */ - -/* - * auth_unix.h, Protocol for UNIX style authentication parameters for RPC - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -/* - * The system is very weak. The client uses no encryption for it - * credentials and only sends null verifiers. The server sends backs - * null verifiers or optionally a verifier that suggests a new short hand - * for the credentials. - */ - -#ifndef _RPC_AUTH_UNIX_H -#define _RPC_AUTH_UNIX_H 1 - -#include -#include -#include -#include -#include - -__BEGIN_DECLS - -/* The machine name is part of a credential; it may not exceed 255 bytes */ -#define MAX_MACHINE_NAME 255 - -/* gids compose part of a credential; there may not be more than 16 of them */ -#define NGRPS 16 - -/* - * Unix style credentials. - */ -struct authunix_parms - { - u_long aup_time; - char *aup_machname; - uid_t aup_uid; - gid_t aup_gid; - u_int aup_len; - gid_t *aup_gids; - }; - -extern bool_t xdr_authunix_parms (XDR *__xdrs, struct authunix_parms *__p) - __THROW; - -/* - * If a response verifier has flavor AUTH_SHORT, - * then the body of the response verifier encapsulates the following structure; - * again it is serialized in the obvious fashion. - */ -struct short_hand_verf - { - struct opaque_auth new_cred; - }; - -__END_DECLS - -#endif /* rpc/auth_unix.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/clnt.h b/mdk-stage1/dietlibc/include/rpc/clnt.h deleted file mode 100644 index 60b0fafdf..000000000 --- a/mdk-stage1/dietlibc/include/rpc/clnt.h +++ /dev/null @@ -1,421 +0,0 @@ -/* @(#)clnt.h 2.1 88/07/29 4.0 RPCSRC; from 1.31 88/02/08 SMI*/ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * clnt.h - Client side remote procedure call interface. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#ifndef _RPC_CLNT_H -#define _RPC_CLNT_H 1 - -#include -#include -#include -#include -#include - -__BEGIN_DECLS - -/* - * Rpc calls return an enum clnt_stat. This should be looked at more, - * since each implementation is required to live with this (implementation - * independent) list of errors. - */ -enum clnt_stat { - RPC_SUCCESS=0, /* call succeeded */ - /* - * local errors - */ - RPC_CANTENCODEARGS=1, /* can't encode arguments */ - RPC_CANTDECODERES=2, /* can't decode results */ - RPC_CANTSEND=3, /* failure in sending call */ - RPC_CANTRECV=4, /* failure in receiving result */ - RPC_TIMEDOUT=5, /* call timed out */ - /* - * remote errors - */ - RPC_VERSMISMATCH=6, /* rpc versions not compatible */ - RPC_AUTHERROR=7, /* authentication error */ - RPC_PROGUNAVAIL=8, /* program not available */ - RPC_PROGVERSMISMATCH=9, /* program version mismatched */ - RPC_PROCUNAVAIL=10, /* procedure unavailable */ - RPC_CANTDECODEARGS=11, /* decode arguments error */ - RPC_SYSTEMERROR=12, /* generic "other problem" */ - RPC_NOBROADCAST = 21, /* Broadcasting not supported */ - /* - * callrpc & clnt_create errors - */ - RPC_UNKNOWNHOST=13, /* unknown host name */ - RPC_UNKNOWNPROTO=17, /* unknown protocol */ - RPC_UNKNOWNADDR = 19, /* Remote address unknown */ - - /* - * rpcbind errors - */ - RPC_RPCBFAILURE=14, /* portmapper failed in its call */ -#define RPC_PMAPFAILURE RPC_RPCBFAILURE - RPC_PROGNOTREGISTERED=15, /* remote program is not registered */ - RPC_N2AXLATEFAILURE = 22, /* Name to addr translation failed */ - /* - * unspecified error - */ - RPC_FAILED=16, - RPC_INTR=18, - RPC_TLIERROR=20, - RPC_UDERROR=23, - /* - * asynchronous errors - */ - RPC_INPROGRESS = 24, - RPC_STALERACHANDLE = 25 -}; - - -/* - * Error info. - */ -struct rpc_err { - enum clnt_stat re_status; - union { - int RE_errno; /* related system error */ - enum auth_stat RE_why; /* why the auth error occurred */ - struct { - u_long low; /* lowest verion supported */ - u_long high; /* highest verion supported */ - } RE_vers; - struct { /* maybe meaningful if RPC_FAILED */ - long s1; - long s2; - } RE_lb; /* life boot & debugging only */ - } ru; -#define re_errno ru.RE_errno -#define re_why ru.RE_why -#define re_vers ru.RE_vers -#define re_lb ru.RE_lb -}; - - -/* - * Client rpc handle. - * Created by individual implementations, see e.g. rpc_udp.c. - * Client is responsible for initializing auth, see e.g. auth_none.c. - */ -typedef struct CLIENT CLIENT; -struct CLIENT { - AUTH *cl_auth; /* authenticator */ - struct clnt_ops { - enum clnt_stat (*cl_call) (CLIENT *, u_long, xdrproc_t, caddr_t, xdrproc_t, - caddr_t, struct timeval); - /* call remote procedure */ - void (*cl_abort) (void); /* abort a call */ - void (*cl_geterr) (CLIENT *, struct rpc_err *); - /* get specific error code */ - bool_t (*cl_freeres) (CLIENT *, xdrproc_t, caddr_t); - /* frees results */ - void (*cl_destroy) (CLIENT *); /* destroy this structure */ - bool_t (*cl_control) (CLIENT *, int, char *); - /* the ioctl() of rpc */ - } *cl_ops; - caddr_t cl_private; /* private stuff */ -}; - - -/* - * client side rpc interface ops - * - * Parameter types are: - * - */ - -/* - * enum clnt_stat - * CLNT_CALL(rh, proc, xargs, argsp, xres, resp, timeout) - * CLIENT *rh; - * u_long proc; - * xdrproc_t xargs; - * caddr_t argsp; - * xdrproc_t xres; - * caddr_t resp; - * struct timeval timeout; - */ -#define CLNT_CALL(rh, proc, xargs, argsp, xres, resp, secs) \ - ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, argsp, xres, resp, secs)) -#define clnt_call(rh, proc, xargs, argsp, xres, resp, secs) \ - ((*(rh)->cl_ops->cl_call)(rh, proc, xargs, argsp, xres, resp, secs)) - -/* - * void - * CLNT_ABORT(rh); - * CLIENT *rh; - */ -#define CLNT_ABORT(rh) ((*(rh)->cl_ops->cl_abort)(rh)) -#define clnt_abort(rh) ((*(rh)->cl_ops->cl_abort)(rh)) - -/* - * struct rpc_err - * CLNT_GETERR(rh); - * CLIENT *rh; - */ -#define CLNT_GETERR(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) -#define clnt_geterr(rh,errp) ((*(rh)->cl_ops->cl_geterr)(rh, errp)) - - -/* - * bool_t - * CLNT_FREERES(rh, xres, resp); - * CLIENT *rh; - * xdrproc_t xres; - * caddr_t resp; - */ -#define CLNT_FREERES(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) -#define clnt_freeres(rh,xres,resp) ((*(rh)->cl_ops->cl_freeres)(rh,xres,resp)) - -/* - * bool_t - * CLNT_CONTROL(cl, request, info) - * CLIENT *cl; - * u_int request; - * char *info; - */ -#define CLNT_CONTROL(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) -#define clnt_control(cl,rq,in) ((*(cl)->cl_ops->cl_control)(cl,rq,in)) - -/* - * control operations that apply to all transports - * - * Note: options marked XXX are no-ops in this implementation of RPC. - * The are present in TI-RPC but can't be implemented here since they - * depend on the presence of STREAMS/TLI, which we don't have. - */ -#define CLSET_TIMEOUT 1 /* set timeout (timeval) */ -#define CLGET_TIMEOUT 2 /* get timeout (timeval) */ -#define CLGET_SERVER_ADDR 3 /* get server's address (sockaddr) */ -#define CLGET_FD 6 /* get connections file descriptor */ -#define CLGET_SVC_ADDR 7 /* get server's address (netbuf) XXX */ -#define CLSET_FD_CLOSE 8 /* close fd while clnt_destroy */ -#define CLSET_FD_NCLOSE 9 /* Do not close fd while clnt_destroy*/ -#define CLGET_XID 10 /* Get xid */ -#define CLSET_XID 11 /* Set xid */ -#define CLGET_VERS 12 /* Get version number */ -#define CLSET_VERS 13 /* Set version number */ -#define CLGET_PROG 14 /* Get program number */ -#define CLSET_PROG 15 /* Set program number */ -#define CLSET_SVC_ADDR 16 /* get server's address (netbuf) XXX */ -#define CLSET_PUSH_TIMOD 17 /* push timod if not already present XXX */ -#define CLSET_POP_TIMOD 18 /* pop timod XXX */ -/* - * Connectionless only control operations - */ -#define CLSET_RETRY_TIMEOUT 4 /* set retry timeout (timeval) */ -#define CLGET_RETRY_TIMEOUT 5 /* get retry timeout (timeval) */ - -/* - * void - * CLNT_DESTROY(rh); - * CLIENT *rh; - */ -#define CLNT_DESTROY(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) -#define clnt_destroy(rh) ((*(rh)->cl_ops->cl_destroy)(rh)) - - -/* - * RPCTEST is a test program which is accessible on every rpc - * transport/port. It is used for testing, performance evaluation, - * and network administration. - */ - -#define RPCTEST_PROGRAM ((u_long)1) -#define RPCTEST_VERSION ((u_long)1) -#define RPCTEST_NULL_PROC ((u_long)2) -#define RPCTEST_NULL_BATCH_PROC ((u_long)3) - -/* - * By convention, procedure 0 takes null arguments and returns them - */ - -#define NULLPROC ((u_long)0) - -/* - * Below are the client handle creation routines for the various - * implementations of client side rpc. They can return NULL if a - * creation failure occurs. - */ - -/* - * Memory based rpc (for speed check and testing) - * CLIENT * - * clntraw_create(prog, vers) - * u_long prog; - * u_long vers; - */ -extern CLIENT *clntraw_create (__const u_long __prog, __const u_long __vers) - __THROW; - - -/* - * Generic client creation routine. Supported protocols are "udp", "tcp" and - * "unix" - * CLIENT * - * clnt_create(host, prog, vers, prot) - * char *host; -- hostname - * u_long prog; -- program number - * u_ong vers; -- version number - * char *prot; -- protocol - */ -extern CLIENT *clnt_create (__const char *__host, __const u_long __prog, - __const u_long __vers, __const char *__prot) - __THROW; - - -/* - * TCP based rpc - * CLIENT * - * clnttcp_create(raddr, prog, vers, sockp, sendsz, recvsz) - * struct sockaddr_in *raddr; - * u_long prog; - * u_long version; - * register int *sockp; - * u_int sendsz; - * u_int recvsz; - */ -extern CLIENT *clnttcp_create (struct sockaddr_in *__raddr, u_long __prog, - u_long __version, int *__sockp, u_int __sendsz, - u_int __recvsz) __THROW; - -/* - * UDP based rpc. - * CLIENT * - * clntudp_create(raddr, program, version, wait, sockp) - * struct sockaddr_in *raddr; - * u_long program; - * u_long version; - * struct timeval wait_resend; - * int *sockp; - * - * Same as above, but you specify max packet sizes. - * CLIENT * - * clntudp_bufcreate(raddr, program, version, wait, sockp, sendsz, recvsz) - * struct sockaddr_in *raddr; - * u_long program; - * u_long version; - * struct timeval wait_resend; - * int *sockp; - * u_int sendsz; - * u_int recvsz; - */ -extern CLIENT *clntudp_create (struct sockaddr_in *__raddr, u_long __program, - u_long __version, struct timeval __wait_resend, - int *__sockp) __THROW; -extern CLIENT *clntudp_bufcreate (struct sockaddr_in *__raddr, - u_long __program, u_long __version, - struct timeval __wait_resend, int *__sockp, - u_int __sendsz, u_int __recvsz) __THROW; - - - - -/* - * AF_UNIX based rpc - * CLIENT * - * clntunix_create(raddr, prog, vers, sockp, sendsz, recvsz) - * struct sockaddr_un *raddr; - * u_long prog; - * u_long version; - * register int *sockp; - * u_int sendsz; - * u_int recvsz; - */ -extern CLIENT *clntunix_create (struct sockaddr_un *__raddr, u_long __program, - u_long __version, int *__sockp, - u_int __sendsz, u_int __recvsz) __THROW; - - -extern int callrpc (__const char *__host, __const u_long __prognum, - __const u_long __versnum, __const u_long __procnum, - __const xdrproc_t __inproc, __const char *__in, - __const xdrproc_t __outproc, char *__out) __THROW; -extern int _rpc_dtablesize (void) __THROW; - -/* - * Print why creation failed - */ -extern void clnt_pcreateerror (__const char *__msg) __THROW; /* stderr */ -extern char *clnt_spcreateerror(__const char *__msg) __THROW; /* string */ - -/* - * Like clnt_perror(), but is more verbose in its output - */ -extern void clnt_perrno (enum clnt_stat __num) __THROW; /* stderr */ - -/* - * Print an English error message, given the client error code - */ -extern void clnt_perror (CLIENT *__clnt, __const char *__msg) __THROW; - /* stderr */ -extern char *clnt_sperror (CLIENT *__clnt, __const char *__msg) __THROW; - /* string */ - -/* - * If a creation fails, the following allows the user to figure out why. - */ -struct rpc_createerr { - enum clnt_stat cf_stat; - struct rpc_err cf_error; /* useful when cf_stat == RPC_PMAPFAILURE */ -}; - -extern struct rpc_createerr rpc_createerr; - - - -/* - * Copy error message to buffer. - */ -extern char *clnt_sperrno (enum clnt_stat __num) __THROW; /* string */ - -/* - * get the port number on the host for the rpc program,version and proto - */ -extern int getrpcport (__const char * __host, u_long __prognum, - u_long __versnum, u_int proto) __THROW; - -/* - * get the local host's IP address without consulting - * name service library functions - */ -extern void get_myaddress (struct sockaddr_in *) __THROW; - -#define UDPMSGSIZE 8800 /* rpc imposed limit on udp msg size */ -#define RPCSMALLMSGSIZE 400 /* a more reasonable packet size */ - -__END_DECLS - -#endif /* rpc/clnt.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/des_crypt.h b/mdk-stage1/dietlibc/include/rpc/des_crypt.h deleted file mode 100644 index 6a65887d3..000000000 --- a/mdk-stage1/dietlibc/include/rpc/des_crypt.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * @(#)des_crypt.h 2.1 88/08/11 4.0 RPCSRC; from 1.4 88/02/08 (C) 1986 SMI - * - * des_crypt.h, des library routine interface - * Copyright (C) 1986, Sun Microsystems, Inc. - */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -#ifndef __DES_CRYPT_H__ -#define __DES_CRYPT_H__ 1 - -#include - -__BEGIN_DECLS - -#define DES_MAXDATA 8192 /* max bytes encrypted in one call */ -#define DES_DIRMASK (1 << 0) -#define DES_ENCRYPT (0*DES_DIRMASK) /* Encrypt */ -#define DES_DECRYPT (1*DES_DIRMASK) /* Decrypt */ - - -#define DES_DEVMASK (1 << 1) -#define DES_HW (0*DES_DEVMASK) /* Use hardware device */ -#define DES_SW (1*DES_DEVMASK) /* Use software device */ - - -#define DESERR_NONE 0 /* succeeded */ -#define DESERR_NOHWDEVICE 1 /* succeeded, but hw device not available */ -#define DESERR_HWERROR 2 /* failed, hardware/driver error */ -#define DESERR_BADPARAM 3 /* failed, bad parameter to call */ - -#define DES_FAILED(err) \ - ((err) > DESERR_NOHWDEVICE) - -/* - * cbc_crypt() - * ecb_crypt() - * - * Encrypt (or decrypt) len bytes of a buffer buf. - * The length must be a multiple of eight. - * The key should have odd parity in the low bit of each byte. - * ivec is the input vector, and is updated to the new one (cbc only). - * The mode is created by oring together the appropriate parameters. - * DESERR_NOHWDEVICE is returned if DES_HW was specified but - * there was no hardware to do it on (the data will still be - * encrypted though, in software). - */ - - -/* - * Cipher Block Chaining mode - */ -extern int cbc_crypt (char *__key, char *__buf, unsigned __len, - unsigned __mode, char *__ivec) __THROW; - -/* - * Electronic Code Book mode - */ -extern int ecb_crypt (char *__key, char *__buf, unsigned __len, - unsigned __mode) __THROW; - -/* - * Set des parity for a key. - * DES parity is odd and in the low bit of each byte - */ -extern void des_setparity (char *__key) __THROW; - -__END_DECLS - -#endif diff --git a/mdk-stage1/dietlibc/include/rpc/key_prot.h b/mdk-stage1/dietlibc/include/rpc/key_prot.h deleted file mode 100644 index 3e2eb7208..000000000 --- a/mdk-stage1/dietlibc/include/rpc/key_prot.h +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Please do not edit this file. - * It was generated using rpcgen. - */ - -#ifndef _KEY_PROT_H_RPCGEN -#define _KEY_PROT_H_RPCGEN - -#include - -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if 0 -#pragma ident "@(#)key_prot.x 1.7 94/04/29 SMI" -#endif -/* Copyright (c) 1990, 1991 Sun Microsystems, Inc. */ - -/* - * Compiled from key_prot.x using rpcgen. - * DO NOT EDIT THIS FILE! - * This is NOT source code! - */ -#define PROOT 3 -#define HEXMODULUS "d4a0ba0250b6fd2ec626e7efd637df76c716e22d0944b88b" -#define HEXKEYBYTES 48 -#define KEYSIZE 192 -#define KEYBYTES 24 -#define KEYCHECKSUMSIZE 16 - -enum keystatus { - KEY_SUCCESS = 0, - KEY_NOSECRET = 1, - KEY_UNKNOWN = 2, - KEY_SYSTEMERR = 3, -}; -typedef enum keystatus keystatus; -#ifdef __cplusplus -extern "C" bool_t xdr_keystatus(XDR *, keystatus*); -#elif __STDC__ -extern bool_t xdr_keystatus(XDR *, keystatus*); -#else /* Old Style C */ -bool_t xdr_keystatus(); -#endif /* Old Style C */ - - -typedef char keybuf[HEXKEYBYTES]; -#ifdef __cplusplus -extern "C" bool_t xdr_keybuf(XDR *, keybuf); -#elif __STDC__ -extern bool_t xdr_keybuf(XDR *, keybuf); -#else /* Old Style C */ -bool_t xdr_keybuf(); -#endif /* Old Style C */ - - -typedef char *netnamestr; -#ifdef __cplusplus -extern "C" bool_t xdr_netnamestr(XDR *, netnamestr*); -#elif __STDC__ -extern bool_t xdr_netnamestr(XDR *, netnamestr*); -#else /* Old Style C */ -bool_t xdr_netnamestr(); -#endif /* Old Style C */ - - -struct cryptkeyarg { - netnamestr remotename; - des_block deskey; -}; -typedef struct cryptkeyarg cryptkeyarg; -#ifdef __cplusplus -extern "C" bool_t xdr_cryptkeyarg(XDR *, cryptkeyarg*); -#elif __STDC__ -extern bool_t xdr_cryptkeyarg(XDR *, cryptkeyarg*); -#else /* Old Style C */ -bool_t xdr_cryptkeyarg(); -#endif /* Old Style C */ - - -struct cryptkeyarg2 { - netnamestr remotename; - netobj remotekey; - des_block deskey; -}; -typedef struct cryptkeyarg2 cryptkeyarg2; -#ifdef __cplusplus -extern "C" bool_t xdr_cryptkeyarg2(XDR *, cryptkeyarg2*); -#elif __STDC__ -extern bool_t xdr_cryptkeyarg2(XDR *, cryptkeyarg2*); -#else /* Old Style C */ -bool_t xdr_cryptkeyarg2(); -#endif /* Old Style C */ - - -struct cryptkeyres { - keystatus status; - union { - des_block deskey; - } cryptkeyres_u; -}; -typedef struct cryptkeyres cryptkeyres; -#ifdef __cplusplus -extern "C" bool_t xdr_cryptkeyres(XDR *, cryptkeyres*); -#elif __STDC__ -extern bool_t xdr_cryptkeyres(XDR *, cryptkeyres*); -#else /* Old Style C */ -bool_t xdr_cryptkeyres(); -#endif /* Old Style C */ - -#define MAXGIDS 16 - -struct unixcred { - u_int uid; - u_int gid; - struct { - u_int gids_len; - u_int *gids_val; - } gids; -}; -typedef struct unixcred unixcred; -#ifdef __cplusplus -extern "C" bool_t xdr_unixcred(XDR *, unixcred*); -#elif __STDC__ -extern bool_t xdr_unixcred(XDR *, unixcred*); -#else /* Old Style C */ -bool_t xdr_unixcred(); -#endif /* Old Style C */ - - -struct getcredres { - keystatus status; - union { - unixcred cred; - } getcredres_u; -}; -typedef struct getcredres getcredres; -#ifdef __cplusplus -extern "C" bool_t xdr_getcredres(XDR *, getcredres*); -#elif __STDC__ -extern bool_t xdr_getcredres(XDR *, getcredres*); -#else /* Old Style C */ -bool_t xdr_getcredres(); -#endif /* Old Style C */ - - -struct key_netstarg { - keybuf st_priv_key; - keybuf st_pub_key; - netnamestr st_netname; -}; -typedef struct key_netstarg key_netstarg; -#ifdef __cplusplus -extern "C" bool_t xdr_key_netstarg(XDR *, key_netstarg*); -#elif __STDC__ -extern bool_t xdr_key_netstarg(XDR *, key_netstarg*); -#else /* Old Style C */ -bool_t xdr_key_netstarg(); -#endif /* Old Style C */ - - -struct key_netstres { - keystatus status; - union { - key_netstarg knet; - } key_netstres_u; -}; -typedef struct key_netstres key_netstres; -#ifdef __cplusplus -extern "C" bool_t xdr_key_netstres(XDR *, key_netstres*); -#elif __STDC__ -extern bool_t xdr_key_netstres(XDR *, key_netstres*); -#else /* Old Style C */ -bool_t xdr_key_netstres(); -#endif /* Old Style C */ - - -#ifndef opaque -#define opaque char -#endif - - -#define KEY_PROG ((u_long)100029) -#define KEY_VERS ((u_long)1) - -#ifdef __cplusplus -#define KEY_SET ((u_long)1) -extern "C" keystatus * key_set_1(opaque *, CLIENT *); -extern "C" keystatus * key_set_1_svc(opaque *, struct svc_req *); -#define KEY_ENCRYPT ((u_long)2) -extern "C" cryptkeyres * key_encrypt_1(cryptkeyarg *, CLIENT *); -extern "C" cryptkeyres * key_encrypt_1_svc(cryptkeyarg *, struct svc_req *); -#define KEY_DECRYPT ((u_long)3) -extern "C" cryptkeyres * key_decrypt_1(cryptkeyarg *, CLIENT *); -extern "C" cryptkeyres * key_decrypt_1_svc(cryptkeyarg *, struct svc_req *); -#define KEY_GEN ((u_long)4) -extern "C" des_block * key_gen_1(void *, CLIENT *); -extern "C" des_block * key_gen_1_svc(void *, struct svc_req *); -#define KEY_GETCRED ((u_long)5) -extern "C" getcredres * key_getcred_1(netnamestr *, CLIENT *); -extern "C" getcredres * key_getcred_1_svc(netnamestr *, struct svc_req *); - -#elif __STDC__ -#define KEY_SET ((u_long)1) -extern keystatus * key_set_1(opaque *, CLIENT *); -extern keystatus * key_set_1_svc(opaque *, struct svc_req *); -#define KEY_ENCRYPT ((u_long)2) -extern cryptkeyres * key_encrypt_1(cryptkeyarg *, CLIENT *); -extern cryptkeyres * key_encrypt_1_svc(cryptkeyarg *, struct svc_req *); -#define KEY_DECRYPT ((u_long)3) -extern cryptkeyres * key_decrypt_1(cryptkeyarg *, CLIENT *); -extern cryptkeyres * key_decrypt_1_svc(cryptkeyarg *, struct svc_req *); -#define KEY_GEN ((u_long)4) -extern des_block * key_gen_1(void *, CLIENT *); -extern des_block * key_gen_1_svc(void *, struct svc_req *); -#define KEY_GETCRED ((u_long)5) -extern getcredres * key_getcred_1(netnamestr *, CLIENT *); -extern getcredres * key_getcred_1_svc(netnamestr *, struct svc_req *); - -#else /* Old Style C */ -#define KEY_SET ((u_long)1) -extern keystatus * key_set_1(); -extern keystatus * key_set_1_svc(); -#define KEY_ENCRYPT ((u_long)2) -extern cryptkeyres * key_encrypt_1(); -extern cryptkeyres * key_encrypt_1_svc(); -#define KEY_DECRYPT ((u_long)3) -extern cryptkeyres * key_decrypt_1(); -extern cryptkeyres * key_decrypt_1_svc(); -#define KEY_GEN ((u_long)4) -extern des_block * key_gen_1(); -extern des_block * key_gen_1_svc(); -#define KEY_GETCRED ((u_long)5) -extern getcredres * key_getcred_1(); -extern getcredres * key_getcred_1_svc(); -#endif /* Old Style C */ -#define KEY_VERS2 ((u_long)2) - -#ifdef __cplusplus -extern "C" keystatus * key_set_2(opaque *, CLIENT *); -extern "C" keystatus * key_set_2_svc(opaque *, struct svc_req *); -extern "C" cryptkeyres * key_encrypt_2(cryptkeyarg *, CLIENT *); -extern "C" cryptkeyres * key_encrypt_2_svc(cryptkeyarg *, struct svc_req *); -extern "C" cryptkeyres * key_decrypt_2(cryptkeyarg *, CLIENT *); -extern "C" cryptkeyres * key_decrypt_2_svc(cryptkeyarg *, struct svc_req *); -extern "C" des_block * key_gen_2(void *, CLIENT *); -extern "C" des_block * key_gen_2_svc(void *, struct svc_req *); -extern "C" getcredres * key_getcred_2(netnamestr *, CLIENT *); -extern "C" getcredres * key_getcred_2_svc(netnamestr *, struct svc_req *); -#define KEY_ENCRYPT_PK ((u_long)6) -extern "C" cryptkeyres * key_encrypt_pk_2(cryptkeyarg2 *, CLIENT *); -extern "C" cryptkeyres * key_encrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *); -#define KEY_DECRYPT_PK ((u_long)7) -extern "C" cryptkeyres * key_decrypt_pk_2(cryptkeyarg2 *, CLIENT *); -extern "C" cryptkeyres * key_decrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *); -#define KEY_NET_PUT ((u_long)8) -extern "C" keystatus * key_net_put_2(key_netstarg *, CLIENT *); -extern "C" keystatus * key_net_put_2_svc(key_netstarg *, struct svc_req *); -#define KEY_NET_GET ((u_long)9) -extern "C" key_netstres * key_net_get_2(void *, CLIENT *); -extern "C" key_netstres * key_net_get_2_svc(void *, struct svc_req *); -#define KEY_GET_CONV ((u_long)10) -extern "C" cryptkeyres * key_get_conv_2(opaque *, CLIENT *); -extern "C" cryptkeyres * key_get_conv_2_svc(opaque *, struct svc_req *); - -#elif __STDC__ -extern keystatus * key_set_2(opaque *, CLIENT *); -extern keystatus * key_set_2_svc(opaque *, struct svc_req *); -extern cryptkeyres * key_encrypt_2(cryptkeyarg *, CLIENT *); -extern cryptkeyres * key_encrypt_2_svc(cryptkeyarg *, struct svc_req *); -extern cryptkeyres * key_decrypt_2(cryptkeyarg *, CLIENT *); -extern cryptkeyres * key_decrypt_2_svc(cryptkeyarg *, struct svc_req *); -extern des_block * key_gen_2(void *, CLIENT *); -extern des_block * key_gen_2_svc(void *, struct svc_req *); -extern getcredres * key_getcred_2(netnamestr *, CLIENT *); -extern getcredres * key_getcred_2_svc(netnamestr *, struct svc_req *); -#define KEY_ENCRYPT_PK ((u_long)6) -extern cryptkeyres * key_encrypt_pk_2(cryptkeyarg2 *, CLIENT *); -extern cryptkeyres * key_encrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *); -#define KEY_DECRYPT_PK ((u_long)7) -extern cryptkeyres * key_decrypt_pk_2(cryptkeyarg2 *, CLIENT *); -extern cryptkeyres * key_decrypt_pk_2_svc(cryptkeyarg2 *, struct svc_req *); -#define KEY_NET_PUT ((u_long)8) -extern keystatus * key_net_put_2(key_netstarg *, CLIENT *); -extern keystatus * key_net_put_2_svc(key_netstarg *, struct svc_req *); -#define KEY_NET_GET ((u_long)9) -extern key_netstres * key_net_get_2(void *, CLIENT *); -extern key_netstres * key_net_get_2_svc(void *, struct svc_req *); -#define KEY_GET_CONV ((u_long)10) -extern cryptkeyres * key_get_conv_2(opaque *, CLIENT *); -extern cryptkeyres * key_get_conv_2_svc(opaque *, struct svc_req *); - -#else /* Old Style C */ -extern keystatus * key_set_2(); -extern keystatus * key_set_2_svc(); -extern cryptkeyres * key_encrypt_2(); -extern cryptkeyres * key_encrypt_2_svc(); -extern cryptkeyres * key_decrypt_2(); -extern cryptkeyres * key_decrypt_2_svc(); -extern des_block * key_gen_2(); -extern des_block * key_gen_2_svc(); -extern getcredres * key_getcred_2(); -extern getcredres * key_getcred_2_svc(); -#define KEY_ENCRYPT_PK ((u_long)6) -extern cryptkeyres * key_encrypt_pk_2(); -extern cryptkeyres * key_encrypt_pk_2_svc(); -#define KEY_DECRYPT_PK ((u_long)7) -extern cryptkeyres * key_decrypt_pk_2(); -extern cryptkeyres * key_decrypt_pk_2_svc(); -#define KEY_NET_PUT ((u_long)8) -extern keystatus * key_net_put_2(); -extern keystatus * key_net_put_2_svc(); -#define KEY_NET_GET ((u_long)9) -extern key_netstres * key_net_get_2(); -extern key_netstres * key_net_get_2_svc(); -#define KEY_GET_CONV ((u_long)10) -extern cryptkeyres * key_get_conv_2(); -extern cryptkeyres * key_get_conv_2_svc(); -#endif /* Old Style C */ - -#endif /* !_KEY_PROT_H_RPCGEN */ diff --git a/mdk-stage1/dietlibc/include/rpc/netdb.h b/mdk-stage1/dietlibc/include/rpc/netdb.h deleted file mode 100644 index da4bddfc4..000000000 --- a/mdk-stage1/dietlibc/include/rpc/netdb.h +++ /dev/null @@ -1,74 +0,0 @@ -/* @(#)netdb.h 2.1 88/07/29 3.9 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -/* @(#)rpc.h 1.8 87/07/24 SMI */ - -/* Cleaned up for GNU C library roland@gnu.ai.mit.edu: - added multiple inclusion protection and use of . - In GNU this file is #include'd by . */ - -#ifndef _RPC_NETDB_H -#define _RPC_NETDB_H 1 - -#include - -#define __need_size_t -#include - -__BEGIN_DECLS - -struct rpcent -{ - char *r_name; /* Name of server for this rpc program. */ - char **r_aliases; /* Alias list. */ - int r_number; /* RPC program number. */ -}; - -extern void setrpcent (int __stayopen) __THROW; -extern void endrpcent (void) __THROW; -extern struct rpcent *getrpcbyname (__const char *__name) __THROW; -extern struct rpcent *getrpcbynumber (int __number) __THROW; -extern struct rpcent *getrpcent (void) __THROW; - -#ifdef __USE_MISC -extern int getrpcbyname_r (__const char *__name, struct rpcent *__result_buf, - char *__buffer, size_t __buflen, - struct rpcent **__result) __THROW; - -extern int getrpcbynumber_r (int __number, struct rpcent *__result_buf, - char *__buffer, size_t __buflen, - struct rpcent **__result) __THROW; - -extern int getrpcent_r (struct rpcent *__result_buf, char *__buffer, - size_t __buflen, struct rpcent **__result) __THROW; -#endif - -__END_DECLS - -#endif /* rpc/netdb.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h b/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h deleted file mode 100644 index 68bc8d8ec..000000000 --- a/mdk-stage1/dietlibc/include/rpc/pmap_clnt.h +++ /dev/null @@ -1,98 +0,0 @@ -/* @(#)pmap_clnt.h 2.1 88/07/29 4.0 RPCSRC; from 1.11 88/02/08 SMI */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * pmap_clnt.h - * Supplies C routines to get to portmap services. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#ifndef _RPC_PMAP_CLNT_H -#define _RPC_PMAP_CLNT_H 1 - -#include -#include -#include -#include - -__BEGIN_DECLS - -typedef bool_t (*resultproc_t) (caddr_t resp, struct sockaddr_in *raddr); - -/* - * Usage: - * success = pmap_set(program, version, protocol, port); - * success = pmap_unset(program, version); - * port = pmap_getport(address, program, version, protocol); - * head = pmap_getmaps(address); - * clnt_stat = pmap_rmtcall(address, program, version, procedure, - * xdrargs, argsp, xdrres, resp, tout, port_ptr) - * (works for udp only.) - * clnt_stat = clnt_broadcast(program, version, procedure, - * xdrargs, argsp, xdrres, resp, eachresult) - * (like pmap_rmtcall, except the call is broadcasted to all - * locally connected nets. For each valid response received, - * the procedure eachresult is called. Its form is: - * done = eachresult(resp, raddr) - * bool_t done; - * caddr_t resp; - * struct sockaddr_in raddr; - * where resp points to the results of the call and raddr is the - * address if the responder to the broadcast. - */ - -extern bool_t pmap_set (__const u_long __program, __const u_long __vers, - int __protocol, u_short __port) __THROW; -extern bool_t pmap_unset (__const u_long __program, __const u_long __vers) - __THROW; -extern struct pmaplist *pmap_getmaps (struct sockaddr_in *__address) __THROW; -extern enum clnt_stat pmap_rmtcall (struct sockaddr_in *__addr, - __const u_long __prog, - __const u_long __vers, - __const u_long __proc, - xdrproc_t __xdrargs, - caddr_t __argsp, xdrproc_t __xdrres, - caddr_t __resp, struct timeval __tout, - u_long *__port_ptr) __THROW; -extern enum clnt_stat clnt_broadcast (__const u_long __prog, - __const u_long __vers, - __const u_long __proc, xdrproc_t __xargs, - caddr_t __argsp, xdrproc_t __xresults, - caddr_t __resultsp, - resultproc_t __eachresult) __THROW; -extern u_short pmap_getport (struct sockaddr_in *__address, - __const u_long __program, - __const u_long __version, u_int __protocol) - __THROW; - -__END_DECLS - -#endif /* rpc/pmap_clnt.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/pmap_prot.h b/mdk-stage1/dietlibc/include/rpc/pmap_prot.h deleted file mode 100644 index fd7fb8e7e..000000000 --- a/mdk-stage1/dietlibc/include/rpc/pmap_prot.h +++ /dev/null @@ -1,108 +0,0 @@ -/* @(#)pmap_prot.h 2.1 88/07/29 4.0 RPCSRC; from 1.14 88/02/08 SMI */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * pmap_prot.h - * Protocol for the local binder service, or pmap. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#ifndef _RPC_PMAP_PROT_H -#define _RPC_PMAP_PROT_H 1 - -#include - -#include - -__BEGIN_DECLS - -/* The following procedures are supported by the protocol: - * - * PMAPPROC_NULL() returns () - * takes nothing, returns nothing - * - * PMAPPROC_SET(struct pmap) returns (bool_t) - * TRUE is success, FALSE is failure. Registers the tuple - * [prog, vers, prot, port]. - * - * PMAPPROC_UNSET(struct pmap) returns (bool_t) - * TRUE is success, FALSE is failure. Un-registers pair - * [prog, vers]. prot and port are ignored. - * - * PMAPPROC_GETPORT(struct pmap) returns (long unsigned). - * 0 is failure. Otherwise returns the port number where the pair - * [prog, vers] is registered. It may lie! - * - * PMAPPROC_DUMP() RETURNS (struct pmaplist *) - * - * PMAPPROC_CALLIT(unsigned, unsigned, unsigned, string<>) - * RETURNS (port, string<>); - * usage: encapsulatedresults = PMAPPROC_CALLIT(prog, vers, proc, encapsulatedargs); - * Calls the procedure on the local machine. If it is not registered, - * this procedure is quite; ie it does not return error information!!! - * This procedure only is supported on rpc/udp and calls via - * rpc/udp. This routine only passes null authentication parameters. - * This file has no interface to xdr routines for PMAPPROC_CALLIT. - * - * The service supports remote procedure calls on udp/ip or tcp/ip socket 111. - */ - -#define PMAPPORT ((u_short)111) -#define PMAPPROG ((u_long)100000) -#define PMAPVERS ((u_long)2) -#define PMAPVERS_PROTO ((u_long)2) -#define PMAPVERS_ORIG ((u_long)1) -#define PMAPPROC_NULL ((u_long)0) -#define PMAPPROC_SET ((u_long)1) -#define PMAPPROC_UNSET ((u_long)2) -#define PMAPPROC_GETPORT ((u_long)3) -#define PMAPPROC_DUMP ((u_long)4) -#define PMAPPROC_CALLIT ((u_long)5) - -struct pmap { - long unsigned pm_prog; - long unsigned pm_vers; - long unsigned pm_prot; - long unsigned pm_port; -}; - -extern bool_t xdr_pmap (XDR *__xdrs, struct pmap *__regs) __THROW; - -struct pmaplist { - struct pmap pml_map; - struct pmaplist *pml_next; -}; - -extern bool_t xdr_pmaplist (XDR *__xdrs, struct pmaplist **__rp) __THROW; - -__END_DECLS - -#endif /* rpc/pmap_prot.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h b/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h deleted file mode 100644 index 160f998ca..000000000 --- a/mdk-stage1/dietlibc/include/rpc/pmap_rmt.h +++ /dev/null @@ -1,68 +0,0 @@ -/* @(#)pmap_rmt.h 2.1 88/07/29 4.0 RPCSRC; from 1.2 88/02/08 SMI */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * Structures and XDR routines for parameters to and replies from - * the portmapper remote-call-service. - * - * Copyright (C) 1986, Sun Microsystems, Inc. - */ - -#ifndef _RPC_PMAP_RMT_H -#define _RPC_PMAP_RMT_H 1 - -#include -#include -#include -#include - -__BEGIN_DECLS - -struct rmtcallargs { - u_long prog, vers, proc, arglen; - caddr_t args_ptr; - xdrproc_t xdr_args; -}; - -extern bool_t xdr_rmtcall_args (XDR *__xdrs, struct rmtcallargs *__crp) - __THROW; - -struct rmtcallres { - u_long *port_ptr; - u_long resultslen; - caddr_t results_ptr; - xdrproc_t xdr_results; -}; - -extern bool_t xdr_rmtcallres (XDR *__xdrs, struct rmtcallres *__crp) __THROW; - -__END_DECLS - -#endif /* rpc/pmap_rmt.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/rpc.h b/mdk-stage1/dietlibc/include/rpc/rpc.h deleted file mode 100644 index 20b341d74..000000000 --- a/mdk-stage1/dietlibc/include/rpc/rpc.h +++ /dev/null @@ -1,72 +0,0 @@ -/* @(#)rpc.h 2.3 88/08/10 4.0 RPCSRC; from 1.9 88/02/08 SMI */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * rpc.h, Just includes the billions of rpc header files necessary to - * do remote procedure calling. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#ifndef _RPC_RPC_H -#define _RPC_RPC_H 1 - -#include /* some typedefs */ -#include - -/* external data representation interfaces */ -#include /* generic (de)serializer */ - -/* Client side only authentication */ -#include /* generic authenticator (client side) */ - -/* Client side (mostly) remote procedure call */ -#include /* generic rpc stuff */ - -/* semi-private protocol headers */ -#include /* protocol for rpc messages */ -#include /* protocol for unix style cred */ -#include /* protocol for des style cred */ - -/* Server side only remote procedure callee */ -#include /* service manager and multiplexer */ -#include /* service side authenticator */ - -/* - * COMMENT OUT THE NEXT INCLUDE IF RUNNING ON SUN OS OR ON A VERSION - * OF UNIX BASED ON NFSSRC. These systems will already have the structures - * defined by included in . - */ -/* routines for parsing /etc/rpc */ -#include /* structures and routines to parse /etc/rpc */ - -int bindresvport(int sd, struct sockaddr_in* sin) __THROW; - -#endif /* rpc/rpc.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/rpc_des.h b/mdk-stage1/dietlibc/include/rpc/rpc_des.h deleted file mode 100644 index 0f36d1697..000000000 --- a/mdk-stage1/dietlibc/include/rpc/rpc_des.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -/* - * Generic DES driver interface - * Keep this file hardware independent! - * Copyright (c) 1986 by Sun Microsystems, Inc. - */ - -#ifndef _DES_H -#define _DES_H - -#include - -#define DES_MAXLEN 65536 /* maximum # of bytes to encrypt */ -#define DES_QUICKLEN 16 /* maximum # of bytes to encrypt quickly */ - -enum desdir - { - ENCRYPT, DECRYPT - }; -enum desmode - { - CBC, ECB - }; - -/* - * parameters to ioctl call - */ -struct desparams - { - u_char des_key[8]; /* key (with low bit parity) */ - enum desdir des_dir; /* direction */ - enum desmode des_mode; /* mode */ - u_char des_ivec[8]; /* input vector */ - unsigned des_len; /* number of bytes to crypt */ - union - { - u_char UDES_data[DES_QUICKLEN]; - u_char *UDES_buf; - } - UDES; -#define des_data UDES.UDES_data /* direct data here if quick */ -#define des_buf UDES.UDES_buf /* otherwise, pointer to data */ - }; - -#endif diff --git a/mdk-stage1/dietlibc/include/rpc/rpc_msg.h b/mdk-stage1/dietlibc/include/rpc/rpc_msg.h deleted file mode 100644 index 636d60ea9..000000000 --- a/mdk-stage1/dietlibc/include/rpc/rpc_msg.h +++ /dev/null @@ -1,202 +0,0 @@ -/* @(#)rpc_msg.h 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -/* @(#)rpc_msg.h 1.7 86/07/16 SMI */ - -#ifndef _RPC_MSG_H -#define _RPC_MSG_H 1 - -#include - -#include -#include - -/* - * rpc_msg.h - * rpc message definition - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#define RPC_MSG_VERSION ((u_long) 2) -#define RPC_SERVICE_PORT ((u_short) 2048) - -__BEGIN_DECLS - -/* - * Bottom up definition of an rpc message. - * NOTE: call and reply use the same overall struct but - * different parts of unions within it. - */ - -enum msg_type { - CALL=0, - REPLY=1 -}; - -enum reply_stat { - MSG_ACCEPTED=0, - MSG_DENIED=1 -}; - -enum accept_stat { - SUCCESS=0, - PROG_UNAVAIL=1, - PROG_MISMATCH=2, - PROC_UNAVAIL=3, - GARBAGE_ARGS=4, - SYSTEM_ERR=5 -}; - -enum reject_stat { - RPC_MISMATCH=0, - AUTH_ERROR=1 -}; - -/* - * Reply part of an rpc exchange - */ - -/* - * Reply to an rpc request that was accepted by the server. - * Note: there could be an error even though the request was - * accepted. - */ -struct accepted_reply { - struct opaque_auth ar_verf; - enum accept_stat ar_stat; - union { - struct { - u_long low; - u_long high; - } AR_versions; - struct { - caddr_t where; - xdrproc_t proc; - } AR_results; - /* and many other null cases */ - } ru; -#define ar_results ru.AR_results -#define ar_vers ru.AR_versions -}; - -/* - * Reply to an rpc request that was rejected by the server. - */ -struct rejected_reply { - enum reject_stat rj_stat; - union { - struct { - u_long low; - u_long high; - } RJ_versions; - enum auth_stat RJ_why; /* why authentication did not work */ - } ru; -#define rj_vers ru.RJ_versions -#define rj_why ru.RJ_why -}; - -/* - * Body of a reply to an rpc request. - */ -struct reply_body { - enum reply_stat rp_stat; - union { - struct accepted_reply RP_ar; - struct rejected_reply RP_dr; - } ru; -#define rp_acpt ru.RP_ar -#define rp_rjct ru.RP_dr -}; - -/* - * Body of an rpc request call. - */ -struct call_body { - u_long cb_rpcvers; /* must be equal to two */ - u_long cb_prog; - u_long cb_vers; - u_long cb_proc; - struct opaque_auth cb_cred; - struct opaque_auth cb_verf; /* protocol specific - provided by client */ -}; - -/* - * The rpc message - */ -struct rpc_msg { - u_long rm_xid; - enum msg_type rm_direction; - union { - struct call_body RM_cmb; - struct reply_body RM_rmb; - } ru; -#define rm_call ru.RM_cmb -#define rm_reply ru.RM_rmb -}; -#define acpted_rply ru.RM_rmb.ru.RP_ar -#define rjcted_rply ru.RM_rmb.ru.RP_dr - - -/* - * XDR routine to handle a rpc message. - * xdr_callmsg(xdrs, cmsg) - * XDR *xdrs; - * struct rpc_msg *cmsg; - */ -extern bool_t xdr_callmsg (XDR *__xdrs, struct rpc_msg *__cmsg) __THROW; - -/* - * XDR routine to pre-serialize the static part of a rpc message. - * xdr_callhdr(xdrs, cmsg) - * XDR *xdrs; - * struct rpc_msg *cmsg; - */ -extern bool_t xdr_callhdr (XDR *__xdrs, struct rpc_msg *__cmsg) __THROW; - -/* - * XDR routine to handle a rpc reply. - * xdr_replymsg(xdrs, rmsg) - * XDR *xdrs; - * struct rpc_msg *rmsg; - */ -extern bool_t xdr_replymsg (XDR *__xdrs, struct rpc_msg *__rmsg) __THROW; - -/* - * Fills in the error part of a reply message. - * _seterr_reply(msg, error) - * struct rpc_msg *msg; - * struct rpc_err *error; - */ -extern void _seterr_reply (struct rpc_msg *__msg, struct rpc_err *__error) - __THROW; - -__END_DECLS - -#endif /* rpc/rpc_msg.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/svc.h b/mdk-stage1/dietlibc/include/rpc/svc.h deleted file mode 100644 index 27c997dde..000000000 --- a/mdk-stage1/dietlibc/include/rpc/svc.h +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * svc.h, Server-side remote procedure call interface. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#ifndef _RPC_SVC_H -#define _RPC_SVC_H 1 - -#include -#include - -__BEGIN_DECLS - -/* - * This interface must manage two items concerning remote procedure calling: - * - * 1) An arbitrary number of transport connections upon which rpc requests - * are received. The two most notable transports are TCP and UDP; they are - * created and registered by routines in svc_tcp.c and svc_udp.c, respectively; - * they in turn call xprt_register and xprt_unregister. - * - * 2) An arbitrary number of locally registered services. Services are - * described by the following four data: program number, version number, - * "service dispatch" function, a transport handle, and a boolean that - * indicates whether or not the exported program should be registered with a - * local binder service; if true the program's number and version and the - * port number from the transport handle are registered with the binder. - * These data are registered with the rpc svc system via svc_register. - * - * A service's dispatch function is called whenever an rpc request comes in - * on a transport. The request's program and version numbers must match - * those of the registered service. The dispatch function is passed two - * parameters, struct svc_req * and SVCXPRT *, defined below. - */ - -enum xprt_stat { - XPRT_DIED, - XPRT_MOREREQS, - XPRT_IDLE -}; - -/* - * Server side transport handle - */ -typedef struct SVCXPRT SVCXPRT; -struct SVCXPRT { - int xp_sock; - u_short xp_port; /* associated port number */ - const struct xp_ops { - bool_t (*xp_recv) (SVCXPRT *__xprt, struct rpc_msg *__msg); - /* receive incoming requests */ - enum xprt_stat (*xp_stat) (SVCXPRT *__xprt); - /* get transport status */ - bool_t (*xp_getargs) (SVCXPRT *__xprt, xdrproc_t __xdr_args, - caddr_t args_ptr); /* get arguments */ - bool_t (*xp_reply) (SVCXPRT *__xprt, struct rpc_msg *__msg); - /* send reply */ - bool_t (*xp_freeargs) (SVCXPRT *__xprt, xdrproc_t __xdr_args, - caddr_t args_ptr); - /* free mem allocated for args */ - void (*xp_destroy) (SVCXPRT *__xprt); - /* destroy this struct */ - } *xp_ops; - int xp_addrlen; /* length of remote address */ - struct sockaddr_in xp_raddr; /* remote address */ - struct opaque_auth xp_verf; /* raw response verifier */ - caddr_t xp_p1; /* private */ - caddr_t xp_p2; /* private */ - char xp_pad [256]; /* padding, internal use */ -}; - -/* - * Approved way of getting address of caller - */ -#define svc_getcaller(x) (&(x)->xp_raddr) - -/* - * Operations defined on an SVCXPRT handle - * - * SVCXPRT *xprt; - * struct rpc_msg *msg; - * xdrproc_t xargs; - * caddr_t argsp; - */ -#define SVC_RECV(xprt, msg) \ - (*(xprt)->xp_ops->xp_recv)((xprt), (msg)) -#define svc_recv(xprt, msg) \ - (*(xprt)->xp_ops->xp_recv)((xprt), (msg)) - -#define SVC_STAT(xprt) \ - (*(xprt)->xp_ops->xp_stat)(xprt) -#define svc_stat(xprt) \ - (*(xprt)->xp_ops->xp_stat)(xprt) - -#define SVC_GETARGS(xprt, xargs, argsp) \ - (*(xprt)->xp_ops->xp_getargs)((xprt), (xargs), (argsp)) -#define svc_getargs(xprt, xargs, argsp) \ - (*(xprt)->xp_ops->xp_getargs)((xprt), (xargs), (argsp)) - -#define SVC_REPLY(xprt, msg) \ - (*(xprt)->xp_ops->xp_reply) ((xprt), (msg)) -#define svc_reply(xprt, msg) \ - (*(xprt)->xp_ops->xp_reply) ((xprt), (msg)) - -#define SVC_FREEARGS(xprt, xargs, argsp) \ - (*(xprt)->xp_ops->xp_freeargs)((xprt), (xargs), (argsp)) -#define svc_freeargs(xprt, xargs, argsp) \ - (*(xprt)->xp_ops->xp_freeargs)((xprt), (xargs), (argsp)) - -#define SVC_DESTROY(xprt) \ - (*(xprt)->xp_ops->xp_destroy)(xprt) -#define svc_destroy(xprt) \ - (*(xprt)->xp_ops->xp_destroy)(xprt) - - -/* - * Service request - */ -struct svc_req { - rpcprog_t rq_prog; /* service program number */ - rpcvers_t rq_vers; /* service protocol version */ - rpcproc_t rq_proc; /* the desired procedure */ - struct opaque_auth rq_cred; /* raw creds from the wire */ - caddr_t rq_clntcred; /* read only cooked cred */ - SVCXPRT *rq_xprt; /* associated transport */ -}; - -#ifndef __DISPATCH_FN_T -#define __DISPATCH_FN_T -typedef void (*__dispatch_fn_t) (struct svc_req*, SVCXPRT*); -#endif - -/* - * Service registration - * - * svc_register(xprt, prog, vers, dispatch, protocol) - * SVCXPRT *xprt; - * rpcprog_t prog; - * rpcvers_t vers; - * void (*dispatch)(struct svc_req*, SVCXPRT*); - * rpcprot_t protocol; like TCP or UDP, zero means do not register - */ -extern bool_t svc_register (SVCXPRT *__xprt, rpcprog_t __prog, - rpcvers_t __vers, __dispatch_fn_t __dispatch, - rpcprot_t __protocol) __THROW; - -/* - * Service un-registration - * - * svc_unregister(prog, vers) - * rpcprog_t prog; - * rpcvers_t vers; - */ -extern void svc_unregister (rpcprog_t __prog, rpcvers_t __vers) __THROW; - -/* - * Transport registration. - * - * xprt_register(xprt) - * SVCXPRT *xprt; - */ -extern void xprt_register (SVCXPRT *__xprt) __THROW; - -/* - * Transport un-register - * - * xprt_unregister(xprt) - * SVCXPRT *xprt; - */ -extern void xprt_unregister (SVCXPRT *__xprt) __THROW; - - -/* - * When the service routine is called, it must first check to see if it - * knows about the procedure; if not, it should call svcerr_noproc - * and return. If so, it should deserialize its arguments via - * SVC_GETARGS (defined above). If the deserialization does not work, - * svcerr_decode should be called followed by a return. Successful - * decoding of the arguments should be followed the execution of the - * procedure's code and a call to svc_sendreply. - * - * Also, if the service refuses to execute the procedure due to too- - * weak authentication parameters, svcerr_weakauth should be called. - * Note: do not confuse access-control failure with weak authentication! - * - * NB: In pure implementations of rpc, the caller always waits for a reply - * msg. This message is sent when svc_sendreply is called. - * Therefore pure service implementations should always call - * svc_sendreply even if the function logically returns void; use - * xdr.h - xdr_void for the xdr routine. HOWEVER, tcp based rpc allows - * for the abuse of pure rpc via batched calling or pipelining. In the - * case of a batched call, svc_sendreply should NOT be called since - * this would send a return message, which is what batching tries to avoid. - * It is the service/protocol writer's responsibility to know which calls are - * batched and which are not. Warning: responding to batch calls may - * deadlock the caller and server processes! - */ - -extern bool_t svc_sendreply (SVCXPRT *xprt, xdrproc_t __xdr_results, - caddr_t __xdr_location) __THROW; - -extern void svcerr_decode (SVCXPRT *__xprt) __THROW; - -extern void svcerr_weakauth (SVCXPRT *__xprt) __THROW; - -extern void svcerr_noproc (SVCXPRT *__xprt) __THROW; - -extern void svcerr_progvers (SVCXPRT *__xprt, rpcvers_t __low_vers, - rpcvers_t __high_vers) __THROW; - -extern void svcerr_auth (SVCXPRT *__xprt, enum auth_stat __why) __THROW; - -extern void svcerr_noprog (SVCXPRT *__xprt) __THROW; - -extern void svcerr_systemerr (SVCXPRT *__xprt) __THROW; - -/* - * Lowest level dispatching -OR- who owns this process anyway. - * Somebody has to wait for incoming requests and then call the correct - * service routine. The routine svc_run does infinite waiting; i.e., - * svc_run never returns. - * Since another (coexistent) package may wish to selectively wait for - * incoming calls or other events outside of the rpc architecture, the - * routine svc_getreq is provided. It must be passed readfds, the - * "in-place" results of a select system call (see select, section 2). - */ - -/* - * Global keeper of rpc service descriptors in use - * dynamic; must be inspected before each call to select - */ - -extern struct pollfd *svc_pollfd; -extern int svc_max_pollfd; -extern fd_set svc_fdset; -#define svc_fds svc_fdset.fds_bits[0] /* compatibility */ - -/* - * a small program implemented by the svc_rpc implementation itself; - * also see clnt.h for protocol numbers. - */ -extern void svc_getreq (int __rdfds) __THROW; -extern void svc_getreq_common (const int __fd) __THROW; -extern void svc_getreqset (fd_set *__readfds) __THROW; -extern void svc_getreq_poll (struct pollfd *, const int) __THROW; -extern void svc_exit (void) __THROW; -extern void svc_run (void) __THROW; - -/* - * Socket to use on svcxxx_create call to get default socket - */ -#define RPC_ANYSOCK -1 - -/* - * These are the existing service side transport implementations - */ - -/* - * Memory based rpc for testing and timing. - */ -extern SVCXPRT *svcraw_create (void) __THROW; - -/* - * Udp based rpc. - */ -extern SVCXPRT *svcudp_create (int __sock) __THROW; -extern SVCXPRT *svcudp_bufcreate (int __sock, u_int __sendsz, u_int __recvsz) - __THROW; - -/* - * Tcp based rpc. - */ -extern SVCXPRT *svctcp_create (int __sock, u_int __sendsize, u_int __recvsize) - __THROW; - - -/* - * Unix based rpc. - */ -extern SVCXPRT *svcunix_create (int __sock, u_int __sendsize, u_int __recvsize, - char *__path) __THROW; - - -__END_DECLS - -#endif /* rpc/svc.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/svc_auth.h b/mdk-stage1/dietlibc/include/rpc/svc_auth.h deleted file mode 100644 index cd4b8da29..000000000 --- a/mdk-stage1/dietlibc/include/rpc/svc_auth.h +++ /dev/null @@ -1,54 +0,0 @@ -/* @(#)svc_auth.h 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -/* @(#)svc_auth.h 1.6 86/07/16 SMI */ - -/* - * svc_auth.h, Service side of rpc authentication. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#ifndef _RPC_SVC_AUTH_H -#define _RPC_SVC_AUTH_H 1 - -#include -#include - -__BEGIN_DECLS - -/* - * Server side authenticator - */ -extern enum auth_stat _authenticate (struct svc_req *__rqst, - struct rpc_msg *__msg) __THROW; - -__END_DECLS - -#endif /* rpc/svc_auth.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/types.h b/mdk-stage1/dietlibc/include/rpc/types.h deleted file mode 100644 index e2e8402be..000000000 --- a/mdk-stage1/dietlibc/include/rpc/types.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -/* fixincludes should not add extern "C" to this file */ -/* - * Rpc additions to - */ -#ifndef _RPC_TYPES_H -#define _RPC_TYPES_H 1 - -typedef int bool_t; -typedef int enum_t; -/* This needs to be changed to uint32_t in the future */ -typedef unsigned long rpcprog_t; -typedef unsigned long rpcvers_t; -typedef unsigned long rpcproc_t; -typedef unsigned long rpcprot_t; -typedef unsigned long rpcport_t; - -#define __dontcare__ -1 - -#ifndef FALSE -# define FALSE (0) -#endif - -#ifndef TRUE -# define TRUE (1) -#endif - -#ifndef NULL -# define NULL 0 -#endif - -#include /* For malloc decl. */ -#define mem_alloc(bsize) malloc(bsize) -#define mem_free(ptr, bsize) free(ptr) - -#ifndef makedev /* ie, we haven't already included it */ -#include -#endif -#include -#include - -#include - -#ifndef INADDR_LOOPBACK -#define INADDR_LOOPBACK (u_long)0x7F000001 -#endif -#ifndef MAXHOSTNAMELEN -#define MAXHOSTNAMELEN 64 -#endif - -#endif /* rpc/types.h */ diff --git a/mdk-stage1/dietlibc/include/rpc/xdr.h b/mdk-stage1/dietlibc/include/rpc/xdr.h deleted file mode 100644 index ce092f085..000000000 --- a/mdk-stage1/dietlibc/include/rpc/xdr.h +++ /dev/null @@ -1,379 +0,0 @@ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * xdr.h, External Data Representation Serialization Routines. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#ifndef _RPC_XDR_H -#define _RPC_XDR_H 1 - -#include -#include -#include - -/* We need FILE. */ -#include - -__BEGIN_DECLS - -/* - * XDR provides a conventional way for converting between C data - * types and an external bit-string representation. Library supplied - * routines provide for the conversion on built-in C data types. These - * routines and utility routines defined here are used to help implement - * a type encode/decode routine for each user-defined type. - * - * Each data type provides a single procedure which takes two arguments: - * - * bool_t - * xdrproc(xdrs, argresp) - * XDR *xdrs; - * *argresp; - * - * xdrs is an instance of a XDR handle, to which or from which the data - * type is to be converted. argresp is a pointer to the structure to be - * converted. The XDR handle contains an operation field which indicates - * which of the operations (ENCODE, DECODE * or FREE) is to be performed. - * - * XDR_DECODE may allocate space if the pointer argresp is null. This - * data can be freed with the XDR_FREE operation. - * - * We write only one procedure per data type to make it easy - * to keep the encode and decode procedures for a data type consistent. - * In many cases the same code performs all operations on a user defined type, - * because all the hard work is done in the component type routines. - * decode as a series of calls on the nested data types. - */ - -/* - * Xdr operations. XDR_ENCODE causes the type to be encoded into the - * stream. XDR_DECODE causes the type to be extracted from the stream. - * XDR_FREE can be used to release the space allocated by an XDR_DECODE - * request. - */ -enum xdr_op { - XDR_ENCODE = 0, - XDR_DECODE = 1, - XDR_FREE = 2 -}; - -/* - * This is the number of bytes per unit of external data. - */ -#define BYTES_PER_XDR_UNIT (4) -/* - * This only works if the above is a power of 2. But it's defined to be - * 4 by the appropriate RFCs. So it will work. And it's normally quicker - * than the old routine. - */ -#if 1 -#define RNDUP(x) (((x) + BYTES_PER_XDR_UNIT - 1) & ~(BYTES_PER_XDR_UNIT - 1)) -#else /* this is the old routine */ -#define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \ - * BYTES_PER_XDR_UNIT) -#endif - -/* - * The XDR handle. - * Contains operation which is being applied to the stream, - * an operations vector for the particular implementation (e.g. see xdr_mem.c), - * and two private fields for the use of the particular implementation. - */ -typedef struct XDR XDR; -struct XDR - { - enum xdr_op x_op; /* operation; fast additional param */ - struct xdr_ops - { - bool_t (*x_getlong) (XDR *__xdrs, long *__lp); - /* get a long from underlying stream */ - bool_t (*x_putlong) (XDR *__xdrs, const long *__lp); - /* put a long to " */ - bool_t (*x_getbytes) (XDR *__xdrs, caddr_t __addr, u_int __len); - /* get some bytes from " */ - bool_t (*x_putbytes) (XDR *__xdrs, const char *__addr, u_int __len); - /* put some bytes to " */ - u_int (*x_getpostn) (const XDR *__xdrs); - /* returns bytes off from beginning */ - bool_t (*x_setpostn) (XDR *__xdrs, u_int __pos); - /* lets you reposition the stream */ - int32_t *(*x_inline) (XDR *__xdrs, int __len); - /* buf quick ptr to buffered data */ - void (*x_destroy) (XDR *__xdrs); - /* free privates of this xdr_stream */ - bool_t (*x_getint32) (XDR *__xdrs, int32_t *__ip); - /* get a int from underlying stream */ - bool_t (*x_putint32) (XDR *__xdrs, const int32_t *__ip); - /* put a int to " */ - } - *x_ops; - caddr_t x_public; /* users' data */ - caddr_t x_private; /* pointer to private data */ - caddr_t x_base; /* private used for position info */ - int x_handy; /* extra private word */ - }; - -/* - * A xdrproc_t exists for each data type which is to be encoded or decoded. - * - * The second argument to the xdrproc_t is a pointer to an opaque pointer. - * The opaque pointer generally points to a structure of the data type - * to be decoded. If this pointer is 0, then the type routines should - * allocate dynamic storage of the appropriate size and return it. - * bool_t (*xdrproc_t)(XDR *, caddr_t *); - */ -typedef bool_t (*xdrproc_t) (XDR *, void *,...); - - -/* - * Operations defined on a XDR handle - * - * XDR *xdrs; - * int32_t *int32p; - * long *longp; - * caddr_t addr; - * u_int len; - * u_int pos; - */ -#define XDR_GETINT32(xdrs, int32p) \ - (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) -#define xdr_getint32(xdrs, int32p) \ - (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) - -#define XDR_PUTINT32(xdrs, int32p) \ - (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) -#define xdr_putint32(xdrs, int32p) \ - (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) - -#define XDR_GETLONG(xdrs, longp) \ - (*(xdrs)->x_ops->x_getlong)(xdrs, longp) -#define xdr_getlong(xdrs, longp) \ - (*(xdrs)->x_ops->x_getlong)(xdrs, longp) - -#define XDR_PUTLONG(xdrs, longp) \ - (*(xdrs)->x_ops->x_putlong)(xdrs, longp) -#define xdr_putlong(xdrs, longp) \ - (*(xdrs)->x_ops->x_putlong)(xdrs, longp) - -#define XDR_GETBYTES(xdrs, addr, len) \ - (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) -#define xdr_getbytes(xdrs, addr, len) \ - (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) - -#define XDR_PUTBYTES(xdrs, addr, len) \ - (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) -#define xdr_putbytes(xdrs, addr, len) \ - (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) - -#define XDR_GETPOS(xdrs) \ - (*(xdrs)->x_ops->x_getpostn)(xdrs) -#define xdr_getpos(xdrs) \ - (*(xdrs)->x_ops->x_getpostn)(xdrs) - -#define XDR_SETPOS(xdrs, pos) \ - (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) -#define xdr_setpos(xdrs, pos) \ - (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) - -#define XDR_INLINE(xdrs, len) \ - (*(xdrs)->x_ops->x_inline)(xdrs, len) -#define xdr_inline(xdrs, len) \ - (*(xdrs)->x_ops->x_inline)(xdrs, len) - -#define XDR_DESTROY(xdrs) \ - do { \ - if ((xdrs)->x_ops->x_destroy) \ - (*(xdrs)->x_ops->x_destroy)(xdrs); \ - } while (0) -#define xdr_destroy(xdrs) \ - do { \ - if ((xdrs)->x_ops->x_destroy) \ - (*(xdrs)->x_ops->x_destroy)(xdrs); \ - } while (0) - -/* - * Support struct for discriminated unions. - * You create an array of xdrdiscrim structures, terminated with - * a entry with a null procedure pointer. The xdr_union routine gets - * the discriminant value and then searches the array of structures - * for a matching value. If a match is found the associated xdr routine - * is called to handle that part of the union. If there is - * no match, then a default routine may be called. - * If there is no match and no default routine it is an error. - */ -#define NULL_xdrproc_t ((xdrproc_t)0) -struct xdr_discrim -{ - int value; - xdrproc_t proc; -}; - -/* - * Inline routines for fast encode/decode of primitive data types. - * Caveat emptor: these use single memory cycles to get the - * data from the underlying buffer, and will fail to operate - * properly if the data is not aligned. The standard way to use these - * is to say: - * if ((buf = XDR_INLINE(xdrs, count)) == NULL) - * return (FALSE); - * <<< macro calls >>> - * where ``count'' is the number of bytes of data occupied - * by the primitive data types. - * - * N.B. and frozen for all time: each data type here uses 4 bytes - * of external representation. - */ - -#define IXDR_GET_INT32(buf) ((int32_t)ntohl((uint32_t)*(buf)++)) -#define IXDR_PUT_INT32(buf, v) (*(buf)++ = (int32_t)htonl((uint32_t)(v))) -#define IXDR_GET_U_INT32(buf) ((uint32_t)IXDR_GET_INT32(buf)) -#define IXDR_PUT_U_INT32(buf, v) IXDR_PUT_INT32(buf, (int32_t)(v)) - -/* WARNING: The IXDR_*_LONG defines are removed by Sun for new platforms - * and shouldn't be used any longer. Code which use this defines or longs - * in the RPC code will not work on 64bit Solaris platforms ! - */ -#define IXDR_GET_LONG(buf) \ - ((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++)) -#define IXDR_PUT_LONG(buf, v) \ - (*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v))) -#define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) -#define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG(buf, (long)(v)) - - -#define IXDR_GET_BOOL(buf) ((bool_t)IXDR_GET_LONG(buf)) -#define IXDR_GET_ENUM(buf, t) ((t)IXDR_GET_LONG(buf)) -#define IXDR_GET_SHORT(buf) ((short)IXDR_GET_LONG(buf)) -#define IXDR_GET_U_SHORT(buf) ((u_short)IXDR_GET_LONG(buf)) - -#define IXDR_PUT_BOOL(buf, v) IXDR_PUT_LONG(buf, (long)(v)) -#define IXDR_PUT_ENUM(buf, v) IXDR_PUT_LONG(buf, (long)(v)) -#define IXDR_PUT_SHORT(buf, v) IXDR_PUT_LONG(buf, (long)(v)) -#define IXDR_PUT_U_SHORT(buf, v) IXDR_PUT_LONG(buf, (long)(v)) - -/* - * These are the "generic" xdr routines. - * None of these can have const applied because it's not possible to - * know whether the call is a read or a write to the passed parameter - * also, the XDR structure is always updated by some of these calls. - */ -extern bool_t xdr_void (void) __THROW; -extern bool_t xdr_short (XDR *__xdrs, short *__sp) __THROW; -extern bool_t xdr_u_short (XDR *__xdrs, u_short *__usp) __THROW; -extern bool_t xdr_int (XDR *__xdrs, int *__ip) __THROW; -extern bool_t xdr_u_int (XDR *__xdrs, u_int *__up) __THROW; -extern bool_t xdr_long (XDR *__xdrs, long *__lp) __THROW; -extern bool_t xdr_u_long (XDR *__xdrs, u_long *__ulp) __THROW; -extern bool_t xdr_hyper (XDR *__xdrs, __quad_t *__llp) __THROW; -extern bool_t xdr_u_hyper (XDR *__xdrs, __u_quad_t *__ullp) __THROW; -extern bool_t xdr_longlong_t (XDR *__xdrs, __quad_t *__llp) __THROW; -extern bool_t xdr_u_longlong_t (XDR *__xdrs, __u_quad_t *__ullp) __THROW; -extern bool_t xdr_int8_t (XDR *__xdrs, int8_t *__ip) __THROW; -extern bool_t xdr_uint8_t (XDR *__xdrs, uint8_t *__up) __THROW; -extern bool_t xdr_int16_t (XDR *__xdrs, int16_t *__ip) __THROW; -extern bool_t xdr_uint16_t (XDR *__xdrs, uint16_t *__up) __THROW; -extern bool_t xdr_int32_t (XDR *__xdrs, int32_t *__ip) __THROW; -extern bool_t xdr_uint32_t (XDR *__xdrs, uint32_t *__up) __THROW; -extern bool_t xdr_int64_t (XDR *__xdrs, int64_t *__ip) __THROW; -extern bool_t xdr_uint64_t (XDR *__xdrs, uint64_t *__up) __THROW; -extern bool_t xdr_bool (XDR *__xdrs, bool_t *__bp) __THROW; -extern bool_t xdr_enum (XDR *__xdrs, enum_t *__ep) __THROW; -extern bool_t xdr_array (XDR * _xdrs, caddr_t *__addrp, u_int *__sizep, - u_int __maxsize, u_int __elsize, xdrproc_t __elproc) - __THROW; -extern bool_t xdr_bytes (XDR *__xdrs, char **__cpp, u_int *__sizep, - u_int __maxsize) __THROW; -extern bool_t xdr_opaque (XDR *__xdrs, caddr_t __cp, u_int __cnt) __THROW; -extern bool_t xdr_string (XDR *__xdrs, char **__cpp, u_int __maxsize) __THROW; -extern bool_t xdr_union (XDR *__xdrs, enum_t *__dscmp, char *__unp, - const struct xdr_discrim *__choices, - xdrproc_t dfault) __THROW; -extern bool_t xdr_char (XDR *__xdrs, char *__cp) __THROW; -extern bool_t xdr_u_char (XDR *__xdrs, u_char *__cp) __THROW; -extern bool_t xdr_vector (XDR *__xdrs, char *__basep, u_int __nelem, - u_int __elemsize, xdrproc_t __xdr_elem) __THROW; -extern bool_t xdr_float (XDR *__xdrs, float *__fp) __THROW; -extern bool_t xdr_double (XDR *__xdrs, double *__dp) __THROW; -extern bool_t xdr_reference (XDR *__xdrs, caddr_t *__xpp, u_int __size, - xdrproc_t __proc) __THROW; -extern bool_t xdr_pointer (XDR *__xdrs, char **__objpp, - u_int __obj_size, xdrproc_t __xdr_obj) __THROW; -extern bool_t xdr_wrapstring (XDR *__xdrs, char **__cpp) __THROW; -extern u_long xdr_sizeof (xdrproc_t, void *) __THROW; - -/* - * Common opaque bytes objects used by many rpc protocols; - * declared here due to commonality. - */ -#define MAX_NETOBJ_SZ 1024 -struct netobj -{ - u_int n_len; - char *n_bytes; -}; -typedef struct netobj netobj; -extern bool_t xdr_netobj (XDR *__xdrs, struct netobj *__np) __THROW; - -/* - * These are the public routines for the various implementations of - * xdr streams. - */ - -/* XDR using memory buffers */ -extern void xdrmem_create (XDR *__xdrs, const caddr_t __addr, - u_int __size, enum xdr_op __xop) __THROW; - -/* XDR using stdio library */ -extern void xdrstdio_create (XDR *__xdrs, FILE *__file, enum xdr_op __xop) - __THROW; - -/* XDR pseudo records for tcp */ -extern void xdrrec_create (XDR *__xdrs, u_int __sendsize, - u_int __recvsize, caddr_t __tcp_handle, - int (*__readit) (char *, char *, int), - int (*__writeit) (char *, char *, int)) __THROW; - -/* make end of xdr record */ -extern bool_t xdrrec_endofrecord (XDR *__xdrs, bool_t __sendnow) __THROW; - -/* move to beginning of next record */ -extern bool_t xdrrec_skiprecord (XDR *__xdrs) __THROW; - -/* true if no more input */ -extern bool_t xdrrec_eof (XDR *__xdrs) __THROW; - -/* free memory buffers for xdr */ -extern void xdr_free (xdrproc_t __proc, char *__objp) __THROW; - -__END_DECLS - -#endif /* rpc/xdr.h */ diff --git a/mdk-stage1/dietlibc/include/sched.h b/mdk-stage1/dietlibc/include/sched.h deleted file mode 100644 index 5e4430d29..000000000 --- a/mdk-stage1/dietlibc/include/sched.h +++ /dev/null @@ -1,74 +0,0 @@ -#ifndef _SCHED_H -#define _SCHED_H 1 - -#include - -#include -#ifndef u16 -#define u16 __u16 -#endif - -/* till those F**KIN' kernel headers are sane: A COPY ! - * #include - * A COPY OF THE STUFF WE NEED.... *GRUMBLE* */ - -/* - * cloning flags: - */ -#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */ -#define CLONE_VM 0x00000100 /* set if VM shared between processes */ -#define CLONE_FS 0x00000200 /* set if fs info shared between processes */ -#define CLONE_FILES 0x00000400 /* set if open files shared between processes */ -#define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */ -#define CLONE_PID 0x00001000 /* set if pid shared */ -#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */ -#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */ -#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */ -#define CLONE_THREAD 0x00010000 /* Same thread group? */ - -#define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREA) - -/* - * Scheduling policies - */ -#define SCHED_OTHER 0 -#define SCHED_FIFO 1 -#define SCHED_RR 2 - -/* - * This is an additional bit set when we want to - * yield the CPU for one re-schedule.. - */ -#define SCHED_YIELD 0x10 - -struct sched_param { - int sched_priority; -}; - -/* END OF COPY form kernel-header */ - -int __sched_setparam(pid_t pid, const struct sched_param *p); -int sched_setparam(pid_t pid, const struct sched_param *p); - -int __sched_getparam(pid_t pid, struct sched_param *p); -int sched_getparam(pid_t pid, struct sched_param *p); - -int __sched_getscheduler(pid_t pid); -int sched_getscheduler(pid_t pid); - -int __sched_setscheduler(pid_t pid, int policy, const struct sched_param *p); -int sched_setscheduler(pid_t pid, int policy, const struct sched_param *p); - -int __sched_yield(void); -int sched_yield(void); - -int __sched_get_priority_max(int policy); -int sched_get_priority_max(int policy); - -int __sched_get_priority_min(int policy); -int sched_get_priority_min(int policy); - -int __sched_rr_get_interval(pid_t pid, struct timespec *tp); -int sched_rr_get_interval(pid_t pid, struct timespec *tp); - -#endif diff --git a/mdk-stage1/dietlibc/include/scsi/scsi.h b/mdk-stage1/dietlibc/include/scsi/scsi.h deleted file mode 100644 index 652e44ee9..000000000 --- a/mdk-stage1/dietlibc/include/scsi/scsi.h +++ /dev/null @@ -1,224 +0,0 @@ -/* Copyright (C) 1998, 1999 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* - * This header file contains public constants and structures used by - * the scsi code for linux. - */ - -#ifndef _SCSI_SCSI_H -#define _SCSI_SCSI_H 1 - -/* - * SCSI opcodes - */ - -#define TEST_UNIT_READY 0x00 -#define REZERO_UNIT 0x01 -#define REQUEST_SENSE 0x03 -#define FORMAT_UNIT 0x04 -#define READ_BLOCK_LIMITS 0x05 -#define REASSIGN_BLOCKS 0x07 -#define READ_6 0x08 -#define WRITE_6 0x0a -#define SEEK_6 0x0b -#define READ_REVERSE 0x0f -#define WRITE_FILEMARKS 0x10 -#define SPACE 0x11 -#define INQUIRY 0x12 -#define RECOVER_BUFFERED_DATA 0x14 -#define MODE_SELECT 0x15 -#define RESERVE 0x16 -#define RELEASE 0x17 -#define COPY 0x18 -#define ERASE 0x19 -#define MODE_SENSE 0x1a -#define START_STOP 0x1b -#define RECEIVE_DIAGNOSTIC 0x1c -#define SEND_DIAGNOSTIC 0x1d -#define ALLOW_MEDIUM_REMOVAL 0x1e - -#define SET_WINDOW 0x24 -#define READ_CAPACITY 0x25 -#define READ_10 0x28 -#define WRITE_10 0x2a -#define SEEK_10 0x2b -#define WRITE_VERIFY 0x2e -#define VERIFY 0x2f -#define SEARCH_HIGH 0x30 -#define SEARCH_EQUAL 0x31 -#define SEARCH_LOW 0x32 -#define SET_LIMITS 0x33 -#define PRE_FETCH 0x34 -#define READ_POSITION 0x34 -#define SYNCHRONIZE_CACHE 0x35 -#define LOCK_UNLOCK_CACHE 0x36 -#define READ_DEFECT_DATA 0x37 -#define MEDIUM_SCAN 0x38 -#define COMPARE 0x39 -#define COPY_VERIFY 0x3a -#define WRITE_BUFFER 0x3b -#define READ_BUFFER 0x3c -#define UPDATE_BLOCK 0x3d -#define READ_LONG 0x3e -#define WRITE_LONG 0x3f -#define CHANGE_DEFINITION 0x40 -#define WRITE_SAME 0x41 -#define READ_TOC 0x43 -#define LOG_SELECT 0x4c -#define LOG_SENSE 0x4d -#define MODE_SELECT_10 0x55 -#define RESERVE_10 0x56 -#define RELEASE_10 0x57 -#define MODE_SENSE_10 0x5a -#define PERSISTENT_RESERVE_IN 0x5e -#define PERSISTENT_RESERVE_OUT 0x5f -#define MOVE_MEDIUM 0xa5 -#define READ_12 0xa8 -#define WRITE_12 0xaa -#define WRITE_VERIFY_12 0xae -#define SEARCH_HIGH_12 0xb0 -#define SEARCH_EQUAL_12 0xb1 -#define SEARCH_LOW_12 0xb2 -#define READ_ELEMENT_STATUS 0xb8 -#define SEND_VOLUME_TAG 0xb6 -#define WRITE_LONG_2 0xea - -/* - * Status codes - */ - -#define GOOD 0x00 -#define CHECK_CONDITION 0x01 -#define CONDITION_GOOD 0x02 -#define BUSY 0x04 -#define INTERMEDIATE_GOOD 0x08 -#define INTERMEDIATE_C_GOOD 0x0a -#define RESERVATION_CONFLICT 0x0c -#define COMMAND_TERMINATED 0x11 -#define QUEUE_FULL 0x14 - -#define STATUS_MASK 0x3e - -/* - * SENSE KEYS - */ - -#define NO_SENSE 0x00 -#define RECOVERED_ERROR 0x01 -#define NOT_READY 0x02 -#define MEDIUM_ERROR 0x03 -#define HARDWARE_ERROR 0x04 -#define ILLEGAL_REQUEST 0x05 -#define UNIT_ATTENTION 0x06 -#define DATA_PROTECT 0x07 -#define BLANK_CHECK 0x08 -#define COPY_ABORTED 0x0a -#define ABORTED_COMMAND 0x0b -#define VOLUME_OVERFLOW 0x0d -#define MISCOMPARE 0x0e - - -/* - * DEVICE TYPES - */ - -#define TYPE_DISK 0x00 -#define TYPE_TAPE 0x01 -#define TYPE_PROCESSOR 0x03 /* HP scanners use this */ -#define TYPE_WORM 0x04 /* Treated as ROM by our system */ -#define TYPE_ROM 0x05 -#define TYPE_SCANNER 0x06 -#define TYPE_MOD 0x07 /* Magneto-optical disk - - * - treated as TYPE_DISK */ -#define TYPE_MEDIUM_CHANGER 0x08 -#define TYPE_ENCLOSURE 0x0d /* Enclosure Services Device */ -#define TYPE_NO_LUN 0x7f - -/* - * standard mode-select header prepended to all mode-select commands - * - * moved here from cdrom.h -- kraxel - */ - -struct ccs_modesel_head - { - unsigned char _r1; /* reserved. */ - unsigned char medium; /* device-specific medium type. */ - unsigned char _r2; /* reserved. */ - unsigned char block_desc_length; /* block descriptor length. */ - unsigned char density; /* device-specific density code. */ - unsigned char number_blocks_hi; /* number of blocks in this block - desc. */ - unsigned char number_blocks_med; - unsigned char number_blocks_lo; - unsigned char _r3; - unsigned char block_length_hi; /* block length for blocks in this - desc. */ - unsigned char block_length_med; - unsigned char block_length_lo; - }; - -/* - * MESSAGE CODES - */ - -#define COMMAND_COMPLETE 0x00 -#define EXTENDED_MESSAGE 0x01 -#define EXTENDED_MODIFY_DATA_POINTER 0x00 -#define EXTENDED_SDTR 0x01 -#define EXTENDED_EXTENDED_IDENTIFY 0x02 /* SCSI-I only */ -#define EXTENDED_WDTR 0x03 -#define SAVE_POINTERS 0x02 -#define RESTORE_POINTERS 0x03 -#define DISCONNECT 0x04 -#define INITIATOR_ERROR 0x05 -#define ABORT 0x06 -#define MESSAGE_REJECT 0x07 -#define NOP 0x08 -#define MSG_PARITY_ERROR 0x09 -#define LINKED_CMD_COMPLETE 0x0a -#define LINKED_FLG_CMD_COMPLETE 0x0b -#define BUS_DEVICE_RESET 0x0c - -#define INITIATE_RECOVERY 0x0f /* SCSI-II only */ -#define RELEASE_RECOVERY 0x10 /* SCSI-II only */ - -#define SIMPLE_QUEUE_TAG 0x20 -#define HEAD_OF_QUEUE_TAG 0x21 -#define ORDERED_QUEUE_TAG 0x22 - -/* - * Here are some scsi specific ioctl commands which are sometimes useful. - */ -/* These are a few other constants only used by scsi devices. */ - -#define SCSI_IOCTL_GET_IDLUN 0x5382 - -/* Used to turn on and off tagged queuing for scsi devices. */ - -#define SCSI_IOCTL_TAGGED_ENABLE 0x5383 -#define SCSI_IOCTL_TAGGED_DISABLE 0x5384 - -/* Used to obtain the host number of a device. */ -#define SCSI_IOCTL_PROBE_HOST 0x5385 - -/* Used to get the bus number for a device. */ -#define SCSI_IOCTL_GET_BUS_NUMBER 0x5386 - -#endif /* scsi/scsi.h */ diff --git a/mdk-stage1/dietlibc/include/scsi/scsi_ioctl.h b/mdk-stage1/dietlibc/include/scsi/scsi_ioctl.h deleted file mode 100644 index bc9931838..000000000 --- a/mdk-stage1/dietlibc/include/scsi/scsi_ioctl.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 1999 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _SCSI_IOCTL_H -#define _SCSI_IOCTL_H - -/* IOCTLs for SCSI. */ -#define SCSI_IOCTL_SEND_COMMAND 1 /* Send a command to the SCSI host. */ -#define SCSI_IOCTL_TEST_UNIT_READY 2 /* Test if unit is ready. */ -#define SCSI_IOCTL_BENCHMARK_COMMAND 3 -#define SCSI_IOCTL_SYNC 4 /* Request synchronous parameters. */ -#define SCSI_IOCTL_START_UNIT 5 -#define SCSI_IOCTL_STOP_UNIT 6 -#define SCSI_IOCTL_DOORLOCK 0x5380 /* Lock the eject mechanism. */ -#define SCSI_IOCTL_DOORUNLOCK 0x5381 /* Unlock the mechanism. */ - -#endif - - diff --git a/mdk-stage1/dietlibc/include/scsi/sg.h b/mdk-stage1/dietlibc/include/scsi/sg.h deleted file mode 100644 index 00334654e..000000000 --- a/mdk-stage1/dietlibc/include/scsi/sg.h +++ /dev/null @@ -1,274 +0,0 @@ -/* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* - History: - Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user - process control of SCSI devices. - Development Sponsored by Killy Corp. NY NY -*/ - -#ifndef _SCSI_SG_H -#define _SCSI_SG_H 1 - -#include - -/* New interface introduced in the 3.x SG drivers follows */ - -/* Same structure as used by readv() Linux system call. It defines one - scatter-gather element. */ -typedef struct sg_iovec -{ - void * iov_base; /* Starting address */ - size_t iov_len; /* Length in bytes */ -} sg_iovec_t; - - -typedef struct sg_io_hdr -{ - int interface_id; /* [i] 'S' for SCSI generic (required) */ - int dxfer_direction; /* [i] data transfer direction */ - unsigned char cmd_len; /* [i] SCSI command length ( <= 16 bytes) */ - unsigned char mx_sb_len; /* [i] max length to write to sbp */ - unsigned short int iovec_count; /* [i] 0 implies no scatter gather */ - unsigned int dxfer_len; /* [i] byte count of data transfer */ - void * dxferp; /* [i], [*io] points to data transfer memory - or scatter gather list */ - unsigned char * cmdp; /* [i], [*i] points to command to perform */ - unsigned char * sbp; /* [i], [*o] points to sense_buffer memory */ - unsigned int timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */ - unsigned int flags; /* [i] 0 -> default, see SG_FLAG... */ - int pack_id; /* [i->o] unused internally (normally) */ - void * usr_ptr; /* [i->o] unused internally */ - unsigned char status; /* [o] scsi status */ - unsigned char masked_status;/* [o] shifted, masked scsi status */ - unsigned char msg_status; /* [o] messaging level data (optional) */ - unsigned char sb_len_wr; /* [o] byte count actually written to sbp */ - unsigned short int host_status; /* [o] errors from host adapter */ - unsigned short int driver_status;/* [o] errors from software driver */ - int resid; /* [o] dxfer_len - actual_transferred */ - unsigned int duration; /* [o] time taken by cmd (unit: millisec) */ - unsigned int info; /* [o] auxiliary information */ -} sg_io_hdr_t; - - -/* Use negative values to flag difference from original sg_header structure. */ -#define SG_DXFER_NONE -1 /* e.g. a SCSI Test Unit Ready command */ -#define SG_DXFER_TO_DEV -2 /* e.g. a SCSI WRITE command */ -#define SG_DXFER_FROM_DEV -3 /* e.g. a SCSI READ command */ -#define SG_DXFER_TO_FROM_DEV -4 /* treated like SG_DXFER_FROM_DEV with the - additional property than during indirect - IO the user buffer is copied into the - kernel buffers before the transfer */ - - -/* following flag values can be "or"-ed together */ -#define SG_FLAG_DIRECT_IO 1 /* default is indirect IO */ -#define SG_FLAG_LUN_INHIBIT 2 /* default is to put device's lun into */ - /* the 2nd byte of SCSI command */ -#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */ - /* user space (debug indirect IO) */ - -/* The following 'info' values are "or"-ed together. */ -#define SG_INFO_OK_MASK 0x1 -#define SG_INFO_OK 0x0 /* no sense, host nor driver "noise" */ -#define SG_INFO_CHECK 0x1 /* something abnormal happened */ - -#define SG_INFO_DIRECT_IO_MASK 0x6 -#define SG_INFO_INDIRECT_IO 0x0 /* data xfer via kernel buffers (or no xfer) */ -#define SG_INFO_DIRECT_IO 0x2 /* direct IO requested and performed */ -#define SG_INFO_MIXED_IO 0x4 /* part direct, part indirect IO */ - - -/* Request information about a specific SG device, used by - SG_GET_SCSI_ID ioctl (). */ -struct sg_scsi_id { - /* Host number as in "scsi" where 'n' is one of 0, 1, 2 etc. */ - int host_no; - int channel; - /* SCSI id of target device. */ - int scsi_id; - int lun; - /* TYPE_... defined in . */ - int scsi_type; - /* Host (adapter) maximum commands per lun. */ - short int h_cmd_per_lun; - /* Device (or adapter) maximum queue length. */ - short int d_queue_depth; - /* Unused, set to 0 for now. */ - int unused[2]; -}; - -/* Used by SG_GET_REQUEST_TABLE ioctl(). */ -typedef struct sg_req_info { - char req_state; /* 0 -> not used, 1 -> written, 2 -> ready to read */ - char orphan; /* 0 -> normal request, 1 -> from interruped SG_IO */ - char sg_io_owned; /* 0 -> complete with read(), 1 -> owned by SG_IO */ - char problem; /* 0 -> no problem detected, 1 -> error to report */ - int pack_id; /* pack_id associated with request */ - void * usr_ptr; /* user provided pointer (in new interface) */ - unsigned int duration; /* millisecs elapsed since written (req_state==1) - or request duration (req_state==2) */ - int unused; -} sg_req_info_t; - - -/* IOCTLs: Those ioctls that are relevant to the SG 3.x drivers follow. - [Those that only apply to the SG 2.x drivers are at the end of the file.] - (_GET_s yield result via 'int *' 3rd argument unless otherwise indicated) */ - -#define SG_EMULATED_HOST 0x2203 /* true for emulated host adapter (ATAPI) */ - -/* Used to configure SCSI command transformation layer for ATAPI devices */ -/* Only supported by the ide-scsi driver */ -#define SG_SET_TRANSFORM 0x2204 /* N.B. 3rd arg is not pointer but value: */ - /* 3rd arg = 0 to disable transform, 1 to enable it */ -#define SG_GET_TRANSFORM 0x2205 - -#define SG_SET_RESERVED_SIZE 0x2275 /* request a new reserved buffer size */ -#define SG_GET_RESERVED_SIZE 0x2272 /* actual size of reserved buffer */ - -/* The following ioctl has a 'sg_scsi_id_t *' object as its 3rd argument. */ -#define SG_GET_SCSI_ID 0x2276 /* Yields fd's bus, chan, dev, lun + type */ -/* SCSI id information can also be obtained from SCSI_IOCTL_GET_IDLUN */ - -/* Override host setting and always DMA using low memory ( <16MB on i386) */ -#define SG_SET_FORCE_LOW_DMA 0x2279 /* 0-> use adapter setting, 1-> force */ -#define SG_GET_LOW_DMA 0x227a /* 0-> use all ram for dma; 1-> low dma ram */ - -/* When SG_SET_FORCE_PACK_ID set to 1, pack_id is input to read() which - tries to fetch a packet with a matching pack_id, waits, or returns EAGAIN. - If pack_id is -1 then read oldest waiting. When ...FORCE_PACK_ID set to 0 - then pack_id ignored by read() and oldest readable fetched. */ -#define SG_SET_FORCE_PACK_ID 0x227b -#define SG_GET_PACK_ID 0x227c /* Yields oldest readable pack_id (or -1) */ - -#define SG_GET_NUM_WAITING 0x227d /* Number of commands awaiting read() */ - -/* Yields max scatter gather tablesize allowed by current host adapter */ -#define SG_GET_SG_TABLESIZE 0x227F /* 0 implies can't do scatter gather */ - -#define SG_GET_VERSION_NUM 0x2282 /* Example: version 2.1.34 yields 20134 */ - -/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */ -#define SG_SCSI_RESET 0x2284 -/* Associated values that can be given to SG_SCSI_RESET follow */ -#define SG_SCSI_RESET_NOTHING 0 -#define SG_SCSI_RESET_DEVICE 1 -#define SG_SCSI_RESET_BUS 2 -#define SG_SCSI_RESET_HOST 3 - -/* synchronous SCSI command ioctl, (only in version 3 interface) */ -#define SG_IO 0x2285 /* similar effect as write() followed by read() */ - -#define SG_GET_REQUEST_TABLE 0x2286 /* yields table of active requests */ - -/* How to treat EINTR during SG_IO ioctl(), only in SG 3.x series */ -#define SG_SET_KEEP_ORPHAN 0x2287 /* 1 -> hold for read(), 0 -> drop (def) */ -#define SG_GET_KEEP_ORPHAN 0x2288 - - -#define SG_SCATTER_SZ (8 * 4096) /* PAGE_SIZE not available to user */ -/* Largest size (in bytes) a single scatter-gather list element can have. - The value must be a power of 2 and <= (PAGE_SIZE * 32) [131072 bytes on - i386]. The minimum value is PAGE_SIZE. If scatter-gather not supported - by adapter then this value is the largest data block that can be - read/written by a single scsi command. The user can find the value of - PAGE_SIZE by calling getpagesize() defined in unistd.h . */ - -#define SG_DEFAULT_RETRIES 1 - -/* Defaults, commented if they differ from original sg driver */ -#define SG_DEF_FORCE_LOW_DMA 0 /* was 1 -> memory below 16MB on i386 */ -#define SG_DEF_FORCE_PACK_ID 0 -#define SG_DEF_KEEP_ORPHAN 0 -#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ /* load time option */ - -/* maximum outstanding requests, write() yields EDOM if exceeded */ -#define SG_MAX_QUEUE 16 - -#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE /* for backward compatibility */ - -/* Alternate style type names, "..._t" variants preferred */ -typedef struct sg_io_hdr Sg_io_hdr; -typedef struct sg_io_vec Sg_io_vec; -typedef struct sg_scsi_id Sg_scsi_id; -typedef struct sg_req_info Sg_req_info; - - -/* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */ -/* The older SG interface based on the 'sg_header' structure follows. */ -/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */ - -#define SG_MAX_SENSE 16 /* this only applies to the sg_header interface */ - -struct sg_header - { - /* Length of incoming packet (including header). */ - int pack_len; - /* Maximal length of expected reply. */ - int reply_len; - /* Id number of packet. */ - int pack_id; - /* 0==ok, otherwise error number. */ - int result; - /* Force 12 byte command length for group 6 & 7 commands. */ - unsigned int twelve_byte:1; - /* SCSI status from target. */ - unsigned int target_status:5; - /* Host status (see "DID" codes). */ - unsigned int host_status:8; - /* Driver status+suggestion. */ - unsigned int driver_status:8; - /* Unused. */ - unsigned int other_flags:10; - /* Output in 3 cases: - when target_status is CHECK_CONDITION or - when target_status is COMMAND_TERMINATED or - when (driver_status & DRIVER_SENSE) is true. */ - unsigned char sense_buffer[SG_MAX_SENSE]; - }; - - -/* IOCTLs: The following are not required (or ignored) when the sg_io_hdr_t - interface is used. They are kept for backward compatibility with - the original and version 2 drivers. */ - -#define SG_SET_TIMEOUT 0x2201 /* Set timeout; *(int *)arg==timeout. */ -#define SG_GET_TIMEOUT 0x2202 /* Get timeout; return timeout. */ - -/* Get/set command queuing state per fd (default is SG_DEF_COMMAND_Q). */ -#define SG_GET_COMMAND_Q 0x2270 /* Yields 0 (queuing off) or 1 (on). */ -#define SG_SET_COMMAND_Q 0x2271 /* Change queuing state with 0 or 1. */ - -/* Turn on error sense trace (1..8), dump this device to log/console (9) - or dump all sg device states ( >9 ) to log/console. */ -#define SG_SET_DEBUG 0x227e /* 0 -> turn off debug */ - -#define SG_NEXT_CMD_LEN 0x2283 /* Override SCSI command length with given - number on the next write() on this file - descriptor. */ - -/* Defaults, commented if they differ from original sg driver */ -#define SG_DEFAULT_TIMEOUT (60*HZ) /* HZ == 'jiffies in 1 second' */ -#define SG_DEF_COMMAND_Q 0 /* command queuing is always on when - the new interface is used */ -#define SG_DEF_UNDERRUN_FLAG 0 - - -#endif /* scsi/sg.h */ diff --git a/mdk-stage1/dietlibc/include/setjmp.h b/mdk-stage1/dietlibc/include/setjmp.h deleted file mode 100644 index 66fc288f4..000000000 --- a/mdk-stage1/dietlibc/include/setjmp.h +++ /dev/null @@ -1,123 +0,0 @@ -#ifndef _SETJMP_H -#define _SETJMP_H - -#include - -#ifdef __i386__ -#ifndef __ASSEMBLER__ -typedef int __jmp_buf[6]; -#endif -# define JB_BX 0 -# define JB_SI 1 -# define JB_DI 2 -# define JB_BP 3 -# define JB_SP 4 -# define JB_PC 5 -# define JB_SIZE 24 -#endif - -#ifdef __alpha__ -#define JB_S0 0 -#define JB_S1 1 -#define JB_S2 2 -#define JB_S3 3 -#define JB_S4 4 -#define JB_S5 5 -#define JB_PC 6 -#define JB_FP 7 -#define JB_SP 8 -#define JB_F2 9 -#define JB_F3 10 -#define JB_F4 11 -#define JB_F5 12 -#define JB_F6 13 -#define JB_F7 14 -#define JB_F8 15 -#define JB_F9 16 -#ifndef __ASSEMBLER__ -typedef long int __jmp_buf[17]; -#endif -#endif - -#ifdef __mips__ -#ifndef __ASSEMBLER__ -typedef struct - { - void * __pc; /* Program counter. */ - void * __sp; /* Stack pointer. */ - int __regs[8]; /* Callee-saved registers s0 through s7. */ - void * __fp; /* The frame pointer. */ - void * __gp; /* The global pointer. */ - int __fpc_csr; /* Floating point status register. */ - double __fpregs[6]; /* Callee-saved floating point registers. */ - } __jmp_buf[1]; -#endif -#endif - -#ifdef __sparc__ -#define JB_SP 0 -#define JB_FP 1 -#define JB_PC 2 -#ifndef __ASSEMBLER__ -typedef int __jmp_buf[3]; -#endif -#endif - -#ifdef __arm__ -#define __JMP_BUF_SP 8 -#ifndef __ASSEMBLER__ -typedef int __jmp_buf[10]; -#endif -#endif - -#ifdef __powerpc__ -# define JB_GPR1 0 /* Also known as the stack pointer */ -# define JB_GPR2 1 -# define JB_LR 2 /* The address we will return to */ -# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total */ -# define JB_CR 21 /* Condition code registers. */ -# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total */ -# define JB_SIZE (58*4) -#ifndef __ASSEMBLER__ -typedef long int __jmp_buf[58]; -#endif -#endif - -#ifndef __ASSEMBLER__ - -typedef int sig_atomic_t; -#define __sig_atomic_t sig_atomic_t - -# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) -typedef struct - { - unsigned long int __val[_SIGSET_NWORDS]; - } __sigset_t; - -/* Calling environment, plus possibly a saved signal mask. */ -typedef struct __jmp_buf_tag /* C++ doesn't like tagless structs. */ - { - /* NOTE: The machine-dependent definitions of `__sigsetjmp' - assume that a `jmp_buf' begins with a `__jmp_buf'. - Do not move this member or add others before it. */ - __jmp_buf __jmpbuf; /* Calling environment. */ - int __mask_was_saved; /* Saved the signal mask? */ - __sigset_t __saved_mask; /* Saved signal mask. */ - } jmp_buf[1]; - -extern int __sigsetjmp (jmp_buf __env, int __savemask) __THROW; - -extern void longjmp (jmp_buf __env, int __val) - __THROW __attribute__ ((__noreturn__)); - -typedef jmp_buf sigjmp_buf; - -extern void siglongjmp (sigjmp_buf __env, int __val) - __THROW __attribute__ ((__noreturn__)); - -#define setjmp(env) __sigsetjmp(env,0) -#define sigsetjmp(a,b) __sigsetjmp(a,b) - -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/shadow.h b/mdk-stage1/dietlibc/include/shadow.h deleted file mode 100644 index 4d6341af1..000000000 --- a/mdk-stage1/dietlibc/include/shadow.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _SHADOW_H -#define _SHADOW_H - -#include -#include - -struct spwd { - char *sp_namp; /* user login name */ - char *sp_pwdp; /* encrypted password */ - long sp_lstchg; /* last password change */ - int sp_min; /* days until change allowed. */ - int sp_max; /* days before change required */ - int sp_warn; /* days warning for expiration */ - int sp_inact; /* days before account inactive */ - int sp_expire; /* date when account expires */ - int sp_flag; /* reserved for future use */ -}; - -extern struct spwd *getspent(void) __THROW; -extern void setspent(void) __THROW; -extern void endspent(void) __THROW; -extern struct spwd *getspnam (__const char *__name) __THROW; - -#endif /* _SHADOW_H */ diff --git a/mdk-stage1/dietlibc/include/signal.h b/mdk-stage1/dietlibc/include/signal.h deleted file mode 100644 index 9ed93fe83..000000000 --- a/mdk-stage1/dietlibc/include/signal.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _SIGNAL_H -#define _SIGNAL_H - -#include - -#define __WANT_POSIX1B_SIGNALS__ - -#include -#include - -typedef void (*sighandler_t)(int); - -int sigemptyset(sigset_t *set) __THROW; -int sigfillset(sigset_t *set) __THROW; -int sigaddset(sigset_t *set, int signum) __THROW; -int sigdelset(sigset_t *set, int signum) __THROW; -int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) __THROW; -sighandler_t signal(int signum, sighandler_t action); -int raise (int sig) __THROW; -int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact) __THROW; -int sigaltstack(const struct sigaltstack *newstack, struct sigaltstack *oldstack) __THROW; - -#ifndef SIGCLD -#define SIGCLD SIGCHLD -#endif - -extern const char *const sys_siglist[]; - -typedef __sighandler_t sig_t; - -#ifndef NSIG -#define NSIG _NSIG -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/stdint.h b/mdk-stage1/dietlibc/include/stdint.h deleted file mode 100644 index d287e6794..000000000 --- a/mdk-stage1/dietlibc/include/stdint.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _STDINT_H -#define _STDINT_H - -#include - -#endif diff --git a/mdk-stage1/dietlibc/include/stdio.h b/mdk-stage1/dietlibc/include/stdio.h deleted file mode 100644 index 92d9dc0cb..000000000 --- a/mdk-stage1/dietlibc/include/stdio.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef _STDIO_H -#define _STDIO_H - -#include -#include - -typedef struct __stdio_file FILE; - -FILE *fopen (const char *path, const char *mode) __THROW; -FILE *fdopen (int fildes, const char *mode) __THROW; -FILE *freopen (const char *path, const char *mode, FILE *stream) __THROW; - -int printf(const char *format, ...) __THROW; -int fprintf(FILE *stream, const char *format, ...) __THROW; -int sprintf(char *str, const char *format, ...) __THROW; -int snprintf(char *str, size_t size, const char *format, ...) __THROW; -int asprintf(char **ptr, const char* format, ...) __THROW; - -int scanf( const char *format, ...) __THROW; -int fscanf( FILE *stream, const char *format, ...) __THROW; -int sscanf( const char *str, const char *format, ...) __THROW; - -#include - -int vprintf(const char *format, va_list ap) __THROW; -int vfprintf(FILE *stream, const char *format, va_list ap) __THROW; -int vsprintf(char *str, const char *format, va_list ap) __THROW; -int vsnprintf(char *str, size_t size, const char *format, va_list ap) __THROW; - -int vscanf( const char *format, va_list ap) __THROW; -int vsscanf( const char *str, const char *format, va_list ap) __THROW; -int vfscanf( FILE *stream, const char *format, va_list ap) __THROW; - -int fgetc(FILE *stream) __THROW; -char *fgets(char *s, int size, FILE *stream) __THROW; -int getc(FILE *stream) __THROW; -int getchar(void) __THROW; -char *gets(char *s) __THROW; -int ungetc(int c, FILE *stream) __THROW; - -int fputc(int c, FILE *stream) __THROW; -int fputs(const char *s, FILE *stream) __THROW; - -#define putc(c,stream) fputc(c,stream) -#define putchar(c) fputc(c,stdout) - -#define getchar() fgetc(stdin) -#define getc(stream) fgetc(stream) - -int puts(const char *s) __THROW; - -long fseek( FILE *stream, long offset, int whence) __THROW; -long ftell( FILE *stream) __THROW; -void rewind( FILE *stream) __THROW; -int fgetpos( FILE *stream, fpos_t *pos) __THROW; -int fsetpos( FILE *stream, fpos_t *pos) __THROW; - -size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW; - -size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream) __THROW; - -int fflush(FILE *stream) __THROW; - -int fclose(FILE *stream) __THROW; - -void clearerr(FILE *stream) __THROW; -int feof (FILE *stream) __THROW; -int ferror( FILE *stream) __THROW; -int fileno( FILE *stream) __THROW; - -int remove(const char *pathname) __THROW; - -void perror(const char *s) __THROW; - -extern FILE *stdin, *stdout, *stderr; - -#define EOF (int)(-1) - -#define BUFSIZ 128 - -#define _IONBF 0 -#define _IOLBF 1 -#define _IOFBF 2 - -int setvbuf(FILE *stream, char *buf, int mode , size_t size) __THROW; - -#define setbuf(stream,buf) setvbuf(stream,buf,buf?_IOFBF:_IONBF,BUFSIZ) -#define setbuffer(stream,buf,size) setvbuf(stream,buf,buf?_IOFBF:_IONBF,size) -#define setlinebuf(stream) setvbuf(stream,0,_IOLBF,BUFSIZ) - -FILE *popen(const char *command, const char *type) __THROW; -int pclose(FILE *stream) __THROW; - -#define getc_unlocked(stream) getc(stream) -#define putc_unlocked(c,stream) putc(c,stream) - -#endif diff --git a/mdk-stage1/dietlibc/include/stdlib.h b/mdk-stage1/dietlibc/include/stdlib.h deleted file mode 100644 index 6a13a48ff..000000000 --- a/mdk-stage1/dietlibc/include/stdlib.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef _STDLIB_H -#define _STDLIB_H - -#include -#include - -#define __LIBC_DIETLIBC__ - -void *calloc(size_t nmemb, size_t size) __THROW; -void *malloc(size_t size) __THROW; -void free(void *ptr) __THROW; -void *realloc(void *ptr, size_t size) __THROW; - -char *getenv(const char *name) __THROW __pure__; -int putenv(const char *string) __THROW; -int setenv(const char *name, const char *value, int overwrite) __THROW; -void unsetenv(const char *name) __THROW; - -int atexit(void (*function)(void)) __THROW; - -double strtod(const char *nptr, char **endptr) __THROW; -long int strtol(const char *nptr, char **endptr, int base) __THROW; -unsigned long int strtoul(const char *nptr, char **endptr, int base) __THROW; - -int __ltostr(char *s, int size, unsigned long i, int base, char UpCase) __THROW; -#ifdef __GNUC__ -long long int strtoll(const char *nptr, char **endptr, int base) __THROW; -unsigned long long int strtoull(const char *nptr, char **endptr, int base) __THROW; -int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase) __THROW; -#endif - -int atoi(const char *nptr) __THROW; -long int atol(const char *nptr) __THROW; -double atof(const char *nptr) __THROW; - -void exit(int status) __THROW __attribute__((noreturn)); -void abort(void) __THROW; - -/* warning: the rand() implementation of the diet libc really sucks. */ -#define RAND_MAX 32767 - -extern int rand(void) __THROW; -extern void srand(unsigned int seed) __THROW; - -void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) __THROW; -void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) __THROW; - -extern char **environ; - -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 - -/* now this function is the greatest bullshit I have ever seen. - * The ISO people must be out of their minds. */ -typedef struct { int quot,rem; } div_t; -div_t div(int numer, int denom) __THROW __attribute__((const)); - -void *alloca(size_t size) __THROW; /* gcc built-in */ - -char *realpath(const char *path, char *resolved_path) __THROW; - -int abs(int j) __THROW; - -long int random(void) __THROW; -void srandom(unsigned int seed) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/string.h b/mdk-stage1/dietlibc/include/string.h deleted file mode 100644 index 1ef78ae54..000000000 --- a/mdk-stage1/dietlibc/include/string.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef _STRING_H -#define _STRING_H - -#include -#include - -char *strcpy(char *dest, const char *src) __THROW; -char *strncpy(char *dest, const char *src, size_t n) __THROW; - -void *memccpy(void *dest, const void *src, int c, size_t n) __THROW; -void *memcpy(void *dest, const void *src, size_t n) __THROW; -void *memmove(void *dest, const void *src, size_t n) __THROW; - -int memccmp(const void *s1, const void *s2, int c, size_t n) __THROW __pure__; -int memcmp(const void *s1, const void *s2, size_t n) __THROW __pure__; -int strcmp(const char *s1, const char *s2) __THROW __pure__; -int strncmp(const char *s1, const char *s2, size_t n) __THROW __pure__; - -int strcasecmp(const char *s1, const char *s2) __THROW __pure__; -int strncasecmp(const char *s1, const char *s2, size_t n) __THROW __pure__; - -size_t strlen(const char *s) __THROW __pure__; - -char *strstr(const char *haystack, const char *needle) __THROW __pure__; - -char *strdup(const char *s) __THROW; - -char *strchr(const char *s, int c) __THROW __pure__; -char *strrchr(const char *s, int c) __THROW __pure__; - -char *strcat(char *dest, const char *src) __THROW; -char *strncat(char *dest, const char *src, size_t n) __THROW; - -size_t strspn(const char *s, const char *accept) __THROW; -size_t strcspn(const char *s, const char *reject) __THROW; - -char *strpbrk(const char *s, const char *accept) __THROW; -char *strsep(char **stringp, const char *delim) __THROW; - -void* memset(void *s, int c, size_t n) __THROW; - -#undef NULL -#define NULL (void*)0 - -#define bzero(s,n) memset(s,0,n) -#define bcopy(src,dest,n) memmove(dest,src,n) -#define bcmp(a,b,n) memcmp(a,b,n) - -char *strerror(int errnum) __THROW; -char *strsignal(int signum) __THROW; - -char *strtok(char *s, const char *delim) __THROW; -char *strtok_r(char *s, const char *delim, char **ptrptr) __THROW; - -int ffs(int i) __THROW __attribute__((__const__)); - -#endif diff --git a/mdk-stage1/dietlibc/include/strings.h b/mdk-stage1/dietlibc/include/strings.h deleted file mode 100644 index ec947a9b9..000000000 --- a/mdk-stage1/dietlibc/include/strings.h +++ /dev/null @@ -1,2 +0,0 @@ -#warning "your code included obsolescent . Please change that to !" -#include diff --git a/mdk-stage1/dietlibc/include/sys/cdefs.h b/mdk-stage1/dietlibc/include/sys/cdefs.h deleted file mode 100644 index 895bb74b8..000000000 --- a/mdk-stage1/dietlibc/include/sys/cdefs.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef _SYS_CDEFS_H -#define _SYS_CDEFS_H - -#define __dietlibc__ - -#ifndef __cplusplus -#define throw () -#define __THROW -#define __BEGIN_DECLS -#define __END_DECLS -#else -#define __THROW throw () -#define __BEGIN_DECLS extern "C" { -#define __END_DECLS } -#endif - -#ifndef __GNUC__ -#define __attribute__(xyz) -#endif - -#define __pure__ -#ifdef __GNUC__ -#if (__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 96)) -#undef __pure__ -#define __pure__ __attribute__ ((__pure__)) -#endif - -#if (__GNUC__ == 2) && (__GNUC_MINOR__ < 95) -#define __restrict__ -#endif - -#endif - -#define __P(x) x - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/file.h b/mdk-stage1/dietlibc/include/sys/file.h deleted file mode 100644 index 93787fd42..000000000 --- a/mdk-stage1/dietlibc/include/sys/file.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _SYS_FILE_H -#define _SYS_FILE_H - -#include - -extern int fcntl(int fd, int cmd, ...) __THROW; -extern int flock(int fd, int operation) __THROW; - -/* Operations for the `flock' call. */ -#define LOCK_SH 1 /* Shared lock. */ -#define LOCK_EX 2 /* Exclusive lock. */ -#define LOCK_UN 8 /* Unlock. */ - -/* Can be OR'd in to one of the above. */ -#define LOCK_NB 4 /* Don't block when locking. */ - - - -#endif /* _SYS_FILE_H */ diff --git a/mdk-stage1/dietlibc/include/sys/io.h b/mdk-stage1/dietlibc/include/sys/io.h deleted file mode 100644 index cce841735..000000000 --- a/mdk-stage1/dietlibc/include/sys/io.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef _IO_H -#define _IO_H - -int ioperm(unsigned long from, unsigned long num, int turn_on) __THROW; - -#ifdef __i386__ - -static __inline void -outb (unsigned char value, unsigned short int port) -{ - __asm__ __volatile__ ("outb %b0,%w1": :"a" (value), "Nd" (port)); -} - -static __inline unsigned char -inb (unsigned short int port) -{ - unsigned char _v; - - __asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" (port)); - return _v; -} - -static __inline unsigned short int -inw (unsigned short int port) -{ - unsigned short _v; - - __asm__ __volatile__ ("inw %w1,%0":"=a" (_v):"Nd" (port)); - return _v; -} - -static __inline void -outw (unsigned short int value, unsigned short int port) -{ - __asm__ __volatile__ ("outw %w0,%w1": :"a" (value), "Nd" (port)); - -} - -#endif - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/ioctl.h b/mdk-stage1/dietlibc/include/sys/ioctl.h deleted file mode 100644 index fca1aeeab..000000000 --- a/mdk-stage1/dietlibc/include/sys/ioctl.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _IOCTL_H -#define _IOCTL_H - -#include -#include -#include - -int ioctl(int d, int request, ...) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/ipc.h b/mdk-stage1/dietlibc/include/sys/ipc.h deleted file mode 100644 index 9184a2a82..000000000 --- a/mdk-stage1/dietlibc/include/sys/ipc.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _SYS_IPC_H -#define _SYS_IPC_H - -#include -#include -#include - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/kd.h b/mdk-stage1/dietlibc/include/sys/kd.h deleted file mode 100644 index 9e9a5152b..000000000 --- a/mdk-stage1/dietlibc/include/sys/kd.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _SYS_KD_H -#define _SYS_KD_H - -#include - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/mman.h b/mdk-stage1/dietlibc/include/sys/mman.h deleted file mode 100644 index dc398ba90..000000000 --- a/mdk-stage1/dietlibc/include/sys/mman.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _SYS_MMAN_H -#define _SYS_MMAN_H - -#include -#include -#include -#include - -#ifndef PAGE_SIZE -#warning PAGE_SIZE undefined -#endif - -#define MAP_FAILED ((void *) -1) - -extern void *mmap (void *__addr, size_t __len, int __prot, - int __flags, int __fd, off_t __offset); - -extern int munmap (void *__addr, size_t __len) __THROW; -extern int mprotect (void *__addr, size_t __len, int __prot) __THROW; -extern int msync (void *__addr, size_t __len, int __flags) __THROW; -extern void *mremap (void *__addr, size_t __old_len, size_t __new_len, - int __may_move) __THROW; -extern int mincore (void *__start, size_t __len, unsigned char *__vec); - -#ifdef __quad_t -extern void *mmap64 (void *__addr, size_t __len, int __prot, - int __flags, int __fd, off64_t __offset) __THROW; -#endif - -int mlockall(int flags) __THROW; -int munlockall(void) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/mount.h b/mdk-stage1/dietlibc/include/sys/mount.h deleted file mode 100644 index 2e9e86774..000000000 --- a/mdk-stage1/dietlibc/include/sys/mount.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _SYS_MOUNT_H -#define _SYS_MOUNT_H - -#include -#include -#include - -int mount(const char* specialfile, const char* dir, const char* filesystemtype, - unsigned long rwflag, const void * data) __THROW; - -int umount(const char *specialfile) __THROW; - -int umount(const char *dir) __THROW; - -int umount2(const char *specialfile, int mflag) __THROW; - -int umount2(const char *dir, int mflag) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/msg.h b/mdk-stage1/dietlibc/include/sys/msg.h deleted file mode 100644 index ea1e470b6..000000000 --- a/mdk-stage1/dietlibc/include/sys/msg.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _SYS_MSG_H -#define _SYS_MSG_H - -#include -#include -#include - -extern int msgctl (int msqid, int cmd, struct msqid_ds *buf) __THROW; -extern int msgget (key_t key, int msgflg) __THROW; -extern int msgrcv (int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg) __THROW; -extern int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/mtio.h b/mdk-stage1/dietlibc/include/sys/mtio.h deleted file mode 100644 index e70663407..000000000 --- a/mdk-stage1/dietlibc/include/sys/mtio.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _SYS_MTIO_H -#define _SYS_MTIO_H - -#include - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/param.h b/mdk-stage1/dietlibc/include/sys/param.h deleted file mode 100644 index 05f4d40e2..000000000 --- a/mdk-stage1/dietlibc/include/sys/param.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _SYS_PARAM_H -#define _SYS_PARAM_H - -#include - -#define MAXPATHLEN PATH_MAX - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/poll.h b/mdk-stage1/dietlibc/include/sys/poll.h deleted file mode 100644 index adce26687..000000000 --- a/mdk-stage1/dietlibc/include/sys/poll.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _SYS_POLL_H -#define _SYS_POLL_H - -#include - -#include - -extern int poll(struct pollfd *ufds, unsigned int nfds, int timeout) __THROW; - - -#endif /* _SYS_POLL_H */ diff --git a/mdk-stage1/dietlibc/include/sys/ptrace.h b/mdk-stage1/dietlibc/include/sys/ptrace.h deleted file mode 100644 index 9dd730bc6..000000000 --- a/mdk-stage1/dietlibc/include/sys/ptrace.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _SYS_PTRACE_H -#define _SYS_PTRACE_H - -#include - -#include - -extern long int ptrace (int request, ...) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/reboot.h b/mdk-stage1/dietlibc/include/sys/reboot.h deleted file mode 100644 index ba58d296a..000000000 --- a/mdk-stage1/dietlibc/include/sys/reboot.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _SYS_REBOOT_H -#define _SYS_REBOOT_H - -#include - -/* Reboot or halt the system. */ -int reboot (int flag, void *arg); - -#endif /* _SYS_REBOOT_H */ diff --git a/mdk-stage1/dietlibc/include/sys/resource.h b/mdk-stage1/dietlibc/include/sys/resource.h deleted file mode 100644 index 442434cd1..000000000 --- a/mdk-stage1/dietlibc/include/sys/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _SYS_RESOURCE_H -#define _SYS_RESOURCE_H - -#include -#include - -int getpriority(int which, int who) __THROW; -int setpriority(int which, int who, int prio) __THROW; - -int getrlimit (int resource, struct rlimit *rlim); -int getrusage (int who, struct rusage *usage); -int setrlimit (int resource, const struct rlimit *rlim); - -typedef unsigned long rlim_t; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/select.h b/mdk-stage1/dietlibc/include/sys/select.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/mdk-stage1/dietlibc/include/sys/sem.h b/mdk-stage1/dietlibc/include/sys/sem.h deleted file mode 100644 index cc182649c..000000000 --- a/mdk-stage1/dietlibc/include/sys/sem.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _SYS_SEM_H -#define _SYS_SEM_H - -#include -#include - -extern int semget( key_t key, int nsems, int semflg) __THROW; -extern int semctl(int semid, int semnum, int cmd, union semun arg) __THROW; -extern int semop(int semid, struct sembuf *sops, unsigned nsops) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/sendfile.h b/mdk-stage1/dietlibc/include/sys/sendfile.h deleted file mode 100644 index 2e0c04add..000000000 --- a/mdk-stage1/dietlibc/include/sys/sendfile.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _SYS_SENDFILE_H -#define _SYS_SENDFILE_H - -#include - -extern ssize_t sendfile (int __out_fd, int __in_fd, off_t *offset, - size_t __count) __THROW; - -#endif /* sys/sendfile.h */ diff --git a/mdk-stage1/dietlibc/include/sys/shm.h b/mdk-stage1/dietlibc/include/sys/shm.h deleted file mode 100644 index c27f5ddcf..000000000 --- a/mdk-stage1/dietlibc/include/sys/shm.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _SYS_SHM_H -#define _SYS_SHM_H - -#include -#include -#include - -#ifndef PAGE_SIZE -#define PAGE_SIZE getpagesize() -#endif - -extern int shmget(key_t key, int size, int shmflg) __THROW; -extern void *shmat(int shmid, const void *shmaddr, int shmflg) __THROW; -extern int shmdt (const void *shmaddr) __THROW; -extern int shmctl(int shmid, int cmd, struct shmid_ds *buf) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/signal.h b/mdk-stage1/dietlibc/include/sys/signal.h deleted file mode 100644 index 2e602dad8..000000000 --- a/mdk-stage1/dietlibc/include/sys/signal.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/mdk-stage1/dietlibc/include/sys/socket.h b/mdk-stage1/dietlibc/include/sys/socket.h deleted file mode 100644 index a1435501c..000000000 --- a/mdk-stage1/dietlibc/include/sys/socket.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef _SYS_SOCKET_H -#define _SYS_SOCKET_H - -#include -#include -#include - -#ifndef SOCK_DGRAM -/* the Linux kernel headers suck really badly on non-x86 */ -#define SOCK_STREAM 1 /* stream (connection) socket */ -#define SOCK_DGRAM 2 /* datagram (conn.less) socket */ -#define SOCK_RAW 3 /* raw socket */ -#define SOCK_RDM 4 /* reliably-delivered message */ -#define SOCK_SEQPACKET 5 /* sequential packet socket */ -#define SOCK_PACKET 10 /* linux specific way of */ -#endif - -struct sockaddr_storage { - char __tmp[sizeof(struct sockaddr)]; -}; - -int socket(int domain, int type, int protocol) __THROW; -int accept(int s, struct sockaddr *addr, socklen_t *addrlen) __THROW; -int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) __THROW; -int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen) __THROW; -int recv(int s, void *buf, size_t len, int flags) __THROW; -int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) __THROW; -int recvmsg(int s, struct msghdr *msg, int flags) __THROW; -int send(int s, const void *msg, size_t len, int flags) __THROW; -int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) __THROW; -int sendmsg(int s, const struct msghdr *msg, int flags) __THROW; - -int getpeername(int s, struct sockaddr *name, socklen_t *namelen) __THROW; -int getsockname(int s , struct sockaddr * name , socklen_t * namelen) __THROW; - -int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) __THROW; -int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) __THROW; - -int listen(int s, int backlog) __THROW; - -#define SHUT_RD 0 -#define SHUT_WR 1 -#define SHUT_RDWR 2 -int shutdown(int s, int how) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/stat.h b/mdk-stage1/dietlibc/include/sys/stat.h deleted file mode 100644 index 10fddfa42..000000000 --- a/mdk-stage1/dietlibc/include/sys/stat.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _SYS_STAT_H -#define _SYS_STAT_H - -#include -#include - -#include -#include - -#ifndef STAT64_HAS_BROKEN_ST_INO -#define __NO_STAT64 -#endif - -extern int stat(const char *__file, struct stat *__buf) __THROW; -extern int fstat(int __fd, struct stat *__buf) __THROW; -extern int lstat(const char *__file, struct stat *__buf) __THROW; - -#ifdef __NO_STAT64 -#undef _FILE_OFFSET_BITS -#else -extern int stat64(const char *__file, struct stat64 *__buf) __THROW; -extern int fstat64(int __fd, struct stat64 *__buf) __THROW; -extern int lstat64(const char *__file, struct stat64 *__buf) __THROW; -#endif - -#if _FILE_OFFSET_BITS == 64 -#define lstat(file,buf) lstat64(file,buf) -#define fstat(file,buf) fstat64(file,buf) -#define stat stat64 -#endif - -#define major(dev) (((dev)>>8) & 0xff) -#define minor(dev) ((dev) & 0xff) -#define makedev(major, minor) ((((unsigned int) (major)) << 8) | ((unsigned int) (minor))) - -extern int chmod (const char *__file, mode_t __mode) __THROW; - -extern int fchmod (int __fd, mode_t __mode) __THROW; - -extern mode_t umask (mode_t __mask) __THROW; - -extern int mkdir (const char *__path, mode_t __mode) __THROW; - -extern int mknod (const char *__path, mode_t __mode, dev_t __dev) __THROW; - -extern int mkfifo (const char *__path, mode_t __mode) __THROW; - -#define S_IREAD S_IRUSR -#define S_IWRITE S_IWUSR -#define S_IEXEC S_IXUSR - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/syscall.h b/mdk-stage1/dietlibc/include/sys/syscall.h deleted file mode 100644 index 5d6b5a4ad..000000000 --- a/mdk-stage1/dietlibc/include/sys/syscall.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _SYSCALL_H -#define _SYSCALL_H - -#include - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/sysinfo.h b/mdk-stage1/dietlibc/include/sys/sysinfo.h deleted file mode 100644 index 5f059d469..000000000 --- a/mdk-stage1/dietlibc/include/sys/sysinfo.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _SYS_SYSINFO_H -#define _SYS_SYSINFO_H - -#include -#include - -int sysinfo(struct sysinfo *info) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/syslog.h b/mdk-stage1/dietlibc/include/sys/syslog.h deleted file mode 100644 index 91bf0d1fa..000000000 --- a/mdk-stage1/dietlibc/include/sys/syslog.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef _SYS_SYSLOG_H -#define _SYS_SYSLOG_H 1 - -#include -#include - -#define _PATH_LOG "/dev/log" - -/* - * priorities/facilities are encoded into a single 32-bit quantity, where the - * bottom 3 bits are the priority (0-7) and the top 28 bits are the facility - * (0-big number). Both the priorities and the facilities map roughly - * one-to-one to strings in the syslogd(8) source code. This mapping is - * included in this file. - * - * priorities (these are ordered) - */ -#define LOG_EMERG 0 /* system is unusable */ -#define LOG_ALERT 1 /* action must be taken immediately */ -#define LOG_CRIT 2 /* critical conditions */ -#define LOG_ERR 3 /* error conditions */ -#define LOG_WARNING 4 /* warning conditions */ -#define LOG_NOTICE 5 /* normal but significant condition */ -#define LOG_INFO 6 /* informational */ -#define LOG_DEBUG 7 /* debug-level messages */ - -#define LOG_PRIMASK 0x07 /* mask to extract priority part (internal) */ - /* extract priority */ -#define LOG_PRI(p) ((p) & LOG_PRIMASK) -#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) - -/* facility codes */ -#define LOG_KERN (0<<3) /* kernel messages */ -#define LOG_USER (1<<3) /* random user-level messages */ -#define LOG_MAIL (2<<3) /* mail system */ -#define LOG_DAEMON (3<<3) /* system daemons */ -#define LOG_AUTH (4<<3) /* security/authorization messages */ -#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ -#define LOG_LPR (6<<3) /* line printer subsystem */ -#define LOG_NEWS (7<<3) /* network news subsystem */ -#define LOG_UUCP (8<<3) /* UUCP subsystem */ -#define LOG_CRON (9<<3) /* clock daemon */ -#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ -#define LOG_FTP (11<<3) /* ftp daemon */ - - /* other codes through 15 reserved for system use */ -#define LOG_LOCAL0 (16<<3) /* reserved for local use */ -#define LOG_LOCAL1 (17<<3) /* reserved for local use */ -#define LOG_LOCAL2 (18<<3) /* reserved for local use */ -#define LOG_LOCAL3 (19<<3) /* reserved for local use */ -#define LOG_LOCAL4 (20<<3) /* reserved for local use */ -#define LOG_LOCAL5 (21<<3) /* reserved for local use */ -#define LOG_LOCAL6 (22<<3) /* reserved for local use */ -#define LOG_LOCAL7 (23<<3) /* reserved for local use */ - -#define LOG_NFACILITIES 24 /* current number of facilities */ -#define LOG_FACMASK 0x03f8 /* mask to extract facility part */ - /* facility of pri */ -#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) - -/* - * arguments to setlogmask. - */ -#define LOG_MASK(pri) (1 << (pri)) /* mask for one priority */ -#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) /* all priorities through pri */ - -/* - * Option flags for openlog. - * - * LOG_ODELAY no longer does anything. - * LOG_NDELAY is the inverse of what it used to be. - */ -#define LOG_PID 0x01 /* log the pid with each message */ -#define LOG_CONS 0x02 /* log on the console if errors in sending */ -#define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */ -#define LOG_NDELAY 0x08 /* don't delay open */ -#define LOG_NOWAIT 0x10 /* don't wait for console forks: DEPRECATED */ -#define LOG_PERROR 0x20 /* log to stderr as well */ - -/* Open connection to system logger. */ -/* against the glibc-routine ident has not to be const ! */ -/* instead ident is limited to 80 characters ! */ -void openlog (const char *ident, int option, int facility); - -void closelog (void) __THROW; - -int setlogmask (int mask) __THROW; - -void syslog (int priority, const char *format, ...) __THROW; - -void vsyslog (int priority, const char *format, va_list arg_ptr) __THROW; - -/* yuck yuck yuck, only needed for syslogd. */ -typedef struct _code { - char *c_name; - int c_val; -} CODE; - -extern CODE prioritynames[]; -extern CODE facilitynames[]; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/time.h b/mdk-stage1/dietlibc/include/sys/time.h deleted file mode 100644 index 11144f57b..000000000 --- a/mdk-stage1/dietlibc/include/sys/time.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef _SYS_TIME_H -#define _SYS_TIME_H 1 - -#include - -#include -#include - -#if defined __USE_GNU || defined __USE_BSD -typedef struct timezone *__timezone_ptr_t; -#else -typedef void *__timezone_ptr_t; -#endif - -int getitimer(int which, struct itimerval *value) __THROW; -int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue) __THROW; - -int gettimeofday(struct timeval *tv, struct timezone *tz) __THROW; -int settimeofday(const struct timeval *tv , const struct timezone *tz) __THROW; - -extern int adjtime (const struct timeval *__delta, - struct timeval *__olddelta) __THROW; - -struct tm -{ - int tm_sec; /* Seconds. [0-60] (1 leap second) */ - int tm_min; /* Minutes. [0-59] */ - int tm_hour; /* Hours. [0-23] */ - int tm_mday; /* Day. [1-31] */ - int tm_mon; /* Month. [0-11] */ - int tm_year; /* Year - 1900. */ - int tm_wday; /* Day of week. [0-6] */ - int tm_yday; /* Days in year.[0-365] */ - int tm_isdst; /* DST. [-1/0/1]*/ - - long int tm_gmtoff; /* Seconds east of UTC. */ - const char *tm_zone; /* Timezone abbreviation. */ -}; - -struct tm* gmtime(const time_t *t) __THROW; -struct tm* gmtime_r(const time_t *t, struct tm *r) __THROW; - -struct tm* localtime(const time_t *t) __THROW; -struct tm* localtime_r(const time_t *t, struct tm *r) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/times.h b/mdk-stage1/dietlibc/include/sys/times.h deleted file mode 100644 index 72ec62fec..000000000 --- a/mdk-stage1/dietlibc/include/sys/times.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _SYS_TIMES_H -#define _SYS_TIMES_H - -#include - -clock_t times(struct tms *buf); - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/types.h b/mdk-stage1/dietlibc/include/sys/types.h deleted file mode 100644 index 34dbaa9f1..000000000 --- a/mdk-stage1/dietlibc/include/sys/types.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef _SYS_TYPES_H -#define _SYS_TYPES_H - -#include -#include -#include - -#ifdef __GNUC__ -#define __quad_t __quad_t -typedef long long int __quad_t; -typedef unsigned long long int __u_quad_t; -#else -#warning no long long support - no 64 bit file I/O support -typedef long int __quad_t; -typedef unsigned long int __u_quad_t; -#endif - - -#ifdef __quad_t -typedef __quad_t off64_t; -typedef __u_quad_t ino64_t; -typedef __quad_t blkcnt64_t; -#endif - -typedef long int fpos_t; - -#define socklen_t socklen_t -typedef unsigned int socklen_t; - -typedef long int blksize_t; -typedef long int blkcnt_t; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/uio.h b/mdk-stage1/dietlibc/include/sys/uio.h deleted file mode 100644 index d64fd33c9..000000000 --- a/mdk-stage1/dietlibc/include/sys/uio.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _SYS_UIO -#define _SYS_UIO 1 - -#include - -int readv(int filedes, const struct iovec *vector, size_t count); -int writev(int filedes, const struct iovec *vector, size_t count); - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/un.h b/mdk-stage1/dietlibc/include/sys/un.h deleted file mode 100644 index 213d9290e..000000000 --- a/mdk-stage1/dietlibc/include/sys/un.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef _SYS_UN_H -#define _SYS_UN_H - -#include - -#include - -#endif /* sys/un.h */ diff --git a/mdk-stage1/dietlibc/include/sys/utsname.h b/mdk-stage1/dietlibc/include/sys/utsname.h deleted file mode 100644 index 37bf6c811..000000000 --- a/mdk-stage1/dietlibc/include/sys/utsname.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _SYS_UTSNAME_H -#define _SYS_UTSNAME_H 1 - -#include - -/* Length of the entries in `struct utsname' is 65. */ -#define _UTSNAME_LENGTH 65 -#define _UTSNAME_NODENAME_LENGTH _UTSNAME_LENGTH - -/* Linux provides as additional information in the `struct utsname' - the name of the current domain. Define _UTSNAME_DOMAIN_LENGTH - to a value != 0 to activate this entry. */ -#define _UTSNAME_DOMAIN_LENGTH _UTSNAME_LENGTH - -struct utsname { - /* Name of the implementation of the operating system. */ - char sysname[_UTSNAME_LENGTH]; - - /* Name of this node on the network. */ - char nodename[_UTSNAME_NODENAME_LENGTH]; - - /* Current release level of this implementation. */ - char release[_UTSNAME_LENGTH]; - /* Current version level of this release. */ - char version[_UTSNAME_LENGTH]; - - /* Name of the hardware type the system is running on. */ - char machine[_UTSNAME_LENGTH]; - - /* Name of the domain of this node on the network. */ - char domainname[_UTSNAME_DOMAIN_LENGTH]; -}; - -extern int uname (struct utsname *__name) __THROW; -#endif diff --git a/mdk-stage1/dietlibc/include/sys/vfs.h b/mdk-stage1/dietlibc/include/sys/vfs.h deleted file mode 100644 index e4740a225..000000000 --- a/mdk-stage1/dietlibc/include/sys/vfs.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _SYS_VFS_H -#define _SYS_VFS_H - -#include -#include -#include - -int statfs(const char *path, struct statfs *buf) __THROW; -int fstatfs(int fd, struct statfs *buf) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/sys/wait.h b/mdk-stage1/dietlibc/include/sys/wait.h deleted file mode 100644 index eb70112e2..000000000 --- a/mdk-stage1/dietlibc/include/sys/wait.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef _SYS_WAIT_H -#define _SYS_WAIT_H - -#include -#include -#include - -/* If WIFEXITED(STATUS), the low-order 8 bits of the status. */ -#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8) -#define WEXITSTATUS __WEXITSTATUS - -/* If WIFSIGNALED(STATUS), the terminating signal. */ -#define __WTERMSIG(status) ((status) & 0x7f) -#define WTERMSIG __WTERMSIG - -/* If WIFSTOPPED(STATUS), the signal that stopped the child. */ -#define __WSTOPSIG(status) __WEXITSTATUS(status) -#define WSTOPSIG __WSTOPSIG - -/* Nonzero if STATUS indicates normal termination. */ -#define WIFEXITED(status) (__WTERMSIG(status) == 0) - -/* Nonzero if STATUS indicates termination by a signal. */ -#define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status)) - -/* Nonzero if STATUS indicates the child is stopped. */ -#define WIFSTOPPED(status) (((status) & 0xff) == 0x7f) - - -pid_t wait(int *status) __THROW; -pid_t waitpid(pid_t pid, int *status, int options) __THROW; - -pid_t wait3(int *status, int options, struct rusage *rusage) __THROW; - -pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/syslog.h b/mdk-stage1/dietlibc/include/syslog.h deleted file mode 100644 index 830b4928a..000000000 --- a/mdk-stage1/dietlibc/include/syslog.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/mdk-stage1/dietlibc/include/termios.h b/mdk-stage1/dietlibc/include/termios.h deleted file mode 100644 index f10909c1b..000000000 --- a/mdk-stage1/dietlibc/include/termios.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef _TERMIOS_H -#define _TERMIOS_H - -#include -#include - -/* man, the Linux kernel headers suck */ -#define __USE_BSD -#include -#undef __USE_BSD - -pid_t tcgetpgrp(int fd) __THROW; -int tcsetpgrp(int fd, pid_t pgrpid) __THROW; -int tcgetattr(int fd, struct termios *termios_p) __THROW; -int tcsetattr(int fd, int optional_actions, struct termios *termios_p) __THROW; -speed_t cfgetospeed(struct termios *termios_p) __THROW; -int cfsetospeed(struct termios *termios_p, speed_t speed) __THROW; -speed_t cfgetispeed(struct termios *termios_p) __THROW; -int cfsetispeed(struct termios *termios_p, speed_t speed) __THROW; -int tcflush(int fd, int queue_selector) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/time.h b/mdk-stage1/dietlibc/include/time.h deleted file mode 100644 index 827c85b97..000000000 --- a/mdk-stage1/dietlibc/include/time.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _TIME_H -#define _TIME_H - -#include -#include - -extern int __isleap(int year); - -int nanosleep(const struct timespec *req, struct timespec *rem) __THROW; -unsigned int sleep(unsigned int secs) __THROW; - -time_t mktime(struct tm *timeptr) __THROW __pure__; - -char *asctime(const struct tm *timeptr) __THROW; -char *asctime_r(const struct tm *timeptr, char *buf) __THROW; - -char *ctime(const time_t *timep) __THROW; - -size_t strftime(char *s, size_t max, const char *format, const struct tm *tm) __THROW; -time_t time(time_t *t) __THROW; - -int stime(time_t *t) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/unistd.h b/mdk-stage1/dietlibc/include/unistd.h deleted file mode 100644 index 1a528c0e4..000000000 --- a/mdk-stage1/dietlibc/include/unistd.h +++ /dev/null @@ -1,168 +0,0 @@ -#ifndef _UNISTD_H -#define _UNISTD_H - -#include -#include -#include -#include -#include -#include -#include - -/* Values for the second argument to access. - These may be OR'd together. */ -#define R_OK 4 /* Test for read permission. */ -#define W_OK 2 /* Test for write permission. */ -#define X_OK 1 /* Test for execute permission. */ -#define F_OK 0 /* Test for existence. */ - -/* Test for access to NAME using the real UID and real GID. */ -extern int access (__const char *__name, int __type) __THROW; - -#define SEEK_SET 0 -#define SEEK_CUR 1 -#define SEEK_END 2 - -#define STDIN_FILENO 0 -#define STDOUT_FILENO 1 -#define STDERR_FILENO 2 - -off_t lseek(int fildes, off_t offset, int whence) __THROW; -int llseek(int fildes, unsigned long hi, unsigned long lo, loff_t* result,int whence) __THROW; -#ifndef __NO_STAT64 -loff_t lseek64(int fildes, loff_t offset, int whence) __THROW; -#endif -#if _FILE_OFFSET_BITS == 64 -#define lseek(fildes,offset,whence) lseek64(fildes,offset,whence) -#endif - -int chdir(const char *path) __THROW; -int fchdir(int fd) __THROW; -int mkdir(const char *pathname, mode_t mode) __THROW; -int rmdir(const char *pathname) __THROW; -char *getcwd(char *buf, size_t size) __THROW; - -int open(const char* pathname,int flags, ...) __THROW; -int open64(const char* pathname,int flags, ...) __THROW; -int creat(const char* pathname,mode_t mode) __THROW; -int creat64(const char* pathname,mode_t mode) __THROW; -int write(int fd,const void* buf,size_t len) __THROW; -int read(int fd,void* buf,size_t len) __THROW; -int close(int fd) __THROW; - -int unlink(const char *pathname) __THROW; - -int pread(int fd, void *buf, size_t count, off_t offset); -int pwrite(int fd, const void *buf, size_t count, off_t offset); - -int execve(const char *filename, char *const argv [], char *const envp[]) __THROW; -int execlp(const char *file, const char *arg, ...) __THROW; -int execv(const char *path, char *const argv[]) __THROW; -int execvp(const char *file, char *const argv[]) __THROW; -int execl(const char *path, ...) __THROW; - -pid_t getpid(void) __attribute__((__const__)) __THROW; -pid_t getppid(void) __THROW; -int kill(pid_t pid, int sig) __THROW; - -int setpgid (pid_t pid,pid_t pgid) __THROW; -pid_t getpgid (pid_t pid) __THROW; -int setpgrp (void) __THROW; -pid_t getpgrp (void) __THROW; -pid_t setsid (void) __THROW; -int dup (int oldfd) __THROW; -int dup2 (int oldfd,int newfd) __THROW; - -int mknod(const char *pathname, mode_t mode, dev_t dev) __THROW; - -int getdents(unsigned int fd, struct dirent *dirp, unsigned int count) __THROW; -int getdents64(unsigned int fd, struct dirent64 *dirp, unsigned int count) __THROW; - -pid_t fork(void) __THROW; -pid_t vfork(void) __THROW; - -int readlink(const char *path, char *buf, size_t bufsiz) __THROW; -int symlink(const char *oldpath, const char *newpath) __THROW; -int link(const char *oldpath, const char *newpath) __THROW; - -int chown(const char *path, uid_t owner, gid_t group) __THROW; -int fchown(int fd, uid_t owner, gid_t group) __THROW; -int lchown(const char *path, uid_t owner, gid_t group) __THROW; - -int fsync(int fd) __THROW; - -int pipe(int filedes[2]) __THROW; - -char *ttyname (int desc) __THROW; - -int brk(void *end_data_segment) __THROW; -void *sbrk(ptrdiff_t increment) __THROW; - -int gethostname(char *name, size_t len) __THROW; -int sethostname(const char *name, size_t len) __THROW; - -void usleep(unsigned long usec) __THROW; -unsigned int sleep(unsigned int seconds) __THROW; - -unsigned int alarm(unsigned int seconds) __THROW; -int sync(void) __THROW; - -int isatty(int desc) __THROW; - -void _exit(int status) __THROW __attribute__((noreturn)); - -extern int daemon (int nochdir,int noclose) __THROW; - -#if _FILE_OFFSET_BITS == 64 -#define open open64 -#define creat creat64 -#endif - -extern char* getlogin(void) __THROW; -/* warning: the diet libc getlogin() simply returns getenv("LOGNAME") */ - -int chroot(const char *path) __THROW; - -uid_t getuid(void) __THROW; -uid_t geteuid(void) __THROW; -gid_t getgid(void) __THROW; -gid_t getegid(void) __THROW; -int setuid(uid_t uid) __THROW; -/* int seteuid(uid_t uid) __THROW; */ -int setgid(gid_t gid) __THROW; -/* int setegid(gid_t gid) __THROW; */ -int setregid(gid_t rgid, gid_t egid) __THROW; -int setreuid(uid_t ruid, uid_t euid) __THROW; -#define seteuid(euid) setreuid(-1,euid) -#define setegid(egid) setregid(-1,egid) - -int rename(const char *oldpath, const char *newpath) __THROW; -int ftruncate(int fd, off_t length) __THROW; - -int mkstemp(char *Template) __THROW; - -int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) __THROW; - -int nice(int inc) __THROW; - -extern char *__environ[]; - -char *crypt(const char *key, const char *salt) __THROW; -void encrypt(char block[64], int edflag) __THROW; -void setkey(const char *key) __THROW; - -size_t getpagesize(void) __attribute__((__const__)) __THROW; - -int getdomainname(char *name, size_t len) __THROW; -int setdomainname(const char *name, size_t len) __THROW; - -int getgroups(int size, gid_t list[]) __THROW; - -/* warning: linux specific: */ -int _sysctl(struct __sysctl_args *args) __THROW; -int sendfile(int out_fd, int in_fd, off_t *offset, size_t count) __THROW; - -int getdtablesize(void) __THROW; -char *getpass(const char * prompt) __THROW; - -#endif diff --git a/mdk-stage1/dietlibc/include/utime.h b/mdk-stage1/dietlibc/include/utime.h deleted file mode 100644 index 41674f379..000000000 --- a/mdk-stage1/dietlibc/include/utime.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _UTIME_H -#define _UTIME_H - -#include -#include -#include - -struct utimbuf { - time_t actime; /* access time */ - time_t modtime; /* modification time */ -}; - -int utime(const char *filename, struct utimbuf *buf) __THROW; - - -#endif diff --git a/mdk-stage1/dietlibc/include/utmp.h b/mdk-stage1/dietlibc/include/utmp.h deleted file mode 100644 index 2946be921..000000000 --- a/mdk-stage1/dietlibc/include/utmp.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef _UTMP_H -#define _UTMP_H - -#include -#include -#include - -#define UT_LINESIZE 32 -#define UT_NAMESIZE 32 -#define UT_HOSTSIZE 256 - -#define _PATH_UTMP "/var/run/utmp" -#define _PATH_WTMP "/var/log/wtmp" - -/* The structure describing an entry in the database of - previous logins. */ -struct lastlog - { - time_t ll_time; - char ll_line[UT_LINESIZE]; - char ll_host[UT_HOSTSIZE]; - }; - -/* The structure describing the status of a terminated process. This - type is used in `struct utmp' below. */ -struct exit_status - { - short int e_termination; /* Process termination status. */ - short int e_exit; /* Process exit status. */ - }; - -/* The structure describing an entry in the user accounting database. */ -struct utmp -{ - short int ut_type; /* Type of login. */ - pid_t ut_pid; /* Process ID of login process. */ - char ut_line[UT_LINESIZE]; /* Devicename. */ - char ut_id[4]; /* Inittab ID. */ - char ut_user[UT_NAMESIZE]; /* Username. */ - char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */ -#define ut_name ut_host - struct exit_status ut_exit; /* Exit status of a process marked - as DEAD_PROCESS. */ - long int ut_session; /* Session ID, used for windowing. */ - struct timeval ut_tv; /* Time entry was made. */ - int32_t ut_addr_v6[4]; /* Internet address of remote host. */ - char __unused[20]; /* Reserved for future use. */ -}; - -/* Values for the `ut_type' field of a `struct utmp'. */ -#define EMPTY 0 /* No valid user accounting information. */ - -#define RUN_LVL 1 /* The system's runlevel. */ -#define BOOT_TIME 2 /* Time of system boot. */ -#define NEW_TIME 3 /* Time after system clock changed. */ -#define OLD_TIME 4 /* Time when system clock changed. */ - -#define INIT_PROCESS 5 /* Process spawned by the init process. */ -#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */ -#define USER_PROCESS 7 /* Normal process. */ -#define DEAD_PROCESS 8 /* Terminated process. */ - -#define ACCOUNTING 9 - -/* Tell the user that we have a modern system with UT_HOST, UT_PID, - UT_TYPE, UT_ID and UT_TV fields. */ -#define _HAVE_UT_TYPE 1 -#define _HAVE_UT_PID 1 -#define _HAVE_UT_ID 1 -#define _HAVE_UT_TV 1 -#define _HAVE_UT_HOST 1 - -#endif diff --git a/mdk-stage1/dietlibc/lib/__dtostr.c b/mdk-stage1/dietlibc/lib/__dtostr.c deleted file mode 100644 index e9a8a83d3..000000000 --- a/mdk-stage1/dietlibc/lib/__dtostr.c +++ /dev/null @@ -1,104 +0,0 @@ -#include -/* convert double to string. Helper for sprintf. */ - -int __dtostr(double d,char *buf,int maxlen,int prec) { - unsigned long long *x=(unsigned long long *)&d; - /* step 1: extract sign, mantissa and exponent */ - signed int s=*x>>63; - signed long e=((*x>>52)&((1<<11)-1))-1023; -/* unsigned long long m=*x & ((1ull<<52)-1); */ - /* step 2: exponent is base 2, compute exponent for base 10 */ - signed long e10=1+(long)(e*0.30102999566398119802); /* log10(2) */ - /* step 3: calculate 10^e10 */ - int i; - double tmp=10.0; - char *oldbuf=buf; - int initial=1; - - if (d==0.0) { - *buf='0'; ++buf; - goto done; - } - if (s) { d=-d; *buf='-'; --maxlen; buf++; } -/* printf("e=%d e10=%d prec=%d\n",e,e10,prec); */ - if (e10>=0) { - i=e10; - while (i>10) { tmp=tmp*1e10; i-=10; } - while (i>1) { tmp=tmp*10; --i; } - } else { - i=(e10=-e10); - while (i>10) { tmp=tmp*1e-10; i-=10; } - while (i>1) { tmp=tmp/10; --i; } - } - while (d/tmp<1) { - --e10; - tmp/=10.0; - } - /* step 4: see if precision is sufficient to display all digits */ - if (e10>prec) { - /* use scientific notation */ - int len=__dtostr(d/tmp,buf,maxlen,prec); - if (len==0) return 0; - maxlen-=len; buf+=len; - if (--maxlen>=0) { - *buf='e'; - ++buf; - } - for (len=1000; len>0; len/=10) { - if (e10>=len || !initial) { - if (--maxlen>=0) { - *buf=(e10/len)+'0'; - ++buf; - } - initial=0; - e10=e10%len; - } - } - if (maxlen>=0) return buf-oldbuf; - return 0; - } - /* step 5: loop through the digits, inserting the decimal point when - * appropriate */ - if (d<1.0) { - double x=1.0; - int first=1; - do { - if (--maxlen<0) return buf-oldbuf; - *buf='0'; ++buf; - if (first) { - first=0; - *buf='.'; ++buf; - if (--maxlen<0) return buf-oldbuf; - } - x/=10.0; - } while (x>d); - } - for (; prec>0; ) { - double tmp2=d/tmp; - char c; - d-=((int)tmp2*tmp); - c=((int)tmp2); - if ((!initial)||c) { - if (--maxlen>=0) { - initial=0; - *buf=c+'0'; - ++buf; - } else - return 0; - --prec; - } - if (tmp>0.5 && tmp<1.5) { - tmp=1e-1; - initial=0; - if (--maxlen>=0) { - *buf='.'; - ++buf; - } else - return 0; - } else - tmp/=10.0; - } -done: - *buf=0; - return buf-oldbuf; -} diff --git a/mdk-stage1/dietlibc/lib/__fstat64.c b/mdk-stage1/dietlibc/lib/__fstat64.c deleted file mode 100644 index 6f9fcb2c5..000000000 --- a/mdk-stage1/dietlibc/lib/__fstat64.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "dietfeatures.h" - -#ifdef WANT_LARGEFILE_BACKCOMPAT -#include -#ifndef __NO_STAT64 -#include - -extern int __dietlibc_fstat64(int __fd, struct stat64 *__buf); -extern void __stat64_cvt(const struct stat *src,struct stat64 *dest); - -int fstat64(int __fd, struct stat64 *__buf) { - if (__dietlibc_fstat64(__fd,__buf)) { - struct stat temp; -#ifdef WANT_THREAD_SAFE - if (*__errno_location()!=ENOSYS) return -1; -#else - if (errno!=ENOSYS) return -1; -#endif - if (fstat(__fd,&temp)) return -1; - __stat64_cvt(&temp,__buf); - } - return 0; -} -#endif -#endif diff --git a/mdk-stage1/dietlibc/lib/__getcwd.c b/mdk-stage1/dietlibc/lib/__getcwd.c deleted file mode 100644 index e97fc4520..000000000 --- a/mdk-stage1/dietlibc/lib/__getcwd.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -extern int __syscall_getcwd(char* buf, size_t size); - -char *getcwd(char *buf, size_t size) { - int tmp; - if ((tmp=__syscall_getcwd(buf,size))<0) return 0; - buf[tmp]=0; - return buf; -} diff --git a/mdk-stage1/dietlibc/lib/__isnan.c b/mdk-stage1/dietlibc/lib/__isnan.c deleted file mode 100644 index 9d21e9824..000000000 --- a/mdk-stage1/dietlibc/lib/__isnan.c +++ /dev/null @@ -1,14 +0,0 @@ -#include - -int __isnan(double d) { - unsigned long long *x=(unsigned long long *)&d; - return (*x==0x7FF8002000000000ll || *x==0x7FF0002000000000); -} - -#if 0 -TestFromIeeeExtended("7FFF0000000000000000"); /* +infinity */ -TestFromIeeeExtended("FFFF0000000000000000"); /* -infinity */ -TestFromIeeeExtended("7FFF8001000000000000"); /* Quiet NaN(1) */ -TestFromIeeeExtended("7FFF0001000000000000"); /* Signalling NaN(1) */ -TestFromIeeeExtended("3FFFFEDCBA9876543210"); /* accuracy test */ -#endif diff --git a/mdk-stage1/dietlibc/lib/__lltostr.c b/mdk-stage1/dietlibc/lib/__lltostr.c deleted file mode 100644 index eb4a27cef..000000000 --- a/mdk-stage1/dietlibc/lib/__lltostr.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -int __lltostr(char *s, int size, unsigned long long i, int base, char UpCase) -{ - char *tmp; - int j=0; - - s[--size]=0; - - tmp=s+size; - - if ((base==0)||(base>36)) base=10; - - j=0; - if (!i) - { - *(--tmp)='0'; - j=1; - } - - while((tmp>s)&&(i)) - { - tmp--; - if ((*tmp=i%base+'0')>'9') *tmp+=(UpCase?'A':'a')-'9'-1; - i=i/base; - j++; - } - memmove(s,tmp,j+1); - - return j; -} diff --git a/mdk-stage1/dietlibc/lib/__lstat64.c b/mdk-stage1/dietlibc/lib/__lstat64.c deleted file mode 100644 index a871f3917..000000000 --- a/mdk-stage1/dietlibc/lib/__lstat64.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "dietfeatures.h" - -#ifdef WANT_LARGEFILE_BACKCOMPAT -#include -#ifndef __NO_STAT64 -#include - -extern int __dietlibc_lstat64(const char *__file, struct stat64 *__buf); -extern void __stat64_cvt(const struct stat *src,struct stat64 *dest); - -int lstat64(const char *__file, struct stat64 *__buf) { - if (__dietlibc_lstat64(__file,__buf)) { - struct stat temp; -#ifdef WANT_THREAD_SAFE - if (*__errno_location()!=ENOSYS) return -1; -#else - if (errno!=ENOSYS) return -1; -#endif - if (lstat(__file,&temp)) return -1; - __stat64_cvt(&temp,__buf); - } - return 0; -} -#endif -#endif diff --git a/mdk-stage1/dietlibc/lib/__ltostr.c b/mdk-stage1/dietlibc/lib/__ltostr.c deleted file mode 100644 index 57e0690d2..000000000 --- a/mdk-stage1/dietlibc/lib/__ltostr.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -int __ltostr(char *s, int size, unsigned long i, int base, char UpCase) -{ - char *tmp; - int j=0; - - s[--size]=0; - - tmp=s+size; - - if ((base==0)||(base>36)) base=10; - - j=0; - if (!i) - { - *(--tmp)='0'; - j=1; - } - - while((tmp>s)&&(i)) - { - tmp--; - if ((*tmp=i%base+'0')>'9') *tmp+=(UpCase?'A':'a')-'9'-1; - i=i/base; - j++; - } - memmove(s,tmp,j+1); - - return j; -} diff --git a/mdk-stage1/dietlibc/lib/__stat64.c b/mdk-stage1/dietlibc/lib/__stat64.c deleted file mode 100644 index dfb0d4315..000000000 --- a/mdk-stage1/dietlibc/lib/__stat64.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "dietfeatures.h" - -#ifdef WANT_LARGEFILE_BACKCOMPAT -#include -#ifndef __NO_STAT64 -#include - -extern int __dietlibc_stat64(const char *__file, struct stat64 *__buf); -extern void __stat64_cvt(const struct stat *src,struct stat64 *dest); - -int stat64(const char *__file, struct stat64 *__buf) { - if (__dietlibc_stat64(__file,__buf)) { - struct stat temp; -#ifdef WANT_THREAD_SAFE - if (*__errno_location()!=ENOSYS) return -1; -#else - if (errno!=ENOSYS) return -1; -#endif - if (stat(__file,&temp)) return -1; - __stat64_cvt(&temp,__buf); - } - return 0; -} -#endif -#endif diff --git a/mdk-stage1/dietlibc/lib/__stat64_cvt.c b/mdk-stage1/dietlibc/lib/__stat64_cvt.c deleted file mode 100644 index dced352a4..000000000 --- a/mdk-stage1/dietlibc/lib/__stat64_cvt.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#ifndef __NO_STAT64 - -void __stat64_cvt(const struct stat *src,struct stat64 *dest) { - dest->st_dev=src->st_dev; - dest->st_ino=src->st_ino; - dest->st_mode=src->st_mode; - dest->st_nlink=src->st_nlink; - dest->st_uid=src->st_gid; - dest->st_rdev=src->st_rdev; - dest->st_size=src->st_size; - dest->st_blksize=src->st_blksize; - dest->st_blocks=src->st_blocks; - dest->st_atime=src->st_atime; - dest->st_mtime=src->st_mtime; - dest->st_ctime=src->st_ctime; -} -#endif diff --git a/mdk-stage1/dietlibc/lib/__xmknod.c b/mdk-stage1/dietlibc/lib/__xmknod.c deleted file mode 100644 index 4739a1f5f..000000000 --- a/mdk-stage1/dietlibc/lib/__xmknod.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int __xmknod(int ver,char* filename,mode_t mode,dev_t *dev) { - return mknod(filename,mode,*dev); -} - diff --git a/mdk-stage1/dietlibc/lib/_brk.c b/mdk-stage1/dietlibc/lib/_brk.c deleted file mode 100644 index 6d0b29c03..000000000 --- a/mdk-stage1/dietlibc/lib/_brk.c +++ /dev/null @@ -1,14 +0,0 @@ -#include - -extern int __diet_brk(void *end_data_segment); - -void* __curbrk=0; - -int __brk(void *end_data_segment) { - int res; - if ((res=__diet_brk(end_data_segment))==0) - __curbrk=end_data_segment; - return res; -} - -int brk (void *end_data_segment) __attribute__((weak,alias("__brk"))); diff --git a/mdk-stage1/dietlibc/lib/abort.c b/mdk-stage1/dietlibc/lib/abort.c deleted file mode 100644 index 55bfb8f0f..000000000 --- a/mdk-stage1/dietlibc/lib/abort.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include -#include -#include - -void abort() { - sigset_t t; - if (!sigemptyset(&t) && !sigaddset(&t, SIGABRT)) - sigprocmask(SIG_UNBLOCK, &t, 0); - while (1) - if (raise(SIGABRT)) - exit(127); -} diff --git a/mdk-stage1/dietlibc/lib/abs.c b/mdk-stage1/dietlibc/lib/abs.c deleted file mode 100644 index 9d7055358..000000000 --- a/mdk-stage1/dietlibc/lib/abs.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int abs(int j) -{ - return (j < 0) ? -j : j; -} diff --git a/mdk-stage1/dietlibc/lib/accept.c b/mdk-stage1/dietlibc/lib/accept.c deleted file mode 100644 index c7e8254ca..000000000 --- a/mdk-stage1/dietlibc/lib/accept.c +++ /dev/null @@ -1,14 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int __libc_accept(int a, void * addr, void * addr2) { -#ifdef __i386__ - return socketcall(SYS_ACCEPT, (long*)&a); -#else - unsigned long args[] = { a, (long) addr, (long) addr2 }; - return socketcall(SYS_ACCEPT, args); -#endif -} - -int accept(int a, void * addr, void * addr2) __attribute__((weak,alias("__libc_accept"))); diff --git a/mdk-stage1/dietlibc/lib/alarm.c b/mdk-stage1/dietlibc/lib/alarm.c deleted file mode 100644 index fd35372f2..000000000 --- a/mdk-stage1/dietlibc/lib/alarm.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (C) 1991, 1992, 1994, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include - -/* Schedule an alarm. In SECONDS seconds, the process will get a SIGALRM. - If SECONDS is zero, any currently scheduled alarm will be cancelled. - The function returns the number of seconds remaining until the last - alarm scheduled would have signaled, or zero if there wasn't one. - There is no return value to indicate an error, but you can set `errno' - to 0 and check its value after calling `alarm', and this might tell you. - The signal may come late due to processor scheduling. */ -unsigned int -alarm (seconds) - unsigned int seconds; -{ - struct itimerval old, new; - unsigned int retval; - - new.it_interval.tv_usec = 0; - new.it_interval.tv_sec = 0; - new.it_value.tv_usec = 0; - new.it_value.tv_sec = (long int) seconds; - if (setitimer (ITIMER_REAL, &new, &old) < 0) - return 0; - - retval = old.it_value.tv_sec; - if (old.it_value.tv_usec) - ++retval; - return retval; -} diff --git a/mdk-stage1/dietlibc/lib/alloc.c b/mdk-stage1/dietlibc/lib/alloc.c deleted file mode 100644 index 8cb87a69b..000000000 --- a/mdk-stage1/dietlibc/lib/alloc.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * malloc/free by O.Dreesen - */ - -#include -#include -#include -#include "dietfeatures.h" - -#if 0 -#include -#define _LIBC -#include -#endif - -#include - -#if defined(MAP_ANONYMOUS) && !defined(MAP_ANON) -#define MAP_ANON MAP_ANONYMOUS -#endif - -#ifndef MAP_FAILED -#define MAP_FAILED ((void*)-1) -#endif - -#ifndef NULL -#define NULL ((void*)0) -#endif - -extern void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset); -extern void *memset(void *s, int c, size_t n); -extern void *memcpy(void *dest, const void *src, size_t n); - -typedef struct t_alloc_head { - unsigned int magic1; - struct t_alloc_head *ptr; - unsigned long size; - unsigned int magic2; -} alloc_head; - -/* guess what ? the virtual block size */ -#define MEM_BLOCK_SIZE 4096 - -/* minimum allocated bytes */ -#define MEM_ALLOC_MIN 4 - -/* Initial start position in memory */ -#define MEM_ALLOC_START ((char*)0x18000000) - -/* Make every block align */ -#define MEM_ALIGN(s) (((s)+MEM_ALLOC_MIN-1)&(~(MEM_ALLOC_MIN-1))) -#define PAGE_ALIGN(s) (((s)+MEM_BLOCK_SIZE-1)&(~(MEM_BLOCK_SIZE-1))) -#define PAGE_ALIGNP(p) ((char*)PAGE_ALIGN((size_t)(p))) - -#define END_OF_BLOCK(p) ((alloc_head*)(((char*)(p))+((p)->size))) -#define START_BLOCK(p) ((alloc_head*)(((char*)(p))-sizeof(alloc_head))) -#define START_DATA(p) (((char*)(p))+sizeof(alloc_head)) -#define MIN_ALLOC(s) (((((s)+sizeof(alloc_head)-1)/MEM_ALLOC_MIN)+1)*MEM_ALLOC_MIN) - -#define ALLOC_MAGIC1 0xbad2f7ee -#define ALLOC_MAGIC2 0xf7ee2bad - -/* freelist handler */ -static alloc_head base = {ALLOC_MAGIC1,&base,0,ALLOC_MAGIC2}; -static char *alloc_get_end = MEM_ALLOC_START; - -void __libc_free(void *ptr) -{ - alloc_head *prev,*p,*block; - - if (ptr==NULL) return; - - block=START_BLOCK(ptr); - if (block->magic1 != ALLOC_MAGIC1) return; - if (block->magic2 != ALLOC_MAGIC2) return; - - prev=&base; - for (p=prev->ptr ; ; prev=p, p=p->ptr) - { - if ((block>prev)&&(blockp)&&(blockp)&&(block>prev)) break; /* block after freelist */ - - /* emergency escape: freelist has ONLY one entry the freelist base */ - if (p->ptr==p) break; - } - prev->ptr = block; - - if (END_OF_BLOCK(block)==p) - { /* join right neighbor */ - block->ptr = p->ptr; - block->size += p->size; - } - else - block->ptr = p; - - if (END_OF_BLOCK(prev)==block) - { /* join left neighbor */ - prev->size += block->size; - prev->ptr = block->ptr; - } -} -void free(void *ptr) __attribute__((weak,alias("__libc_free"))); - -static void *alloc_get_mem(unsigned long size) -{ - char *tmp; - alloc_head *ah; - - size=PAGE_ALIGN(size); - - /* map free pages @ alloc_get_end */ - tmp=mmap(alloc_get_end, size, PROT_READ|PROT_WRITE, - MAP_ANONYMOUS|MAP_PRIVATE|MAP_FIXED, -1, 0); - if (tmp==MAP_FAILED) - { - /* OK we can't map free pages @ alloc_get_end so try free position */ - tmp=mmap(0, size, PROT_READ|PROT_WRITE, - MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); - if (tmp==MAP_FAILED) - { - errno = ENOMEM; - return NULL; /* PANIC ! */ - } - alloc_get_end=tmp; - } - - alloc_get_end+=size; - - /* make a header */ - ah=(alloc_head*)tmp; - ah->magic1=ALLOC_MAGIC1; - ah->magic2=ALLOC_MAGIC2; - ah->ptr=ah; - ah->size=size; - - /* link new free maped pages in freelist */ - __libc_free(START_DATA(tmp)); - - return &base; -} - -void *__libc_malloc(size_t size) -{ - alloc_head *p, *prev; - size_t need; - - /* needed MEM_ALLOC_MIN */ - need=MIN_ALLOC(size); - - prev=&base; - for (p=prev->ptr;;prev=p,p=p->ptr) - { - if (p->size>=need) - { - if (p->size==need) - { /* fit PERFECT */ - prev->ptr=p->ptr; /* relink freelist */ - } - else - { - alloc_head *tmp=(alloc_head*)(((char*)p)+need); - if ((p->size-need)size; - prev->ptr=p->ptr; /* relink freelist */ - } - else - { - prev->ptr=tmp; - tmp->magic1=ALLOC_MAGIC1; - tmp->magic2=ALLOC_MAGIC2; - tmp->ptr=p->ptr; - tmp->size=p->size-need; /* remaining size */ - } - - p->size=need; /* set size */ - } - p->ptr=p; /* self-link */ - - return (void*)START_DATA(p); - } - else if (p==&base) - { - if ((p=alloc_get_mem(need))==NULL) goto err_out; - } - } -err_out: - return NULL; -} -void *malloc(size_t size) __attribute__((weak,alias("__libc_malloc"))); - -void *calloc(size_t nmemb,size_t size) -{ - size_t n=nmemb*size; - void *tmp=malloc(n); - if (tmp) memset(tmp,0,n); - return tmp; -} - -void *realloc(void *ptr,size_t size) -{ - alloc_head *tmp=0,*tf=0; - long need=0; - long diff=0; - - if (ptr) - { - if (size) - { - tmp=START_BLOCK(ptr); - need=MIN_ALLOC(size); /* only this size will survive */ - diff=tmp->size-need; - if (diff<0) - { - if ((tf=malloc(size))) - { - memcpy(tf,ptr,tmp->size-sizeof(alloc_head)); - free(ptr); - return tf; - } - return NULL; - } - if (diff>=sizeof(alloc_head)) - { - tmp->size=need; - tf=END_OF_BLOCK(tmp); - tf->magic1=ALLOC_MAGIC1; - tf->magic2=ALLOC_MAGIC2; - tf->ptr=tf; - tf->size=diff; - free(START_DATA(tf)); - } - return ptr; - } - else - free(ptr); - } - else if (size>0) - return malloc(size); - return NULL; -} diff --git a/mdk-stage1/dietlibc/lib/assert_fail.c b/mdk-stage1/dietlibc/lib/assert_fail.c deleted file mode 100644 index 3d6ba65c1..000000000 --- a/mdk-stage1/dietlibc/lib/assert_fail.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include -#include "dietwarning.h" - -extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase); - -void __assert_fail (const char *assertion, const char *file, unsigned int line, const char *function) -{ - int alen=strlen(assertion); - int flen=strlen(file); - int fulen=strlen(function); - char *buf=(char*)alloca(alen+flen+fulen+50); - if (buf) { - char *tmp; - *buf=0; - if (file) strcat(strcat(buf,file),":"); - tmp=buf+strlen(buf); - __ltostr(tmp,10,line,10,0); - strcat(buf,": "); - if (function) strcat(strcat(buf,function),": "); - strcat(buf,"Assertion `"); - strcat(buf,assertion); - strcat(buf,"' failed.\n"); - write(2,buf,strlen(buf)); - } - abort(); -} - -link_warning("__assert_fail","warning: your code still has assertions enabled!") diff --git a/mdk-stage1/dietlibc/lib/atexit.c b/mdk-stage1/dietlibc/lib/atexit.c deleted file mode 100644 index 8204af06c..000000000 --- a/mdk-stage1/dietlibc/lib/atexit.c +++ /dev/null @@ -1,23 +0,0 @@ -typedef void (*function)(void); - -static function __atexitlist[4]; - -int atexit(function t) { - int i; - for (i=0; i<4; i++) - if (__atexitlist[i]==0) { - __atexitlist[i]=t; - return 0; - } - return -1; -} - -extern void _exit(int code) __attribute__((noreturn)); - -void exit(int code) { - if (__atexitlist[3]) __atexitlist[3](); - if (__atexitlist[2]) __atexitlist[2](); - if (__atexitlist[1]) __atexitlist[1](); - if (__atexitlist[0]) __atexitlist[0](); - _exit(code); -} diff --git a/mdk-stage1/dietlibc/lib/atof.c b/mdk-stage1/dietlibc/lib/atof.c deleted file mode 100644 index 54221390e..000000000 --- a/mdk-stage1/dietlibc/lib/atof.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -double atof(const char *nptr) { -#if 0 - return strtod(nptr,0); -#else - double tmp=strtod(nptr,0); - return tmp; -#endif -} diff --git a/mdk-stage1/dietlibc/lib/atoi.c b/mdk-stage1/dietlibc/lib/atoi.c deleted file mode 100644 index fe952b8c4..000000000 --- a/mdk-stage1/dietlibc/lib/atoi.c +++ /dev/null @@ -1,8 +0,0 @@ -int atoi(const char* s) { - int v=0; - int sign=1; - if (*s=='-') { sign=-1; ++s; } else if (*s=='+') ++s; - while (*s && (*s>='0') && (*s<='9')) - v=v*10+*s++-'0'; - return v*sign; -} diff --git a/mdk-stage1/dietlibc/lib/atol.c b/mdk-stage1/dietlibc/lib/atol.c deleted file mode 100644 index 558a004b9..000000000 --- a/mdk-stage1/dietlibc/lib/atol.c +++ /dev/null @@ -1,8 +0,0 @@ -long int atol(const char* s) { - long int v=0; - int sign=1; - if (*s=='-') { sign=-1; ++s; } else if (*s=='+') ++s; - while (*s && (*s>='0') && (*s<='9')) - v=v*10+*s++-'0'; - return v*sign; -} diff --git a/mdk-stage1/dietlibc/lib/bind.c b/mdk-stage1/dietlibc/lib/bind.c deleted file mode 100644 index ec1c93e1b..000000000 --- a/mdk-stage1/dietlibc/lib/bind.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int bind(int a, void * b, int c) { -#ifdef __i386__ - return socketcall(SYS_BIND, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c }; - return socketcall(SYS_BIND, args); -#endif -} diff --git a/mdk-stage1/dietlibc/lib/bsearch.c b/mdk-stage1/dietlibc/lib/bsearch.c deleted file mode 100644 index d2f5c74b2..000000000 --- a/mdk-stage1/dietlibc/lib/bsearch.c +++ /dev/null @@ -1,20 +0,0 @@ -#include - -void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) { - const char *v, *r; - int res; - r=base+(nmemb-1)*size; - do { - register int num=nmemb/2; - v=base+num*size; - if ((res=compar(key,v))<0) { - r=v-size; - nmemb=num; - } else { - if (res==0) return (void*)v; - base=v+size; - nmemb-=num; - } - } while ((char*)base<=r); - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/cfmakeraw.c b/mdk-stage1/dietlibc/lib/cfmakeraw.c deleted file mode 100644 index 7f6df9913..000000000 --- a/mdk-stage1/dietlibc/lib/cfmakeraw.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -void cfmakeraw(struct termios *t) -{ - t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); - t->c_oflag &= ~OPOST; - t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); - t->c_cflag &= ~(CSIZE|PARENB); - t->c_cflag |= CS8; - t->c_cc[VMIN] = 1; - t->c_cc[VTIME] = 0; -} - diff --git a/mdk-stage1/dietlibc/lib/closedir.c b/mdk-stage1/dietlibc/lib/closedir.c deleted file mode 100644 index e73025eb1..000000000 --- a/mdk-stage1/dietlibc/lib/closedir.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "dietdirent.h" -#include -#include -#include - -int closedir (DIR* d) { - int res=close(d->fd); - free(d); - return res; -} diff --git a/mdk-stage1/dietlibc/lib/connect.c b/mdk-stage1/dietlibc/lib/connect.c deleted file mode 100644 index 01fd61a6c..000000000 --- a/mdk-stage1/dietlibc/lib/connect.c +++ /dev/null @@ -1,14 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int __libc_connect(int a, void * b, int c) { -#ifdef __i386__ - return socketcall(SYS_CONNECT, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c }; - return socketcall(SYS_CONNECT, args); -#endif -} - -int connect(int a, void * b, int c) __attribute__((weak,alias("__libc_connect"))); diff --git a/mdk-stage1/dietlibc/lib/creat.c b/mdk-stage1/dietlibc/lib/creat.c deleted file mode 100644 index 82145b515..000000000 --- a/mdk-stage1/dietlibc/lib/creat.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -int creat(const char *file,mode_t mode) { - return open(file,O_WRONLY|O_CREAT|O_TRUNC,mode); -} diff --git a/mdk-stage1/dietlibc/lib/creat64.c b/mdk-stage1/dietlibc/lib/creat64.c deleted file mode 100644 index 8cf897b57..000000000 --- a/mdk-stage1/dietlibc/lib/creat64.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -#ifndef O_LARGEFILE -#define O_LARGEFILE 0 -#endif - -int creat64(const char *file,mode_t mode) { - return open(file,O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE,mode); -} diff --git a/mdk-stage1/dietlibc/lib/errlist.c b/mdk-stage1/dietlibc/lib/errlist.c deleted file mode 100644 index d0e712190..000000000 --- a/mdk-stage1/dietlibc/lib/errlist.c +++ /dev/null @@ -1,132 +0,0 @@ - -const char *const sys_errlist[] = { - "Success", /* 0 */ - "Operation not permitted", /* EPERM */ - "No such file or directory", /* ENOENT */ - "No such process", /* ESRCH */ - "Interrupted system call", /* EINTR */ - "I/O error", /* EIO */ - "No such device or address", /* ENXIO */ - "Arg list too long", /* E2BIG */ - "Exec format error", /* ENOEXEC */ - "Bad file number", /* EBADF */ - "No child processes", /* ECHILD */ - "Try again", /* EAGAIN */ - "Out of memory", /* ENOMEM */ - "Permission denied", /* EACCES */ - "Bad address", /* EFAULT */ - "Block device required", /* ENOTBLK */ - "Device or resource busy", /* EBUSY */ - "File exists", /* EEXIST */ - "Cross-device link", /* EXDEV */ - "No such device", /* ENODEV */ - "Not a directory", /* ENOTDIR */ - "Is a directory", /* EISDIR */ - "Invalid argument", /* EINVAL */ - "File table overflow", /* ENFILE */ - "Too many open files", /* EMFILE */ - "Not a typewriter", /* ENOTTY */ - "Text file busy", /* ETXTBSY */ - "File too large", /* EFBIG */ - "No space left on device", /* ENOSPC */ - "Illegal seek", /* ESPIPE */ - "Read-only file system", /* EROFS */ - "Too many links", /* EMLINK */ - "Broken pipe", /* EPIPE */ - "Math argument out of domain of func", /* EDOM */ - "Math result not representable", /* ERANGE */ - "Resource deadlock would occur", /* EDEADLK */ - "File name too long", /* ENAMETOOLONG */ - "No record locks available", /* ENOLCK */ - "Function not implemented", /* ENOSYS */ - "Directory not empty", /* ENOTEMPTY */ - "Too many symbolic links encountered", /* ELOOP */ - "Operation would block", /* EWOULDBLOCK */ - "No message of desired type", /* ENOMSG */ - "Identifier removed", /* EIDRM */ - "Channel number out of range", /* ECHRNG */ - "Level 2 not synchronized", /* EL2NSYNC */ - "Level 3 halted", /* EL3HLT */ - "Level 3 reset", /* EL3RST */ - "Link number out of range", /* ELNRNG */ - "Protocol driver not attached", /* EUNATCH */ - "No CSI structure available", /* ENOCSI */ - "Level 2 halted", /* EL2HLT */ - "Invalid exchange", /* EBADE */ - "Invalid request descriptor", /* EBADR */ - "Exchange full", /* EXFULL */ - "No anode", /* ENOANO */ - "Invalid request code", /* EBADRQC */ - "Invalid slot", /* EBADSLT */ - "File locking deadlock error", /* EDEADLOCK */ - "Bad font file format", /* EBFONT */ - "Device not a stream", /* ENOSTR */ - "No data available", /* ENODATA */ - "Timer expired", /* ETIME */ - "Out of streams resources", /* ENOSR */ - "Machine is not on the network", /* ENONET */ - "Package not installed", /* ENOPKG */ - "Object is remote", /* EREMOTE */ - "Link has been severed", /* ENOLINK */ - "Advertise error", /* EADV */ - "Srmount error", /* ESRMNT */ - "Communication error on send", /* ECOMM */ - "Protocol error", /* EPROTO */ - "Multihop attempted", /* EMULTIHOP */ - "RFS specific error", /* EDOTDOT */ - "Not a data message", /* EBADMSG */ - "Value too large for defined data type", /* EOVERFLOW */ - "Name not unique on network", /* ENOTUNIQ */ - "File descriptor in bad state", /* EBADFD */ - "Remote address changed", /* EREMCHG */ - "Can not access a needed shared library", /* ELIBACC */ - "Accessing a corrupted shared library", /* ELIBBAD */ - ".lib section in a.out corrupted", /* ELIBSCN */ - "Attempting to link in too many shared libraries", /* ELIBMAX */ - "Cannot exec a shared library directly", /* ELIBEXEC */ - "Illegal byte sequence", /* EILSEQ */ - "Interrupted system call should be restarted", /* ERESTART */ - "Streams pipe error", /* ESTRPIPE */ - "Too many users", /* EUSERS */ - "Socket operation on non-socket", /* ENOTSOCK */ - "Destination address required", /* EDESTADDRREQ */ - "Message too long", /* EMSGSIZE */ - "Protocol wrong type for socket", /* EPROTOTYPE */ - "Protocol not available", /* ENOPROTOOPT */ - "Protocol not supported", /* EPROTONOSUPPORT */ - "Socket type not supported", /* ESOCKTNOSUPPORT */ - "Operation not supported on transport endpoint", /* EOPNOTSUPP */ - "Protocol family not supported", /* EPFNOSUPPORT */ - "Address family not supported by protocol", /* EAFNOSUPPORT */ - "Address already in use", /* EADDRINUSE */ - "Cannot assign requested address", /* EADDRNOTAVAIL */ - "Network is down", /* ENETDOWN */ - "Network is unreachable", /* ENETUNREACH */ - "Network dropped connection because of reset", /* ENETRESET */ - "Software caused connection abort", /* ECONNABORTED */ - "Connection reset by peer", /* ECONNRESET */ - "No buffer space available", /* ENOBUFS */ - "Transport endpoint is already connected", /* EISCONN */ - "Transport endpoint is not connected", /* ENOTCONN */ - "Cannot send after transport endpoint shutdown", /* ESHUTDOWN */ - "Too many references: cannot splice", /* ETOOMANYREFS */ - "Connection timed out", /* ETIMEDOUT */ - "Connection refused", /* ECONNREFUSED */ - "Host is down", /* EHOSTDOWN */ - "No route to host", /* EHOSTUNREACH */ - "Operation already in progress", /* EALREADY */ - "Operation now in progress", /* EINPROGRESS */ - "Stale NFS file handle", /* ESTALE */ - "Structure needs cleaning", /* EUCLEAN */ - "Not a XENIX named type file", /* ENOTNAM */ - "No XENIX semaphores available", /* ENAVAIL */ - "Is a named type file", /* EISNAM */ - "Remote I/O error", /* EREMOTEIO */ - "Quota exceeded", /* EDQUOT */ - "No medium found", /* ENOMEDIUM */ - "Wrong medium type", /* EMEDIUMTYPE */ - 0 -}; - - -const int sys_nerr = ((sizeof (sys_errlist))/(sizeof(char *))-1); diff --git a/mdk-stage1/dietlibc/lib/errno_location.c b/mdk-stage1/dietlibc/lib/errno_location.c deleted file mode 100644 index 286f833c9..000000000 --- a/mdk-stage1/dietlibc/lib/errno_location.c +++ /dev/null @@ -1,5 +0,0 @@ -extern int errno; - -int *__errno_location() { return &errno; } - -int *errno_location() __attribute__((weak,alias("__errno_location"))); diff --git a/mdk-stage1/dietlibc/lib/exec_lib.c b/mdk-stage1/dietlibc/lib/exec_lib.c deleted file mode 100644 index 3129224a0..000000000 --- a/mdk-stage1/dietlibc/lib/exec_lib.c +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -extern char **environ; - -int __exec_shell(const char *file, char *const argv[]) { - int i; - - for (i = 0; argv[i]; i++); - - { - char *shell_argv[i + 1]; - shell_argv[0] = _PATH_BSHELL; - shell_argv[1] = (char *) file; - for (; i > 1; i--) - shell_argv[i] = argv[i - 1]; - return execve(_PATH_BSHELL, shell_argv, environ); - } -} - diff --git a/mdk-stage1/dietlibc/lib/exec_lib.h b/mdk-stage1/dietlibc/lib/exec_lib.h deleted file mode 100644 index 0971bd1fb..000000000 --- a/mdk-stage1/dietlibc/lib/exec_lib.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __EXEC_LIB_H -#define __EXEC_LIB_H - -#include - -extern int __exec_shell(const char *file, char *const argv[]); - -#endif /* __EXEC_LIB_H */ - diff --git a/mdk-stage1/dietlibc/lib/execl.c b/mdk-stage1/dietlibc/lib/execl.c deleted file mode 100644 index 71459e71f..000000000 --- a/mdk-stage1/dietlibc/lib/execl.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include -#include -#include - -int execl( const char *path,...) { - va_list ap; - int n,i; - char **argv,*tmp; - va_start(ap, path); - n=1; - while ((tmp=va_arg(ap,char *))) - ++n; - va_end (ap); - if ((argv=(char **)alloca(n*sizeof(char*)))) { - va_start(ap, path); - for (i=0; i -#include -#include -#include -#include "dietstdarg.h" - -int execlp(const char* file, const char *arg,...) { - va_list ap,bak; - int n,i; - char **argv,*tmp; - va_start(ap, arg); - va_copy(bak,ap); - n=2; - while ((tmp=va_arg(ap,char *))) - ++n; - va_end (ap); - if ((argv=(char **)alloca(n*sizeof(char*)))) { - argv[0]=arg; - for (i=0; i -#include -#include -#include -#include -#include "exec_lib.h" - -int execv(const char *file, char *const argv[]) { - if (execve(file,argv,environ)==-1) { - if (errno==ENOEXEC) __exec_shell(file,argv); - } - return -1; -} diff --git a/mdk-stage1/dietlibc/lib/execvp.c b/mdk-stage1/dietlibc/lib/execvp.c deleted file mode 100644 index 20521d69f..000000000 --- a/mdk-stage1/dietlibc/lib/execvp.c +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include -#include -#include -#include -#include "exec_lib.h" - -int execvp(const char *file, char *const argv[]) { - char *path=getenv("PATH"); - char *cur,*next; - char buf[PATH_MAX]; - if (strchr((char*)file,'/')) { - if (execve(file,argv,environ)==-1) { - if (errno==ENOEXEC) __exec_shell(file,argv); - return -1; - } - } - if (!path) path=_PATH_DEFPATH; - for (cur=path; cur; cur=next) { - next=strchr(cur,':'); - if (!next) - next=cur+strlen(cur); - if (next==cur) { - buf[0]='.'; - cur--; - } else - memmove(buf,cur,next-cur); - buf[next-cur]='/'; - memmove(&buf[next-cur+1],file,strlen(file)+1); - if (execve(buf,argv,environ)==-1) { - if (errno==ENOEXEC) return __exec_shell(buf,argv); - if ((errno!=EACCES) && (errno!=ENOENT)) return -1; - } - if (*next==0) break; - next++; - } - return -1; -} diff --git a/mdk-stage1/dietlibc/lib/ftw.c b/mdk-stage1/dietlibc/lib/ftw.c deleted file mode 100644 index a3c04af9a..000000000 --- a/mdk-stage1/dietlibc/lib/ftw.c +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -int ftw(const char *dir,int (*fn)(const char *file, const struct stat *sb, int flag), int depth) { - char *cwd; - int cwdlen; - DIR *d; - struct dirent *de; - struct stat sb; - if (chdir(dir)) return -1; - cwd=alloca(PATH_MAX+1); - if (!getcwd(cwd,PATH_MAX)) return -1; - cwd[PATH_MAX]=0; - cwdlen=strlen(cwd); -/* write(1,"ftw in ",7); puts(cwd); */ - if (!(d=opendir("."))) return -1; - while ((de=readdir(d))) { - int res; - int flag; - int nlen; - char *filename; - if (de->d_name[0]=='.' && - (de->d_name[1]==0 || - (de->d_name[1]=='.' && de->d_name[2]==0))) continue; - nlen=strlen(de->d_name); - filename=alloca(nlen+cwdlen+3); - memmove(filename,cwd,cwdlen); - filename[cwdlen]='/'; - memmove(filename+cwdlen+1,de->d_name,nlen+1); - if (!lstat(de->d_name,&sb)) { - if (S_ISLNK(sb.st_mode)) flag=FTW_SL; else - if (S_ISDIR(sb.st_mode)) flag=FTW_D; else - flag=FTW_F; - } else - flag=FTW_NS; - res=fn(filename,&sb,flag); - if (res) return res; - if (flag==FTW_D && depth>0) { - res=ftw(filename,fn,depth-1); - chdir(dir); - if (res) return res; - } -/* puts(de->d_name); */ - } - closedir(d); - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/getdomainname.c b/mdk-stage1/dietlibc/lib/getdomainname.c deleted file mode 100644 index 2554fe4c3..000000000 --- a/mdk-stage1/dietlibc/lib/getdomainname.c +++ /dev/null @@ -1,17 +0,0 @@ -#define _GNU_SOURCE - -#include -#include - -int getdomainname(char *name,size_t len) { - struct utsname u; - int res=uname(&u); - if (res==0) { - int i; - if (len>=_UTSNAME_DOMAIN_LENGTH) - len=_UTSNAME_DOMAIN_LENGTH; - for (i=0; i - -extern char **environ; - -extern char *getenv(const char *s) -{ - int i; - unsigned int len; - - if (!environ || !s) return 0; - len = strlen(s); - for (i = 0;environ[i];++i) - if ((memcmp(environ[i],s,len)==0) && (environ[i][len] == '=')) - return environ[i] + len + 1; - return 0; -} - diff --git a/mdk-stage1/dietlibc/lib/gethostname.c b/mdk-stage1/dietlibc/lib/gethostname.c deleted file mode 100644 index ccc0fbc8e..000000000 --- a/mdk-stage1/dietlibc/lib/gethostname.c +++ /dev/null @@ -1,18 +0,0 @@ -#define _GNU_SOURCE - -#include -#include - -int gethostname(char *name,size_t len) { - struct utsname u; - int res=uname(&u); - if (res==0) { - int i; - if (len>=_UTSNAME_NODENAME_LENGTH) - len=_UTSNAME_NODENAME_LENGTH; - for (i=0; i - -/* - * by Olaf Dreesen - */ - -int opterr; - -int optind=1; -char *optarg; - -static int opt_unknown=1,opt_unknown_len; - -static int getopt_check(int c,char*o,int ol) -{ - int i; - if (c==':') return 2; - for (i=0;iopt_unknown;i--) v[i+oi]=v[i-1]; - - v[opt_unknown++]=tmp; - if (oi) v[opt_unknown++]=tmp2; - } -} - -static char* nextchar; -int getopt(int c,char*v[],char*o) -{ - int ol=strlen(o); - int ret=0; - int oi=0; - - optarg=0; - - while (nextchar || (optind - -extern int socketcall(int callno,long* args); - -int getpeername(int a, void * b, int c) { -#ifdef __i386__ - return socketcall(SYS_GETPEERNAME, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c }; - return socketcall(SYS_GETPEERNAME, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/getpgrp.c b/mdk-stage1/dietlibc/lib/getpgrp.c deleted file mode 100644 index ee2ab0257..000000000 --- a/mdk-stage1/dietlibc/lib/getpgrp.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int getpgrp() -{ - return getpgid(0); -} diff --git a/mdk-stage1/dietlibc/lib/getservent.c b/mdk-stage1/dietlibc/lib/getservent.c deleted file mode 100644 index bf25d046b..000000000 --- a/mdk-stage1/dietlibc/lib/getservent.c +++ /dev/null @@ -1,137 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -static int servicesfd=-1; -static char* servicesmap; -static unsigned int serviceslen; - -static char* aliases[10]; - -static char *cur; - -/* nameserver 42/tcp name # IEN 116 */ -struct servent *getservent(void) { - static struct servent se; - char *last; - int aliasidx; - if (servicesfd<0) { - servicesfd=open(_PATH_SERVICES,O_RDONLY); - if (servicesfd<0) return 0; - serviceslen=lseek(servicesfd,0,SEEK_END); - servicesmap=mmap(0,serviceslen,PROT_READ|PROT_WRITE,MAP_PRIVATE,servicesfd,0); - if ((long)servicesmap==(-1)) goto error; - cur=servicesmap; - } - last=servicesmap+serviceslen; -again: - se.s_name=0; - se.s_aliases=aliases; aliases[0]=0; - se.s_port=0; - se.s_proto=0; - if (cur>=last) return 0; - if (*cur=='#' || *cur=='\n') goto parseerror; - /* first, the primary name */ - if (!isalpha(*cur)) goto parseerror; - se.s_name=cur; - se.s_aliases=aliases; - while (cur=last) return 0; - if (*cur=='\n') goto parseerror; - *cur=0; cur++; - /* second, the port */ - while (cur=last) return 0; - /* third, "/tcp" or "/udp" */ - if (*cur!='/') goto parseerror; - cur++; - se.s_proto=cur; - while (cur=last) return 0; - if (*cur=='\n') { *cur++=0; return &se; } - *cur=0; cur++; - /* now the aliases */ - for (aliasidx=0;aliasidx<10;++aliasidx) { - while (cur=last || !isblank(*cur)) break; - *cur++=0; - } - aliases[aliasidx]=0; - return &se; -parseerror: - while (curs_name,strlen(s->s_name)); - write(1,"/",1); - write(1,s->s_proto,strlen(s->s_proto)); - write(1,"\n",1); - if (!strcmp(name,"auth")) { - tmp=s->s_aliases; - write(1," aka ",5); - while (*tmp) { - write(1,*tmp,strlen(*tmp)); - write(1,", ",2); - ++tmp; - } - write(1,"\n",1); - } -#endif - if (!strcmp(name,s->s_name) && !strcmp(proto,s->s_proto)) - return s; - tmp=s->s_aliases; - while (*tmp) - if (!strcmp(name,*tmp++)) return s; - } - return 0; -} - -struct servent *getservbyport(int port, const char *proto) { - struct servent *s; - for (s=getservent(); s; s=getservent()) { - if (port==s->s_port && !strcmp(proto,s->s_proto)) - return s; - } - return 0; -} - -void endservent(void) { - if (servicesmap!=(char*)-1) munmap(servicesmap,serviceslen); - if (servicesfd!=-1) close(servicesfd); - servicesmap=(char*)-1; - servicesfd=-1; -} - diff --git a/mdk-stage1/dietlibc/lib/getsockname.c b/mdk-stage1/dietlibc/lib/getsockname.c deleted file mode 100644 index 61a3ea24a..000000000 --- a/mdk-stage1/dietlibc/lib/getsockname.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int getsockname(int a, void * b, int c) { -#ifdef __i386__ - return socketcall(SYS_GETSOCKNAME, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c }; - return socketcall(SYS_GETSOCKNAME, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/getsockopt.c b/mdk-stage1/dietlibc/lib/getsockopt.c deleted file mode 100644 index 8c0a57557..000000000 --- a/mdk-stage1/dietlibc/lib/getsockopt.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int getsockopt(int a, int b, int c, void *d, int e) { -#ifdef __i386__ - return socketcall(SYS_GETSOCKOPT, (long*)&a); -#else - unsigned long args[] = { a, b, c, (long)d, e }; - return socketcall(SYS_GETSOCKOPT, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/htonl.c b/mdk-stage1/dietlibc/lib/htonl.c deleted file mode 100644 index 490de42c4..000000000 --- a/mdk-stage1/dietlibc/lib/htonl.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -unsigned long int htonl(unsigned long int hostlong) { -#if __BYTE_ORDER==__LITTLE_ENDIAN - return (hostlong>>24) | ((hostlong&0xff0000)>>8) | - ((hostlong&0xff00)<<8) | (hostlong<<24); -#else - return hostlong; -#endif -} - -unsigned long int ntohl(unsigned long int hostlong) __attribute__((weak,alias("htonl"))); diff --git a/mdk-stage1/dietlibc/lib/htons.c b/mdk-stage1/dietlibc/lib/htons.c deleted file mode 100644 index 765d3bbc5..000000000 --- a/mdk-stage1/dietlibc/lib/htons.c +++ /dev/null @@ -1,11 +0,0 @@ -#include - -unsigned short int htons(unsigned short int hostshort) { -#if __BYTE_ORDER==__LITTLE_ENDIAN - return ((hostshort>>8)&0xff) | (hostshort<<8); -#else - return hostshort; -#endif -} - -unsigned short int ntohs(unsigned short int hostshort) __attribute__((weak,alias("htons"))); diff --git a/mdk-stage1/dietlibc/lib/if_indextoname.c b/mdk-stage1/dietlibc/lib/if_indextoname.c deleted file mode 100644 index e683755f6..000000000 --- a/mdk-stage1/dietlibc/lib/if_indextoname.c +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include -#include -#include - -#ifndef SOCK_DGRAM -#define SOCK_DGRAM 2 -#endif - -char* if_indextoname(unsigned int interface,char* blub) { - struct ifreq ifr; - int fd; - - fd=socket(AF_INET6,SOCK_DGRAM,0); - if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0); - ifr.ifr_ifindex=interface; - if (ioctl(fd,SIOCGIFNAME,&ifr)==0) { - int i; - close(fd); - for (i=0; i -#include -#include -#include -#include - -#ifndef SOCK_DGRAM -#define SOCK_DGRAM 2 -#endif - -int if_nametoindex(char* blub) { - struct ifreq ifr; - int fd; - char *tmp; - int len=sizeof(ifr.ifr_name); - fd=socket(AF_INET6,SOCK_DGRAM,0); - if (fd<0) fd=socket(AF_INET,SOCK_DGRAM,0); - for (tmp=ifr.ifr_name; len>0; --len) { - if ((*tmp++=*blub++)==0) break; - } - if (ioctl(fd,SIOCGIFINDEX,&ifr)==0) { - close(fd); - return ifr.ifr_ifindex; - } - close(fd); - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/isalnum.c b/mdk-stage1/dietlibc/lib/isalnum.c deleted file mode 100644 index 4d363fab9..000000000 --- a/mdk-stage1/dietlibc/lib/isalnum.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int __isalnum_ascii(int c) { - return isalpha(c) || isdigit(c); -} - -int isalnum(int c) __attribute__((weak,alias("__isalnum_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isalpha.c b/mdk-stage1/dietlibc/lib/isalpha.c deleted file mode 100644 index 07ea69696..000000000 --- a/mdk-stage1/dietlibc/lib/isalpha.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int __isalpha_ascii(int c) { - return (c>='a' && c<='z') || (c>='A' && c<='Z'); -} - -int isalpha(int c) __attribute__((weak,alias("__isalpha_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isascii.c b/mdk-stage1/dietlibc/lib/isascii.c deleted file mode 100644 index e06994783..000000000 --- a/mdk-stage1/dietlibc/lib/isascii.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int isascii(int c) { - return (c & 0x80) == 0; -} - diff --git a/mdk-stage1/dietlibc/lib/isatty.c b/mdk-stage1/dietlibc/lib/isatty.c deleted file mode 100644 index b31609720..000000000 --- a/mdk-stage1/dietlibc/lib/isatty.c +++ /dev/null @@ -1,20 +0,0 @@ -#define ioctl libc_ioctl -#include -#undef ioctl -#include - -extern int errno; - -int isatty(int fd) -{ - int save; - int is_tty; - struct termios term; - - save = errno; - is_tty = ioctl(fd, TCGETS, &term) == 0; - errno = save; - - return is_tty; -} - diff --git a/mdk-stage1/dietlibc/lib/isblank.c b/mdk-stage1/dietlibc/lib/isblank.c deleted file mode 100644 index 034e543b1..000000000 --- a/mdk-stage1/dietlibc/lib/isblank.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int isblank(int ch) -{ - return ((ch==' ')||(ch=='\t')); -} diff --git a/mdk-stage1/dietlibc/lib/iscntrl.c b/mdk-stage1/dietlibc/lib/iscntrl.c deleted file mode 100644 index a183a54f1..000000000 --- a/mdk-stage1/dietlibc/lib/iscntrl.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int __iscntrl_ascii(int c) { - return (c<32) || (c==127); -} - -int iscntrl(int c) __attribute__((weak,alias("__iscntrl_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isdigit.c b/mdk-stage1/dietlibc/lib/isdigit.c deleted file mode 100644 index 8a7c3e801..000000000 --- a/mdk-stage1/dietlibc/lib/isdigit.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int __isdigit_ascii(int c) { - return (c>='0' && c<='9'); -} - -int isdigit(int c) __attribute__((weak,alias("__isdigit_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isgraph.c b/mdk-stage1/dietlibc/lib/isgraph.c deleted file mode 100644 index 807f90ff0..000000000 --- a/mdk-stage1/dietlibc/lib/isgraph.c +++ /dev/null @@ -1,5 +0,0 @@ -int __isgraph_ascii(int c) { - return (c>=33 && c<=126); -} - -int isgraph(int c) __attribute__((weak,alias("__isgraph_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/islower.c b/mdk-stage1/dietlibc/lib/islower.c deleted file mode 100644 index 6a9afa519..000000000 --- a/mdk-stage1/dietlibc/lib/islower.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int __islower_ascii(int c) { - return (c>='a' && c<='z'); -} - -int islower(int c) __attribute__((weak,alias("__islower_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isprint.c b/mdk-stage1/dietlibc/lib/isprint.c deleted file mode 100644 index e980658a5..000000000 --- a/mdk-stage1/dietlibc/lib/isprint.c +++ /dev/null @@ -1,6 +0,0 @@ - -int __isprint_ascii(int c) { - return (c>=32 && c<=126); -} - -int isprint(int c) __attribute__((weak,alias("__isprint_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/ispunct.c b/mdk-stage1/dietlibc/lib/ispunct.c deleted file mode 100644 index 2fd1183b1..000000000 --- a/mdk-stage1/dietlibc/lib/ispunct.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int __ispunct_ascii(int c) { - return isprint(c) && !( isalnum(c) || isspace(c) ); -} - -int ispunct(int c) __attribute__((weak,alias("__ispunct_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isspace.c b/mdk-stage1/dietlibc/lib/isspace.c deleted file mode 100644 index 916f784ab..000000000 --- a/mdk-stage1/dietlibc/lib/isspace.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -int __isspace_ascii(int ch) -{ - return ((ch==' ')||(ch=='\f')||(ch=='\t')||(ch=='\v')||(ch=='\r')||(ch=='\n')); -} - -int isspace(int c) __attribute__((weak,alias("__isspace_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isupper.c b/mdk-stage1/dietlibc/lib/isupper.c deleted file mode 100644 index 933dfc169..000000000 --- a/mdk-stage1/dietlibc/lib/isupper.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int __isupper_ascii(int c) { - return (c>='A' && c<='Z'); -} - -int isupper(int c) __attribute__((weak,alias("__isupper_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/isxdigit.c b/mdk-stage1/dietlibc/lib/isxdigit.c deleted file mode 100644 index 22a711f2d..000000000 --- a/mdk-stage1/dietlibc/lib/isxdigit.c +++ /dev/null @@ -1,5 +0,0 @@ -int __isxdigit_ascii(int c) { - return ((c>='0'&&c<='9') || (c>='A'&&c<='F') || (c>='a'&&c<='f')); -} - -int isxdigit(int c) __attribute__((weak,alias("__isxdigit_ascii"))); diff --git a/mdk-stage1/dietlibc/lib/listen.c b/mdk-stage1/dietlibc/lib/listen.c deleted file mode 100644 index 56a51be06..000000000 --- a/mdk-stage1/dietlibc/lib/listen.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int listen(int a, int b) { -#ifdef __i386__ - return socketcall(SYS_LISTEN, (long*)&a); -#else - unsigned long args[] = { a, b, 0 }; - return socketcall(SYS_LISTEN, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/lockf.c b/mdk-stage1/dietlibc/lib/lockf.c deleted file mode 100644 index 2b1d004ef..000000000 --- a/mdk-stage1/dietlibc/lib/lockf.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include -#include - -int lockf(int fd, int cmd, off_t len) { - struct flock fl; - fl.l_whence=SEEK_CUR; - fl.l_start=0; - fl.l_len=len; - fl.l_pid=0; - switch (cmd) { - case F_TEST: - if (fcntl(fd,F_GETLK,&fl)<0) - return -1; - if (fl.l_type == F_UNLCK || fl.l_pid == getpid ()) - return 0; - errno=EACCES; - return -1; - case F_ULOCK: - fl.l_type=F_UNLCK; - cmd=F_SETLK; - break; - case F_LOCK: - fl.l_type = F_WRLCK; - cmd = F_SETLKW; - break; - case F_TLOCK: - fl.l_type = F_WRLCK; - cmd = F_SETLK; - break; - default: - errno=EINVAL; - return -1; - } - return fcntl(fd,cmd,&fl); -} diff --git a/mdk-stage1/dietlibc/lib/longjmp.c b/mdk-stage1/dietlibc/lib/longjmp.c deleted file mode 100644 index d0a5719c1..000000000 --- a/mdk-stage1/dietlibc/lib/longjmp.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 1991, 92, 94, 95, 97, 98 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* #include */ -#include -#include - -extern int __sigprocmask(int how,void* set,void* oldset); -extern void __longjmp(void* env, int val); - -/* -extern void _longjmp_unwind (jmp_buf env, int val); -*/ -/* Set the signal mask to the one specified in ENV, and jump - to the position specified in ENV, causing the setjmp - call there to return VAL, or 1 if VAL is 0. */ -void __siglongjmp (sigjmp_buf env, int val) -{ - /* Perform any cleanups needed by the frames being unwound. */ - /* - _longjmp_unwind (env, val); - */ - - if (env[0].__mask_was_saved) - /* Restore the saved signal mask. */ - (void) __sigprocmask (SIG_SETMASK, &env[0].__saved_mask, - (sigset_t *) NULL); - - /* Call the machine-dependent function to restore machine state. */ - __longjmp (env[0].__jmpbuf, val ?: 1); -} - -void siglongjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp"))); -void longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp"))); -void _longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp"))); -void __libc_longjmp (sigjmp_buf env, int val) __attribute__((weak,alias("__siglongjmp"))); diff --git a/mdk-stage1/dietlibc/lib/lseek64.c b/mdk-stage1/dietlibc/lib/lseek64.c deleted file mode 100644 index f39e779f9..000000000 --- a/mdk-stage1/dietlibc/lib/lseek64.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "dietfeatures.h" - -#ifdef WANT_LARGEFILE_BACKCOMPAT -#include -#ifndef __NO_STAT64 -#include -#include - -loff_t lseek64(int fildes, loff_t offset, int whence) { - loff_t tmp; - if (llseek(fildes,offset>>32,offset&0xffffffff,&tmp,whence)) { -#ifdef WANT_THREAD_SAFE - if (*__errno_location()!=ENOSYS) return -1; -#else - if (errno!=ENOSYS) return -1; -#endif - return (loff_t)lseek(fildes,(off_t)offset,whence); - } - return tmp; -} -#endif -#endif diff --git a/mdk-stage1/dietlibc/lib/memccmp.c b/mdk-stage1/dietlibc/lib/memccmp.c deleted file mode 100644 index 3a8c14f60..000000000 --- a/mdk-stage1/dietlibc/lib/memccmp.c +++ /dev/null @@ -1,17 +0,0 @@ -#define _POSIX_SOURCE -#define _XOPEN_SOURCE -#include - -int memccmp(const void *dst, const void *src, int c, size_t count) -{ - register const char *a = dst; - register const char *b = src; - while (count--) - { - register int res=(*a - *b); - if (res) return res; - if (*a==c) return 0; - ++a; ++b; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/memccpy.c b/mdk-stage1/dietlibc/lib/memccpy.c deleted file mode 100644 index 6d6ac98ab..000000000 --- a/mdk-stage1/dietlibc/lib/memccpy.c +++ /dev/null @@ -1,19 +0,0 @@ -#define _POSIX_SOURCE -#define _XOPEN_SOURCE -#include - -void *memccpy(void *dst, const void *src, int c, size_t count) -{ - char *a = dst; - const char *b = src; - while (count--) - { - *a++ = *b; - if (*b==c) - { - return (void *)a; - } - b++; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/memchr.c b/mdk-stage1/dietlibc/lib/memchr.c deleted file mode 100644 index 93d81328a..000000000 --- a/mdk-stage1/dietlibc/lib/memchr.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -char *memchr(const char *s, int c, size_t n) { - int i; - for (i=n; i; --i) - if (*s++==c) - return (char*)s; - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/memcmp.c b/mdk-stage1/dietlibc/lib/memcmp.c deleted file mode 100644 index c05a46863..000000000 --- a/mdk-stage1/dietlibc/lib/memcmp.c +++ /dev/null @@ -1,16 +0,0 @@ -#include - -int memcmp(const void *dst, const void *src, size_t count) { - register int r; - register const char *d=dst; - register const char *s=src; - while (count--) { - if ((r=(*d - *s))) - return r; - ++d; - ++s; - } - return 0; -} - -int bcmp(const char *a,const char *b,size_t c) __attribute__((weak,alias("memcmp"))); diff --git a/mdk-stage1/dietlibc/lib/memcpy.c b/mdk-stage1/dietlibc/lib/memcpy.c deleted file mode 100644 index 0c688b509..000000000 --- a/mdk-stage1/dietlibc/lib/memcpy.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -void* memcpy(void* dst, const void* src, size_t count) { - register char *d=dst; - register const char *s=src; - ++count; /* this actually produces better code than using count-- */ - while (--count) { - *d = *s; - ++d; ++s; - } - return dst; -} diff --git a/mdk-stage1/dietlibc/lib/memmove.c b/mdk-stage1/dietlibc/lib/memmove.c deleted file mode 100644 index 7adb2be91..000000000 --- a/mdk-stage1/dietlibc/lib/memmove.c +++ /dev/null @@ -1,23 +0,0 @@ -#define _POSIX_SOURCE -#define _XOPEN_SOURCE -#include - -void *memmove(void *dst, const void *src, size_t count) -{ - char *a = dst; - const char *b = src; - if (src!=dst) - { - if (src>dst) - { - while (count--) *a++ = *b++; - } - else - { - a+=count-1; - b+=count-1; - while (count--) *a-- = *b--; - } - } - return dst; -} diff --git a/mdk-stage1/dietlibc/lib/memset.c b/mdk-stage1/dietlibc/lib/memset.c deleted file mode 100644 index 5f9ae49ee..000000000 --- a/mdk-stage1/dietlibc/lib/memset.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -void * memset(void * dst, int s, size_t count) { - register char * a = dst; - count++; /* this actually creates smaller code than using count-- */ - while (--count) - *a++ = s; - return dst; -} diff --git a/mdk-stage1/dietlibc/lib/mkfifo.c b/mdk-stage1/dietlibc/lib/mkfifo.c deleted file mode 100644 index 596efbe27..000000000 --- a/mdk-stage1/dietlibc/lib/mkfifo.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int mkfifo(const char *fn,mode_t mode) { - return mknod(fn,S_IFIFO|mode,0); -} diff --git a/mdk-stage1/dietlibc/lib/msgctl.c b/mdk-stage1/dietlibc/lib/msgctl.c deleted file mode 100644 index 19ea6d8cf..000000000 --- a/mdk-stage1/dietlibc/lib/msgctl.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int msgctl(int msqid, int cmd, struct msqid_ds *buf) { - return __ipc(MSGCTL,msqid,cmd,0,buf); -} diff --git a/mdk-stage1/dietlibc/lib/msgget.c b/mdk-stage1/dietlibc/lib/msgget.c deleted file mode 100644 index 9bca09ebe..000000000 --- a/mdk-stage1/dietlibc/lib/msgget.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int msgget(key_t key,int flag) { - return __ipc(MSGGET,key,flag,0,0); -} diff --git a/mdk-stage1/dietlibc/lib/msgrcv.c b/mdk-stage1/dietlibc/lib/msgrcv.c deleted file mode 100644 index b4ae9cc6c..000000000 --- a/mdk-stage1/dietlibc/lib/msgrcv.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int msgrcv(int msqid, void *msgp, size_t msgsz, long int msgtyp, int msgflg) { - struct ipc_kludge tmp; - tmp.msgp = msgp; - tmp.msgtyp = msgtyp; - return __ipc(MSGRCV,msqid, msgsz, msgflg, &tmp); -} diff --git a/mdk-stage1/dietlibc/lib/msgsnd.c b/mdk-stage1/dietlibc/lib/msgsnd.c deleted file mode 100644 index 6203053f0..000000000 --- a/mdk-stage1/dietlibc/lib/msgsnd.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int msgsnd (int msqid, const void *msgp, size_t msgsz, int msgflg) { - return __ipc(MSGSND,msqid, msgsz, msgflg, msgp); -} diff --git a/mdk-stage1/dietlibc/lib/nop.c b/mdk-stage1/dietlibc/lib/nop.c deleted file mode 100644 index c05bea813..000000000 --- a/mdk-stage1/dietlibc/lib/nop.c +++ /dev/null @@ -1,7 +0,0 @@ - -int __fflush_stdin() __attribute__((weak,alias("__return0"))); -int __fflush_stdout() __attribute__((weak,alias("__return0"))); -int __fflush_stderr() __attribute__((weak,alias("__return0"))); - -/* used for weak aliases */ -int __return0() { return 0; } diff --git a/mdk-stage1/dietlibc/lib/open64.c b/mdk-stage1/dietlibc/lib/open64.c deleted file mode 100644 index f1499d017..000000000 --- a/mdk-stage1/dietlibc/lib/open64.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -#ifndef O_LARGEFILE -#define O_LARGEFILE 0 -#endif - -extern int open(const char* file,int oflag,int mode); - -int __libc_open64(const char* file,int oflag,int mode) { - return open(file,oflag|O_LARGEFILE,mode); -} - -int open64(const char* file,int oflag,int mode) __attribute__((weak,alias("__libc_open64"))); diff --git a/mdk-stage1/dietlibc/lib/opendir.c b/mdk-stage1/dietlibc/lib/opendir.c deleted file mode 100644 index 5c0c4a305..000000000 --- a/mdk-stage1/dietlibc/lib/opendir.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "dietdirent.h" -#include -#include -#include -#include - -DIR *opendir (const char *name) { - DIR *t=(DIR*)malloc(sizeof(DIR)); - if (t) { - if ((t->fd=open(name,O_RDONLY|O_DIRECTORY))>=0) { - t->num=t->cur=0; - } else { - free(t); - t=0; - } - } - return t; -} diff --git a/mdk-stage1/dietlibc/lib/perror.c b/mdk-stage1/dietlibc/lib/perror.c deleted file mode 100644 index ecab7250b..000000000 --- a/mdk-stage1/dietlibc/lib/perror.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "dietfeatures.h" -#include -#include -#include - -extern char *sys_errlist[]; -extern int sys_nerr; -extern int errno; - -void perror(const char *s) { - register char *message="[unknown error]"; - write(2,s,strlen(s)); - write(2,": ",2); - if (errno>=0 && errno -#include - -extern size_t __pread(int fd, void *buf, size_t count, off_t a,off_t b); - -size_t __libc_pread(int fd, void *buf, size_t count, off_t offset) { - return __pread(fd,buf,count,offset,0); -} - -int pread(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread"))); diff --git a/mdk-stage1/dietlibc/lib/pread64.c b/mdk-stage1/dietlibc/lib/pread64.c deleted file mode 100644 index e6ba4d103..000000000 --- a/mdk-stage1/dietlibc/lib/pread64.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include -#include - -#ifndef __NO_STAT64 -extern size_t __pread(int fd, void *buf, size_t count, off_t a,off_t b); - -size_t __libc_pread64(int fd, void *buf, size_t count, off64_t offset) { - return __pread(fd,buf,count,__LONG_LONG_PAIR (offset&0xffffffff,offset>>32)); -} - -int pread64(int fd, void *buf, size_t count, off_t offset) __attribute__((weak,alias("__libc_pread64"))); -#endif diff --git a/mdk-stage1/dietlibc/lib/putenv.c b/mdk-stage1/dietlibc/lib/putenv.c deleted file mode 100644 index 274b16b0e..000000000 --- a/mdk-stage1/dietlibc/lib/putenv.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include - -int putenv(const char *string) { - int len; - int envc; - char *tmp; - const char **ep; - char **newenv; - static char **origenv=0; - if (!origenv) origenv=environ; - if (!(tmp=strchr(string,'='))) - len=strlen(string); - else - len=tmp-string+1; - for (envc=0, ep=(const char**)environ; *ep; ++ep) { - if (!memcmp(string,*ep,len)) { /* found */ - if (!tmp) { - for (; ep[1]; ++ep) ep[0]=ep[1]; - ep[0]=0; - return 0; - } - *ep=string; - return 0; - } - ++envc; - } - if (tmp) { - newenv=(char**)malloc((envc+2)*sizeof(char*)); - if (!newenv) return -1; - newenv[0]=(char*)string; - memcpy(newenv+1,environ,(envc+1)*sizeof(char*)); - if (environ!=origenv) free(environ); - environ=newenv; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/puts.c b/mdk-stage1/dietlibc/lib/puts.c deleted file mode 100644 index 54415151d..000000000 --- a/mdk-stage1/dietlibc/lib/puts.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include -#include "dietstdio.h" -#include "dietfeatures.h" - -int puts(const char *s) { -#ifdef WANT_BUFFERED_STDIO - return fwrite(s,1,strlen(s),stdout) && fputc('\n',stdout); -#else - return write(1,s,strlen(s)) && write(1,"\n",1); -#endif -} diff --git a/mdk-stage1/dietlibc/lib/qsort.c b/mdk-stage1/dietlibc/lib/qsort.c deleted file mode 100644 index 2a8824bf3..000000000 --- a/mdk-stage1/dietlibc/lib/qsort.c +++ /dev/null @@ -1,125 +0,0 @@ -#include -#include - -/* comments: - 1. insertion sort sofort, nicht nachträglich - 2. threshold = 16 - */ - -static inline void iswap(void *a,void *b,size_t size) { - register char *x=a; - register char *y=b; - register char *z=x+size; - while (x1) { - char *min=base; - char *tmp=min+size; - for (i=1; i=0 && right<=1000); -#endif - if (nmemb<=8) { - --level; - return isort(base,nmemb,size,compar); - } - { - mid=base+(nmemb/2)*size; - max=base+(nmemb-1)*size; - - if (compar(base,max)<0) /* a[left] < a[right] */ - if (compar(base,mid)<0) /* a[left] < a[med] */ - if (compar(max,mid)<0) /* a[left] < a[right] < a[med] */ - v=max; - else /* a[left] < a[med] < a[right] */ - v=mid; - else /* a[med] < a[left] < a[right] */ - v=base; - else /* a[right] < a[left] */ - if (compar(base,mid)<0) /* a[right] < a[left] < a[med] */ - v=base; - else /* a[right] < a[left] && a[med] < a[left] */ - if (compar(max,mid)<0) /* a[right] < a[med] < a[left] */ - v=mid; - else - v=max; -// printf("%d %d %d -> median %d\n",*(int*)base,*(int*)mid,*(int*)max,*(int*)v); - } - if (v != max) - iswap(v,max,size); - v=max; - min=base; lmemb=0; - for (;;) { - while (compar(min,v)<0) { min+=size; ++lmemb; } - while (compar(max-=size,v)>0) ; - if (min>=max) break; - iswap(min,max,size); - } - iswap(min,v,size); -#ifdef DEBUG -// { int i; for (i=0; i(char*)base+size) { -#ifdef DEBUG - assert(base==dbase); -#endif -// { int i; for (i=0; ilmemb+1) { -// { int i; for (i=0; i -#include -#include -#include "syscalls.h" - -int raise(int sig) { - return kill(getpid(),sig); -} diff --git a/mdk-stage1/dietlibc/lib/rand.c b/mdk-stage1/dietlibc/lib/rand.c deleted file mode 100644 index 10bfaf94d..000000000 --- a/mdk-stage1/dietlibc/lib/rand.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -static unsigned int seed=1; - -int rand() { - return ((seed = seed * 1103515245 + 12345) % ((unsigned int)RAND_MAX + 1)); -} - -void srand(unsigned int i) { seed=i; } diff --git a/mdk-stage1/dietlibc/lib/random.c b/mdk-stage1/dietlibc/lib/random.c deleted file mode 100644 index e7785c455..000000000 --- a/mdk-stage1/dietlibc/lib/random.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -static unsigned int seed=1; - -long int random() { - return ((seed = seed * 1103515245 + 12345) % ((unsigned int)RAND_MAX + 1)); -} - -void srandom(unsigned int i) { seed=i; } diff --git a/mdk-stage1/dietlibc/lib/readdir.c b/mdk-stage1/dietlibc/lib/readdir.c deleted file mode 100644 index 689f5d08b..000000000 --- a/mdk-stage1/dietlibc/lib/readdir.c +++ /dev/null @@ -1,13 +0,0 @@ -#include "dietdirent.h" -#include -#include -#include - -struct dirent* readdir(DIR *d) { - if (!d->num || (d->cur += ((struct dirent*)(d->buf+d->cur))->d_reclen)>=d->num) { - int res=getdents(d->fd,(struct dirent*)d->buf,1023); - if (res<=0) return 0; - d->num=res; d->cur=0; - } - return (struct dirent*)(d->buf+d->cur); -} diff --git a/mdk-stage1/dietlibc/lib/reboot.c b/mdk-stage1/dietlibc/lib/reboot.c deleted file mode 100644 index 7f47a95dd..000000000 --- a/mdk-stage1/dietlibc/lib/reboot.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -int __reboot(int magic1, int magic2, int cmd, void * arg); - -int reboot(int cmd, void *arg) -{ - return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, arg); -} diff --git a/mdk-stage1/dietlibc/lib/recv.c b/mdk-stage1/dietlibc/lib/recv.c deleted file mode 100644 index bc6b1e5d7..000000000 --- a/mdk-stage1/dietlibc/lib/recv.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int __libc_recv(int a, const void * b, size_t c, int flags) { -#ifdef __i386__ - return socketcall(SYS_RECV,(long*)&a); -#else - unsigned long args[] = { a, (long) b, c, flags }; - return socketcall(SYS_RECV, args); -#endif -} - -int recv(int a, const void * b, size_t c, int flags) - __attribute__ ((weak, alias("__libc_recv"))); diff --git a/mdk-stage1/dietlibc/lib/recvfrom.c b/mdk-stage1/dietlibc/lib/recvfrom.c deleted file mode 100644 index 802ad665f..000000000 --- a/mdk-stage1/dietlibc/lib/recvfrom.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int __libc_recvfrom(int a, const void * b, size_t c, int flags, void *to, void *tolen) { -#ifdef __i386__ - return socketcall(SYS_RECVFROM, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c, flags, (long) to, (long) tolen }; - return socketcall(SYS_RECVFROM, args); -#endif -} - -int recvfrom(int a, const void * b, size_t c, int flags, void *to, void *tolen) - __attribute__ ((weak,alias("__libc_recvfrom"))) ; diff --git a/mdk-stage1/dietlibc/lib/recvmsg.c b/mdk-stage1/dietlibc/lib/recvmsg.c deleted file mode 100644 index c14c58c78..000000000 --- a/mdk-stage1/dietlibc/lib/recvmsg.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int __libc_recvmsg(int a, struct msghdr* msg, int flags) { -#ifdef __i386__ - return socketcall(SYS_RECVMSG, (long*)&a); -#else - unsigned long args[] = { a, (long) msg, flags }; - return socketcall(SYS_RECVMSG, args); -#endif -} - -int recvmsg(int a, struct msghdr *msg, int flags) - __attribute__ ((weak,alias("__libc_recvmsg"))) ; diff --git a/mdk-stage1/dietlibc/lib/remove.c b/mdk-stage1/dietlibc/lib/remove.c deleted file mode 100644 index d5125bfed..000000000 --- a/mdk-stage1/dietlibc/lib/remove.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -int remove(const char* filename) { - if (unlink(filename)) { - if (errno==EISDIR) - return rmdir(filename); - return -1; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/rewind.c b/mdk-stage1/dietlibc/lib/rewind.c deleted file mode 100644 index 48434a316..000000000 --- a/mdk-stage1/dietlibc/lib/rewind.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -void rewind( FILE *stream) { - fseek(stream, 0L, SEEK_SET); -} diff --git a/mdk-stage1/dietlibc/lib/rewinddir.c b/mdk-stage1/dietlibc/lib/rewinddir.c deleted file mode 100644 index addc7bde9..000000000 --- a/mdk-stage1/dietlibc/lib/rewinddir.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "dietdirent.h" -#include -#include - -void rewinddir(DIR *d) { - if (lseek(d->fd,0,SEEK_SET) != (off_t)-1) - d->num=d->cur=0; -} diff --git a/mdk-stage1/dietlibc/lib/sbrk.c b/mdk-stage1/dietlibc/lib/sbrk.c deleted file mode 100644 index 945ad5a16..000000000 --- a/mdk-stage1/dietlibc/lib/sbrk.c +++ /dev/null @@ -1,20 +0,0 @@ -#include - -extern int __brk(void *end_data_segment); - -extern void* __curbrk; - -void* __sbrk(ptrdiff_t increment) { - void* oldbrk; - if (__curbrk==0) - if (__brk(0) < 0) - return (void*)-1; - if (increment==0) - return __curbrk; - oldbrk=__curbrk; - if (__brk(oldbrk+increment)<0) - return (void*)-1; - return oldbrk; -} - -void* sbrk (ptrdiff_t increment) __attribute__((weak,alias("__sbrk"))); diff --git a/mdk-stage1/dietlibc/lib/seekdir.c b/mdk-stage1/dietlibc/lib/seekdir.c deleted file mode 100644 index cf111fbc8..000000000 --- a/mdk-stage1/dietlibc/lib/seekdir.c +++ /dev/null @@ -1,8 +0,0 @@ -#include "dietdirent.h" -#include -#include - -void seekdir(DIR *d,off_t offset) { - if (lseek(d->fd,offset,SEEK_SET) != (off_t)-1) - d->num=d->cur=0; -} diff --git a/mdk-stage1/dietlibc/lib/semctl.c b/mdk-stage1/dietlibc/lib/semctl.c deleted file mode 100644 index ddc0aae95..000000000 --- a/mdk-stage1/dietlibc/lib/semctl.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int semctl(int semid, int semnum, int cmd, union semun arg) { - return __ipc(SEMCTL,semid,semnum,cmd,&arg); -} diff --git a/mdk-stage1/dietlibc/lib/semget.c b/mdk-stage1/dietlibc/lib/semget.c deleted file mode 100644 index 056aeae04..000000000 --- a/mdk-stage1/dietlibc/lib/semget.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int semget(key_t key, int nsems, int semflg) { - return __ipc(SEMGET,key,nsems,semflg,0); -} diff --git a/mdk-stage1/dietlibc/lib/semop.c b/mdk-stage1/dietlibc/lib/semop.c deleted file mode 100644 index abfde73a7..000000000 --- a/mdk-stage1/dietlibc/lib/semop.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int semop(int semid,struct sembuf *sops,unsigned nsops) { - return __ipc(SEMOP,semid,nsops,0,sops); -} diff --git a/mdk-stage1/dietlibc/lib/send.c b/mdk-stage1/dietlibc/lib/send.c deleted file mode 100644 index c1adf1b5d..000000000 --- a/mdk-stage1/dietlibc/lib/send.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int __libc_send(int a, const void * b, size_t c, int flags) { -#ifdef __i386__ - return socketcall(SYS_SEND, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c, flags }; - return socketcall(SYS_SEND, args); -#endif -} - -int send(int a, const void * b, size_t c, int flags) - __attribute__ ((weak, alias("__libc_send"))); diff --git a/mdk-stage1/dietlibc/lib/sendmsg.c b/mdk-stage1/dietlibc/lib/sendmsg.c deleted file mode 100644 index 277265985..000000000 --- a/mdk-stage1/dietlibc/lib/sendmsg.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int __libc_sendmsg(int a, const struct msghdr* msg, int flags) { -#ifdef __i386__ - return socketcall(SYS_SENDMSG, (long*)&a); -#else - unsigned long args[] = { a, (long) msg, flags }; - return socketcall(SYS_SENDMSG, args); -#endif -} - -int sendmsg(int a, const struct msghdr *msg, int flags) - __attribute__ ((weak,alias("__libc_sendmsg"))) ; diff --git a/mdk-stage1/dietlibc/lib/sendto.c b/mdk-stage1/dietlibc/lib/sendto.c deleted file mode 100644 index 078c010ea..000000000 --- a/mdk-stage1/dietlibc/lib/sendto.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int __libc_sendto(int a, const void * b, size_t c, int flags, void *to, int tolen) { -#ifdef __i386__ - return socketcall(SYS_SENDTO, (long*)&a); -#else - unsigned long args[] = { a, (long) b, c, flags, (long) to, tolen }; - return socketcall(SYS_SENDTO, args); -#endif -} - -int sendto(int a, const void * b, size_t c, int flags, void *to, int tolen) - __attribute__ ((weak, alias("__libc_sendto"))); diff --git a/mdk-stage1/dietlibc/lib/set_errno.c b/mdk-stage1/dietlibc/lib/set_errno.c deleted file mode 100644 index 6553bc496..000000000 --- a/mdk-stage1/dietlibc/lib/set_errno.c +++ /dev/null @@ -1,9 +0,0 @@ -extern int errno; - -void __set_errno(int error) __attribute__ ((weak)); - -void __set_errno(int error) -{ - errno=error; -} - diff --git a/mdk-stage1/dietlibc/lib/setpgrp.c b/mdk-stage1/dietlibc/lib/setpgrp.c deleted file mode 100644 index 825ca3725..000000000 --- a/mdk-stage1/dietlibc/lib/setpgrp.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -int setpgrp() -{ - return setpgid(0,0); -} diff --git a/mdk-stage1/dietlibc/lib/setsockopt.c b/mdk-stage1/dietlibc/lib/setsockopt.c deleted file mode 100644 index 781e9c31c..000000000 --- a/mdk-stage1/dietlibc/lib/setsockopt.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int setsockopt(int a, int b, int c, void *d, void *e) { -#ifdef __i386__ - return socketcall(SYS_SETSOCKOPT, (long*)&a); -#else - unsigned long args[] = { a, b, c, (long)d, (long) e }; - return socketcall(SYS_SETSOCKOPT, args); -#endif -} - diff --git a/mdk-stage1/dietlibc/lib/shmat.c b/mdk-stage1/dietlibc/lib/shmat.c deleted file mode 100644 index 63284b1ea..000000000 --- a/mdk-stage1/dietlibc/lib/shmat.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include -#include -#include - -extern void* __ipc(); - -void* shmat(int shmid,const void* shmaddr,int shmflg) { - void* raddr; - register void* result; - result=__ipc(SHMAT,shmid,shmflg,&raddr,shmaddr); - if ((unsigned long)result <= -(unsigned long)SHMLBA) - result=raddr; - return result; -} diff --git a/mdk-stage1/dietlibc/lib/shmctl.c b/mdk-stage1/dietlibc/lib/shmctl.c deleted file mode 100644 index 8f942f2a4..000000000 --- a/mdk-stage1/dietlibc/lib/shmctl.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int shmctl(int shmid, int cmd, struct shmid_ds *buf) { - return __ipc(SHMCTL,shmid,cmd,0,buf); -} diff --git a/mdk-stage1/dietlibc/lib/shmdt.c b/mdk-stage1/dietlibc/lib/shmdt.c deleted file mode 100644 index 36db10f08..000000000 --- a/mdk-stage1/dietlibc/lib/shmdt.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int shmdt(const void* shmaddr) { - return __ipc(SHMDT,0,0,0,shmaddr); -} diff --git a/mdk-stage1/dietlibc/lib/shmget.c b/mdk-stage1/dietlibc/lib/shmget.c deleted file mode 100644 index 9b03f5deb..000000000 --- a/mdk-stage1/dietlibc/lib/shmget.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include -#include - -extern int __ipc(); - -int shmget(key_t key, int size, int shmflg) { - return __ipc(SHMGET,key,size,shmflg,0); -} diff --git a/mdk-stage1/dietlibc/lib/shutdown.c b/mdk-stage1/dietlibc/lib/shutdown.c deleted file mode 100644 index 0a6be6c37..000000000 --- a/mdk-stage1/dietlibc/lib/shutdown.c +++ /dev/null @@ -1,14 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int __libc_shutdown(int s, int how) { -#ifdef __i386__ - return socketcall(SYS_SHUTDOWN, (long*)&s); -#else - unsigned long args[] = { s, (long) how, 0 }; - return socketcall(SYS_SHUTDOWN, args); -#endif -} - -int shutdown(int s, int how) __attribute__((weak,alias("__libc_shutdown"))); diff --git a/mdk-stage1/dietlibc/lib/sigaddset.c b/mdk-stage1/dietlibc/lib/sigaddset.c deleted file mode 100644 index 8ce69ea77..000000000 --- a/mdk-stage1/dietlibc/lib/sigaddset.c +++ /dev/null @@ -1,15 +0,0 @@ -#define __KERNEL__ -#define sigaddset foobar -#include -#undef sigaddset - -int __sigaddset(sigset_t *set, int signo) { - unsigned long sig = signo - 1; - if (_NSIG_WORDS == 1) - set->sig[0] |= 1UL << sig; - else - set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW); - return 0; -} - -int sigaddset (sigset_t *env, int signo) __attribute__((weak,alias("__sigaddset"))); diff --git a/mdk-stage1/dietlibc/lib/sigdelset.c b/mdk-stage1/dietlibc/lib/sigdelset.c deleted file mode 100644 index 2c3385ea8..000000000 --- a/mdk-stage1/dietlibc/lib/sigdelset.c +++ /dev/null @@ -1,15 +0,0 @@ -#define __KERNEL__ -#define sigdelset foobar -#include -#undef sigdelset - -int __sigdelset(sigset_t *set, int signo) { - unsigned long sig = signo - 1; - if (_NSIG_WORDS == 1) - set->sig[0] &= ~(1UL << sig); - else - set->sig[sig / _NSIG_BPW] &= ~(1UL << (sig % _NSIG_BPW)); - return 0; -} - -int sigdelset (sigset_t *env, int signo) __attribute__((weak,alias("__sigdelset"))); diff --git a/mdk-stage1/dietlibc/lib/sigemptyset.c b/mdk-stage1/dietlibc/lib/sigemptyset.c deleted file mode 100644 index f4532f96e..000000000 --- a/mdk-stage1/dietlibc/lib/sigemptyset.c +++ /dev/null @@ -1,14 +0,0 @@ -#define __USE_EXTERN_INLINES 1 -#include -#include -#include - -int sigemptyset(sigset_t *set) { - if (set==NULL) { - __set_errno(EINVAL); - return -1; - } - memset(set,0,sizeof(*set)); - return 0; -} - diff --git a/mdk-stage1/dietlibc/lib/sigfillset.c b/mdk-stage1/dietlibc/lib/sigfillset.c deleted file mode 100644 index ddac6e391..000000000 --- a/mdk-stage1/dietlibc/lib/sigfillset.c +++ /dev/null @@ -1,11 +0,0 @@ -#define __KERNEL__ -#include - -int __sigfillset (sigset_t *set) { - int i; - for (i=0; i<_NSIG_WORDS; i++) - set->sig[i]=~0; - return 0; -} - -int sigfillset(sigset_t *env) __attribute__((weak,alias("__sigfillset"))); diff --git a/mdk-stage1/dietlibc/lib/sigismember.c b/mdk-stage1/dietlibc/lib/sigismember.c deleted file mode 100644 index 67a258884..000000000 --- a/mdk-stage1/dietlibc/lib/sigismember.c +++ /dev/null @@ -1,21 +0,0 @@ -#define __USE_EXTERN_INLINES 1 -#include - -# define __sigmask(sig) \ - (((unsigned long int) 1) << (((sig) - 1) % (8 * sizeof (unsigned long int)))) - -# define __sigword(sig) (((sig) - 1) / (8 * sizeof (unsigned long int))) - -# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int))) -typedef struct - { - unsigned long int __val[_SIGSET_NWORDS]; - } __sigset_t; - -int __sigismember(const __sigset_t *set, int signo) { - unsigned long int __mask = __sigmask (signo); - unsigned long int __word = __sigword (signo); - return (set->__val[__word] & __mask); -} - -int sigismember(const sigset_t *env, int signo) __attribute__((weak,alias("__sigismember"))); diff --git a/mdk-stage1/dietlibc/lib/sigjmp.c b/mdk-stage1/dietlibc/lib/sigjmp.c deleted file mode 100644 index be97c62cc..000000000 --- a/mdk-stage1/dietlibc/lib/sigjmp.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (C) 1992, 1994, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include -#include - -/* This function is called by the `sigsetjmp' macro - before doing a `__setjmp' on ENV[0].__jmpbuf. - Always return zero. */ - -int -__sigjmp_save (sigjmp_buf env, int savemask) -{ - env[0].__mask_was_saved = (savemask && - sigprocmask (SIG_BLOCK, (sigset_t *) NULL, - (sigset_t*)&env[0].__saved_mask) == 0); - - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/sleep.c b/mdk-stage1/dietlibc/lib/sleep.c deleted file mode 100644 index ec5b99533..000000000 --- a/mdk-stage1/dietlibc/lib/sleep.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -unsigned int sleep(unsigned int secs) { - struct timespec t; - t.tv_sec=secs; - t.tv_nsec=0; - nanosleep(&t,&t); - return secs-t.tv_sec; -} - diff --git a/mdk-stage1/dietlibc/lib/snprintf.c b/mdk-stage1/dietlibc/lib/snprintf.c deleted file mode 100644 index 096c06115..000000000 --- a/mdk-stage1/dietlibc/lib/snprintf.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int snprintf(char *str,size_t size,const char *format,...) -{ - int n; - va_list arg_ptr; - va_start(arg_ptr, format); - n=vsnprintf(str,size,format,arg_ptr); - va_end (arg_ptr); - return n; -} diff --git a/mdk-stage1/dietlibc/lib/socket.c b/mdk-stage1/dietlibc/lib/socket.c deleted file mode 100644 index 1684a6a2b..000000000 --- a/mdk-stage1/dietlibc/lib/socket.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -extern int socketcall(int callno,long* args); - -int socket(int a, int b, int c) { -#ifdef __i386__ - return socketcall(SYS_SOCKET, (long*)&a); -#else - unsigned long args[] = { a, b, c }; - return socketcall(SYS_SOCKET, args); -#endif -} diff --git a/mdk-stage1/dietlibc/lib/speed.c b/mdk-stage1/dietlibc/lib/speed.c deleted file mode 100644 index a7fcca7c9..000000000 --- a/mdk-stage1/dietlibc/lib/speed.c +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include -#include - -#include - -extern int errno; - -/* Hack around a kernel bug; value must correspond to the one used in tcsetattr.c */ -#define IBAUD0 020000000000 - - -/* Return the output baud rate stored in *TERMIOS_P. */ -speed_t cfgetospeed (struct termios *termios_p) -{ - return termios_p->c_cflag & (CBAUD | CBAUDEX); -} - - -/* Return the input baud rate stored in *TERMIOS_P. - Although for Linux there is no difference between input and output - speed, the numerical 0 is a special case for the input baud rate. It - should set the input baud rate to the output baud rate. */ -speed_t cfgetispeed (struct termios *termios_p) -{ - return ((termios_p->c_iflag & IBAUD0) - ? 0 : termios_p->c_cflag & (CBAUD | CBAUDEX)); -} - - -/* Set the output baud rate stored in *TERMIOS_P to SPEED. */ -int cfsetospeed (struct termios *termios_p, speed_t speed) -{ - if ((speed & ~CBAUD) != 0 && (speed < B57600 || speed > B460800)) { - errno = EINVAL; - return -1; - } - - termios_p->c_cflag &= ~(CBAUD | CBAUDEX); - termios_p->c_cflag |= speed; - - return 0; -} - - -/* Set the input baud rate stored in *TERMIOS_P to SPEED. - Although for Linux there is no difference between input and output - speed, the numerical 0 is a special case for the input baud rate. It - should set the input baud rate to the output baud rate. */ -int cfsetispeed (struct termios *termios_p, speed_t speed) -{ - if ((speed & ~CBAUD) != 0 && (speed < B57600 || speed > B460800)) { - errno = EINVAL; - return -1; - } - - if (speed == 0) - termios_p->c_iflag |= IBAUD0; - else - { - termios_p->c_iflag &= ~IBAUD0; - termios_p->c_cflag &= ~(CBAUD | CBAUDEX); - termios_p->c_cflag |= speed; - } - - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/sprintf.c b/mdk-stage1/dietlibc/lib/sprintf.c deleted file mode 100644 index b355d01f9..000000000 --- a/mdk-stage1/dietlibc/lib/sprintf.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include -#include "dietwarning.h" - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int sprintf(char *dest,const char *format,...) -{ - int n; - va_list arg_ptr; - va_start(arg_ptr, format); - n=vsnprintf(dest,1000000,format,arg_ptr); - va_end (arg_ptr); - return n; -} - -link_warning("sprintf","warning: Avoid sprintf; use snprintf. It is more secure and faster.") diff --git a/mdk-stage1/dietlibc/lib/sscanf.c b/mdk-stage1/dietlibc/lib/sscanf.c deleted file mode 100644 index 341e74bba..000000000 --- a/mdk-stage1/dietlibc/lib/sscanf.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -int vsscanf(const char *str, const char *format, va_list arg_ptr); - -int sscanf(const char *str, const char *format, ...) -{ - int n; - va_list arg_ptr; - va_start(arg_ptr, format); - n=vsscanf(str,format,arg_ptr); - va_end (arg_ptr); - return n; -} diff --git a/mdk-stage1/dietlibc/lib/strcasecmp.c b/mdk-stage1/dietlibc/lib/strcasecmp.c deleted file mode 100644 index d978488a4..000000000 --- a/mdk-stage1/dietlibc/lib/strcasecmp.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include "dietfeatures.h" - -int strcasecmp(register const char *s,register const char *t) { - register char x; - - for (;;) { - x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t; - x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t; - x = tolower(*s); if (x != tolower(*t)) break; if (!x) break; ++s; ++t; -#endif - } - return ((int)(unsigned int)(unsigned char) x) - - ((int)(unsigned int)(unsigned char) *t); -} diff --git a/mdk-stage1/dietlibc/lib/strcat.c b/mdk-stage1/dietlibc/lib/strcat.c deleted file mode 100644 index 8a755afea..000000000 --- a/mdk-stage1/dietlibc/lib/strcat.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "dietfeatures.h" -#include - -char* strcat(register char* s,register const char* t) -{ - char *dest=s; - s+=strlen(s); - for (;;) { - if (!(*s = *t)) break; ++s; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (!(*s = *t)) break; ++s; ++t; - if (!(*s = *t)) break; ++s; ++t; - if (!(*s = *t)) break; ++s; ++t; -#endif - } - return dest; -} - diff --git a/mdk-stage1/dietlibc/lib/strchr.c b/mdk-stage1/dietlibc/lib/strchr.c deleted file mode 100644 index 0c2050da6..000000000 --- a/mdk-stage1/dietlibc/lib/strchr.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "dietfeatures.h" - -char *strchr(register const char *t, int c) { - register char ch; - - ch = c; - for (;;) { - if (*t == ch) break; if (!*t) return 0; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (*t == ch) break; if (!*t) return 0; ++t; - if (*t == ch) break; if (!*t) return 0; ++t; - if (*t == ch) break; if (!*t) return 0; ++t; -#endif - } - return (char*)t; -} - -char *index(char *t,int c) __attribute__((weak,alias("strchr"))); diff --git a/mdk-stage1/dietlibc/lib/strcmp.c b/mdk-stage1/dietlibc/lib/strcmp.c deleted file mode 100644 index 0db324e66..000000000 --- a/mdk-stage1/dietlibc/lib/strcmp.c +++ /dev/null @@ -1,16 +0,0 @@ -#include "dietfeatures.h" - -int strcmp(register const char *s,register const char *t) { - register char x; - - for (;;) { - x = *s; if (x != *t) break; if (!x) break; ++s; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - x = *s; if (x != *t) break; if (!x) break; ++s; ++t; - x = *s; if (x != *t) break; if (!x) break; ++s; ++t; - x = *s; if (x != *t) break; if (!x) break; ++s; ++t; -#endif - } - return ((int)(unsigned int)(unsigned char) x) - - ((int)(unsigned int)(unsigned char) *t); -} diff --git a/mdk-stage1/dietlibc/lib/strcpy.c b/mdk-stage1/dietlibc/lib/strcpy.c deleted file mode 100644 index 49693c30d..000000000 --- a/mdk-stage1/dietlibc/lib/strcpy.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "dietfeatures.h" - -char* strcpy(register char* s,register const char* t) -{ - char *dest=s; - for (;;) { - if (!(*s = *t)) return dest; ++s; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (!(*s = *t)) return dest; ++s; ++t; - if (!(*s = *t)) return dest; ++s; ++t; - if (!(*s = *t)) return dest; ++s; ++t; -#endif - } -} - diff --git a/mdk-stage1/dietlibc/lib/strcspn.c b/mdk-stage1/dietlibc/lib/strcspn.c deleted file mode 100644 index 37053c72c..000000000 --- a/mdk-stage1/dietlibc/lib/strcspn.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -size_t strcspn(const char *s, const char *reject) -{ - size_t l=0; - int a=1,i,al=strlen(reject); - - while((a)&&(*s)) - { - for(i=0;(a)&&(i -#include - -char *strdup(const char *s) { - char *tmp=(char *)malloc(strlen(s)+1); - if (!tmp) return 0; - strcpy(tmp,s); - return tmp; -} diff --git a/mdk-stage1/dietlibc/lib/strerror.c b/mdk-stage1/dietlibc/lib/strerror.c deleted file mode 100644 index f15b86aae..000000000 --- a/mdk-stage1/dietlibc/lib/strerror.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -extern char *sys_errlist[]; -extern int sys_nerr; - -char *strerror(int errnum) { - if (errnum>=0 && errnum - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: strlcat.c,v 1.2 1999/06/17 16:28:58 millert Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include - -/* - * Appends src to string dst of size siz (unlike strncat, siz is the - * full size of dst, not space left). At most siz-1 characters - * will be copied. Always NUL terminates (unless siz == 0). - * Returns strlen(initial dst) + strlen(src); if retval >= siz, - * truncation occurred. - */ -size_t strlcat(dst, src, siz) - char *dst; - const char *src; - size_t siz; -{ - register char *d = dst; - register const char *s = src; - register size_t n = siz; - size_t dlen; - - /* Find the end of dst and adjust bytes left but don't go past end */ - while (*d != '\0' && n-- != 0) - d++; - dlen = d - dst; - n = siz - dlen; - - if (n == 0) - return(dlen + strlen(s)); - while (*s != '\0') { - if (n != 1) { - *d++ = *s; - n--; - } - s++; - } - *d = '\0'; - - return(dlen + (s - src)); /* count does not include NUL */ -} diff --git a/mdk-stage1/dietlibc/lib/strlcpy.3 b/mdk-stage1/dietlibc/lib/strlcpy.3 deleted file mode 100644 index e00af8d6b..000000000 --- a/mdk-stage1/dietlibc/lib/strlcpy.3 +++ /dev/null @@ -1,169 +0,0 @@ -.\" $OpenBSD: strlcpy.3,v 1.10 2000/11/06 01:03:25 aaron Exp $ -.\" -.\" Copyright (c) 1998, 2000 Todd C. Miller -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. The name of the author may not be used to endorse or promote products -.\" derived from this software without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, -.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -.\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -.\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -.\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -.\" -.Dd June 22, 1998 -.Dt STRLCPY 3 -.Os -.Sh NAME -.Nm strlcpy , -.Nm strlcat -.Nd size-bounded string copying and concatenation -.Sh SYNOPSIS -.Fd #include -.Ft size_t -.Fn strlcpy "char *dst" "const char *src" "size_t size" -.Ft size_t -.Fn strlcat "char *dst" "const char *src" "size_t size" -.Sh DESCRIPTION -The -.Fn strlcpy -and -.Fn strlcat -functions copy and concatenate strings respectively. -They are designed -to be safer, more consistent, and less error prone replacements for -.Xr strncpy 3 -and -.Xr strncat 3 . -Unlike those functions, -.Fn strlcpy -and -.Fn strlcat -take the full size of the buffer (not just the length) and guarantee to -NUL-terminate the result (as long as -.Fa size -is larger than 0 or, in the case of -.Fn strlcat , -as long as there is at least one byte free in -.Fa dst ) . -Note that you should include a byte for the NUL in -.Fa size . -Also note that -.Fn strlcpy -and -.Fn strlcat -only operate on true -.Dq C -strings. -This means that for -.Fn strlcpy -.Fa src -must be NUL-terminated and for -.Fn strlcat -both -.Fa src -and -.Fa dst -must be NUL-terminated. -.Pp -The -.Fn strlcpy -function copies up to -.Fa size -- 1 characters from the NUL-terminated string -.Fa src -to -.Fa dst , -NUL-terminating the result. -.Pp -The -.Fn strlcat -function appends the NUL-terminated string -.Fa src -to the end of -.Fa dst . -It will append at most -.Fa size -- strlen(dst) - 1 bytes, NUL-terminating the result. -.Sh RETURN VALUES -The -.Fn strlcpy -and -.Fn strlcat -functions return the total length of the string they tried to create. -For -.Fn strlcpy -that means the length of -.Fa src . -For -.Fn strlcat -that means the initial length of -.Fa dst -plus -the length of -.Fa src . -While this may seem somewhat confusing it was done to make -truncation detection simple. -.Sh EXAMPLES -The following code fragment illustrates the simple case: -.Bd -literal -offset indent -char *s, *p, buf[BUFSIZ]; - -\&... - -(void)strlcpy(buf, s, sizeof(buf)); -(void)strlcat(buf, p, sizeof(buf)); -.Ed -.Pp -To detect truncation, perhaps while building a pathname, something -like the following might be used: -.Bd -literal -offset indent -char *dir, *file, pname[MAXPATHLEN]; - -\&... - -if (strlcpy(pname, dir, sizeof(pname)) >= sizeof(pname)) - goto toolong; -if (strlcat(pname, file, sizeof(pname)) >= sizeof(pname)) - goto toolong; -.Ed -.Pp -Since we know how many characters we copied the first time, we can -speed things up a bit by using a copy instead of an append: -.Bd -literal -offset indent -char *dir, *file, pname[MAXPATHLEN]; -size_t n; - -\&... - -n = strlcpy(pname, dir, sizeof(pname)); -if (n >= sizeof(pname)) - goto toolong; -if (strlcpy(pname + n, file, sizeof(pname) - n) >= sizeof(pname) - n) - goto toolong; -.Ed -.Pp -However, one may question the validity of such optimizations, as they -defeat the whole purpose of -.Fn strlcpy -and -.Fn strlcat . -As a matter of fact, the first version of this manual page got it wrong. -.Sh SEE ALSO -.Xr snprintf 3 , -.Xr strncat 3 , -.Xr strncpy 3 diff --git a/mdk-stage1/dietlibc/lib/strlcpy.c b/mdk-stage1/dietlibc/lib/strlcpy.c deleted file mode 100644 index b935b9527..000000000 --- a/mdk-stage1/dietlibc/lib/strlcpy.c +++ /dev/null @@ -1,68 +0,0 @@ -/* $OpenBSD: strlcpy.c,v 1.3 1999/04/24 01:17:37 millert Exp $ */ - -/* - * Copyright (c) 1998 Todd C. Miller - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: strlcpy.c,v 1.3 1999/04/24 01:17:37 millert Exp $"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include - -/* - * Copy src to string dst of size siz. At most siz-1 characters - * will be copied. Always NUL terminates (unless siz == 0). - * Returns strlen(src); if retval >= siz, truncation occurred. - */ -size_t strlcpy(dst, src, siz) - char *dst; - const char *src; - size_t siz; -{ - register char *d = dst; - register const char *s = src; - register size_t n = siz; - - /* Copy as many bytes as will fit */ - if (n != 0 && --n != 0) { - do { - if ((*d++ = *s++) == 0) - break; - } while (--n != 0); - } - - /* Not enough room in dst, add NUL and traverse rest of src */ - if (n == 0) { - if (siz != 0) - *d = '\0'; /* NUL-terminate dst */ - while (*s++) - ; - } - - return(s - src - 1); /* count does not include NUL */ -} diff --git a/mdk-stage1/dietlibc/lib/strlen.c b/mdk-stage1/dietlibc/lib/strlen.c deleted file mode 100644 index 56c085dac..000000000 --- a/mdk-stage1/dietlibc/lib/strlen.c +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include "dietfeatures.h" -#include - -#ifdef WANT_SMALL_STRING_ROUTINES -size_t strlen(const char *s) { - register int i; - if (!s) return 0; - for (i=0; *s; ++s) ++i; - return i; -} -#else -static const unsigned long magic = 0x01010101; - -size_t strlen(const char *s) -{ - const char *t = s; - unsigned long word; - - if (!s) return 0; - - /* Byte compare up until word boundary */ - for (; ((unsigned long) t & 3); t++) - if (!*t) return t - s; - - /* Word compare */ - do { - word = *((unsigned long *) t); t += 4; - word = (word - magic) &~ word; - word &= (magic << 7); - } while (word == 0); - -#if BYTE_ORDER == LITTLE_ENDIAN - /* word & 0x80808080 == word */ - word = (word - 1) & (magic << 10); - word += (word << 8) + (word << 16); - t += word >> 26; -#else - if ((word & 0x80800000) == 0) { - word <<= 16; - t += 2; - } - if ((word & 0x80000000) == 0) t += 1; -#endif - return ((const char *) t) - 4 - s; -} -#endif diff --git a/mdk-stage1/dietlibc/lib/strncasecmp.c b/mdk-stage1/dietlibc/lib/strncasecmp.c deleted file mode 100644 index 8a5445e53..000000000 --- a/mdk-stage1/dietlibc/lib/strncasecmp.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include - -int strncasecmp(const char *s, const char *t, size_t n) { - register char x; - register const char* u=s+n; - for (;;) { - x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t; - x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t; - x = tolower(*s); if (x!=tolower(*t)) break; if (!x) break; if (++s>=u) return 0; ++t; -#endif - } - return ((int)(unsigned int)(unsigned char) x) - - ((int)(unsigned int)(unsigned char) *t); -} diff --git a/mdk-stage1/dietlibc/lib/strncat.c b/mdk-stage1/dietlibc/lib/strncat.c deleted file mode 100644 index a08e97916..000000000 --- a/mdk-stage1/dietlibc/lib/strncat.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "dietfeatures.h" -#include - -#ifdef WANT_NON_COMPLIANT_STRNCAT -/* this implementation is not standards compliant. - * the standard says that strncat(dest,"foobar",3) should write 'f', 'o' - * and 'o'. The programmer is then expected to overwrite the last byte - * with '\0', which is often forgotten. This implementation makes sure - * the last written bytes is always '\0'. */ -#endif - -char *strncat(char *s, const char *t, size_t n) { - char *dest=s; - register char *max; - s+=strlen(s); -#ifdef WANT_NON_COMPLIANT_STRNCAT - max=s+n-1; -#else - max=s+n; -#endif - for (;;) { - if (!(*s = *t)) break; if (++s==max) break; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (!(*s = *t)) break; if (++s==max) break; ++t; - if (!(*s = *t)) break; if (++s==max) break; ++t; - if (!(*s = *t)) break; if (++s==max) break; ++t; -#endif - } - *s=0; - return dest; -} diff --git a/mdk-stage1/dietlibc/lib/strncmp.c b/mdk-stage1/dietlibc/lib/strncmp.c deleted file mode 100644 index 7c08c0fa7..000000000 --- a/mdk-stage1/dietlibc/lib/strncmp.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int strncmp(const char *s1, const char *s2, size_t n) { - return memccmp(s1,s2,0,n); -} diff --git a/mdk-stage1/dietlibc/lib/strncpy.c b/mdk-stage1/dietlibc/lib/strncpy.c deleted file mode 100644 index 531387b7f..000000000 --- a/mdk-stage1/dietlibc/lib/strncpy.c +++ /dev/null @@ -1,10 +0,0 @@ -#define _POSIX_SOURCE -#define _XOPEN_SOURCE -#include -#include - -char *strncpy(char *dest, const char *src, size_t n) -{ - memccpy(dest,src,0,n); - return dest; -} diff --git a/mdk-stage1/dietlibc/lib/strpbrk.c b/mdk-stage1/dietlibc/lib/strpbrk.c deleted file mode 100644 index e18fd2a2d..000000000 --- a/mdk-stage1/dietlibc/lib/strpbrk.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -char *strpbrk(const char *s, const char *accept) { - register int i,l=strlen(accept); - for (; *s; s++) - for (i=0; i -#include "dietfeatures.h" - -char *strrchr(const char *t, int c) { - register char ch; - register const char *l=0; - - ch = c; - for (;;) { - if (*t == ch) l=t; if (!*t) return (char*)l; ++t; -#ifndef WANT_SMALL_STRING_ROUTINES - if (*t == ch) l=t; if (!*t) return (char*)l; ++t; - if (*t == ch) l=t; if (!*t) return (char*)l; ++t; - if (*t == ch) l=t; if (!*t) return (char*)l; ++t; -#endif - } - return (char*)l; -} - -char *rindex(const char *t,int c) __attribute__((weak,alias("strrchr"))); diff --git a/mdk-stage1/dietlibc/lib/strsep.c b/mdk-stage1/dietlibc/lib/strsep.c deleted file mode 100644 index a1bf1872a..000000000 --- a/mdk-stage1/dietlibc/lib/strsep.c +++ /dev/null @@ -1,16 +0,0 @@ -#include - -char *strsep(char **stringp, const char *delim) { - register char *tmp=*stringp; - register char *tmp2=tmp; - register const char *tmp3; - for (tmp2=tmp; *tmp2; ++tmp2) { - for (tmp3=delim; *tmp3; ++tmp3) - if (*tmp2==*tmp3) { /* delimiter found */ - *tmp2=0; - *stringp=tmp2+1; - return tmp; - } - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/strspn.c b/mdk-stage1/dietlibc/lib/strspn.c deleted file mode 100644 index 2b3a4c116..000000000 --- a/mdk-stage1/dietlibc/lib/strspn.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -size_t strspn(const char *s, const char *accept) -{ - size_t l=0; - int a=1,i,al=strlen(accept); - - while((a)&&(*s)) - { - for(a=i=0;(!a)&&(i -#include - -char *strstr(const char *haystack, const char *needle) { - int nl=strlen(needle); - int hl=strlen(haystack); - int i; - if (nl>hl) return 0; - for (i=hl-nl+1; i; --i) { - if (!memcmp(haystack,needle,nl)) - return (char*)haystack; - ++haystack; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/lib/strtod.c b/mdk-stage1/dietlibc/lib/strtod.c deleted file mode 100644 index cbe983d84..000000000 --- a/mdk-stage1/dietlibc/lib/strtod.c +++ /dev/null @@ -1,52 +0,0 @@ -#include - -extern char isspace(char c); - -#ifdef __GNUC__ -static inline char isdigit(char c) { return (c>='0' && c<='9'); } -#endif - -double strtod(const char *nptr, char **endptr) { - double d=0; - register const char *c=nptr; - char neg=0; - while (*c && isspace(*c)) ++c; - switch (*c) { - case '-': neg=1; - case '+': c++; break; - default: break; - } - while (isdigit(*c)) { - d=d*10+(*c-'0'); - ++c; - } - if (*c=='.') { - double factor=.1; - while (isdigit(*++c)) { - d=d+(factor*(*c-'0')); - factor/=10; - } - } - if ((*c|32)=='e') { - int exp=0; - double factor=10; - if (c[1]<'0') { - switch (c[1]) { - case '-': factor=0.1; - case '+': c++; break; - default: - d=0; - c=nptr; - goto done; - } - } - while (isdigit(*++c)) - exp=exp*10+(*c-'0'); - while (exp) { /* XXX: this introduces rounding errors */ - d*=factor; --exp; - } - } -done: - if (endptr) *endptr=(char*)c; - return d; -} diff --git a/mdk-stage1/dietlibc/lib/strtok.c b/mdk-stage1/dietlibc/lib/strtok.c deleted file mode 100644 index 86337da7b..000000000 --- a/mdk-stage1/dietlibc/lib/strtok.c +++ /dev/null @@ -1,8 +0,0 @@ -char *strtok_r(char *s, const char *delim, char **ptrptr); - -static char *strtok_pos; - -char *strtok(char *s, const char *delim) -{ - return strtok_r(s,delim,&strtok_pos); -} diff --git a/mdk-stage1/dietlibc/lib/strtok_r.c b/mdk-stage1/dietlibc/lib/strtok_r.c deleted file mode 100644 index 93f9401de..000000000 --- a/mdk-stage1/dietlibc/lib/strtok_r.c +++ /dev/null @@ -1,21 +0,0 @@ -#include - -char *strtok_r(char *s, const char *delim, char **ptrptr) -{ - int i; - char *tmp=0; - - if (s) (*ptrptr)=s; - - if (**ptrptr) - { - while(!(i=strcspn(*ptrptr,delim))) (*ptrptr)++; - if (**ptrptr) - { - tmp=(*ptrptr); - (*ptrptr)+=i; - if (**ptrptr) *(*ptrptr)++=0; - } - } - return tmp; -} diff --git a/mdk-stage1/dietlibc/lib/strtol.c b/mdk-stage1/dietlibc/lib/strtol.c deleted file mode 100644 index ead89f408..000000000 --- a/mdk-stage1/dietlibc/lib/strtol.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -extern unsigned long int strtoul(const char *nptr, char **endptr, int base); - -long int strtol(const char *nptr, char **endptr, int base) -{ - int neg=0; - unsigned long int v; - - while(isspace(*nptr)) nptr++; - - if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; } - v=strtoul(nptr,endptr,base); - return (neg?-v:v); -} diff --git a/mdk-stage1/dietlibc/lib/strtoll.c b/mdk-stage1/dietlibc/lib/strtoll.c deleted file mode 100644 index 7b8e28a1d..000000000 --- a/mdk-stage1/dietlibc/lib/strtoll.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -extern unsigned long int strtoull(const char *nptr, char **endptr, int base); - -long int strtoll(const char *nptr, char **endptr, int base) -{ - int neg=0; - unsigned long long int v; - - while(isspace(*nptr)) nptr++; - - if (*nptr == '-' && isdigit(nptr[1])) { neg=-1; nptr++; } - v=strtoull(nptr,endptr,base); - return (neg?-v:v); -} diff --git a/mdk-stage1/dietlibc/lib/strtoul.c b/mdk-stage1/dietlibc/lib/strtoul.c deleted file mode 100644 index 3f93962a9..000000000 --- a/mdk-stage1/dietlibc/lib/strtoul.c +++ /dev/null @@ -1,32 +0,0 @@ -#include - -/* static char *num="0123456789abcdefghijklmnopqrstuvwxyz"; */ - -unsigned long int strtoul(const char *nptr, char **endptr, int base) -{ - long int v=0; - - while(isspace(*nptr)) ++nptr; - - if (*nptr == '+') ++nptr; - if (!base) { - if (*nptr=='0') { - base=8; - if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) { - nptr+=2; - base=16; - } - } - else - base=10; - } - while(*nptr) { - register unsigned char c=*nptr; - c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c-'0'); - if (c>=base) break; - v=v*base+c; - ++nptr; - } - if (endptr) *endptr=(char *)nptr; - return v; -} diff --git a/mdk-stage1/dietlibc/lib/strtoull.c b/mdk-stage1/dietlibc/lib/strtoull.c deleted file mode 100644 index 40818958d..000000000 --- a/mdk-stage1/dietlibc/lib/strtoull.c +++ /dev/null @@ -1,30 +0,0 @@ -#include - -unsigned long long int strtoull(const char *nptr, char **endptr, int base) -{ - long long int v=0; - - while(isspace(*nptr)) ++nptr; - - if (*nptr == '+') ++nptr; - if (!base) { - if (*nptr=='0') { - base=8; - if ((*(nptr+1)=='x')||(*(nptr+1)=='X')) { - nptr+=2; - base=16; - } - } - else - base=10; - } - while(*nptr) { - register unsigned char c=*nptr; - c=(c>='a'?c-'a'+10:c>='A'?c-'A'+10:c-'0'); - if (c>=base) break; - v=v*base+c; - ++nptr; - } - if (endptr) *endptr=(char *)nptr; - return v; -} diff --git a/mdk-stage1/dietlibc/lib/sys_siglist.c b/mdk-stage1/dietlibc/lib/sys_siglist.c deleted file mode 100644 index 80d7b3fb0..000000000 --- a/mdk-stage1/dietlibc/lib/sys_siglist.c +++ /dev/null @@ -1,37 +0,0 @@ -const char *const sys_siglist[] = - { - "Signal 0", - "Hangup", - "Interrupt", - "Quit", - "Illegal instruction", - "Trace/breakpoint trap", - "IOT trap", - "EMT trap", - "Floating point exception", - "Killed", - "Bus error", - "Segmentation fault", - "Bad system call", - "Broken pipe", - "Alarm clock", - "Terminated", - "Urgent I/O condition", - "Stopped (signal)", - "Stopped", - "Continued", - "Child exited", - "Stopped (tty input)", - "Stopped (tty output)", - "I/O possible", - "CPU time limit exceeded", - "File size limit exceeded", - "Virtual timer expired", - "Profiling timer expired", - "Window changed", - "Resource lost", - "User defined signal 1", - "User defined signal 2", - 0 - }; - diff --git a/mdk-stage1/dietlibc/lib/tcdrain.c b/mdk-stage1/dietlibc/lib/tcdrain.c deleted file mode 100644 index 7a760f643..000000000 --- a/mdk-stage1/dietlibc/lib/tcdrain.c +++ /dev/null @@ -1,8 +0,0 @@ -#include - -int __libc_tcdrain(int fd) -{ - return ioctl(fd, TCSBRK, 1); -} - -int tcdrain(int fd) __attribute__((weak,alias("__libc_tcdrain"))); diff --git a/mdk-stage1/dietlibc/lib/tcflush.c b/mdk-stage1/dietlibc/lib/tcflush.c deleted file mode 100644 index a19fe11d1..000000000 --- a/mdk-stage1/dietlibc/lib/tcflush.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include - -#include - -extern int errno; - -/* Flush pending data on FD. */ -int tcflush(int fd, int queue_selector) -{ - switch (queue_selector) { - case TCIFLUSH: - return ioctl(fd, TCFLSH, 0); - case TCOFLUSH: - return ioctl(fd, TCFLSH, 1); - case TCIOFLUSH: - return ioctl(fd, TCFLSH, 2); - default: - errno = EINVAL; - return -1; - } -} diff --git a/mdk-stage1/dietlibc/lib/tcgetattr.c b/mdk-stage1/dietlibc/lib/tcgetattr.c deleted file mode 100644 index f35d39442..000000000 --- a/mdk-stage1/dietlibc/lib/tcgetattr.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -int tcgetattr(int fildes, struct termios *termios_p) -{ - return ioctl(fildes, TCGETS, termios_p); -} diff --git a/mdk-stage1/dietlibc/lib/tcgetpgrp.c b/mdk-stage1/dietlibc/lib/tcgetpgrp.c deleted file mode 100644 index f2a290651..000000000 --- a/mdk-stage1/dietlibc/lib/tcgetpgrp.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -int tcgetpgrp(int fildes) -{ - return ioctl(fildes, TIOCGPGRP); -} diff --git a/mdk-stage1/dietlibc/lib/tcsetattr.c b/mdk-stage1/dietlibc/lib/tcsetattr.c deleted file mode 100644 index cf70354d2..000000000 --- a/mdk-stage1/dietlibc/lib/tcsetattr.c +++ /dev/null @@ -1,27 +0,0 @@ -#define tcsetattr libc_tcsetattr -#include -#include -#undef tcsetattr - -#include - -extern int errno; - -/* Hack around a kernel bug; value must correspond to the one used in speed.c */ -#define IBAUD0 020000000000 - -int tcsetattr(int fildes, int optional_actions, struct termios *termios_p) -{ - termios_p->c_iflag &= ~IBAUD0; - switch (optional_actions) { - case TCSANOW: - return ioctl(fildes, TCSETS, termios_p); - case TCSADRAIN: - return ioctl(fildes, TCSETSW, termios_p); - case TCSAFLUSH: - return ioctl(fildes, TCSETSF, termios_p); - default: - errno = EINVAL; - return -1; - } -} diff --git a/mdk-stage1/dietlibc/lib/tcsetpgrp.c b/mdk-stage1/dietlibc/lib/tcsetpgrp.c deleted file mode 100644 index 6c40b5c79..000000000 --- a/mdk-stage1/dietlibc/lib/tcsetpgrp.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -int tcsetpgrp(int fildes, pid_t pgrpid) -{ - return ioctl(fildes, TIOCSPGRP, &pgrpid); -} diff --git a/mdk-stage1/dietlibc/lib/telldir.c b/mdk-stage1/dietlibc/lib/telldir.c deleted file mode 100644 index 58be5d034..000000000 --- a/mdk-stage1/dietlibc/lib/telldir.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "dietdirent.h" -#include -#include - -off_t telldir(DIR *d) { - return lseek(d->fd,0,SEEK_CUR)-d->num+d->cur; -} diff --git a/mdk-stage1/dietlibc/lib/tolower.c b/mdk-stage1/dietlibc/lib/tolower.c deleted file mode 100644 index 4b7c7cf2d..000000000 --- a/mdk-stage1/dietlibc/lib/tolower.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -inline int tolower(int c) { - return (c>='A' && c<='Z')?c-'A'+'a':c; -} - diff --git a/mdk-stage1/dietlibc/lib/toupper.c b/mdk-stage1/dietlibc/lib/toupper.c deleted file mode 100644 index c048e60bb..000000000 --- a/mdk-stage1/dietlibc/lib/toupper.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -inline int toupper(int c) { - return (c>='a' && c<='z')?c-'a'+'A':c; -} - diff --git a/mdk-stage1/dietlibc/lib/ttyname.c b/mdk-stage1/dietlibc/lib/ttyname.c deleted file mode 100644 index a6b479088..000000000 --- a/mdk-stage1/dietlibc/lib/ttyname.c +++ /dev/null @@ -1,59 +0,0 @@ -#include "dietfeatures.h" -#include -#include - -#ifdef __linux__ - -extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase); - -char *ttyname(int fd) { -#ifdef SLASH_PROC_OK - char ibuf[20]; - static char obuf[20]; - strcpy(ibuf,"/proc/self/fd/"); - ibuf[__ltostr(ibuf+14,6,fd,10,0)+14]=0; - if (readlink(ibuf,obuf,sizeof(obuf)-1)<0) return 0; - return obuf; -#else - static char buf[20]="/dev/tty"; - struct stat s; - char *c=buf+8; - int n; - if (fstat(fd,&s)) return 0; - if (S_ISCHR(s.st_mode)) { - n=minor(s.st_rdev); - switch (major(s.st_rdev)) { - case 4: - buf[5]='t'; buf[7]='y'; - if (n>63) { - n-=64; - *c='S'; - ++c; - } -num: - c[__ltostr(c,6,n,10,0)]=0; - break; - case 2: - buf[5]='p'; buf[7]='y'; - buf[8]='p'-(n>>4); - buf[9]=n%4+'0'; - if (buf[9]>'9') *c+='a'-'0'; - buf[10]=0; - case 136: - case 137: - case 138: - case 139: - buf[5]='p'; buf[7]='s'; - n+=(major(s.st_rdev)-136)<<8; - *c='/'; ++c; - goto num; - default: - return 0; - } - return buf; - } - return 0; -#endif -} - -#endif diff --git a/mdk-stage1/dietlibc/lib/usleep.c b/mdk-stage1/dietlibc/lib/usleep.c deleted file mode 100644 index 494f99233..000000000 --- a/mdk-stage1/dietlibc/lib/usleep.c +++ /dev/null @@ -1,12 +0,0 @@ -#include -#include - -/* nano * 1000 == usecs - * usecs * 1000 == msecs - * msecs * 1000 = secs */ -void usleep(unsigned int usecs) { - struct timespec t; - t.tv_sec=usecs/1000000; - t.tv_nsec=(usecs%1000000)*1000; - nanosleep(&t,&t); -} diff --git a/mdk-stage1/dietlibc/lib/vfork.c b/mdk-stage1/dietlibc/lib/vfork.c deleted file mode 100644 index 795cddb05..000000000 --- a/mdk-stage1/dietlibc/lib/vfork.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -pid_t vfork(void) { - return fork(); -} diff --git a/mdk-stage1/dietlibc/lib/vfprintf.c b/mdk-stage1/dietlibc/lib/vfprintf.c deleted file mode 100644 index c33a2404b..000000000 --- a/mdk-stage1/dietlibc/lib/vfprintf.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include -#include "dietstdarg.h" - -int vfprintf(FILE *fstream, const char *format, va_list ap) -{ - char *tmp; - va_list cp_ap; - size_t n = 0; - - va_copy(cp_ap, ap); - n=vsnprintf(0, 1000000, format, cp_ap); - tmp=alloca(n+2); - vsnprintf(tmp, n+1, format, ap); - fwrite(tmp, n,1, fstream); - return n; -} - diff --git a/mdk-stage1/dietlibc/lib/vprintf.c b/mdk-stage1/dietlibc/lib/vprintf.c deleted file mode 100644 index 46ecc47a4..000000000 --- a/mdk-stage1/dietlibc/lib/vprintf.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include -#include - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int vprintf(const char *format, va_list ap) -{ - char tmp[1000000]; - size_t n = vsnprintf(tmp, sizeof(tmp), format, ap); - write(1, tmp, n); - return n; -} diff --git a/mdk-stage1/dietlibc/lib/vsnprintf.c b/mdk-stage1/dietlibc/lib/vsnprintf.c deleted file mode 100644 index f425066e3..000000000 --- a/mdk-stage1/dietlibc/lib/vsnprintf.c +++ /dev/null @@ -1,238 +0,0 @@ -#include "dietfeatures.h" -#include -#include -#include -#include -#include "dietwarning.h" - -extern int __ltostr(char *s, int size, unsigned long i, int base, char UpCase); -extern int __dtostr(double d,char *buf,int maxlen,int prec); - -int vsnprintf (char *str, size_t size, const char *format, va_list arg_ptr) -{ - size_t apos,i; - char ch,buf[1024]; - char *pb; - char flag_in_sign; - char flag_hash,flag_zero,flag_left,flag_space,flag_sign,flag_dot,flag_long; - long number,width,preci,buf_len,pad; - char padwith; - - size--; - - apos=0; - while (apos=size) continue; /* ARGL !!! */ - - ch=*format++; - switch (ch) - { -/* Format end ?!? */ - case 0: - return -1; - break; - -/* Format flag chars */ - case '#': - flag_hash=1; - goto inn_vsnprintf; - - case 'l': - ++flag_long; - goto inn_vsnprintf; - - case '0': - padwith='0'; - goto inn_vsnprintf; - - case '-': - flag_left=1; - goto inn_vsnprintf; - - case ' ': - flag_space=1; - goto inn_vsnprintf; - - case '+': - flag_sign=1; - goto inn_vsnprintf; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if(flag_dot) return -1; - width=strtol(--format,&pb,10); - format=pb; - goto inn_vsnprintf; - - case '*': - width=va_arg(arg_ptr,int); - goto inn_vsnprintf; - - case '.': - flag_dot=1; - if (*format=='*') { - preci=va_arg(arg_ptr,int); - ++format; - } else { - preci=strtol(format,&pb,10); - format=pb; - } - goto inn_vsnprintf; - -/* Format conversion chars */ - case 'c': - ch=(char)va_arg(arg_ptr,int); - case '%': - if (str) str[apos]=ch; ++apos; - break; - - case 's': - pb=va_arg(arg_ptr,char *); -#ifdef WANT_NULL_PRINTF - if (!pb) pb="(null)"; -#endif - buf_len=strlen(pb); - if (flag_dot && buf_len>preci) buf_len=preci; - if (buf_len>size-apos) buf_len=size-apos; - -print_out: - if (str) { - if (width && (!flag_left)) - { - for (pad=width-buf_len; pad>0; --pad) str[apos++]=padwith; - } - for(i=0;i0; --pad) str[apos++]=padwith; - } - } else { - if (width) { - apos+=width>buf_len?width:buf_len; - } else { - apos+=size>buf_len?buf_len:size; - } - } - - break; - - /* Numbers */ - case 'b': - i=2; - goto num_vsnprintf; - case 'p': - flag_hash=1; - width=sizeof(void *)<<1; - padwith='0'; - ch='x'; - case 'X': - case 'x': - i=16; - if (flag_hash) - { - if (str) { - str[apos++]='0'; - str[apos++]=ch; - } else - apos+=2; - } - goto num_vsnprintf; - case 'd': - case 'i': - flag_in_sign=1; - case 'u': - i=10; - goto num_vsnprintf; - case 'o': - i=8; - if (flag_hash) { if (str) str[apos]='0'; ++apos; } - -num_vsnprintf: - if (apos>=size) continue; /* ARGL !!! */ - - if (flag_long) - number=va_arg(arg_ptr,long); - else - number=va_arg(arg_ptr,int); - - if (flag_in_sign && (number<0)) - { - number*=-1; - flag_in_sign=2; - } - - buf_len=__ltostr(buf+1,sizeof(buf)-1,(unsigned long) number,i,0); - pb=buf+1; - - if (flag_in_sign==2) - { - *(--pb)='-'; - buf_len++; - } - else if ((flag_in_sign)&&(flag_sign || flag_space)) - { - *(--pb)=(flag_sign)?'+':' '; - buf_len++; - } - goto print_out; - -#ifdef WANT_FLOATING_POINT_IN_PRINTF - case 'f': - case 'g': - { - double d=va_arg(arg_ptr,double); - buf_len=__dtostr(d,buf,sizeof(buf),width?width:6); - if (flag_dot) { - char *tmp; - if ((tmp=strchr(buf,'.'))) { - while (preci>-1 && *++tmp) --preci; - *tmp=0; - } - } - pb=buf; - goto print_out; - } -#endif - default: - break; - } - break; - case 0: - if (str) str[apos]=0; - return apos; - default: - if (str) str[apos]=ch; apos++; - break; - } - } - if (str) str[apos]=0; - return apos; -} - -link_warning("vsnprintf","warning: the printf functions add several kilobytes of bloat.") - diff --git a/mdk-stage1/dietlibc/lib/vsprintf.c b/mdk-stage1/dietlibc/lib/vsprintf.c deleted file mode 100644 index 10ff04bd7..000000000 --- a/mdk-stage1/dietlibc/lib/vsprintf.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int vsprintf(char *dest,const char *format, va_list arg_ptr) -{ - return vsnprintf(dest,1000000,format,arg_ptr); -} diff --git a/mdk-stage1/dietlibc/lib/vsscanf.c b/mdk-stage1/dietlibc/lib/vsscanf.c deleted file mode 100644 index 1c4c9b787..000000000 --- a/mdk-stage1/dietlibc/lib/vsscanf.c +++ /dev/null @@ -1,304 +0,0 @@ -#include "dietfeatures.h" -#include -#include -#include -#include -#include - -const char *skip_ws(const char *str) -{ - while ((*str)&&(isspace(*str))) str++; - return str; -} - -extern double strtod(const char *s,char **f); - -int vsscanf(const char *str, const char *format, va_list arg_ptr) -{ - int n=0,div; - unsigned char ch; - - char flag_discard, flag_malloc, flag_half, flag_long, flag_longlong; - char flag_width; - - unsigned long width; - - /* arg_ptr tmps */ -#ifdef WANT_FLOATING_POINT_IN_SCANF - double d,*pd; - float *pf; -#endif - - long l=0,*pl; - short *ph; - int *pi; - char *s; - - while ((*str)&&(*format)) - { - const char *prevfmt=format; - format=skip_ws(format); - ch=*format++; - if (!ch) continue; - - switch (ch) - { - case '%': - div=0; - flag_discard=0; - flag_malloc=0; - flag_half=0; - flag_long=0; - flag_longlong=0; - - flag_width=0; - width=-1; - -inn_vsscanf: - ch=*format++; - - switch (ch) - { - case 0: - return 0; - - case '%': - if (*(str++)!=ch) return n; - break; - - /* flags */ - case '*': - flag_discard=1; - goto inn_vsscanf; - - case 'a': - flag_malloc=1; - goto inn_vsscanf; - - case 'h': - flag_half=1; - goto inn_vsscanf; - - case 'l': - if (flag_long) flag_longlong=1; - flag_long=1; - goto inn_vsscanf; - - /* longlong ? NOT YET ! */ - case 'q': - case 'L': - flag_longlong=1; - goto inn_vsscanf; - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - width=strtol(format-1,&s,10); - format=s; - flag_width=1; - goto inn_vsscanf; - - /* conversion */ - - case 'n': - while (width && *str) - { - *(s++)=*(str++); - --width; - l++; - } - if (!flag_discard) - { - pl=(long *)va_arg(arg_ptr,long*); - *pl=l; - ++n; - } - break; - - case 'p': - case 'X': - case 'x': - div+=6; - case 'd': - div+=2; - case 'o': - div+=8; - case 'u': - case 'i': - if (*(str=skip_ws(str))) - { - l=strtol(str,&s,div); - if (str!=s) - { - if (!flag_discard) - { - if (flag_long) - { - pl=(long *)va_arg(arg_ptr,long*); - *pl=l; - } - else if (flag_half) - { - ph=(short *)va_arg(arg_ptr,short*); - *ph=l; - } - else - { - pi=(int *)va_arg(arg_ptr,int*); - *pi=l; - } - ++n; - } - str=s; - } - else - return n; - } - break; - -#ifdef WANT_FLOATING_POINT_IN_SCANF - case 'e': - case 'E': - case 'f': - case 'g': - if (*(str=skip_ws(str))) - { - d=strtod(str,&s); - if (str!=s) - { - if (!flag_discard) - { - if (flag_long) - { - pd=(double *)va_arg(arg_ptr,double*); - *pd=d; - } - else - { - pf=(float *)va_arg(arg_ptr,float*); - *pf=d; - } - ++n; - } - str=s; - } - else - return n; - } - break; -#endif - - case 'c': - if (!flag_discard) - { - s=(char *)va_arg(arg_ptr,char*); - ++n; - } - if (!flag_width) width=1; - while (width && *str) - { - if (!flag_discard) *(s++)=*(str); - ++str; - --width; - } - break; - - case 's': - if (!flag_discard) - { - s=(char *)va_arg(arg_ptr,char*); - ++n; - } - if (*(str=skip_ws(str))) - { - while (width && (!isspace(*str))) - { - if (!flag_discard) *(s++)=*(str); - if (!*str) break; - ++str; - --width; - } - *s=0; - } - break; - -#ifdef WANT_CHARACTER_CLASSES_IN_SCANF - case '[': - { - char cset[256]; - int flag_not=0; - int flag_dash=0; - memset(cset,0,sizeof(cset)); - ch=*format++; - - /* first char specials */ - if (ch=='^') - { - flag_not=1; - ch=*format++; - } - if ((ch=='-')||(ch==']')) - { - cset[ch]=1; - ch=*format++; - } - - /* almost all non special chars */ - for (;(*format) && (*format!=']');++format) { - if (flag_dash) - { - register unsigned char tmp=*format; - for (;ch<=tmp;++ch) cset[ch]=1; - flag_dash=0; - ch=*(++format); - } - else if (*format=='-') flag_dash=1; - else - { - cset[ch]=1; - ch=*format; - } - } - - /* last char specials */ - if (flag_dash) cset['-']=1; - else cset[ch]=1; - - /* like %c or %s */ - if (!flag_discard) - { - s=(char *)va_arg(arg_ptr,char*); - ++n; - } - while (width && (cset[(unsigned char)(*str)]-flag_not)) - { - if (!flag_discard) *(s++)=*(str); - if (!*str) break; - ++str; - --width; - } - } - break; -#endif - } - break; - - default: - if (prevfmt -#include - -pid_t wait(int *status) { - return waitpid(-1,status,0); -} diff --git a/mdk-stage1/dietlibc/lib/wait3.c b/mdk-stage1/dietlibc/lib/wait3.c deleted file mode 100644 index 19e90740c..000000000 --- a/mdk-stage1/dietlibc/lib/wait3.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -int wait3(int* status,int opts,struct rusage* rusage) { - return wait4(-1,status,opts,rusage); -} diff --git a/mdk-stage1/dietlibc/libcruft/___div.c b/mdk-stage1/dietlibc/libcruft/___div.c deleted file mode 100644 index d359dc47b..000000000 --- a/mdk-stage1/dietlibc/libcruft/___div.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "dietwarning.h" -#include - -div_t div(int numer, int denom) { - div_t temp; - temp.quot=numer/denom; - temp.rem=numer%denom; - return temp; -} - -link_warning("div","warning: your code uses div(), which is completely superfluous!"); diff --git a/mdk-stage1/dietlibc/libcruft/dnscruft.c b/mdk-stage1/dietlibc/libcruft/dnscruft.c deleted file mode 100644 index d7a0efa50..000000000 --- a/mdk-stage1/dietlibc/libcruft/dnscruft.c +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int __dns_fd=-1; - -void __dns_make_fd() { - int tmp; - struct sockaddr_in si; - if (__dns_fd>0) return; - tmp=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); - if (tmp<0) { - perror("__dns_make_fd!socket"); - return; - } - si.sin_family=AF_INET; - si.sin_port=0; - si.sin_addr.s_addr=INADDR_ANY; - if (bind(tmp,(struct sockaddr*)&si,sizeof(si))) { - perror("__dns_make_fd!bind"); - return; - } - __dns_fd=tmp; -} - -int __dns_servers=0; -struct sockaddr __dns_server_ips[8]; - -int __dns_search=0; -char *__dns_domains[8]; - -void __dns_readstartfiles() { - int fd; - char *buf=alloca(4096); - int len; - if (__dns_servers>0) return; - { - struct sockaddr_in to; - char *cacheip=getenv("DNSCACHEIP"); - if (cacheip) { - to.sin_port=htons(53); - to.sin_family=AF_INET; - if (inet_aton(cacheip,&to.sin_addr)) { - memmove(__dns_server_ips,&to,sizeof(struct sockaddr)); - ++__dns_servers; - } - } - } - if ((fd=open("/etc/resolv.conf",O_RDONLY))<0) return; - len=read(fd,buf,4096); - close(fd); - { - char *last=buf+len; - for (; buf=last) break; - *buf=0; - if (inet_aton(tmp,&i.sin_addr)) { - i.sin_family=AF_INET; - i.sin_port=htons(53); - memmove(&__dns_server_ips[__dns_servers],&i,sizeof(struct sockaddr)); - if (__dns_servers<8) ++__dns_servers; - } - } - } - } - if (!strncmp(buf,"search",6) || !strncmp(buf,"domain",6)) { - buf+=6; - } - while (buf0&&*tmp; ) { - if ((*tmp>>6)==3) { /* goofy DNS decompression */ - unsigned int ofs=((unsigned int)(*tmp&0x3f)<<8)|*(tmp+1); - if (ofs>=offset) return -1; /* RFC1035: "pointer to a _prior_ occurrance" */ - if (aftermax) return -1; - for (duh=*tmp; duh>0; --duh) - *dest++=*++tmp; - *dest++='.'; ok=1; - ++tmp; - if (tmp>after) { after=tmp; if (!*tmp) ++after; } - } - } - if (ok) --dest; - *dest=0; - return after-packet; -} diff --git a/mdk-stage1/dietlibc/libcruft/dnscruft2.c b/mdk-stage1/dietlibc/libcruft/dnscruft2.c deleted file mode 100644 index b59207072..000000000 --- a/mdk-stage1/dietlibc/libcruft/dnscruft2.c +++ /dev/null @@ -1,185 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -extern int h_errno; - -static char dnspacket[]="\xfe\xfe\001\000\000\001\000\000\000\000\000\000"; - -extern void __dns_make_fd(); -extern int __dns_fd; - -extern int __dns_servers; -extern struct sockaddr __dns_server_ips[]; - -extern void __dns_readstartfiles(); - -extern int __dns_decodename(unsigned char *packet,int offset,unsigned char *dest,int maxlen); - -/* Oh boy, this interface sucks so badly, there are no words for it. - * Not one, not two, but _three_ error signalling methods! (*h_errnop - * nonzero? return value nonzero? *RESULT zero?) The glibc goons - * really outdid themselves with this one. */ -int __dns_gethostbyx_r(const char* name, struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop, int lookfor) { - int names,ips; - unsigned char *cur; - unsigned char *max; - unsigned char packet[512]; - __dns_make_fd(); - - if (lookfor==1) { - result->h_aliases=(char**)(buf+8*4); - result->h_addrtype=AF_INET; - result->h_length=4; - result->h_addr_list=(char**)buf; - } else { - result->h_aliases=(char**)(buf+8*16); - result->h_addrtype=AF_INET6; - result->h_length=16; - result->h_addr_list=(char**)buf; - } - result->h_aliases[0]=0; - - cur=buf+16*sizeof(char*); - max=buf+buflen; - names=ips=0; - - memmove(packet,dnspacket,12); - *(unsigned short*)packet=rand(); - { - unsigned char* x; - const char* y,* tmp; - x=packet+12; y=name; - while (*y) { - while (*y=='.') ++y; - for (tmp=y; *tmp && *tmp!='.'; ++tmp) ; - *x=tmp-y; - if (!(tmp-y)) break; - ++x; - if (x>=packet+510-(tmp-y)) { *h_errnop=ERANGE; return 1; } - memmove(x,y,tmp-y); - x+=tmp-y; - if (!*tmp) { - *x=0; - break; - } - y=tmp; - } - *++x= 0; *++x= lookfor; /* A */ - *++x= 0; *++x= 1; /* IN */ - ++x; - { - int i; /* current server */ - int j; /* timeout count down */ - struct pollfd duh; - i=0; j=30; - __dns_readstartfiles(); - duh.fd=__dns_fd; - duh.events=POLLIN; - for (j=30; j>0; --j) { - sendto(__dns_fd,packet,x-packet,0,(struct sockaddr*)&(__dns_server_ips[i]),sizeof(struct sockaddr)); - if (++i > __dns_servers) i=0; - if (poll(&duh,1,1) == 1) { - /* read and parse answer */ - unsigned char inpkg[1500]; - /*int len=*/ read(__dns_fd,inpkg,1500); -#if 0 - { - int tft=open("duh",0); - read(tft,inpkg,1500); - close(tft); - } -#endif - /* header, question, answer, authority, additional */ - if (inpkg[0]!=packet[0] || inpkg[1]!=packet[1]) continue; /* wrong ID */ - if ((inpkg[2]&0xf9) != 0x81) continue; /* not answer */ - if ((inpkg[3]&0x0f) != 0) break; /* error */ - tmp=inpkg+12; - { - char name[257]; - unsigned short q=((unsigned short)inpkg[4]<<8)+inpkg[5]; - while (q>0) { - while (*tmp) tmp+=*tmp+1; - tmp+=5; - --q; - } - q=((unsigned short)inpkg[6]<<8)+inpkg[7]; - if (q<1) break; - while (q>0) { - int decofs=__dns_decodename(inpkg,tmp-(char*)inpkg,name,256); - if (decofs<0) break; - tmp=inpkg+decofs; - --q; - if (tmp[0]!=0 || tmp[1]!=lookfor || /* TYPE != A */ - tmp[2]!=0 || tmp[3]!=1) { /* CLASS != IN */ - if (tmp[1]==5) { /* CNAME */ - tmp+=10; - decofs=__dns_decodename(inpkg,tmp-(char*)inpkg,name,256); - if (decofs<0) break; - tmp=inpkg+decofs; - } else - break; - continue; - } - tmp+=10; /* skip type, class, TTL and length */ - { - int slen; - if (lookfor==1 || lookfor==28) /* A or AAAA*/ { - slen=strlen(name); - if (cur+slen+8+(lookfor==28?12:0)>=max) { *h_errnop=NO_RECOVERY; return 1; } - } else if (lookfor==12) /* PTR */ { - decofs=__dns_decodename(inpkg,tmp-(char*)inpkg,name,256); - if (decofs<0) break; - tmp=inpkg+decofs; - slen=strlen(name); - } else - slen=strlen(name); - strcpy(cur,name); - if (names==0) - result->h_name=cur; - else - result->h_aliases[names-1]=cur; - result->h_aliases[names]=0; - ++names; -/* cur+=slen+1; */ - cur+=(slen|3)+1; - result->h_addr_list[ips++] = cur; - if (lookfor==1) /* A */ { - *(int*)cur=*(int*)tmp; - cur+=4; - result->h_addr_list[ips]=0; - } else if (lookfor==28) /* AAAA */ { - { - int i; - for (i=0; i<16; ++i) cur[i]=tmp[i]; - } - cur+=16; - result->h_addr_list[ips]=0; - } - } -/* puts(name); */ - } - } -/* printf("%d answers\n",((unsigned short)inpkg[6]<<8)+inpkg[7]); - printf("ok\n");*/ - *h_errnop=0; - *RESULT=result; - return 0; - } -/*kaputt:*/ - } - } - } - return 1; -} diff --git a/mdk-stage1/dietlibc/libcruft/entlib.c b/mdk-stage1/dietlibc/libcruft/entlib.c deleted file mode 100644 index f88b3f057..000000000 --- a/mdk-stage1/dietlibc/libcruft/entlib.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - * dietlibc/lib/entlib.c - Generic delimited-line parsing library - * - * Copyright 2001 Jeff Garzik - * - * This is a brand new implementation, based on the interface - * described in man-pages-1.34-1mdk man pages package. - */ - - -#include "entlib.h" /* this is our only include */ - - -/* - * __ent_start - * - * Allocates and zeroes the module's state structure, - * and open a handle to /etc/passwd. - * - * Returns -1 on failure and sets errno, or zero for success. - */ - -int __ent_start(const char *pathname, struct __ent_state **st_ref) -{ - struct __ent_state *st; - - if (*st_ref) - return 0; - - st = calloc(1, sizeof(*st)); - if (!st) { - errno = ENOMEM; - return -1; - } - - st->fd = open(pathname, O_RDONLY); - if (st->fd == -1) { - /* errno should have been set by open(2) */ - free(st); - st = NULL; - return -1; - } - - *st_ref = st; - return 0; -} - - -/* - * __ent_get_line - * - * Eliminates a previous line from the buffer, if any. - * Then reads in a new line from /etc/passwd, if necessary. - * - * Returns -1 on failure, or zero for success. - */ - -int __ent_get_line(struct __ent_state *st) -{ - int rc; - - /* overwrite previous line, by shifting the rest - * of the rest to the front of the buffer - */ - if (st->bufptr) { - unsigned int slop = st->buflen - st->bufptr; - memmove(st->ent_buf, &st->ent_buf[st->bufptr], slop); - st->bufptr = 0; - st->buflen = slop; - st->ent_buf[st->buflen] = 0; /* null terminate */ - } - - if (st->buflen == __ENT_BUFSIZ || strchr(st->ent_buf, '\n')) - return 0; - - rc = read(st->fd, &st->ent_buf[st->buflen], __ENT_BUFSIZ - st->buflen); - if (rc < 0) - return -1; - - st->buflen += rc; - if (st->buflen == 0) - return -1; - - return 0; -} - - -/* - * __ent_split - * - * Splits a string into parts based on a delimiter. - * Stops processing when \n is reached also. - * - * Returns -1 on failure, or zero on success. - */ - -int __ent_split(struct __ent_state *st, char **parts, - int n_parts, int delimiter, int require_exact) -{ - char *s = &st->ent_buf[st->bufptr]; - int idx = 0; - - /* empty list */ - if (!*s) { - if (!require_exact) - return 0; - return -1; - } - - /* scan through string, sticking string pointers - * into parts[] as delimiters are found - */ - parts[idx++] = s; - while (*s) { - st->bufptr++; - if (*s == '\n') { - *s = 0; /* null terminate */ - break; - } - if (*s == delimiter) { - *s = 0; /* null terminate */ - /* boundary error: too many delimiters */ - if (idx == n_parts) - return -1; - s++; - parts[idx++] = s; - } else { - s++; - } - } - - if (!require_exact) - return 0; - return (n_parts == idx) ? 0 : -1; -} - - -void __ent_set(struct __ent_state *st) -{ - if (!st) - return; - st->buflen = st->bufptr = 0; - lseek(st->fd, 0, SEEK_SET); -} - - -void __ent_end(struct __ent_state *st) -{ - if (!st) - return; - close(st->fd); - free(st); -} diff --git a/mdk-stage1/dietlibc/libcruft/entlib.h b/mdk-stage1/dietlibc/libcruft/entlib.h deleted file mode 100644 index 2659d542e..000000000 --- a/mdk-stage1/dietlibc/libcruft/entlib.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * dietlibc/lib/entlib.h - Generic delimited-line parsing library header - * - * Copyright 2001 Jeff Garzik - * - * This is a brand new implementation, based on the interface - * described in man-pages-1.34-1mdk man pages package. - */ - -#ifndef __ENTLIB_H -#define __ENTLIB_H - -#include /* for open(2), lseek(2) */ -#include /* for open(2) */ -#include /* for open(2) */ -#include /* for close(2), lseek(2) */ -#include /* for calloc(3), free(3) */ -#include /* for errno */ -#include /* for memmove(3) */ -#include /* for atoi(3) */ -#include /* for the file locations */ - -#include /* for struct passwd */ -#include /* for struct group */ -#include /* for struct spwd */ - -/* should be a multiple of 64 to create decent alignment */ -#define __ENT_BUFSIZ (64 * 2) -#define __ENT_RAW_BUFSIZ (__ENT_BUFSIZ + 2) /* some overlap required */ - -struct __ent_state { - char ent_buf[__ENT_RAW_BUFSIZ]; /* raw file data buffer */ - unsigned int buflen; /* amount of valid data in ent_buf */ - unsigned int bufptr; /* next valid position in ent_buf */ - int fd; /* /etc/passwd file descriptor */ -}; - -extern int __ent_start(const char *pathname, struct __ent_state **st_ref); -extern int __ent_get_line(struct __ent_state *st); -extern int __ent_split(struct __ent_state *st, char **parts, int n_parts, int delimiter, int require_exact); -extern void __ent_set(struct __ent_state *st); -extern void __ent_end(struct __ent_state *st); - -#endif /* __ENTLIB_H */ diff --git a/mdk-stage1/dietlibc/libcruft/getdtablesize.c b/mdk-stage1/dietlibc/libcruft/getdtablesize.c deleted file mode 100644 index 227354714..000000000 --- a/mdk-stage1/dietlibc/libcruft/getdtablesize.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include - -int getdtablesize(void) { - return OPEN_MAX; -} diff --git a/mdk-stage1/dietlibc/libcruft/getgrgid.c b/mdk-stage1/dietlibc/libcruft/getgrgid.c deleted file mode 100644 index 0c223056c..000000000 --- a/mdk-stage1/dietlibc/libcruft/getgrgid.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -struct group *getgrgid(gid_t gid) { - struct group *tmp; - setgrent(); - for (;;) { - tmp=getgrent(); - if (!tmp) return 0; - if (tmp->gr_gid == gid) - return tmp; - } -} diff --git a/mdk-stage1/dietlibc/libcruft/getgrnam.c b/mdk-stage1/dietlibc/libcruft/getgrnam.c deleted file mode 100644 index 1bdbb42a8..000000000 --- a/mdk-stage1/dietlibc/libcruft/getgrnam.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -struct group *getgrnam(const char* name) { - struct group *tmp; - setgrent(); - for (;;) { - tmp=getgrent(); - if (!tmp) return 0; - if (!strcmp(tmp->gr_name,name)) - return tmp; - } -} diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c b/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c deleted file mode 100644 index a4207d44d..000000000 --- a/mdk-stage1/dietlibc/libcruft/gethostbyaddr.c +++ /dev/null @@ -1,38 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern int h_errno; - -struct hostent* gethostbyaddr(const void *addr, socklen_t len, int type) { - static struct hostent hostbuf; - struct hostent *hp; - size_t hstbuflen; - char *tmphstbuf; - int res; - int herr; - - hstbuflen = 1024; - /* Allocate buffer, remember to free it to avoid a memory leakage. */ - tmphstbuf = malloc (hstbuflen); - - while ((res = gethostbyaddr_r (addr, len, type, &hostbuf, tmphstbuf, hstbuflen, - &hp, &herr)) == ERANGE) - { - /* Enlarge the buffer. */ - hstbuflen *= 2; - tmphstbuf = realloc (tmphstbuf, hstbuflen); - } - /* Check for errors. */ - if (res || hp == NULL) - return NULL; - return hp; -} - diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c deleted file mode 100644 index 37174ab13..000000000 --- a/mdk-stage1/dietlibc/libcruft/gethostbyaddr_r.c +++ /dev/null @@ -1,51 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -extern int __dns_gethostbyx_r(const char* name, struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop, int lookfor); - -static int i2a(char* dest,unsigned int x) { - register unsigned int tmp=x; - register int len=0; - if (x>=100) { *dest++=tmp/100+'0'; tmp=tmp%100; ++len; } - if (x>=10) { *dest++=tmp/10+'0'; tmp=tmp%10; ++len; } - *dest++=tmp+'0'; - return len+1; -} - -/* Oh boy, this interface sucks so badly, there are no words for it. - * Not one, not two, but _three_ error signalling methods! (*h_errnop - * nonzero? return value nonzero? *RESULT zero?) The glibc goons - * really outdid themselves with this one. */ -int gethostbyaddr_r(const char* addr, size_t length, int format, - struct hostent* result, char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop) { - if (format==AF_INET) { - char tmpbuf[50]; - char *tmp; - int res; - tmp=tmpbuf+i2a(tmpbuf,(unsigned char)addr[3]); *tmp++='.'; - tmp+=i2a(tmp,(unsigned char)addr[2]); *tmp++='.'; - tmp+=i2a(tmp,(unsigned char)addr[1]); *tmp++='.'; - tmp+=i2a(tmp,(unsigned char)addr[0]); strcpy(tmp,".in-addr.arpa"); - res= __dns_gethostbyx_r(tmpbuf,result,buf+4,buflen-4,RESULT,h_errnop,12); /* 12 == ns_t_ptr */ - if (res==0) { - result->h_addr_list[0]=buf; - result->h_addr_list[1]=buf; - *(int*)buf=*(int*)addr; - } - return res; - } - return 1; -} diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname.c b/mdk-stage1/dietlibc/libcruft/gethostbyname.c deleted file mode 100644 index 5db5bf3c5..000000000 --- a/mdk-stage1/dietlibc/libcruft/gethostbyname.c +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern int h_errno; - -struct hostent* gethostbyname (const char *host) -{ - static struct hostent hostbuf; - struct hostent *hp; - size_t hstbuflen; - char *tmphstbuf; - int res; - int herr; - - hstbuflen = 1024; - /* Allocate buffer, remember to free it to avoid a memory leakage. */ - tmphstbuf = malloc (hstbuflen); - - while ((res = gethostbyname_r (host, &hostbuf, tmphstbuf, hstbuflen, - &hp, &herr)) == ERANGE) - { - /* Enlarge the buffer. */ - hstbuflen *= 2; - tmphstbuf = realloc (tmphstbuf, hstbuflen); - } - /* Check for errors. */ - if (res || hp == NULL) - return NULL; - return hp; -} - diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname2.c b/mdk-stage1/dietlibc/libcruft/gethostbyname2.c deleted file mode 100644 index 3d8296616..000000000 --- a/mdk-stage1/dietlibc/libcruft/gethostbyname2.c +++ /dev/null @@ -1,40 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern int h_errno; - -struct hostent* gethostbyname2(const char *host,int AF) -{ - static struct hostent hostbuf; - struct hostent *hp; - size_t hstbuflen; - char *tmphstbuf; - int res; - int herr; - - hstbuflen = 1024; - /* Allocate buffer, remember to free it to avoid a memory leakage. */ - tmphstbuf = malloc (hstbuflen); - - while ((res = gethostbyname2_r (host, AF,&hostbuf, tmphstbuf, hstbuflen, - &hp, &herr)) == ERANGE) - { - /* Enlarge the buffer. */ - hstbuflen *= 2; - tmphstbuf = realloc (tmphstbuf, hstbuflen); - } - /* Check for errors. */ - if (res || hp == NULL) - return NULL; - return hp; -} - diff --git a/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c b/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c deleted file mode 100644 index b505ccfbc..000000000 --- a/mdk-stage1/dietlibc/libcruft/gethostbyname2_r.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -extern int __dns_gethostbyx_r(const char* name, struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop, int lookfor); - -/* Oh boy, this interface sucks so badly, there are no words for it. - * Not one, not two, but _three_ error signalling methods! (*h_errnop - * nonzero? return value nonzero? *RESULT zero?) The glibc goons - * really outdid themselves with this one. */ -int gethostbyname2_r(const char* name, int AF, struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop) { - int L=strlen(name); - int lookfor=0; - switch (AF) { - case AF_INET: lookfor=1; break; - case AF_INET6: lookfor=28; break; - default: *h_errnop=EINVAL; return 1; - } - result->h_name=buf; - if (buflen -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -extern int __dns_gethostbyx_r(const char* name, struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop, int lookfor); - -/* Oh boy, this interface sucks so badly, there are no words for it. - * Not one, not two, but _three_ error signalling methods! (*h_errnop - * nonzero? return value nonzero? *RESULT zero?) The glibc goons - * really outdid themselves with this one. */ -int gethostbyname_r(const char* name, struct hostent* result, - char *buf, size_t buflen, - struct hostent **RESULT, int *h_errnop) { - int L=strlen(name); - result->h_name=buf; - if (buflen - -char* getlogin() { - return getenv("LOGNAME"); -} diff --git a/mdk-stage1/dietlibc/libcruft/getpagesize.c b/mdk-stage1/dietlibc/libcruft/getpagesize.c deleted file mode 100644 index dea4a9693..000000000 --- a/mdk-stage1/dietlibc/libcruft/getpagesize.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -#ifndef PAGE_SIZE -#define PAGE_SIZE 4096 -#endif - -size_t __libc_getpagesize(void) { - return PAGE_SIZE; -} - -size_t getpagesize(void) __attribute__((weak,alias("__libc_getpagesize"))); - diff --git a/mdk-stage1/dietlibc/libcruft/getpass.c b/mdk-stage1/dietlibc/libcruft/getpass.c deleted file mode 100644 index 3da7cd2b3..000000000 --- a/mdk-stage1/dietlibc/libcruft/getpass.c +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include -#include -#include -#include - -char *getpass(const char* prompt) { - struct termios old,tmp; - int out,in=open("/dev/tty",O_RDWR); - int doclose=(in>=0); - static char buf[PASS_MAX]; - if (doclose) { in=0; out=2; } else out=in; - if (!tcgetattr(in,&old)) { - tmp=old; - tmp.c_lflag &= ~(ECHO|ISIG); - tcsetattr(in,TCSAFLUSH,&tmp); - } - write(out,prompt,strlen(prompt)); - { - int nread,ofs=0; - for (;;) { - nread=read(in,buf+ofs,PASS_MAX-ofs); - if (nread<0) { - buf[ofs]=0; - break; - } else if (ofs+nread>=PASS_MAX) { - buf[PASS_MAX-1]=0; - break; - } else if (buf[ofs+nread-1]=='\n') { - buf[ofs+nread-1]=0; - break; - } - ofs+=nread; - } - write(out,"\n",1); - } - tcsetattr(in,TCSAFLUSH,&old); - if (doclose) close(in); - return buf; -} diff --git a/mdk-stage1/dietlibc/libcruft/getpwnam.c b/mdk-stage1/dietlibc/libcruft/getpwnam.c deleted file mode 100644 index 53aae74d1..000000000 --- a/mdk-stage1/dietlibc/libcruft/getpwnam.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -struct passwd *getpwnam(const char * name) { - struct passwd *tmp; - setpwent(); - for (;;) { - tmp=getpwent(); - if (!tmp) return 0; - if (!strcmp(tmp->pw_name,name)) - return tmp; - } -} diff --git a/mdk-stage1/dietlibc/libcruft/getpwuid.c b/mdk-stage1/dietlibc/libcruft/getpwuid.c deleted file mode 100644 index eef14e6e8..000000000 --- a/mdk-stage1/dietlibc/libcruft/getpwuid.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -struct passwd *getpwuid(uid_t uid) { - struct passwd *tmp; - setpwent(); - for (;;) { - tmp=getpwent(); - if (!tmp) return 0; - if (tmp->pw_uid==uid) - return tmp; - } -} diff --git a/mdk-stage1/dietlibc/libcruft/getspnam.c b/mdk-stage1/dietlibc/libcruft/getspnam.c deleted file mode 100644 index e6573345d..000000000 --- a/mdk-stage1/dietlibc/libcruft/getspnam.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -struct spwd *getspnam(const char * name) { - struct spwd *tmp; - setspent(); - for (;;) { - tmp=getspent(); - if (!tmp) return 0; - if (!strcmp(tmp->sp_namp,name)) - return tmp; - } -} diff --git a/mdk-stage1/dietlibc/libcruft/grent.c b/mdk-stage1/dietlibc/libcruft/grent.c deleted file mode 100644 index 0357657de..000000000 --- a/mdk-stage1/dietlibc/libcruft/grent.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * dietlibc/lib/grent.c - getgrent(3)/setgrent(3)/endgrent(3) implementation - * - * Copyright 2001 Jeff Garzik - * - * This is a brand new implementation, based on the interface - * described in man-pages-1.34-1mdk man pages package. - */ - - -#include "entlib.h" /* this is our only include */ - -#define MAX_GROUP_MEMBERS 16 /* matches Linux kernel task struct */ - -static struct __ent_state *st = NULL; /* state held across calls */ -static char *gr_mem[MAX_GROUP_MEMBERS+1]; -static struct group gr; - -struct group *getgrent(void) -{ - char *parts[4], *grouplist; - unsigned int bufptr; - - if (__ent_start(_PATH_GROUP, &st)) - return NULL; - if (__ent_get_line(st)) - goto err_out; - if (__ent_split(st, parts, 4, ':', 1) < 0) - goto err_out; - - gr.gr_name = parts[0]; - gr.gr_passwd = parts[1]; - gr.gr_gid = (gid_t) atoi(parts[2]); - grouplist = parts[3]; - - memset(&gr_mem, 0, sizeof(gr_mem)); - gr.gr_mem = gr_mem; - - /* rewind bufptr to beginning of group list */ - bufptr = st->bufptr; - st->bufptr = (int) (grouplist - st->ent_buf); - - __ent_split(st, gr_mem, MAX_GROUP_MEMBERS, ',', 0); - st->bufptr = bufptr; - - return &gr; - -err_out: - st->buflen = st->bufptr = 0; /* invalidate file data buffer */ - return NULL; -} - -void setgrent(void) { __ent_set(st); } -void endgrent(void) { __ent_end(st); st=NULL; } diff --git a/mdk-stage1/dietlibc/libcruft/h_errno.c b/mdk-stage1/dietlibc/libcruft/h_errno.c deleted file mode 100644 index 73ead0469..000000000 --- a/mdk-stage1/dietlibc/libcruft/h_errno.c +++ /dev/null @@ -1 +0,0 @@ -int h_errno; diff --git a/mdk-stage1/dietlibc/libcruft/herrno_location.c b/mdk-stage1/dietlibc/libcruft/herrno_location.c deleted file mode 100644 index 203f73d4b..000000000 --- a/mdk-stage1/dietlibc/libcruft/herrno_location.c +++ /dev/null @@ -1,5 +0,0 @@ -extern int h_errno; - -int *__h_errno_location() { return &h_errno; } - -int *h_errno_location() __attribute__((weak,alias("__h_errno_location"))); diff --git a/mdk-stage1/dietlibc/libcruft/inet_addr.c b/mdk-stage1/dietlibc/libcruft/inet_addr.c deleted file mode 100644 index 0b8531ab1..000000000 --- a/mdk-stage1/dietlibc/libcruft/inet_addr.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include - -unsigned long int inet_addr(const char *cp) { - struct in_addr foo; - if (inet_aton(cp,&foo)) - return foo.s_addr; - else - return (unsigned long int)-1; -} diff --git a/mdk-stage1/dietlibc/libcruft/inet_aton.c b/mdk-stage1/dietlibc/libcruft/inet_aton.c deleted file mode 100644 index ac7d9d007..000000000 --- a/mdk-stage1/dietlibc/libcruft/inet_aton.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include -#include - -/* inet_aton() converts the Internet host address cp from the standard - * numbers-and-dots notation into binary data and stores it in the - * structure that inp points to. inet_aton returns nonzero if the - * address is valid, zero if not. */ - -/* problem is, inet_aton is historically quite, uh, lenient. - * the following are all acceptable: - * 0x7f000001 == 127.1 == 127.0.0.1.0 == 127.0.0.1 - * btw: 127.0.0.x.y == 127.0.0.(x|y) - * and: 10.1.1 == 10.1.0.1 (huh?!) - * and: 10 == 0.0.0.10 (?!?!?) - * The Berkeley people must have been so stoned that they are still high. - */ - -/* I hereby disclaim that I wrote this code. */ -int inet_aton(const char *cp, struct in_addr *inp) { - int i; - unsigned int ip=0; - char *tmp=(char*)cp; - for (i=24; ;) { - long j; - j=strtol(tmp,&tmp,0); - if (*tmp==0) { - ip|=j; - break; - } - if (*tmp=='.') { - if (j>255) return 0; - ip|=(j<0) i-=8; - ++tmp; - continue; - } - return 0; - } - inp->s_addr=htonl(ip); - return 1; -} diff --git a/mdk-stage1/dietlibc/libcruft/inet_ntoa.c b/mdk-stage1/dietlibc/libcruft/inet_ntoa.c deleted file mode 100644 index f8c975f7a..000000000 --- a/mdk-stage1/dietlibc/libcruft/inet_ntoa.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include - -extern char *inet_ntoa_r(struct in_addr in,char* buf); - -char *inet_ntoa(struct in_addr in) { - static char buf[20]; - return inet_ntoa_r(in,buf); -} diff --git a/mdk-stage1/dietlibc/libcruft/inet_ntoa_r.c b/mdk-stage1/dietlibc/libcruft/inet_ntoa_r.c deleted file mode 100644 index dcf0eab7b..000000000 --- a/mdk-stage1/dietlibc/libcruft/inet_ntoa_r.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include - -static unsigned int i2a(char* dest,unsigned int x) { - register unsigned int tmp=x; - register unsigned int len=0; - if (x>=100) { *dest++=tmp/100+'0'; tmp=tmp%100; ++len; } - if (x>=10) { *dest++=tmp/10+'0'; tmp=tmp%10; ++len; } - *dest++=tmp+'0'; - return len+1; -} - -char *inet_ntoa_r(struct in_addr in,char* buf) { - unsigned int len; - unsigned char *ip=(unsigned char*)∈ - len=i2a(buf,ip[0]); buf[len]='.'; ++len; - len+=i2a(buf+ len,ip[1]); buf[len]='.'; ++len; - len+=i2a(buf+ len,ip[2]); buf[len]='.'; ++len; - len+=i2a(buf+ len,ip[3]); buf[len]=0; - return buf; -} diff --git a/mdk-stage1/dietlibc/libcruft/inet_ntop.c b/mdk-stage1/dietlibc/libcruft/inet_ntop.c deleted file mode 100644 index 77c47f239..000000000 --- a/mdk-stage1/dietlibc/libcruft/inet_ntop.c +++ /dev/null @@ -1,75 +0,0 @@ -#include - -extern char *inet_ntoa_r(struct in_addr in,char* buf); - -static const unsigned char V4mappedprefix[12]={0,0,0,0,0,0,0,0,0,0,0xff,0xff}; - -static char tohex(char hexdigit) { - return hexdigit>9?hexdigit+'a'-10:hexdigit+'0'; -} - -static int fmt_xlong(char* s,unsigned int i) { - char* bak=s; - *s=tohex((i>>12)&0xf); if (s!=bak || *s!='0') ++s; - *s=tohex((i>>8)&0xf); if (s!=bak || *s!='0') ++s; - *s=tohex((i>>4)&0xf); if (s!=bak || *s!='0') ++s; - *s=tohex(i&0xf); - return s-bak+1; -} - -unsigned int fmt_ip6(char *s,const char ip[16]) -{ - unsigned int len; - unsigned int i; - unsigned int temp; - unsigned int compressing; - int j; - - len = 0; compressing = 0; - for (j=0; j<16; j+=2) { - if (j==12 && !memcmp(ip,V4mappedprefix,12)) { - inet_ntoa_r(*(struct in_addr*)(ip+12),s); - temp=strlen(s); - return len+temp; - } - temp = ((unsigned long) (unsigned char) ip[j] << 8) + - (unsigned long) (unsigned char) ip[j+1]; - if (temp == 0) { - if (!compressing) { - compressing=1; - if (j==0) { - *s++=':'; ++len; - } - } - } else { - if (compressing) { - compressing=0; - *s++=':'; ++len; - } - i = fmt_xlong(s,temp); len += i; s += i; - if (j<14) { - *s++ = ':'; - ++len; - } - } - } - *s=0; - return len; -} - -const char* inet_ntop(int AF, const void *CP, char *BUF, size_t LEN) { - char buf[100]; - int len; - if (AF==AF_INET) { - inet_ntoa_r(*(struct in_addr*)CP,buf); - len=strlen(buf); - } else if (AF==AF_INET6) { - len=fmt_ip6(buf,CP); - } else - return 0; - if (len -#include -#include - -static unsigned int scan_ip6(const char *s,char ip[16]) -{ - unsigned int i; - unsigned int len=0; - unsigned long u; - - char suffix[16]; - int prefixlen=0; - int suffixlen=0; - - for (i=0; i<16; i++) ip[i]=0; - - for (;;) { - if (*s == ':') { - len++; - if (s[1] == ':') { /* Found "::", skip to part 2 */ - s+=2; - len++; - break; - } - s++; - } - { - char *tmp; - u=strtol(s,&tmp,16); - i=tmp-s; - } - - if (!i) return 0; - if (prefixlen==12 && s[i]=='.') { - /* the last 4 bytes may be written as IPv4 address */ - if (inet_aton(s,(struct in_addr*)(ip+12))) - return i+len; - else - return 0; - } - ip[prefixlen++] = (u >> 8); - ip[prefixlen++] = (u & 255); - s += i; len += i; - if (prefixlen==16) - return len; - } - -/* part 2, after "::" */ - for (;;) { - if (*s == ':') { - if (suffixlen==0) - break; - s++; - len++; - } else if (suffixlen!=0) - break; - { - char *tmp; - u=strtol(s,&tmp,16); - i=tmp-s; - } - if (!i) { - len--; - break; - } - if (suffixlen+prefixlen<=12 && s[i]=='.') { - if (inet_aton(s,(struct in_addr*)(suffix+suffixlen))) { - suffixlen+=4; - len+=strlen(s); - break; - } else - prefixlen=12-suffixlen; /* make end-of-loop test true */ - } - suffix[suffixlen++] = (u >> 8); - suffix[suffixlen++] = (u & 255); - s += i; len += i; - if (prefixlen+suffixlen==16) - break; - } - for (i=0; i -#include -#include - -int initgroups(const char *user, gid_t group) { - int n=0; - gid_t grouplist[32]; - struct group *g; - setgrent(); - while ((g=getgrent())) { - char **duh=g->gr_mem; - while (*duh) { - if (!strcmp(*duh,user)) { - grouplist[n]=g->gr_gid; - if (++n>=32) - break; - } - duh++; - } - } - return setgroups(n,grouplist); -} - diff --git a/mdk-stage1/dietlibc/libcruft/mkstemp.c b/mdk-stage1/dietlibc/libcruft/mkstemp.c deleted file mode 100644 index 3b24ecb54..000000000 --- a/mdk-stage1/dietlibc/libcruft/mkstemp.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include -#include - -int mkstemp(char* template) { - char *tmp=template+strlen(template)-6; - int randfd; - int i,res; - unsigned int random; - for (i=0; i<6; ++i) if (tmp[i]!='X') { __set_errno(EINVAL); return -1; } - randfd=open("/dev/urandom",O_RDONLY); - for (;;) { - read(randfd,&random,sizeof(random)); - for (i=0; i<6; ++i) { - int hexdigit=(random>>(i*5))&0x1f; - tmp[i]=hexdigit>9?hexdigit+'a'-10:hexdigit+'0'; - } - res=open(template,O_CREAT|O_RDWR|O_EXCL,0600); - if (res>=0) return res; - } - close(randfd); -} diff --git a/mdk-stage1/dietlibc/libcruft/pwent.c b/mdk-stage1/dietlibc/libcruft/pwent.c deleted file mode 100644 index 30a8a0957..000000000 --- a/mdk-stage1/dietlibc/libcruft/pwent.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * dietlibc/lib/pwent.c - getpwent(3)/setpwent(3)/endpwent(3) implementation - * - * Copyright 2001 Jeff Garzik - * - * This is a brand new implementation, based on the interface - * described in man-pages-1.34-1mdk man pages package. - */ - - -#include "entlib.h" /* this is our only include */ - -static struct __ent_state *st = NULL; /* state held across calls */ -static struct passwd pw; - -struct passwd *getpwent(void) -{ - char *parts[7]; - - if (__ent_start(_PATH_PASSWD, &st)) - return NULL; - if (__ent_get_line(st)) - goto err_out; - if (__ent_split(st, parts, 7, ':', 1) < 0) - goto err_out; - - pw.pw_name = parts[0]; - pw.pw_passwd = parts[1]; - pw.pw_uid = (uid_t) atoi(parts[2]); - pw.pw_gid = (gid_t) atoi(parts[3]); - pw.pw_gecos = parts[4]; - pw.pw_dir = parts[5]; - pw.pw_shell = parts[6]; - - return &pw; - -err_out: - st->buflen = st->bufptr = 0; /* invalidate file data buffer */ - return NULL; -} - -void setpwent(void) { __ent_set(st); } -void endpwent(void) { __ent_end(st); st=NULL; } diff --git a/mdk-stage1/dietlibc/libcruft/res_init.c b/mdk-stage1/dietlibc/libcruft/res_init.c deleted file mode 100644 index 9322af298..000000000 --- a/mdk-stage1/dietlibc/libcruft/res_init.c +++ /dev/null @@ -1,7 +0,0 @@ -extern int __dns_servers; -extern void __dns_readstartfiles(void); - -int res_init(void) { - __dns_servers=0; - __dns_readstartfiles(); -} diff --git a/mdk-stage1/dietlibc/libcruft/spent.c b/mdk-stage1/dietlibc/libcruft/spent.c deleted file mode 100644 index e4beb81e4..000000000 --- a/mdk-stage1/dietlibc/libcruft/spent.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * dietlibc/lib/spent.c - getspent(3)/setspent(3)/endspent(3) implementation - * - * Copyright 2001 Jeff Garzik - * - * This is a brand new implementation, based on the interface - * described in man-pages-1.34-1mdk man pages package. - */ - - -#include "entlib.h" /* this is our only include */ - -static struct __ent_state *st = NULL; /* state held across calls */ -static struct spwd sp; - -struct spwd *getspent(void) -{ - char *parts[9]; - - if (__ent_start(_PATH_SHADOW, &st)) - return NULL; - if (__ent_get_line(st)) - goto err_out; - if (__ent_split(st, parts, 9, ':', 1) < 0) - goto err_out; - - sp.sp_namp = parts[0]; - sp.sp_pwdp = parts[1]; - sp.sp_lstchg = atoi(parts[2]); /* XXX: atol */ - sp.sp_min = atoi(parts[3]); - sp.sp_max = atoi(parts[4]); - sp.sp_warn = atoi(parts[5]); - sp.sp_inact = atoi(parts[6]); - sp.sp_expire = atoi(parts[7]); - sp.sp_flag = atoi(parts[8]); - - return &sp; - -err_out: - st->buflen = st->bufptr = 0; /* invalidate file data buffer */ - return NULL; -} - -void setspent(void) { __ent_set(st); } -void endspent(void) { __ent_end(st); st=NULL; } diff --git a/mdk-stage1/dietlibc/libcrypt/crypt.c b/mdk-stage1/dietlibc/libcrypt/crypt.c deleted file mode 100644 index 933397f5f..000000000 --- a/mdk-stage1/dietlibc/libcrypt/crypt.c +++ /dev/null @@ -1,309 +0,0 @@ -#include "dietfeatures.h" -#include - -/* Initial permutation, */ -static char IP[] = { - 57,49,41,33,25,17, 9, 1, - 59,51,43,35,27,19,11, 3, - 61,53,45,37,29,21,13, 5, - 63,55,47,39,31,23,15, 7, - 56,48,40,32,24,16, 8, 0, - 58,50,42,34,26,18,10, 2, - 60,52,44,36,28,20,12, 4, - 62,54,46,38,30,22,14, 6 -}; - -/* Final permutation, FP = IP^(-1) */ -static char FP[] = { - 39, 7,47,15,55,23,63,31, - 38, 6,46,14,54,22,62,30, - 37, 5,45,13,53,21,61,29, - 36, 4,44,12,52,20,60,28, - 35, 3,43,11,51,19,59,27, - 34, 2,42,10,50,18,58,26, - 33, 1,41, 9,49,17,57,25, - 32, 0,40, 8,48,16,56,24 -}; - -/* Permuted-choice 1 from the key bits to yield C and D. - * Note that bits 8,16... are left out: They are intended for a parity check. - */ -static char PC1_C[] = { - 56,48,40,32,24,16, 8, - 0,57,49,41,33,25,17, - 9, 1,58,50,42,34,26, - 18,10, 2,59,51,43,35 -}; - -static char PC1_D[] = { - 62,54,46,38,30,22,14, - 6,61,53,45,37,29,21, - 13, 5,60,52,44,36,28, - 20,12, 4,27,19,11, 3 -}; - -/* Sequence of shifts used for the key schedule. */ -static char shifts[] = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1 }; - -/* - * Permuted-choice 2, to pick out the bits from the CD array that generate - * the key schedule. - */ -static char PC2_C[] = { - 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, - 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1 -}; - -static char PC2_D[] = { - 12, 23, 2, 8, 18, 26, 1, 11, 22, 16, 4, 19, - 15, 20, 10, 27, 5, 24, 17, 13, 21, 7, 0, 3 -}; - -/* The C and D arrays used to calculate the key schedule. */ - -static char C[28]; -static char D[28]; -/* The key schedule. Generated from the key. */ -static char KS[16][48]; - -/* The E bit-selection table. */ -static char E[48]; -static char e2[] = { - 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, - 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, - 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, - 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1 -}; - -/* Set up the key schedule from the key. */ -void setkey(const char *key) -{ - register int i, j, k; - int t; - int s; - - /* First, generate C and D by permuting the key. The low order bit of each - * 8-bit char is not used, so C and D are only 28 bits apiece. - */ - for(i=0; i < 28; i++) { - C[i] = key[(int)PC1_C[i]]; - D[i] = key[(int)PC1_D[i]]; - } - /* To generate Ki, rotate C and D according to schedule and pick up a - * permutation using PC2. - */ - for(i=0; i < 16; i++) { - /* rotate. */ - s = shifts[i]; - for(k=0; k < s; k++) { - t = C[0]; - for(j=0; j < 27; j++) - C[j] = C[j+1]; - C[27] = t; - t = D[0]; - for(j=0; j < 27; j++) - D[j] = D[j+1]; - D[27] = t; - } - /* get Ki. Note C and D are concatenated. */ - for(j=0; j < 24; j++) { - KS[i][j] = C[(int)PC2_C[j]]; - KS[i][j+24] = D[(int)PC2_D[j]]; - } - } - - for(i=0; i < 48; i++) - E[i] = e2[i]; -} - -/* The 8 selection functions. For some reason, they give a 0-origin index, - * unlike everything else. - */ -static char S[8][64] = { - { - 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7, - 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8, - 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0, - 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13 - }, - - { - 15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10, - 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5, - 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15, - 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9 - }, - - { - 10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8, - 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1, - 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7, - 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12 - }, - - { - 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15, - 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9, - 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4, - 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14 - }, - - { - 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9, - 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6, - 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14, - 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3 - }, - - { - 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11, - 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8, - 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6, - 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13 - }, - - { - 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1, - 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6, - 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2, - 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12 - }, - - { - 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7, - 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2, - 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8, - 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11 - } -}; - -/* P is a permutation on the selected combination of the current L and key. */ -static char P[] = { - 15, 6,19,20, 28,11,27,16, 0,14,22,25, 4,17,30, 9, - 1, 7,23,13, 31,26, 2, 8, 18,12,29, 5, 21,10, 3,24 -}; - -/* The current block, divided into 2 halves. */ -static char L[32], R[32]; -static char tempL[32]; -static char f[32]; - -/* The combination of the key and the input, before selection. */ -static char preS[48]; - -/* The payoff: encrypt a block. */ -void encrypt(char block[64], int edflag) -{ - int i, ii; - register int t, j, k; - - /* First, permute the bits in the input */ - for(j=0; j < 64; j++) - L[j] = block[(int)IP[j]]; - /* Perform an encryption operation 16 times. */ - for(ii=0; ii < 16; ii++) { - i = ii; - /* Save the R array, which will be the new L. */ - for(j=0; j < 32; j++) - tempL[j] = R[j]; - /* Expand R to 48 bits using the E selector; - * exclusive-or with the current key bits. - */ - for(j=0; j < 48; j++) - preS[j] = R[E[j]-1] ^ KS[i][j]; - /* The pre-select bits are now considered in 8 groups of 6 bits each. - * The 8 selection functions map these 6-bit quantities into 4-bit - * quantities and the results permuted to make an f(R, K). - * The indexing into the selection functions is peculiar; - * it could be simplified by rewriting the tables. - */ - for(j=0; j < 8; j++) { - t = ((j<<1)+j)<<1; - k = S[j][(preS[t]<<5)+ - (preS[t+1]<<3)+ - (preS[t+2]<<2)+ - (preS[t+3]<<1)+ - (preS[t+4] )+ - (preS[t+5]<<4)]; - t = j << 2; - f[t ] = (k>>3)&01; - f[t+1] = (k>>2)&01; - f[t+2] = (k>>1)&01; - f[t+3] = (k )&01; - } - /* The new R is L ^ f(R, K). The f here has to be permuted first, though. */ - for(j=0; j < 32; j++) - R[j] = L[j] ^ f[(int)P[j]]; - /* Finally, the new L (the original R) is copied back. */ - for(j=0; j < 32; j++) - L[j] = tempL[j]; - } - /* The output L and R are reversed. */ - for(j=0; j < 32; j++) { - L[j] ^= R[j]; - R[j] ^= L[j]; - L[j] ^= R[j]; - } - /* The final output gets the inverse permutation of the very original. */ - for(j=0; j < 64; j++) - block[j] = L[(int)FP[j]]; -} - -char * crypt(const char *pw, const char *salt) -{ - register int i, j, c; - static char block[66], iobuf[16]; - - for(i=0; i < 66; i++) - block[i] = 0; - for(i=0; (c= *pw) && i < 64; pw++) { - for(j=0; j < 7; j++, i++) - block[i] = (c>>(6-j)) & 01; - i++; - } - - setkey(block); - - for(i=0; i < 66; i++) - block[i] = 0; - - for(i=0; i < 2; i++) { - c = *salt++; - iobuf[i] = c; - if(c > 'Z') - c -= 6; - if(c > '9') - c -= 7; - c -= '.'; - for(j=0; j < 6; j++) { - if((c>>j) & 01) { - int ind1 = (((i<<1)+i)<< 1) + j; - int ind2 = ind1 + 24; - E[ind1] ^= E[ind2]; - E[ind2] ^= E[ind1]; - E[ind1] ^= E[ind2]; - } - } - } - - for(i=0; i < 25; i++) - encrypt(block, 0); - - for(i=0; i < 11; i++) { - c = 0; - for(j=0; j < 6; j++) { - c <<= 1; - c |= block[(((i<<1)+i)<<1)+j]; - } - c += '.'; - if(c > '9') - c += 7; - if(c > 'Z') - c += 6; - iobuf[i+2] = c; - } - iobuf[i+2] = 0; - if(iobuf[1] == 0) - iobuf[1] = iobuf[0]; - return(iobuf); -} diff --git a/mdk-stage1/dietlibc/libdl/Makefile b/mdk-stage1/dietlibc/libdl/Makefile deleted file mode 100644 index c0463f887..000000000 --- a/mdk-stage1/dietlibc/libdl/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# local "test" make file - -SRC = $(wildcard *.c) test/test.c -OBJ = _dl_jump.o $(SRC:.c=.o) - -#CFLAGS = -Wall -O2 -CFLAGS = -g - -%.o : %.S - $(HOME)/bin/diet gcc $(CFLAGS) -c -o $@ $^ - -%.o : %.c - $(HOME)/bin/diet gcc $(CFLAGS) -c -o $@ $^ - -all: test.out - -test.g: test.c - gcc -o $@ $^ -ldl - -test.out: $(OBJ) - $(HOME)/bin/diet gcc -o $@ $^ - -clean: - $(RM) *.o *.a *.out *~ # *.so diff --git a/mdk-stage1/dietlibc/libdl/README b/mdk-stage1/dietlibc/libdl/README deleted file mode 100644 index 5d77bde34..000000000 --- a/mdk-stage1/dietlibc/libdl/README +++ /dev/null @@ -1,6 +0,0 @@ -this is the experimental libdl test-pre-pre-alpha code - -written by Olaf Dreesen - -Shouldn't work yet had some problems with the elf specs... -and more inconsistencies... diff --git a/mdk-stage1/dietlibc/libdl/_dl_int.h b/mdk-stage1/dietlibc/libdl/_dl_int.h deleted file mode 100644 index 659e6ee0f..000000000 --- a/mdk-stage1/dietlibc/libdl/_dl_int.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef ___DL_INT_H__ -#define ___DL_INT_H__ - -#include - -struct _dl_handle { - /* basic */ - void * mem_base; /* base address of maped *.so */ - unsigned long mem_size; /* len of mem block */ - unsigned int lnk_count; /* reference count */ - - /* symbol resolve helper */ - unsigned long*hash_tab; /* hash table */ - Elf32_Sym * dyn_sym_tab; /* dynamic symbol table */ - char * dyn_str_tab; /* dyn_name table */ - - Elf32_Rel * plt_rel; /* PLT relocation table */ - - /* FINI */ - void (*fini)(void); -}; - -#define HASH_BUCKET_LEN(p) ((p)) -#define HASH_BUCKET(p) ((p)+2) - -#define HASH_CHAIN_LEN(p) ((p)+1) -#define HASH_CHAIN(p) ((p)+2+HASH_BUCKET_LEN(p)) - -unsigned long elf_hash(const unsigned char *name); - -#endif diff --git a/mdk-stage1/dietlibc/libdl/_dl_jump.S b/mdk-stage1/dietlibc/libdl/_dl_jump.S deleted file mode 100644 index 134f31ea5..000000000 --- a/mdk-stage1/dietlibc/libdl/_dl_jump.S +++ /dev/null @@ -1,8 +0,0 @@ -.text -.global _dl_jump -_dl_jump: - call do_rel - pop %edx - pop %edx - jmp *%eax - diff --git a/mdk-stage1/dietlibc/libdl/_dl_open.c b/mdk-stage1/dietlibc/libdl/_dl_open.c deleted file mode 100644 index 1f907db21..000000000 --- a/mdk-stage1/dietlibc/libdl/_dl_open.c +++ /dev/null @@ -1,207 +0,0 @@ -#include -#include -#include -#include -#include - -#include "_dl_int.h" - -struct _dl_handle dl_test; - -#define _ELF_DWN_ROUND(ps,n) ((n)&(~((ps)-1))) -#define _ELF_UP_ROUND(ps,n) ((((n)&((ps)-1))?(ps):0)+ _ELF_DWN_ROUND((ps),(n))) -#define _ELF_RST_ROUND(ps,n) ((n)&((ps)-1)) - -void _dl_jump(); - -/* - * this file is a Q. & D. hack ... don't think this is bug free or meaningfull - */ - -static void *do_map_in(void *base, unsigned long length, int flags, int fd, unsigned long offset) -{ - int perm = 0; - if (flags & PF_X) perm|=PROT_EXEC; - if (flags & PF_R) perm|=PROT_READ; - if (flags & PF_W) perm|=PROT_WRITE; - return mmap(base, length, perm, MAP_PRIVATE|((base)?MAP_FIXED:0), fd, offset); -} - -unsigned long do_rel(struct _dl_handle * tmp_dl, unsigned long off) -{ -// struct _dl_handle * tmp_dl = ((void*)*((&off)-1)); - Elf32_Rel *tmp = ((void*)tmp_dl->plt_rel)+off; - int sym=ELF32_R_SYM(tmp->r_info); - register unsigned long sym_val; - - printf("do_rel %08x %08x\n",tmp_dl,off); - - printf ("do_rel %08x+%x\n",tmp_dl->plt_rel,off); - printf("do_rel @ %08x with type %d -> %d\n",tmp->r_offset,ELF32_R_TYPE(tmp->r_info),sym); - - printf("do_rel sym %08x\n",tmp_dl->dyn_sym_tab[sym].st_value); - - /* modify GOT for REAL symbol */ - sym_val=((unsigned long)(tmp_dl->mem_base+tmp_dl->dyn_sym_tab[sym].st_value)); - *((unsigned long*)(tmp_dl->mem_base+tmp->r_offset))=sym_val; - - printf("do_rel sym %08x\n",sym_val); - /* HOWTO JUMP ?!? */ - return sym_val; -} - -void *_dl_open(const char*pathname, int fd, int flag) -{ - int ps=getpagesize(); - int i; - unsigned char buf[1024]; - char *m=0,*d; - struct _dl_handle *ret=0; - - unsigned long l; - - Elf32_Ehdr *eh; - Elf32_Phdr *ph; - - int ld_nr=0; - Elf32_Phdr *ld[4]={0,0,0,0}; - Elf32_Phdr *dyn=0; - - if (fd==-1) return 0; - - printf("_dl_open: %s\n",pathname); - - read(fd, buf, 1024); - eh=(Elf32_Ehdr*)buf; - ph=(Elf32_Phdr*)&buf[eh->e_phoff]; - - for (i=0; ie_phnum; i++) { - if (ph[i].p_type==PT_LOAD) { - ld[ld_nr++]=ph+i; - } - if (ph[i].p_type==PT_DYNAMIC) { - dyn=ph+i; - } - } - - if (ld_nr==1) { - unsigned long offset = _ELF_DWN_ROUND(ps,ld[0]->p_offset); - unsigned long off = _ELF_RST_ROUND(ps,ld[0]->p_offset); - unsigned long length = _ELF_UP_ROUND(ps,ld[0]->p_memsz+off); - m = (char*)do_map_in(0, length, ld[0]->p_flags, fd, offset); - - /* zero pad bss */ - l = ld[0]->p_offset+ld[0]->p_filesz; - memset(m+l,0,length-l); - - dl_test.mem_base=m; - dl_test.mem_size=length; - dl_test.lnk_count=0; - - ret = &dl_test; - } - else if (ld_nr==2) { /* aem... yes Quick & Really Dirty / for the avarage 99% */ - //unsigned long text_addr = _ELF_DWN_ROUND(ps,ld[0]->p_vaddr); - unsigned long text_offset = _ELF_DWN_ROUND(ps,ld[0]->p_offset); - unsigned long text_off = _ELF_RST_ROUND(ps,ld[0]->p_offset); - unsigned long text_size = _ELF_UP_ROUND(ps,ld[0]->p_memsz+text_off); - - unsigned long data_addr = _ELF_DWN_ROUND(ps,ld[1]->p_vaddr); - unsigned long data_offset = _ELF_DWN_ROUND(ps,ld[1]->p_offset); - unsigned long data_off = _ELF_RST_ROUND(ps,ld[1]->p_offset); - unsigned long data_size = _ELF_UP_ROUND(ps,ld[1]->p_memsz+data_off); - unsigned long data_fsize = _ELF_UP_ROUND(ps,ld[1]->p_filesz+data_off); - - /* mmap all mem_blocks for *.so */ - l = text_size+data_size; - - dl_test.mem_size=l; - - m = (char*) do_map_in(0,l,ld[0]->p_flags,fd,text_offset); - - /* release data,bss part */ - mprotect(m+data_addr, data_size, PROT_NONE); - - /* mmap data,bss part */ - d = (char*) do_map_in(m+data_addr,data_fsize,ld[1]->p_flags,fd,data_offset); - - /* zero pad bss */ - l = data_off+ld[1]->p_filesz; - memset(d+l,0,data_size-l); - - /* more bss ? */ - if (data_size>data_fsize) { - l = data_size-data_fsize; - mmap(d+data_fsize, l, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); - } - - dl_test.mem_base=m; - dl_test.lnk_count=0; - ret = &dl_test; - } - - printf("_dl_open pre resolv\n"); - if (ret) { - Elf32_Dyn* dyn_tab = (void*)m+dyn->p_vaddr; - void (*init)(); - unsigned long* got=0; - void* jmprel=0; - int pltreltype=0; - int pltrelsize=0; - - printf("_dl_open IN resolv\n"); - for(i=0;dyn_tab[i].d_tag;i++) { - if (dyn_tab[i].d_tag==DT_HASH) { - ret->hash_tab = (unsigned long*)(m+dyn_tab[i].d_un.d_ptr); - } - if (dyn_tab[i].d_tag==DT_SYMTAB) { - ret->dyn_sym_tab = (Elf32_Sym*)(m+dyn_tab[i].d_un.d_ptr); - } - if (dyn_tab[i].d_tag==DT_STRTAB) { - ret->dyn_str_tab = (char*)(m+dyn_tab[i].d_un.d_ptr); - } - if (dyn_tab[i].d_tag==DT_FINI) { - ret->fini = (void(*)(void))(m+dyn_tab[i].d_un.d_val); - } - if (dyn_tab[i].d_tag==DT_INIT) { - init = (void(*)(void))(m+dyn_tab[i].d_un.d_val); - printf("init @ %08x\n",init); - } - if (dyn_tab[i].d_tag==DT_PLTGOT) { - got=(unsigned long*)(m+dyn_tab[i].d_un.d_val); - } - if (dyn_tab[i].d_tag==DT_PLTREL) { - pltreltype=dyn_tab[i].d_un.d_val; - } - if (dyn_tab[i].d_tag==DT_PLTRELSZ) { - pltrelsize=dyn_tab[i].d_un.d_val; - } - if (dyn_tab[i].d_tag==DT_JMPREL) { - jmprel=(m+dyn_tab[i].d_un.d_val); - dl_test.plt_rel=jmprel; - } - } - /* GOT */ - got[0]+=(unsigned long)m; - got[1]=(unsigned long)&dl_test; -// got[2]=(unsigned long)do_rel; - got[2]=(unsigned long)(_dl_jump); - /* */ - - if (pltreltype == DT_REL) { - Elf32_Rel *tmp = jmprel; - for (;(char*)tmp<(((char*)jmprel)+pltrelsize);(char*)tmp=((char*)tmp)+sizeof(Elf32_Rel)) { - *((unsigned long*)(m+tmp->r_offset))+=(unsigned long)m; -// *((unsigned long*)(m+tmp->r_offset))+=(unsigned long)do_rel; - printf("rel @ %08x with type %d -> %d\n",tmp->r_offset,ELF32_R_TYPE(tmp->r_info),ELF32_R_SYM(tmp->r_info)); - } - } - - printf("_dl_open post resolv, pre init\n"); - init(); - } - printf("_dl_open post resolv, init\n"); - - close(fd); - return ret; -} diff --git a/mdk-stage1/dietlibc/libdl/_dl_search.c b/mdk-stage1/dietlibc/libdl/_dl_search.c deleted file mode 100644 index 5e3217d46..000000000 --- a/mdk-stage1/dietlibc/libdl/_dl_search.c +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include -#include -#include - -#include -#include - -#define WANT_LD_SO_CONF_SEARCH - -static const char *_dl_search_rpath=0; -void _dl_set_rpath(const char *path) { _dl_search_rpath=path; } - -/* search a colon (semicolon) seperated path for the libraray "filename" */ -static int _dl_search_path(char *buf, int len, const char*path, const int pathlen, const char *filename) -{ - int fd,l=len,i=1; - const char *c,*pe=path+pathlen; - - if (path) { - for (c=path; clnk_count) { - --h->lnk_count; - return -1; - } - if (munmap(h->mem_base,h->mem_size)!=0) return -1; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/libdl/dlerror.c b/mdk-stage1/dietlibc/libdl/dlerror.c deleted file mode 100644 index 1e31bae54..000000000 --- a/mdk-stage1/dietlibc/libdl/dlerror.c +++ /dev/null @@ -1,4 +0,0 @@ -const char *dlerror(void) -{ - return "HAE ?!?"; -} diff --git a/mdk-stage1/dietlibc/libdl/dlopen.c b/mdk-stage1/dietlibc/libdl/dlopen.c deleted file mode 100644 index 1693d889f..000000000 --- a/mdk-stage1/dietlibc/libdl/dlopen.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include - -int _dl_search(char*buf, int bufsize, const char*filename); -void *_dl_open(const char*pathname, int fd, int flag); - -void *dlopen (const char *filename, int flag) -{ - int fd; - char buf[PATH_MAX]; - const char *p; - if (*filename=='/') - fd=open(p=filename,O_RDONLY); - else { - p=buf; - fd=_dl_search(buf,sizeof(buf),filename); - } - - return _dl_open(p,fd,flag); -} diff --git a/mdk-stage1/dietlibc/libdl/dlsym.c b/mdk-stage1/dietlibc/libdl/dlsym.c deleted file mode 100644 index 2af940837..000000000 --- a/mdk-stage1/dietlibc/libdl/dlsym.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "_dl_int.h" - -void *dlsym(void *handle, char *symbol) -{ - printf("dlsym(%08x,%s) -> %08x\n",handle,symbol,elf_hash(symbol)%17); - return 0; -} diff --git a/mdk-stage1/dietlibc/libdl/elf_hash.c b/mdk-stage1/dietlibc/libdl/elf_hash.c deleted file mode 100644 index 463dba0dd..000000000 --- a/mdk-stage1/dietlibc/libdl/elf_hash.c +++ /dev/null @@ -1,12 +0,0 @@ -unsigned long elf_hash(const unsigned char *name) -{ - unsigned long h=0, g; - - while (*name) - { - h = (h<<4) + *(name++); - if (g = h&0xf0000000) h ^= g>>24; - h &= ~g; - } - return h; -} diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c b/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c deleted file mode 100644 index b0c3605b0..000000000 --- a/mdk-stage1/dietlibc/liblatin1/latin1-iscntrl.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -int iscntrl(int c) { - return (c<32) || (c>=127 && c<=160); -} diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c b/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c deleted file mode 100644 index c8d4a5df0..000000000 --- a/mdk-stage1/dietlibc/liblatin1/latin1-isgraph.c +++ /dev/null @@ -1,4 +0,0 @@ -int isgraph(int c) { - return (c>=33 && c<=126) || (c>=161 && c<=255); -} - diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-islower.c b/mdk-stage1/dietlibc/liblatin1/latin1-islower.c deleted file mode 100644 index cab1a5171..000000000 --- a/mdk-stage1/dietlibc/liblatin1/latin1-islower.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -int islower(int c) { - return (c>='a' && c<='z') || (c>=223 && c<=255 && c!=247); -} diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c b/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c deleted file mode 100644 index f632483a0..000000000 --- a/mdk-stage1/dietlibc/liblatin1/latin1-isprint.c +++ /dev/null @@ -1,4 +0,0 @@ - -int isprint(int c) { - return (c>=32 && c<=126) || (c>=160 && c<=255); -} diff --git a/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c b/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c deleted file mode 100644 index 1c1d59db8..000000000 --- a/mdk-stage1/dietlibc/liblatin1/latin1-isupper.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -int isupper(int c) { - return (c>='A' && c<='Z') || (c>=192 && c<=222 && c!=215); -} diff --git a/mdk-stage1/dietlibc/libpthread/CHANGES b/mdk-stage1/dietlibc/libpthread/CHANGES deleted file mode 100644 index d39d990ba..000000000 --- a/mdk-stage1/dietlibc/libpthread/CHANGES +++ /dev/null @@ -1,45 +0,0 @@ -This is the pthread implementation of dietlibc. -Written from scratch by Olaf Dreesen. - -Thu Apr 12 16:47:12 MEST 2001 - - added conditional variables... - except pthread_cond_timedwait all should work man-page like - pthread_cond_timedwait dosen't handle cancel request according to man-page - - added thread specific key handling (all according to man-page) - -Fri Mar 30 18:47:37 MEST 2001 - - uff found some logic errors and fixed them. - pthread_create had a problem with user provided stacks. - - -Fri Mar 23 14:09:54 MET 2001 - - arg.. the kernel-header are so inconsistent... - on x86 it works on arm and sparc not due to MISSING defines, miss-places - includes and __KERNEL__ checks.... - the best in this category is that the kernel-header are changed that the - buggy (g)libc haven't to change... (f..k glibc, the headers HAVE to be - CONSISTENT) - a public defined symbol on arch X have to be in Y to unless marked... - that is mainly speaking SCHED.H ! arg.... - - -Wed Mar 14 04:28:45 MET 2001 - - I have implemented the "Manager Thread" so that nested thread creation - works. really ugly stuff... don't look at it unless you're sitting on solid - ground. - - -Mon Mar 12 16:16:00 CET 2001 - - first of all: - I strongly suggest NOT to use it yet, it's very, very, ... very - experimental. I guess you got the point. there is still much debug code, - incomplete functions and unusable states.... - - I'm still working on the final alpha... - diff --git a/mdk-stage1/dietlibc/libpthread/Makefile b/mdk-stage1/dietlibc/libpthread/Makefile deleted file mode 100644 index 06420f43a..000000000 --- a/mdk-stage1/dietlibc/libpthread/Makefile +++ /dev/null @@ -1,139 +0,0 @@ -all: libpthread.a - -ARCH=$(shell uname -m | sed 's/i[4-9]86/i386/') - -CFLAGS=-pipe -CROSS= - -CC=gcc - -VPATH=../$(ARCH)/ - -PTHREAD_OBJS = \ - __testandset.o \ - \ - thread_internal.o \ - thread_key.o \ - \ - pthread_once.o pthread_spinlock.o \ - \ - pthread_create.o pthread_detach.o \ - pthread_join.o pthread_self.o \ - pthread_exit.o \ - \ - pthread_cleanup_push.o \ - pthread_cleanup_pop.o \ - \ - pthread_attr_getdetachstate.o \ - pthread_attr_getinheritsched.o \ - pthread_attr_getschedparam.o \ - pthread_attr_getschedpolicy.o \ - pthread_attr_getscope.o \ - pthread_attr_getstackaddr.o \ - pthread_attr_getstacksize.o \ - pthread_attr_init.o \ - pthread_attr_setdetachstate.o \ - pthread_attr_setinheritsched.o \ - pthread_attr_setschedparam.o \ - pthread_attr_setschedpolicy.o \ - pthread_attr_setscope.o \ - pthread_attr_setstackaddr.o \ - pthread_attr_setstacksize.o \ - \ - pthread_cancel.o pthread_setcancelstate.o \ - pthread_setcanceltype.o pthread_testcancel.o \ - \ - pthread_mutex_init.o \ - pthread_mutex_destroy.o \ - pthread_mutex_lock.o \ - pthread_mutex_trylock.o \ - pthread_mutex_unlock.o \ - \ - pthread_mutexattr_getkind_np.o \ - pthread_mutexattr_init.o \ - pthread_mutexattr_setkind_np.o \ - \ - pthread_condattr.o \ - pthread_cond_broadcast.o \ - pthread_cond_destroy.o \ - pthread_cond_init.o \ - pthread_cond_signal.o \ - pthread_cond_timedwait.o \ - pthread_cond_wait.o \ - \ - pthread_key_create.o \ - pthread_key_delete.o \ - pthread_getspecific.o \ - pthread_setspecific.o \ - \ - pthread_atfork.o \ - pthread_sys_alloc.o \ - pthread_sys_close.o \ - pthread_sys_create.o \ - pthread_sys_fcntl.o \ - pthread_sys_fsync.o \ - pthread_sys_nanosleep.o \ - pthread_sys_logging.o \ - pthread_sys_open.o \ - pthread_sys_pause.o \ - pthread_sys_read.o \ - pthread_sys_sigsuspend.o \ - pthread_sys_tcdrain.o \ - pthread_sys_waitpid.o \ - pthread_sys_write.o - -%.o : %.c - $(CC) $(CFLAGS) -c -o $@ $? - -include ../$(ARCH)/Makefile.add - -ifeq ($(CFLAGS),-pipe) -CFLAGS+=-O -fomit-frame-pointer -endif - -#CFLAGS = -g -CFLAGS += -Wall - -CFLAGS += -I.. -I../include -Wall - -PWD=$(shell pwd) - -.SUFFIXES: -.SUFFIXES: .S .c - -% :: %,v - -%.o: %.S - $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< - -%.o: %.c - $(CROSS)$(CC) -I. -Iinclude $(CFLAGS) -c $< -# $(CROSS)strip -x -R .comment -R .note $@ - -libpthread.a: $(PTHREAD_OBJS) - ar cr $@ $^ - -libpthread.so: libpthread.a - $(CROSS)ld -whole-archive -shared -o $@ $^ - - -clean: - $(RM) *.o *.a *.so *.out *~ - -exports: libpthread.a - nm -g libpthread.a | grep -w T | awk '{ print $$3 }' | sort -u > exports - -.PHONY: test.out - -test.out: test.o libpthread.a $(LIBS) - $(CROSS)$(CC) -g $(CFLAGS) -nostdlib ../bin-$(ARCH)/start.o -o $@ $^ ../bin-$(ARCH)/dietlibc.a -lgcc - - -.PHONY: sparc ppc mips arm alpha i386 - -sparc ppc alpha i386: - $(MAKE) ARCH=$@ CROSS=$@-linux- all t libdietc.so - -mips arm: - $(MAKE) ARCH=$@ CROSS=$@-linux-gnu- all t libdietc.so - diff --git a/mdk-stage1/dietlibc/libpthread/README b/mdk-stage1/dietlibc/libpthread/README deleted file mode 100644 index 3139c731d..000000000 --- a/mdk-stage1/dietlibc/libpthread/README +++ /dev/null @@ -1,42 +0,0 @@ -LIBPTHREAD - - This is the pthread implementation of dietlibc. - Written from scratch by Olaf Dreesen. - -1. STATUS: incomplete but should work (or not... I had a lot of heisen-bugs...) - On non i386 archs the kernel header have major differences... - NO workaround yet for this problems... - -It's like linuxthreads a clone base thread implementation. - -I have implemented a "Manager Thread" with all the pain it involves... -Nested thread creation is now working fine... - - -2. HOW-TO make this lib: - - 1. generate the dietlibc in the parent directory. - and make sure you have WANT_THREAD_SAVE active in the file: - dietfeatures.h - - 2. change back here and type make - - and then you should have a libpthread.a - - -3. NOTES - -NON STANDARD SIGNAL HANDLING for the threads: - - SIGHUP the targeted thread is canceled - depends on the cancel type of the thread. - - ASYNCHRONOUS: the signal handler will KILL the thread immediately. - - DEFERRED: the signal handler mark its thread as canceled. - (only for the sig-handler to do some sane stuff...) - - SIGTERM the thread is KILLED - if the thread signaled is the main thread, then ALL child-threads - will get a SIGHUP and after some micros a SIGTERM.... - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_atfork.c b/mdk-stage1/dietlibc/libpthread/pthread_atfork.c deleted file mode 100644 index 2dc612dcc..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_atfork.c +++ /dev/null @@ -1,77 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -#define PTHREAD_NUM_ATFORK 4 - -static struct _pthread_fastlock __atfork_struct_lock; -static struct { - int used; - void (*prepare)(void); - void (*parent)(void); - void (*child)(void); -} pthread_atfork_buf[PTHREAD_NUM_ATFORK]; - -int pthread_atfork(void (*prepare)(void), - void (*parent)(void), - void (*child)(void)) -{ - int i,ret=-1; - - __NO_ASYNC_CANCEL_BEGIN; - __pthread_lock(&__atfork_struct_lock); - - for (i=0;i0) { /* parent */ - for (i=0;i -#include - -#include -#include "thread_internal.h" - -int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate) -{ - __THREAD_INIT(); - - *detachstate=attr->__detachstate; - return 0; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_getinheritsched.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_getinheritsched.c deleted file mode 100644 index 314fd8ade..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_getinheritsched.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit) -{ - __THREAD_INIT(); - - *inherit = attr->__inheritsched; - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_getschedparam.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_getschedparam.c deleted file mode 100644 index f0a9a07d1..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_getschedparam.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param) -{ - __THREAD_INIT(); - - param->sched_priority=attr->__schedparam.sched_priority; - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_getschedpolicy.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_getschedpolicy.c deleted file mode 100644 index 53f1bed8c..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_getschedpolicy.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy) -{ - __THREAD_INIT(); - - *policy = attr->__schedpolicy; - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_getscope.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_getscope.c deleted file mode 100644 index 99a33110d..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_getscope.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_getscope(const pthread_attr_t *attr, int *scope) -{ - __THREAD_INIT(); - - *scope=PTHREAD_SCOPE_SYSTEM; - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_getstackaddr.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_getstackaddr.c deleted file mode 100644 index d71421901..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_getstackaddr.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stack) -{ - __THREAD_INIT(); - - *stack=attr->__stackaddr; - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_getstacksize.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_getstacksize.c deleted file mode 100644 index 4785979a0..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_getstacksize.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize) -{ - __THREAD_INIT(); - - *stacksize=attr->__stacksize; - return 0; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c deleted file mode 100644 index 726e88fe5..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_init.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_init(pthread_attr_t *attr) -{ - __THREAD_INIT(); - - memset(attr,0,sizeof(pthread_attr_t)); - attr->__stacksize=PTHREAD_STACK_SIZE; - return 0; -} - -int pthread_attr_destroy(pthread_attr_t *attr) __attribute__((alias("pthread_attr_init"))); - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c deleted file mode 100644 index 690ad5f8e..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setdetachstate.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate) -{ - __THREAD_INIT(); - - if ((detachstate == PTHREAD_CREATE_JOINABLE) || - (detachstate == PTHREAD_CREATE_DETACHED)) { - attr->__detachstate=detachstate; - return 0; - } - (*(__errno_location()))=EINVAL; - return -1; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c deleted file mode 100644 index f38e6e35e..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setinheritsched.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit) -{ - __THREAD_INIT(); - - if ((inherit==PTHREAD_INHERIT_SCHED) || - (inherit==PTHREAD_EXPLICIT_SCHED)) { - attr->__inheritsched=inherit; - return 0; - } - (*(__errno_location()))=EINVAL; - return -1; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c deleted file mode 100644 index 833c0111b..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedparam.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param) -{ - __THREAD_INIT(); - - if ((attr->__schedpolicy == SCHED_OTHER) && (param->sched_priority == 0)) { - attr->__schedparam.sched_priority=0; - return 0; - } - if (((attr->__schedpolicy == SCHED_RR) || (attr->__schedpolicy == SCHED_RR)) - && ((param->sched_priority > 0) && (param->sched_priority < 100))) { - attr->__schedparam.sched_priority=param->sched_priority; - return 0; - } - (*(__errno_location()))=EINVAL; - return -1; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c deleted file mode 100644 index e845bca32..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setschedpolicy.c +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy) -{ - __THREAD_INIT(); - - if (policy==SCHED_OTHER) { - attr->__schedpolicy=policy; - return 0; - } - if ((policy==SCHED_FIFO) || (policy==SCHED_RR)) { - if (geteuid()==0) { - attr->__schedpolicy=policy; - return 0; - } - (*(__errno_location()))=ENOTSUP; - } - else - (*(__errno_location()))=EINVAL; - return -1; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c deleted file mode 100644 index 39088c9b2..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setscope.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_setscope(pthread_attr_t *attr, int scope) -{ - __THREAD_INIT(); - - if (scope==PTHREAD_SCOPE_SYSTEM) return 0; - - if (scope==PTHREAD_SCOPE_PROCESS) - (*(__errno_location()))=ENOTSUP; - else - (*(__errno_location()))=EINVAL; - return -1; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setstackaddr.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setstackaddr.c deleted file mode 100644 index 4b320cd9d..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setstackaddr.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stack) -{ - __THREAD_INIT(); - - attr->__stackaddr=stack; - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c b/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c deleted file mode 100644 index cfbab7747..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_attr_setstacksize.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize) -{ - __THREAD_INIT(); - - if (stacksize>=PTHREAD_STACK_SIZE) { - attr->__stacksize=stacksize; - return 0; - } - (*(__errno_location()))=EINVAL; - return -1; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cancel.c b/mdk-stage1/dietlibc/libpthread/pthread_cancel.c deleted file mode 100644 index 4c87a3ed1..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_cancel.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_cancel(pthread_t th) -{ - pthread_t j; - _pthread_descr thread; - - __THREAD_INIT(); - - j=__find_thread_id(th); - - if (j==-1) { - (*(__errno_location()))=ESRCH; - return -1; - } - thread = __get_thread_struct(j); - - if (thread==0) { - (*(__errno_location()))=ESRCH; - return -1; - } - - if (thread->cancelstate!=PTHREAD_CANCEL_DISABLE) { - thread->canceled=1; - if (thread->canceltype!=PTHREAD_CANCEL_DEFERRED) { - kill(thread->pid,SIGHUP); - } - } - - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cleanup_pop.c b/mdk-stage1/dietlibc/libpthread/pthread_cleanup_pop.c deleted file mode 100644 index 641bb6083..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_cleanup_pop.c +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -void pthread_cleanup_pop(int execute) -{ - _pthread_descr this; - struct thread_cleanup_t tmp; - int i=PTHREAD_MAX_CLEANUP; - - __THREAD_INIT(); - - this = __thread_self(); - - while(i>0) { - if (this->cleanup_stack[--i].func) { - tmp.func=this->cleanup_stack[i].func; - tmp.arg=this->cleanup_stack[i].arg; - this->cleanup_stack[i].func=0; - break; - } - } - - if (execute) tmp.func(tmp.arg); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cleanup_push.c b/mdk-stage1/dietlibc/libpthread/pthread_cleanup_push.c deleted file mode 100644 index cd2aabf71..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_cleanup_push.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -void pthread_cleanup_push(void (*func)(void*), void *arg) -{ - _pthread_descr this; - int i; - - __THREAD_INIT(); - - this = __thread_self(); - - for (i=0; icleanup_stack[i].func==0) { - this->cleanup_stack[i].func=func; - this->cleanup_stack[i].arg=arg; - break; - } - } -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c deleted file mode 100644 index d3c2274f3..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_broadcast.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_cond_broadcast(pthread_cond_t *cond) -{ - _pthread_descr tmp; - - __THREAD_INIT(); - - __pthread_lock(&(cond->lock)); - while ((tmp=cond->wait_chain)) { - cond->wait_chain=tmp->waitnext; - tmp->waitnext=0; - tmp->waiting=0; - } - __pthread_unlock(&(cond->lock)); - - return 0; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c deleted file mode 100644 index 9a6cc4f0b..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_destroy.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_cond_destroy(pthread_cond_t *cond) -{ - __THREAD_INIT(); - - if (cond->wait_chain) { - (*__errno_location())=EBUSY; - return 1; - } - - memset(cond,0,sizeof(pthread_cond_t)); - return 0; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c deleted file mode 100644 index 20b38bef2..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_init.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr) -{ - __THREAD_INIT(); - - memset(cond,0,sizeof(pthread_cond_t)); - return 0; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c deleted file mode 100644 index 60bf2119c..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_signal.c +++ /dev/null @@ -1,24 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_cond_signal(pthread_cond_t *cond) -{ - _pthread_descr tmp=0; - - __THREAD_INIT(); - - __pthread_lock(&(cond->lock)); - if ((tmp=cond->wait_chain)) cond->wait_chain=tmp->waitnext; - __pthread_unlock(&(cond->lock)); - - if (tmp) { - tmp->waitnext=0; - tmp->waiting=0; - } - - return 0; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c deleted file mode 100644 index 6613f2ca9..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_timedwait.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, - const struct timespec *abstime) -{ - _pthread_descr tmp; - _pthread_descr this; - int ret; - - __THREAD_INIT(); - - this=__thread_self(); - - /* put in wait-chain */ - __pthread_lock(&(cond->lock)); - this->waiting=1; - if (cond->wait_chain) { - for(tmp=cond->wait_chain;tmp->waitnext;tmp=tmp->waitnext); - tmp->waitnext=this; - } else cond->wait_chain=this; - __pthread_unlock(&(cond->lock)); - - /* Aeh yeah / wait till signal */ - pthread_mutex_unlock(mutex); - ret=nanosleep(abstime,0); - pthread_mutex_lock(mutex); - - __TEST_CANCEL(); - - if (ret) { - if ((*__errno_location())!=EINTR) return -1; - return 0; - } - - (*__errno_location())=ETIMEDOUT; - return -1; -} - - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c b/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c deleted file mode 100644 index 0c6c0ae13..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_cond_wait.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) -{ - _pthread_descr tmp; - _pthread_descr this; - - __THREAD_INIT(); - - this=__thread_self(); - - /* put in wait-chain */ - __pthread_lock(&(cond->lock)); - this->waiting=1; - if (cond->wait_chain) { - for(tmp=cond->wait_chain;tmp->waitnext;tmp=tmp->waitnext); - tmp->waitnext=this; - } else cond->wait_chain=this; - __pthread_unlock(&(cond->lock)); - - /* Aeh yeah / wait till signal */ - pthread_mutex_unlock(mutex); - while (this->waiting) { - __thread_wait_some_time(); - if (this->canceled) this->waiting=0; /* we got a cancel signal */ - } - pthread_mutex_lock(mutex); - - __TEST_CANCEL(); - return 0; -} - - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_condattr.c b/mdk-stage1/dietlibc/libpthread/pthread_condattr.c deleted file mode 100644 index c537890ba..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_condattr.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -int pthread_condattr_init(pthread_condattr_t *attr) -{ - return 0; -} - -int pthread_condattr_destroy(pthread_condattr_t *attr) -__attribute__((alias("pthread_condattr_init"))); - -int pthread_condattr_getpshared(const pthread_condattr_t *attr, int *pshared) -__attribute__((alias("pthread_condattr_init"))); - -int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared) -__attribute__((alias("pthread_condattr_init"))); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_create.c b/mdk-stage1/dietlibc/libpthread/pthread_create.c deleted file mode 100644 index b4a499081..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_create.c +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include -#include - -#include -#include "thread_internal.h" - -int pthread_create (pthread_t *thread, const pthread_attr_t *attr, - void *(*start_routine) (void *), void *arg) -{ - int ret=0; - _pthread_descr td; - pthread_attr_t default_attr; - - __THREAD_INIT(); - - if (start_routine==0) { - (*(__errno_location()))=EINVAL; - return -1; - } - - td = __thread_get_free(); - - if (td) { - if (!(attr)) { - pthread_attr_init(&default_attr); - attr=&default_attr; - } - - if ((td->policy!=SCHED_OTHER)&&(td->priority==0)) { - (*(__errno_location()))=EINVAL; - return -1; - } - - if (attr->__inheritsched==PTHREAD_INHERIT_SCHED) { - _pthread_descr this = __thread_self(); - td->policy = this->policy; - td->priority = this->priority; - } else { - td->policy = attr->__schedpolicy; - td->priority = attr->__schedparam.sched_priority; - } - - td->func = start_routine; - td->arg = arg; - - td->detached = attr->__detachstate; - - td->stack_size = attr->__stacksize; - - if (!(td->stack_addr)) { - char *stack=(char*)malloc(td->stack_size); - if (!(stack)) { - (*(__errno_location()))=EINVAL; - return -1; - } - td->stack_begin = stack; - td->stack_addr = stack+td->stack_size; - } else { - td->stack_begin = 0; - td->stack_addr = attr->__stackaddr; - } - - ret = signal_manager_thread(td); - - if (ret>1) - *thread=ret; - else - __thread_cleanup(td); - } - else - (*(__errno_location()))=EAGAIN; - - if (ret<2) return -1; - return ret; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_detach.c b/mdk-stage1/dietlibc/libpthread/pthread_detach.c deleted file mode 100644 index c07280389..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_detach.c +++ /dev/null @@ -1,36 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int pthread_detach(pthread_t th) -{ - pthread_t j; - _pthread_descr thread; - - __THREAD_INIT(); - - j=__find_thread_id(th); - - if (j==-1) { - (*(__errno_location()))=ESRCH; - return -1; - } - thread = __get_thread_struct(j); - - if (thread==0) { - (*(__errno_location()))=ESRCH; - return -1; - } - - if (thread->detached) { - (*(__errno_location()))=EINVAL; - return -1; - } - - if (!thread->joined) { - thread->detached=1; - } - - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_exit.c b/mdk-stage1/dietlibc/libpthread/pthread_exit.c deleted file mode 100644 index 41eac0a33..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_exit.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -void pthread_exit(void *retval) -{ - _pthread_descr this; - - __THREAD_INIT(); - - this = __thread_self(); - this->retval = retval; - - longjmp(this->jmp_exit,1); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_getspecific.c b/mdk-stage1/dietlibc/libpthread/pthread_getspecific.c deleted file mode 100644 index c2f84c814..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_getspecific.c +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -extern struct _thread_key __thread_keys[PTHREAD_KEYS_MAX]; -const void *pthread_getspecific(pthread_key_t key) -{ - int id; - __THREAD_INIT(); - - id=__find_thread_id(getpid()); - - if ((key -#include -#include - -#include "thread_internal.h" -#include - -int pthread_join(pthread_t th, void **thread_return) -{ - pthread_t j; - _pthread_descr this, thread; - - __THREAD_INIT(); - - this = __thread_self(); - j=__find_thread_id(th); - - if (j==-1) { - (*(__errno_location()))=ESRCH; - return -1; - } - - thread = __get_thread_struct(j); - - /* error handling */ - if (thread==0) { - (*(__errno_location()))=ESRCH; - return -1; - } - - if (this==thread) { - (*(__errno_location()))=EDEADLK; - return -1; - } - - if (thread->detached || thread->joined) { - (*(__errno_location()))=EINVAL; - return -1; - } - - thread->joined=this; - this->join=1; - - while(this->join) __thread_wait_some_time(); - - if (thread_return) *thread_return=this->retval; - - return 0; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_key_create.c b/mdk-stage1/dietlibc/libpthread/pthread_key_create.c deleted file mode 100644 index 44fccea6a..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_key_create.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -extern struct _pthread_fastlock __thread_keys_lock; -extern struct _thread_key __thread_keys[PTHREAD_KEYS_MAX]; -int pthread_key_create(pthread_key_t *key, void (*destructor)(const void*)) -{ - int ret=-1,i; - - __THREAD_INIT(); - - __NO_ASYNC_CANCEL_BEGIN; - __pthread_lock(&__thread_keys_lock); - - for (i=0; i -#include - -#include -#include "thread_internal.h" - -extern struct _thread_key __thread_keys[PTHREAD_KEYS_MAX]; -int pthread_key_delete(pthread_key_t key) -{ - __THREAD_INIT(); - - if (key>=PTHREAD_KEYS_MAX) { - (*__errno_location())=EINVAL; - return -1; - } - - __thread_keys[key].used=0; - - return 0; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c deleted file mode 100644 index 33a16abd4..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_destroy.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_mutex_destroy(pthread_mutex_t *mutex) -{ - __THREAD_INIT(); - - if ((mutex->owner)||(mutex->lock.__spinlock)) { - (*(__errno_location()))=EBUSY; - return -1; - } - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c deleted file mode 100644 index b1797fb20..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_init.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_mutex_init(pthread_mutex_t *mutex, - const pthread_mutexattr_t *mutexattr) -{ - __THREAD_INIT(); - - memset(mutex,0,sizeof(pthread_mutex_t)); - if (mutexattr) { - mutex->kind=mutexattr->__mutexkind; - } - return 0; -} - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c deleted file mode 100644 index 0c3ade9e8..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_lock.c +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include -#include - -#include -#include "thread_internal.h" - -/* will never return EINVAL ! */ - -int pthread_mutex_lock(pthread_mutex_t *mutex) -{ - _pthread_descr this; - - __THREAD_INIT(); - - this = __thread_self(); - - if (this!=mutex->owner) { - /* wait for mutex to free */ - __pthread_lock(&(mutex->lock)); - - mutex->owner=this; - } - else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) - { - (*(__errno_location()))=EDEADLK; - return -1; - } - - if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) ++(mutex->count); - - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c deleted file mode 100644 index fcf63f75e..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_trylock.c +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include -#include - -#include -#include "thread_internal.h" - -/* will never return EINVAL ! */ - -int pthread_mutex_trylock(pthread_mutex_t *mutex) -{ - _pthread_descr this; - - __THREAD_INIT(); - - this = __thread_self(); - - if (this!=mutex->owner) { - /* wait for mutex to free */ - if (__pthread_trylock(&(mutex->lock))) { - (*(__errno_location()))=EBUSY; - return -1; - } - - mutex->owner=this; - } - else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) - { - (*(__errno_location()))=EDEADLK; - return -1; - } - - if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) ++(mutex->count); - - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c b/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c deleted file mode 100644 index 0b5a1d0f7..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutex_unlock.c +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include - -#include -#include "thread_internal.h" - -/* will never return EINVAL ! */ - -int pthread_mutex_unlock(pthread_mutex_t *mutex) -{ - _pthread_descr this; - - __THREAD_INIT(); - - this = __thread_self(); - - if (this==mutex->owner) { - if (mutex->kind==PTHREAD_MUTEX_RECURSIVE_NP) { - if (--(mutex->count)) - return 0; - } - - mutex->owner=0; - __pthread_unlock(&(mutex->lock)); - } - else if (mutex->kind==PTHREAD_MUTEX_ERRORCHECK_NP) - { - (*(__errno_location()))=EPERM; - return -1; - } - - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_getkind_np.c b/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_getkind_np.c deleted file mode 100644 index 63cd9133c..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_getkind_np.c +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_mutexattr_getkind_np(const pthread_mutexattr_t *attr, int *kind) -{ - __THREAD_INIT(); - - *kind=attr->__mutexkind; - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_init.c b/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_init.c deleted file mode 100644 index ff60e4c74..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_init.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_mutexattr_init(pthread_mutexattr_t *attr) -{ - __THREAD_INIT(); - - attr->__mutexkind = 0; - return 0; -} - -int pthread_mutexattr_destroy(pthread_mutexattr_t *attr) __attribute__((alias ("pthread_mutexattr_init"))); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c b/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c deleted file mode 100644 index ac600f8ed..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_mutexattr_setkind_np.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind) -{ - __THREAD_INIT(); - - if ((kind==PTHREAD_MUTEX_FAST_NP) || (kind==PTHREAD_MUTEX_RECURSIVE_NP) || - (kind==PTHREAD_MUTEX_ERRORCHECK_NP)) { - attr->__mutexkind=kind; - return 0; - } - (*(__errno_location()))=EINVAL; - return -1; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_once.c b/mdk-stage1/dietlibc/libpthread/pthread_once.c deleted file mode 100644 index 16d9cb392..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_once.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include "thread_internal.h" - -int __pthread_once (pthread_once_t* once_control, void (*init_routine)(void)) -{ - if (!(__testandset(once_control))) init_routine(); - return 0; -} -int pthread_once (pthread_once_t* once_control, void (*init_routine)(void)) __attribute__((alias("__pthread_once"))); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_self.c b/mdk-stage1/dietlibc/libpthread/pthread_self.c deleted file mode 100644 index 394686dd4..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_self.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include - -pthread_t pthread_self() { return getpid(); } diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c b/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c deleted file mode 100644 index b906492fb..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_setcancelstate.c +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_setcancelstate(int state, int *oldstate) -{ - _pthread_descr thread; - - __THREAD_INIT(); - - if ((state==PTHREAD_CANCEL_ENABLE) || (state==PTHREAD_CANCEL_DISABLE)) - { - thread = __thread_self(); - - if (oldstate) *oldstate = thread->cancelstate; - thread->cancelstate = state; - - return 0; - } - - (*(__errno_location()))=EINVAL; - return -1; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c b/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c deleted file mode 100644 index 03d1f53de..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_setcanceltype.c +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int pthread_setcanceltype(int type, int *oldtype) -{ - _pthread_descr thread; - - __THREAD_INIT(); - - if ((type==PTHREAD_CANCEL_DEFERRED) || (type==PTHREAD_CANCEL_ASYNCHRONOUS)) - { - thread = __thread_self(); - - if (oldtype) *oldtype = thread->canceltype; - thread->canceltype = type; - - return 0; - } - - (*(__errno_location()))=EINVAL; - return -1; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c b/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c deleted file mode 100644 index 78339c20b..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_setspecific.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -extern struct _thread_key __thread_keys[PTHREAD_KEYS_MAX]; -int pthread_setspecific(pthread_key_t key, const void *value) -{ - int id; - __THREAD_INIT(); - - id=__find_thread_id(getpid()); - if ((key -#include -#include "thread_internal.h" - -static void __pthread_acquire(int * spinlock) -{ - int cnt = 0; - struct timespec tm; - - while (__testandset(spinlock)) { - if (cnt < MAX_SPIN_COUNT) { - sched_yield(); - cnt++; - } else { - tm.tv_sec = 0; - tm.tv_nsec = SPIN_SLEEP_DURATION; - __libc_nanosleep(&tm, 0); - cnt = 0; - } - } -} - -void __pthread_lock(struct _pthread_fastlock * lock) -{ - __pthread_acquire(&lock->__spinlock); -} - -int __pthread_trylock(struct _pthread_fastlock * lock) -{ - return __testandset(&lock->__spinlock); -} - -int __pthread_unlock(struct _pthread_fastlock * lock) -{ - return (lock->__spinlock = 0); -} - - diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c deleted file mode 100644 index 9f7d23d79..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_alloc.c +++ /dev/null @@ -1,26 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -static pthread_mutex_t mutex_alloc = PTHREAD_MUTEX_INITIALIZER; - -void free(void *ptr) -{ - __NO_ASYNC_CANCEL_BEGIN; - pthread_mutex_lock(&mutex_alloc); - __libc_free(ptr); - pthread_mutex_unlock(&mutex_alloc); - __NO_ASYNC_CANCEL_END; -} - -void *malloc(size_t size) -{ - register void *ret; - __NO_ASYNC_CANCEL_BEGIN; - pthread_mutex_lock(&mutex_alloc); - ret=__libc_malloc(size); - pthread_mutex_unlock(&mutex_alloc); - __NO_ASYNC_CANCEL_END; - return ret; -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_close.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_close.c deleted file mode 100644 index 84d5d5f36..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_close.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int close(int fd) -{ - __TEST_CANCEL(); - return __libc_close(fd); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_create.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_create.c deleted file mode 100644 index 9d47844f5..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_create.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int creat(const char *pathname, mode_t mode) -{ - __TEST_CANCEL(); - return __libc_creat(pathname,mode); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c deleted file mode 100644 index 99210a488..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_fcntl.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int fcntl(int fd, int cmd, void *arg) -{ - __TEST_CANCEL(); - return __libc_fcntl(fd,cmd,arg); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_fsync.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_fsync.c deleted file mode 100644 index a2c995069..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_fsync.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int fsync(int fd) -{ - __TEST_CANCEL(); - return __libc_fsync(fd); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c deleted file mode 100644 index 6070ad219..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_logging.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -static pthread_mutex_t mutex_syslog = PTHREAD_MUTEX_INITIALIZER; - -void closelog(void) -{ - pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock,&mutex_syslog); - pthread_mutex_lock(&mutex_syslog); - __libc_closelog(); - pthread_cleanup_pop(1); -} - -void openlog(const char *ident, int option, int facility) -{ - pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock,&mutex_syslog); - pthread_mutex_lock(&mutex_syslog); - __libc_openlog(ident, option, facility); - pthread_cleanup_pop(1); -} - -void vsyslog(int priority, const char *format, va_list arg_ptr) -{ - pthread_cleanup_push((void(*)(void*))pthread_mutex_unlock,&mutex_syslog); - pthread_mutex_lock(&mutex_syslog); - __libc_vsyslog(priority, format, arg_ptr); - pthread_cleanup_pop(1); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_nanosleep.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_nanosleep.c deleted file mode 100644 index 699de4654..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_nanosleep.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -int nanosleep(const struct timespec *req, struct timespec *rem) -{ - __TEST_CANCEL(); - return __libc_nanosleep(req,rem); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c deleted file mode 100644 index 513f6a323..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_open.c +++ /dev/null @@ -1,12 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int __pthread_open(const char *pathname, int flags, mode_t mode) -{ - __TEST_CANCEL(); - return __libc_open(pathname,flags,mode); -} - -int open(const char *pathname, int flags, ...) __attribute__((alias("__pthread_open"))); diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_pause.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_pause.c deleted file mode 100644 index ab15ead11..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_pause.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int pause() -{ - __TEST_CANCEL(); - return __libc_pause(); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_read.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_read.c deleted file mode 100644 index 60f886003..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_read.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int read(int fd, void *buf, size_t count) -{ - __TEST_CANCEL(); - return __libc_read(fd,buf,count); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_sigsuspend.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_sigsuspend.c deleted file mode 100644 index 72cd783ae..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_sigsuspend.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int sigsuspend(const sigset_t *mask) -{ - __TEST_CANCEL(); - return __libc_sigsuspend(mask); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c deleted file mode 100644 index 1ac33adfc..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_tcdrain.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int tcdrain(int fd) -{ - __TEST_CANCEL(); - return __libc_tcdrain(fd); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c deleted file mode 100644 index 76d5ddca7..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_waitpid.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -pid_t waitpid(pid_t pid, int *status, int options) -{ - __TEST_CANCEL(); - return __libc_waitpid(pid,status,options); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_sys_write.c b/mdk-stage1/dietlibc/libpthread/pthread_sys_write.c deleted file mode 100644 index 37541ae42..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_sys_write.c +++ /dev/null @@ -1,10 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -int write(int fd, const void *buf, size_t count) -{ - __TEST_CANCEL(); - return __libc_write(fd,buf,count); -} diff --git a/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c b/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c deleted file mode 100644 index 68f91e743..000000000 --- a/mdk-stage1/dietlibc/libpthread/pthread_testcancel.c +++ /dev/null @@ -1,16 +0,0 @@ -#include - -#include -#include "thread_internal.h" - -void pthread_testcancel() -{ - _pthread_descr thread; - __THREAD_INIT(); - - thread=__thread_self(); - - if (thread->canceled) { - pthread_exit(PTHREAD_CANCELED); - } -} diff --git a/mdk-stage1/dietlibc/libpthread/test.c b/mdk-stage1/dietlibc/libpthread/test.c deleted file mode 100644 index 3272c1753..000000000 --- a/mdk-stage1/dietlibc/libpthread/test.c +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include - -#include -#include - -#include - -int ra; - -void test(int sig) -{ - printf("SIGNAL %d in %d\n",sig,getpid()); - fflush(stdout); - signal(SIGHUP, test); -} - -void* thread(void* arg) -{ - int i; - for (i=0;i<10; i++) - { - printf("child %ld %8p\n", pthread_self(),arg); - sleep(1); - } - return arg; -} - -void* thread2(void *arg) -{ - pthread_t t; - int i; - - printf("child %ld %8p\n", pthread_self(),arg); - for (i=0; i<3; ++i) { - printf("child starting next in %d secs %ld %8p\n", 3-i, pthread_self(),arg); - sleep(1); - } - pthread_create(&t,0, thread, (void*)2); - printf("new child @ %ld\n",t); - return (void*)t; -} - -int main(int argc, char*argv[]) -{ - pthread_t t; - - signal(SIGHUP, test); - - pthread_create(&t,0, thread2, 0); - pthread_create(&t,0, thread, (void *)3); - pthread_create(&t,0, thread, (void *)1); - - puts("main"); - -#if 0 - { - int i; - for(i=0;i<4;i++) sleep(1); - } -#else - { - int *tt; - int i = pthread_join(t,(void*)&tt); - printf("join %d %p %d\n",i,tt,(*(__errno_location()))); - } -#endif - - puts("main exit"); - - return 0; -} diff --git a/mdk-stage1/dietlibc/libpthread/thread_internal.c b/mdk-stage1/dietlibc/libpthread/thread_internal.c deleted file mode 100644 index a93806203..000000000 --- a/mdk-stage1/dietlibc/libpthread/thread_internal.c +++ /dev/null @@ -1,344 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "thread_internal.h" - -static struct _pthread_fastlock __thread_struct_lock = {0}; -static struct _pthread_descr_struct threads[PTHREAD_THREADS_MAX]; -static int _max_used_thread_id=1; -pthread_once_t __thread_inited; - -static struct _pthread_fastlock __manager_thread_signal_lock = {0}; -static struct _pthread_fastlock __manager_thread_data_lock = {1}; -static struct _pthread_fastlock __manager_thread_data_go_lock = {1}; - -//#define DEBUG - -/* find thread */ -int __find_thread_id(int pid) -{ - register int i; - for (i=0; i<_max_used_thread_id; i++) - if (threads[i].pid==pid) - return i; - return -1; -} - -/* get thread */ -_pthread_descr __get_thread_struct(int id) -{ - return threads+id; -} - -/* thread errno location */ -int *__errno_location(void) -{ - int id=0; - if (__thread_inited) id=__find_thread_id(getpid()); - if (id<0) - return 0; - else - return &threads[id].errno; -} - -/* thread self */ -_pthread_descr __thread_self() -{ - register int i=__find_thread_id(getpid()); - if (i<0) - return 0; - else - return threads+i; -} - -/* allocate a thread slot */ -_pthread_descr __thread_get_free() -{ - _pthread_descr ret=0; - int i; - - __NO_ASYNC_CANCEL_BEGIN; - __pthread_lock(&__thread_struct_lock); - - for (i=0; i=_max_used_thread_id) _max_used_thread_id=i+1; - break; - } - } - - __pthread_unlock(&__thread_struct_lock); - __NO_ASYNC_CANCEL_END; - return ret; -} - -/* sleep a little (reschedule for this time) */ -void __thread_wait_some_time() -{ - struct timespec reg; - reg.tv_sec=0; - reg.tv_nsec=SPIN_SLEEP_DURATION; - __libc_nanosleep(®,0); -} - -/* cleanup a thread struct */ -void __thread_cleanup(_pthread_descr th) -{ - /* lib provided stack should be freed */ - if (th->stack_begin) free(th->stack_begin); - - /* an other thread has joined this on */ - if (th->joined) { - th->joined->retval=th->retval; - th->joined->join=0; - th->joined=0; - } - th->pid=0; /* mark struct as free */ -} - -/* SIGHUP handler (thread cnacel) PTHREAD_CANCEL_ASYNCHRONOUS */ -static void __thread_cancel_handler(int sig) -{ - _pthread_descr this; - this = __thread_self(); - this->canceled=1; - if (this->canceltype==PTHREAD_CANCEL_ASYNCHRONOUS) - pthread_exit(PTHREAD_CANCELED); - signal( SIGHUP, __thread_cancel_handler ); -} - -/* kill ALL threads / other then prime task and manager thread */ -static void __kill_all_threads() -{ - int i; - - for (i=2; i<_max_used_thread_id; i++) { - if (threads[i].pid>1) { -#ifdef DEBUG - printf("CANCEL ! %d\n",threads[i].pid); -#endif - threads[i].canceled=1; - kill(threads[i].pid, SIGHUP); /* cancel thread */ - } - } - - __thread_wait_some_time(); - - for (i=2; i<_max_used_thread_id; i++) { - if (threads[i].pid>1) { -#ifdef DEBUG - printf("KILL ! %d\n",threads[i].pid); -#endif - kill(threads[i].pid, SIGTERM); /* KILL thread */ - } - } -} - -__attribute__((weak)) volatile void __thread_start__key(int id) { return; } -__attribute__((weak,alias("__thread_start__key"))) volatile void __thread_exit__key(int id); - -/* support for manager */ -static void *__mthread_starter(void *arg) -{ - _pthread_descr td = (_pthread_descr)arg; - int i = td->stack_size-4096; - - /* just to be sure */ - td->pid=getpid(); - - /* signal handling for a thread */ - signal(SIGTERM, _exit); - signal(SIGCHLD, SIG_DFL); - signal(SIGHUP, __thread_cancel_handler ); - - /* limit stack so that we NEVER have to worry */ - setrlimit(RLIMIT_STACK, (struct rlimit *)(&i)); - - /* set scheduler */ - if (td->policy!=SCHED_OTHER) { - struct sched_param sp; - sp.sched_priority=td->priority; - sched_setscheduler(td->pid,td->policy, &sp); - } - - /* thread_key glue */ - __thread_start__key(td-threads); - -#ifdef DEBUG - printf("in starter %d, parameter %8p\n", td->pid, td->func); -#endif - - if (!td->canceled) { - if (!(setjmp(td->jmp_exit))) { - td->retval=td->func(td->arg); -#ifdef DEBUG - } else { - printf("pthread_exit called in %d\n", td->pid); -#endif - } - } - pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,0); - - /* thread_key glue */ - __thread_exit__key(td-threads); - -#ifdef DEBUG - printf("end starter %d, retval %8p\n", td->pid, td->retval); -#endif - - /* wake joined thread and put retval */ - if (td->joined) { - td->joined->retval=td->retval; - td->joined->join=0; - td->joined=0; - } - - /* execute all functions on the cleanup-stack */ - for (i=PTHREAD_MAX_CLEANUP;i;) { - if (td->cleanup_stack[--i].func) { - td->cleanup_stack[i].func(td->cleanup_stack[i].arg); - } - } - - return 0; -} - - -/* manager thread and signal handler */ -static char __manager_thread_stack[12*1024]; -static volatile _pthread_descr __manager_thread_data; -static void __manager_SIGCHLD(int sig) -{ - int pid, status, i; - - while(1) { - pid = __libc_waitpid (-1, &status, WNOHANG); - if (pid <= 0) break; - - for (i=0; i<_max_used_thread_id; i++) { - if (threads[i].pid==pid) { - __thread_cleanup(threads+i); - break; - } - } - } -} - -static void __manager_SIGTERM(int sig) -{ - __kill_all_threads(); - _exit(0); -} - -static void* __manager_thread(void *arg) -{ - struct sigaction sig_action_chld; - sig_action_chld.sa_handler = __manager_SIGCHLD; - sigemptyset(&sig_action_chld.sa_mask); - sig_action_chld.sa_flags = SA_RESTART; - - sigaction(SIGCHLD, &sig_action_chld, 0); - signal(SIGTERM, __manager_SIGTERM); - signal(SIGHUP, SIG_IGN); - - __pthread_unlock(&__manager_thread_data_go_lock); /* release init */ - while(1) { - do { - __thread_wait_some_time(); - if (getppid()<0) __manager_SIGTERM(0); - } while (__pthread_trylock(&__manager_thread_data_lock)); - - __manager_thread_data->pid = - __clone(__mthread_starter, - __manager_thread_data->stack_addr, - CLONE_VM | CLONE_FS | CLONE_FILES | SIGCHLD, - __manager_thread_data); - __thread_wait_some_time(); -#ifdef DEBUG - printf("manager new thread %d\n",__manager_thread_data->pid); -#endif - __pthread_unlock(&__manager_thread_data_go_lock); /* release sender */ - } - return 0; -} - -/* pthread_create bottom half */ -int signal_manager_thread(_pthread_descr td) -{ - __NO_ASYNC_CANCEL_BEGIN; - - __pthread_lock(&__manager_thread_signal_lock); /* lock */ - - __manager_thread_data = td; - __thread_wait_some_time(); - __pthread_unlock(&__manager_thread_data_lock); /* signal manager to start */ - __thread_wait_some_time(); - __pthread_lock(&__manager_thread_data_go_lock); /* wait for manager */ - - __pthread_unlock(&__manager_thread_signal_lock); /* unlock */ - - __NO_ASYNC_CANCEL_END; - - return td->pid; -} - - -/* thread stop */ -static void __thread_main_exit() -{ - if (getpid()!=threads[0].pid) { -#ifdef DEBUG - printf("A THREAD ? %d\n",getpid()); -#endif - kill(threads[0].pid, SIGTERM); - while(1) __thread_wait_some_time(); - } -#ifdef DEBUG - else - printf("EXIT ! %d\n",getpid()); -#endif - - /* stop ALL threads */ - kill(threads[1].pid, SIGTERM); - __thread_wait_some_time(); - __kill_all_threads(); -} - -/* thread intern init */ -void __thread_init() -{ - if (atexit(__thread_main_exit)==-1) - exit(42); - -#ifdef DEBUG - printf("INIT ! %d\n",getpid()); - memset(threads,0,sizeof(threads)); -#endif - - threads[0].pid = getpid(); - - ++_max_used_thread_id; - threads[1].stack_size=sizeof(__manager_thread_stack); - threads[1].stack_addr=&__manager_thread_stack[sizeof(__manager_thread_stack)]; - threads[1].stack_begin=0; - threads[1].func=__manager_thread; - - threads[1].pid = __clone(__mthread_starter, threads[1].stack_addr, - CLONE_VM | CLONE_FS | CLONE_FILES, threads+1); - -#ifdef DEBUG - printf("manager thread @ : %d\n",threads[1].pid); -#endif - __pthread_lock(&__manager_thread_data_go_lock); /* wait for manager to be ready */ -} - diff --git a/mdk-stage1/dietlibc/libpthread/thread_internal.h b/mdk-stage1/dietlibc/libpthread/thread_internal.h deleted file mode 100644 index 5eb3bbd08..000000000 --- a/mdk-stage1/dietlibc/libpthread/thread_internal.h +++ /dev/null @@ -1,131 +0,0 @@ -#ifndef __THREAD_INTERNAL_H__ -#define __THREAD_INTERNAL_H__ - -#include -#include -#include -#include "dietfeatures.h" -#ifndef WANT_THREAD_SAFE -#error "the diet libc is not compiled with thread safeness enabled!" -#endif - -/* cleanup */ -#define PTHREAD_MAX_CLEANUP 8 -struct thread_cleanup_t { - void (*func)(void*); - void *arg; -}; - -/* the thread descriptor / internal */ -struct _pthread_descr_struct { - /* runtime handling */ - struct _pthread_descr_struct *joined; /* a joined thread or NULL */ - - /* conditional variables */ - struct _pthread_descr_struct *waitnext; /* an other waiting thread or NULL */ - int waiting; /* internal waiting "lock" */ - - /* thread/process data */ - int pid; /* Process id */ - - int policy; /* thread scheduling policy */ - int priority; /* thread priority */ - - /* errno handling */ - int errno; - int h_errno; - - /* stack handling */ - unsigned int stack_size; /* stack size for setrlimit */ - void *stack_addr; /* stack address for clone */ - void *stack_begin; /* begin of lib-stack / lowest address (free) */ - - /* thread exit handling */ - void *retval; /* thread return value */ - int join; /* thread waits for other to return */ - jmp_buf jmp_exit; /* pthread_exit jump */ - - /* thread flags */ - int detached; /* thread is detached */ - int canceled; /* thread canceled */ - - /* cancel handling */ - int cancelstate; /* cancel state */ - int canceltype; /* type of cancellation */ - - /* thread basics */ - void* (*func) (void* arg); /* thread function */ - void* arg; /* thread argument */ - - /* create thread / manager thread lock */ - struct _pthread_fastlock *manager_lock; - - /* cleanup stack */ - struct thread_cleanup_t cleanup_stack[PTHREAD_MAX_CLEANUP]; - -} __attribute__ ((aligned(32))); - -/* thread keys */ -struct _thread_key { - int used; - void (*destructor)(const void*); - const void *tkd[PTHREAD_THREADS_MAX]; -}; - -/* internal stuff */ -int __testandset(int *spinlock); - -void __pthread_lock(struct _pthread_fastlock * lock); -int __pthread_trylock(struct _pthread_fastlock * lock); -int __pthread_unlock(struct _pthread_fastlock * lock); - -int __clone(void* (*fn)(void*), void* stack, int flags, void *arg); - -int __find_thread_id(int pid); -_pthread_descr __get_thread_struct(int id); - -_pthread_descr __thread_get_free(); -_pthread_descr __thread_self(); - -void __thread_cleanup(_pthread_descr th); - -void __thread_wait_some_time(); - -#define __NO_ASYNC_CANCEL_BEGIN { int oldtype; pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype); -#define __NO_ASYNC_CANCEL_END pthread_setcanceltype(oldtype,0); pthread_testcancel(); } -#define __NO_ASYNC_CANCEL_STOP pthread_setcanceltype(oldtype,0); } - -/* manager thread stuff */ -int signal_manager_thread(_pthread_descr td); - -/* init stuff */ -extern pthread_once_t __thread_inited; -void __thread_init(); -#define __THREAD_INIT() __pthread_once(&__thread_inited, __thread_init) -#define __TEST_CANCEL() pthread_testcancel() - -/* diet libc syscalls */ - -void __libc_free(void *ptr); -void *__libc_malloc(size_t size); - -void __libc_closelog(void); -void __libc_openlog(const char *ident, int option, int facility); -void __libc_vsyslog(int priority, const char *format, va_list arg_ptr); - -pid_t __libc_fork(void); - -int __libc_close(int fd); -int __libc_creat(const char *pathname, mode_t mode); -int __libc_fcntl(int fd, int cmd, void *arg); -int __libc_fsync(int fd); -int __libc_nanosleep(const struct timespec *req, struct timespec *rem); -int __libc_open(const char *pathname, int flags, mode_t mode); -int __libc_pause(void); -int __libc_read(int fd, void *buf, size_t count); -int __libc_sigsuspend(const sigset_t *mask); -int __libc_tcdrain(int fd); -pid_t __libc_waitpid(pid_t pid, int *status, int options); -int __libc_write(int fd, const void *buf, size_t count); - -#endif diff --git a/mdk-stage1/dietlibc/libpthread/thread_key.c b/mdk-stage1/dietlibc/libpthread/thread_key.c deleted file mode 100644 index b0f719fc9..000000000 --- a/mdk-stage1/dietlibc/libpthread/thread_key.c +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include - -#include -#include "thread_internal.h" - -struct _pthread_fastlock __thread_keys_lock; -struct _thread_key __thread_keys[PTHREAD_KEYS_MAX]; - -void __thread_start__key(int id) -{ - int i; - - __NO_ASYNC_CANCEL_BEGIN; - __pthread_lock(&__thread_keys_lock); - - for (i=0; i -#include -#include -#include -#include - -/* this is ugly. - * the idea is to build a parse tree, then do some poor man's OOP with a - * generic matcher function call that is always that the start of each - * record, and a next pointer. When the parse tree is done, we need to - * recursively set the next pointers to point to the part of the parse - * tree that needs to match next. - * This is the prototype of the generic match function call pointer. - * The first argument is the "this" pointer, the second is the text to - * be matched against, ofs is the offset from the start of the matched - * text (so we can match "^") and matches is an array where match - * positions are stored. */ -/* now declared in regex.h: */ -/* typedef int (*matcher)(void*,const char*,int ofs,regmatch_t* matches,int plus,int eflags); */ - -/* one would think that this is approach is an order of magnitude slower - * than the standard NFA approach, but it isn't. The busybox grep took - * 0.26 seconds for a fixed string compared to 0.19 seconds for the - * glibc regex. */ - -/* first part: parse a regex into a parse tree */ -struct bracketed { - unsigned int cc[32]; -}; - -/* now declared in regex.h: -struct regex { - matcher m; - void* next; - int pieces; - int num; - struct branch *b; -}; */ - -struct atom { - matcher m; - void* next; - enum { EMPTY, REGEX, BRACKET, ANY, LINESTART, LINEEND, WORDSTART, WORDEND, CHAR, } type; - int bnum; - union { - struct regex r; - struct bracketed b; - char c; - } u; -}; - -struct piece { - matcher m; - void* next; - struct atom a; - unsigned char min,max; -}; - -struct branch { - matcher m; - void* next; - int num; - struct piece *p; -}; - -static void clearcc(unsigned int* x) { - memset(x,0,sizeof(*x)); -} - -static void setcc(unsigned int* x,unsigned int bit) { - x[bit/32]|=(1<<((bit%32)-1)); -} - -static int issetcc(unsigned int* x,unsigned int bit) { - return x[bit/32] & (1<<((bit%32)-1)); -} - -static const char* parsebracketed(struct bracketed*__restrict__ b,const char*__restrict__ s,regex_t*__restrict__ rx) { - const char* t; - int i,negflag=0; - if (*s!='[') return s; - t=s+1; - clearcc(b->cc); - if (*t=='^') { negflag=1; ++t; } - do { - if (*t==0) return s; - setcc(b->cc,rx->cflags®_ICASE?*t:tolower(*t)); - if (t[1]=='-' && t[2]!=']') { - for (i=*t+1; i<=t[2]; ++i) setcc(b->cc,rx->cflags®_ICASE?i:tolower(i)); - t+=2; - } - ++t; - } while (*t!=']'); - if (negflag) for (i=0; i<32; ++i) b->cc[i]=~b->cc[i]; - return t+1; -} - -static const char* parseregex(struct regex* r,const char* s,regex_t* rx); - -static int matchatom(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) { - register struct atom* a=(struct atom*)x; - int matchlen=0; - switch (a->type) { - case EMPTY: -// printf("matching EMPTY against \"%s\"\n",s); - preg->l[a->bnum].rm_so=preg->l[a->bnum].rm_eo=ofs; - goto match; - case REGEX: -// printf("matching REGEX against \"%s\"\n",s); - if ((matchlen=a->u.r.m(a,s,ofs,preg,0,eflags))>=0) { - preg->l[a->bnum].rm_so=ofs; - preg->l[a->bnum].rm_eo=ofs+matchlen; - goto match; - } - break; - case BRACKET: -// printf("matching BRACKET against \"%s\"\n",s); - matchlen=1; - if (*s=='\n' && (preg->cflags®_NEWLINE)) break; - if (*s && issetcc(a->u.b.cc,(preg->cflags®_ICASE?tolower(*s):*s))) - goto match; - break; - case ANY: -// printf("matching ANY against \"%s\"\n",s); - if (*s=='\n' && (preg->cflags®_NEWLINE)) break; - matchlen=1; - if (*s) goto match; - break; - case LINESTART: -// printf("matching LINESTART against \"%s\"\n",s); - if (ofs==0 && (eflags®_NOTBOL)==0) { - goto match; - } - break; - case LINEEND: -// printf("matching LINEEND against \"%s\"\n",s); - if ((*s && *s!='\n') || (eflags®_NOTEOL)==0) break; - goto match; - case WORDSTART: - if ((ofs==0 || isspace(s[-1])) && !isspace(*s)) - goto match; - break; - case WORDEND: - if (ofs>0 && !isspace(s[-1]) && isspace(*s)) - goto match; - break; - case CHAR: -// printf("matching CHAR %c against \"%s\"\n",a->u.c,s); - matchlen=1; - if (((preg->cflags®_ICASE)?tolower(*s):*s)==a->u.c) goto match; - break; - } - return -1; -match: - if (a->next) - return ((struct atom*)(a->next))->m(a->next,s+matchlen,ofs+matchlen,preg,plus+matchlen,eflags); - else - return plus+matchlen; -} - -static const char* parseatom(struct atom*__restrict__ a,const char*__restrict__ s,regex_t*__restrict__ rx) { - const char *tmp; - a->m=matchatom; - a->bnum=-1; - switch (*s) { - case '(': - a->bnum=++rx->brackets; - if (s[1]==')') { - a->type=EMPTY; - return s+2; - } - a->type=REGEX; - if ((tmp=parseregex(&a->u.r,s+1,rx))!=s) { - if (*tmp==')') - return tmp+1; - } - case 0: - case '|': - case ')': - return s; - case '[': - a->type=BRACKET; - if ((tmp=parsebracketed(&a->u.b,s,rx))!=s) - return tmp; - return s; - case '.': - a->type=ANY; - break; - case '^': - a->type=LINESTART; - break; - case '$': - a->type=LINEEND; - break; - case '\\': - if (!*++s) return s; - if (*s=='<') { - a->type=WORDSTART; - break; - } else if (*s=='>') { - a->type=WORDEND; - break; - } - default: - a->type=CHAR; - a->u.c=rx->cflags®_ICASE?*s:tolower(*s); - break; - } - return s+1; -} - -/* needs to do "greedy" matching, i.e. match as often as possible */ -static int matchpiece(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) { - register struct piece* a=(struct piece*)x; - int matchlen=0; - int tmp,num=0; - unsigned int *offsets=alloca(sizeof(int)*a->max); - offsets[0]=0; -// printf("matchpiece \"%s\"...\n",s); - /* first, try to match the atom as often as possible, up to a->max times */ - if (a->max == 1 && a->min == 1) - return a->a.m(&a->a,s+matchlen,ofs+matchlen,preg,0,eflags); - while (nummax) { - void* save=a->a.next; - a->a.next=0; - if ((tmp=a->a.m(&a->a,s+matchlen,ofs+matchlen,preg,0,eflags))>=0) { - a->a.next=save; - ++num; - matchlen+=tmp; - offsets[num]=tmp; - } else { - a->a.next=save; - break; - } - } - if (nummin) return -1; /* already at minimum matches; signal mismatch */ - /* then, while the rest does not match, back off */ - for (;;) { - if (a->next) - tmp=((struct atom*)(a->next))->m(a->next,s+matchlen,ofs+matchlen,preg,plus+matchlen,eflags); - else - tmp=plus+matchlen; - if (tmp>=0) break; /* it did match; don't back off any further */ - matchlen-=offsets[num]; - --num; - } - return tmp; -} - -static const char* parsepiece(struct piece*__restrict__ p,const char*__restrict__ s,regex_t*__restrict__ rx) { - const char* tmp=parseatom(&p->a,s,rx); - if (tmp==s) return s; - p->m=matchpiece; - p->min=p->max=1; - switch (*tmp) { - case '*': p->min=0; p->max=RE_DUP_MAX; break; - case '+': p->min=1; p->max=RE_DUP_MAX; break; - case '?': p->min=0; p->max=1; break; - case '{': - if (isdigit(*++tmp)) { - p->min=*tmp-'0'; p->max=RE_DUP_MAX; - while (isdigit(*++tmp)) p->min=p->min*10+*tmp-'0'; - if (*tmp==',') { - if (isdigit(*++tmp)) { - p->max=*tmp-'0'; - while (isdigit(*++tmp)) p->max=p->max*10+*tmp-'0'; - } - } - if (*tmp!='}') return s; - ++tmp; - } - default: - return tmp; - } - return tmp+1; -} - -/* trivial, just pass through */ -static int matchbranch(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) { - register struct branch* a=(struct branch*)x; - int tmp; - tmp=a->p->m(a->p,s,ofs,preg,plus,eflags); - if (tmp>=0) { - if (a->next) - return ((struct atom*)(a->next))->m(a->next,s+tmp,ofs+tmp,preg,plus+tmp,eflags); - else - return plus+tmp; - } - return -1; -} - -static const char* parsebranch(struct branch*__restrict__ b,const char*__restrict__ s,regex_t*__restrict__ rx,int*__restrict__ pieces) { - struct piece p; - const char *tmp; - b->m=matchbranch; - b->num=0; b->p=0; - for (;;) { - if (*s=='|') { - if (b->num==0) { - tmp=s+1; - p.a.type=EMPTY; - p.min=p.max=1; - } - } else { - tmp=parsepiece(&p,s,rx); - if (tmp==s) return s; - } - if (!(b->p=realloc(b->p,++b->num*sizeof(p)))) return s; - b->p[b->num-1]=p; - if (*s=='|') { ++tmp; break; } - s=tmp; - } - *pieces+=b->num; - return tmp; -} - -/* try the branches one by one */ -static int matchregex(void*__restrict__ x,const char*__restrict__ s,int ofs,struct __regex_t*__restrict__ preg,int plus,int eflags) { - register struct regex* a=(struct regex*)x; - int i,tmp; - for (i=0; inum; ++i) { - tmp=a->b[i].m(&a->b[i],s,ofs,preg,plus,eflags); - if (tmp>=0) { - if (a->next) - return ((struct atom*)(a->next))->m(a->next,s+tmp,ofs+tmp,preg,plus+tmp,eflags); - else - return plus+tmp; - } - } - return -1; -} - -static const char* parseregex(struct regex*__restrict__ r,const char*__restrict__ s,regex_t*__restrict__ p) { - struct branch b; - const char *tmp; - r->m=matchregex; - r->num=0; r->b=0; r->pieces=0; - for (;;) { - tmp=parsebranch(&b,s,p,&r->pieces); - if (tmp==s) return s; - if (!(r->b=realloc(r->b,++r->num*sizeof(b)))) return s; - r->b[r->num-1]=b; - s=tmp; - } - return tmp; -} - - -/* The matcher relies on the presence of next pointers, of which the - * parser does not know the correct destination. So we need an - * additional pass through the data structure that sets the next - * pointers correctly. */ -static void regex_putnext(struct regex* r,void* next); - -static void atom_putnext(struct atom*__restrict__ a,void*__restrict__ next) { - a->next=next; - if (a->type==REGEX) - regex_putnext(&a->u.r,next); -} - -static void piece_putnext(struct piece*__restrict__ p,void*__restrict__ next) { - p->next=next; - atom_putnext(&p->a,next); -} - -static void branch_putnext(struct branch*__restrict__ b,void*__restrict__ next) { - int i; - for (i=0; inum-1; ++i) - piece_putnext(&b->p[i],&b->p[i+1]); - piece_putnext(&b->p[i],0); - b->next=next; -} - -static void regex_putnext(struct regex*__restrict__ r,void*__restrict__ next) { - int i; - for (i=0; inum; ++i) - branch_putnext(&r->b[i],next); - r->next=next; -} - - - -int regcomp(regex_t*__restrict__ preg, const char*__restrict__ regex, int cflags) { - const char* t=parseregex(&preg->r,regex,preg); - if (t==regex) return -1; - regex_putnext(&preg->r,0); - preg->cflags=cflags; - return 0; -} - -int regexec(const regex_t*__restrict__ preg, const char*__restrict__ string, size_t nmatch, regmatch_t pmatch[], int eflags) { - int matched; - const char *orig=string; - ((regex_t*)preg)->l=alloca(sizeof(regmatch_t)*(preg->brackets+1)); - while (*string) { - matched=preg->r.m((void*)&preg->r,string,string-orig,(regex_t*)preg,0,eflags); - if (matched>=0) { - if ((preg->cflags®_NOSUB)==0) memmove(pmatch,preg->l,nmatch*sizeof(regmatch_t)); - return 0; - } - ++string; eflags|=REG_NOTBOL; - } - return REG_NOMATCH; -} - - - -void regfree(regex_t* preg) { - int i; - for (i=0; ir.num; ++i) { - free(preg->r.b[i].p); - free(preg->r.b); - } -} - -size_t regerror(int errcode, const regex_t*__restrict__ preg, char*__restrict__ errbuf, size_t errbuf_size) { - strncpy(errbuf,"invalid regular expression (sorry)",errbuf_size); - return strlen(errbuf); -} - - - - -#if 0 -int main() { - struct regex r; - int bnum=-1; - const char* t=parseregex(&r,"^a*ab$",&bnum); - regex_putnext(&r,0); - printf("%d pieces, %s\n",r.pieces,t); - printf("%d\n",r.m(&r,"aaab",0,0,0)); - return 0; -} -#endif diff --git a/mdk-stage1/dietlibc/librpc/auth_none.c b/mdk-stage1/dietlibc/librpc/auth_none.c deleted file mode 100644 index 7a4dffe87..000000000 --- a/mdk-stage1/dietlibc/librpc/auth_none.c +++ /dev/null @@ -1,128 +0,0 @@ -/* @(#)auth_none.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)auth_none.c 1.19 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * auth_none.c - * Creates a client authentication handle for passing "null" - * credentials and verifiers to remote systems. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#define MAX_MARSHEL_SIZE 20 - -/* - * Authenticator operations routines - */ -static void authnone_verf(); -static void authnone_destroy(); -static bool_t authnone_marshal(); -static bool_t authnone_validate(); -static bool_t authnone_refresh(); - -static struct auth_ops ops = { - authnone_verf, - authnone_marshal, - authnone_validate, - authnone_refresh, - authnone_destroy -}; - -static struct authnone_private { - AUTH no_client; - char marshalled_client[MAX_MARSHEL_SIZE]; - u_int mcnt; -} *authnone_private; - -AUTH *authnone_create() -{ - register struct authnone_private *ap = authnone_private; - XDR xdr_stream; - register XDR *xdrs; - - if (ap == 0) { - ap = (struct authnone_private *) calloc(1, sizeof(*ap)); - if (ap == 0) - return (0); - authnone_private = ap; - } - if (!ap->mcnt) { - ap->no_client.ah_cred = ap->no_client.ah_verf = _null_auth; - ap->no_client.ah_ops = &ops; - xdrs = &xdr_stream; - xdrmem_create(xdrs, ap->marshalled_client, - (u_int) MAX_MARSHEL_SIZE, XDR_ENCODE); - (void) xdr_opaque_auth(xdrs, &ap->no_client.ah_cred); - (void) xdr_opaque_auth(xdrs, &ap->no_client.ah_verf); - ap->mcnt = XDR_GETPOS(xdrs); - XDR_DESTROY(xdrs); - } - return (&ap->no_client); -} - - /*ARGSUSED*/ static bool_t authnone_marshal(client, xdrs) -AUTH *client; -XDR *xdrs; -{ - register struct authnone_private *ap = authnone_private; - - if (ap == 0) - return (0); - return ((*xdrs->x_ops->x_putbytes) (xdrs, - ap->marshalled_client, ap->mcnt)); -} - -static void authnone_verf() -{ -} - -static bool_t authnone_validate() -{ - - return (TRUE); -} - -static bool_t authnone_refresh() -{ - - return (FALSE); -} - -static void authnone_destroy() -{ -} diff --git a/mdk-stage1/dietlibc/librpc/auth_unix.c b/mdk-stage1/dietlibc/librpc/auth_unix.c deleted file mode 100644 index 5daeb5f4a..000000000 --- a/mdk-stage1/dietlibc/librpc/auth_unix.c +++ /dev/null @@ -1,313 +0,0 @@ -/* @(#)auth_unix.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)auth_unix.c 1.19 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * auth_unix.c, Implements UNIX style authentication parameters. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * The system is very weak. The client uses no encryption for it's - * credentials and only sends null verifiers. The server sends backs - * null verifiers or optionally a verifier that suggests a new short hand - * for the credentials. - * - */ - -#include -#include -#include -#include - -#include -#include -#include -#include - -/* - * Unix authenticator operations vector - */ -static void authunix_nextverf(); -static bool_t authunix_marshal(); -static bool_t authunix_validate(); -static bool_t authunix_refresh(); -static void authunix_destroy(); - -static struct auth_ops auth_unix_ops = { - authunix_nextverf, - authunix_marshal, - authunix_validate, - authunix_refresh, - authunix_destroy -}; - -/* - * This struct is pointed to by the ah_private field of an auth_handle. - */ -struct audata { - struct opaque_auth au_origcred; /* original credentials */ - struct opaque_auth au_shcred; /* short hand cred */ - u_long au_shfaults; /* short hand cache faults */ - char au_marshed[MAX_AUTH_BYTES]; - u_int au_mpos; /* xdr pos at end of marshed */ -}; - -#define AUTH_PRIVATE(auth) ((struct audata *)auth->ah_private) - -static void marshal_new_auth(); - - -/* - * Create a unix style authenticator. - * Returns an auth handle with the given stuff in it. - */ -AUTH *authunix_create __P ((char *machname, uid_t uid, - gid_t gid, int len, - gid_t *aup_gids)) -{ - struct authunix_parms aup; - char mymem[MAX_AUTH_BYTES]; - struct timeval now; - XDR xdrs; - register AUTH *auth; - register struct audata *au; - - /* - * Allocate and set up auth handle - */ - auth = (AUTH *) mem_alloc(sizeof(*auth)); -#ifndef KERNEL - if (auth == NULL) { - (void) fprintf(stderr, "authunix_create: out of memory\n"); - return (NULL); - } -#endif - au = (struct audata *) mem_alloc(sizeof(*au)); -#ifndef KERNEL - if (au == NULL) { - (void) fprintf(stderr, "authunix_create: out of memory\n"); - return (NULL); - } -#endif - auth->ah_ops = &auth_unix_ops; - auth->ah_private = (caddr_t) au; - auth->ah_verf = au->au_shcred = _null_auth; - au->au_shfaults = 0; - - /* - * fill in param struct from the given params - */ - (void) gettimeofday(&now, (struct timezone *) 0); - aup.aup_time = now.tv_sec; - aup.aup_machname = machname; - aup.aup_uid = uid; - aup.aup_gid = gid; - aup.aup_len = (u_int) len; - aup.aup_gids = aup_gids; - - /* - * Serialize the parameters into origcred - */ - xdrmem_create(&xdrs, mymem, MAX_AUTH_BYTES, XDR_ENCODE); - if (!xdr_authunix_parms(&xdrs, &aup)) - abort(); - au->au_origcred.oa_length = len = XDR_GETPOS(&xdrs); - au->au_origcred.oa_flavor = AUTH_UNIX; -#ifdef KERNEL - au->au_origcred.oa_base = mem_alloc((u_int) len); -#else - if ((au->au_origcred.oa_base = mem_alloc((u_int) len)) == NULL) { - (void) fprintf(stderr, "authunix_create: out of memory\n"); - return (NULL); - } -#endif - bcopy(mymem, au->au_origcred.oa_base, (u_int) len); - - /* - * set auth handle to reflect new cred. - */ - auth->ah_cred = au->au_origcred; - marshal_new_auth(auth); - return (auth); -} - -/* - * Returns an auth handle with parameters determined by doing lots of - * syscalls. - */ -AUTH *authunix_create_default() -{ - register int len; - char machname[MAX_MACHINE_NAME + 1]; - register int uid; - register int gid; - gid_t gids[NGRPS]; - - if (gethostname(machname, MAX_MACHINE_NAME) == -1) - abort(); - machname[MAX_MACHINE_NAME] = 0; - uid = geteuid(); - gid = getegid(); - if ((len = getgroups(NGRPS, gids)) < 0) - abort(); - return (authunix_create(machname, uid, gid, len, gids)); -} - -/* - * authunix operations - */ - -static void authunix_nextverf(auth) -AUTH *auth; -{ - /* no action necessary */ -} - -static bool_t authunix_marshal(auth, xdrs) -AUTH *auth; -XDR *xdrs; -{ - register struct audata *au = AUTH_PRIVATE(auth); - - return (XDR_PUTBYTES(xdrs, au->au_marshed, au->au_mpos)); -} - -static bool_t authunix_validate(auth, verf) -register AUTH *auth; -struct opaque_auth verf; -{ - register struct audata *au; - XDR xdrs; - - if (verf.oa_flavor == AUTH_SHORT) { - au = AUTH_PRIVATE(auth); - xdrmem_create(&xdrs, verf.oa_base, verf.oa_length, XDR_DECODE); - - if (au->au_shcred.oa_base != NULL) { - mem_free(au->au_shcred.oa_base, au->au_shcred.oa_length); - au->au_shcred.oa_base = NULL; - } - if (xdr_opaque_auth(&xdrs, &au->au_shcred)) { - auth->ah_cred = au->au_shcred; - } else { - xdrs.x_op = XDR_FREE; - (void) xdr_opaque_auth(&xdrs, &au->au_shcred); - au->au_shcred.oa_base = NULL; - auth->ah_cred = au->au_origcred; - } - marshal_new_auth(auth); - } - return (TRUE); -} - -static bool_t authunix_refresh(auth) -register AUTH *auth; -{ - register struct audata *au = AUTH_PRIVATE(auth); - struct authunix_parms aup; - struct timeval now; - XDR xdrs; - register int stat; - - if (auth->ah_cred.oa_base == au->au_origcred.oa_base) { - /* there is no hope. Punt */ - return (FALSE); - } - au->au_shfaults++; - - /* first deserialize the creds back into a struct authunix_parms */ - aup.aup_machname = NULL; - aup.aup_gids = (gid_t *) NULL; - xdrmem_create(&xdrs, au->au_origcred.oa_base, - au->au_origcred.oa_length, XDR_DECODE); - stat = xdr_authunix_parms(&xdrs, &aup); - if (!stat) - goto done; - - /* update the time and serialize in place */ - (void) gettimeofday(&now, (struct timezone *) 0); - aup.aup_time = now.tv_sec; - xdrs.x_op = XDR_ENCODE; - XDR_SETPOS(&xdrs, 0); - stat = xdr_authunix_parms(&xdrs, &aup); - if (!stat) - goto done; - auth->ah_cred = au->au_origcred; - marshal_new_auth(auth); - done: - /* free the struct authunix_parms created by deserializing */ - xdrs.x_op = XDR_FREE; - (void) xdr_authunix_parms(&xdrs, &aup); - XDR_DESTROY(&xdrs); - return (stat); -} - -static void authunix_destroy(auth) -register AUTH *auth; -{ - register struct audata *au = AUTH_PRIVATE(auth); - - mem_free(au->au_origcred.oa_base, au->au_origcred.oa_length); - - if (au->au_shcred.oa_base != NULL) - mem_free(au->au_shcred.oa_base, au->au_shcred.oa_length); - - mem_free(auth->ah_private, sizeof(struct audata)); - - if (auth->ah_verf.oa_base != NULL) - mem_free(auth->ah_verf.oa_base, auth->ah_verf.oa_length); - - mem_free((caddr_t) auth, sizeof(*auth)); -} - -/* - * Marshals (pre-serializes) an auth struct. - * sets private data, au_marshed and au_mpos - */ -static void marshal_new_auth(auth) -register AUTH *auth; -{ - XDR xdr_stream; - register XDR *xdrs = &xdr_stream; - register struct audata *au = AUTH_PRIVATE(auth); - - xdrmem_create(xdrs, au->au_marshed, MAX_AUTH_BYTES, XDR_ENCODE); - if ((!xdr_opaque_auth(xdrs, &(auth->ah_cred))) || - (!xdr_opaque_auth(xdrs, &(auth->ah_verf)))) { - perror("auth_none.c - Fatal marshalling problem"); - } else { - au->au_mpos = XDR_GETPOS(xdrs); - } - XDR_DESTROY(xdrs); -} diff --git a/mdk-stage1/dietlibc/librpc/authunix_prot.c b/mdk-stage1/dietlibc/librpc/authunix_prot.c deleted file mode 100644 index ddcadb808..000000000 --- a/mdk-stage1/dietlibc/librpc/authunix_prot.c +++ /dev/null @@ -1,69 +0,0 @@ -/* @(#)authunix_prot.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)authunix_prot.c 1.15 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * authunix_prot.c - * XDR for UNIX style authentication parameters for RPC - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - - -#include -#include -#include -#include - -/* - * XDR for unix authentication parameters. - */ -bool_t xdr_authunix_parms(xdrs, p) -register XDR *xdrs; -register struct authunix_parms *p; -{ - int a,b; - - if (xdr_u_long(xdrs, &(p->aup_time)) - && xdr_string(xdrs, &(p->aup_machname), MAX_MACHINE_NAME) - && xdr_int(xdrs, &a) - && xdr_int(xdrs, &b) - && xdr_array(xdrs, (caddr_t *) & (p->aup_gids), - &(p->aup_len), NGRPS, sizeof(int), (xdrproc_t)xdr_int)) { - p->aup_uid=(uid_t)a; - p->aup_gid=(gid_t)b; - return (TRUE); - } - return (FALSE); -} diff --git a/mdk-stage1/dietlibc/librpc/bindresvport.c b/mdk-stage1/dietlibc/librpc/bindresvport.c deleted file mode 100644 index 8b65261dd..000000000 --- a/mdk-stage1/dietlibc/librpc/bindresvport.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * Copyright (c) 1987 by Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#include -#include - -/* - * Bind a socket to a privileged IP port - */ -int bindresvport(sd, sin) -int sd; -struct sockaddr_in *sin; -{ - int res; - static short port; - struct sockaddr_in myaddr; - extern int errno; - int i; - -#define STARTPORT 600 -#define ENDPORT (IPPORT_RESERVED - 1) -#define NPORTS (ENDPORT - STARTPORT + 1) - - if (sin == (struct sockaddr_in *) 0) { - sin = &myaddr; - bzero(sin, sizeof(*sin)); - sin->sin_family = AF_INET; - } else if (sin->sin_family != AF_INET) { - errno = EPFNOSUPPORT; - return (-1); - } - if (port == 0) { - port = (getpid() % NPORTS) + STARTPORT; - } - res = -1; - errno = EADDRINUSE; - for (i = 0; i < NPORTS && res < 0 && errno == EADDRINUSE; i++) { - sin->sin_port = htons(port++); - if (port > ENDPORT) { - port = STARTPORT; - } - res = bind(sd, (struct sockaddr*)sin, sizeof(struct sockaddr_in)); - } - return (res); -} diff --git a/mdk-stage1/dietlibc/librpc/clnt_generic.c b/mdk-stage1/dietlibc/librpc/clnt_generic.c deleted file mode 100644 index 9bb81cc80..000000000 --- a/mdk-stage1/dietlibc/librpc/clnt_generic.c +++ /dev/null @@ -1,112 +0,0 @@ -/* @(#)clnt_generic.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)clnt_generic.c 1.4 87/08/11 (C) 1987 SMI"; -#endif -/* - * Copyright (C) 1987, Sun Microsystems, Inc. - */ -#include -#include -#include -#include -#include - -/* - * Generic client creation: takes (hostname, program-number, protocol) and - * returns client handle. Default options are set, which the user can - * change using the rpc equivalent of ioctl()'s. - */ -CLIENT *clnt_create __P ((const char *hostname, const u_long prog, - const u_long vers, const char *proto)) -{ - struct hostent *h; - struct protoent *p; - struct sockaddr_in sin; - int sock; - struct timeval tv; - CLIENT *client; - - h = gethostbyname(hostname); - if (h == NULL) { - rpc_createerr.cf_stat = RPC_UNKNOWNHOST; - return (NULL); - } - if (h->h_addrtype != AF_INET) { - /* - * Only support INET for now - */ - rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = EAFNOSUPPORT; - return (NULL); - } -#ifdef __linux__ - bzero((char *) &sin, sizeof(sin)); -#endif - sin.sin_family = h->h_addrtype; - sin.sin_port = 0; -#ifndef __linux__ - bzero(sin.sin_zero, sizeof(sin.sin_zero)); -#endif - bcopy(h->h_addr, (char *) &sin.sin_addr, h->h_length); - p = getprotobyname(proto); - if (p == NULL) { - rpc_createerr.cf_stat = RPC_UNKNOWNPROTO; - rpc_createerr.cf_error.re_errno = EPFNOSUPPORT; - return (NULL); - } - sock = RPC_ANYSOCK; - switch (p->p_proto) { - case IPPROTO_UDP: - tv.tv_sec = 5; - tv.tv_usec = 0; - client = clntudp_create(&sin, prog, vers, tv, &sock); - if (client == NULL) { - return (NULL); - } - tv.tv_sec = 25; - clnt_control(client, CLSET_TIMEOUT, (char*)&tv); - break; - case IPPROTO_TCP: - client = clnttcp_create(&sin, prog, vers, &sock, 0, 0); - if (client == NULL) { - return (NULL); - } - tv.tv_sec = 25; - tv.tv_usec = 0; - clnt_control(client, CLSET_TIMEOUT, (char*)&tv); - break; - default: - rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = EPFNOSUPPORT; - return (NULL); - } - return (client); -} diff --git a/mdk-stage1/dietlibc/librpc/clnt_perror.c b/mdk-stage1/dietlibc/librpc/clnt_perror.c deleted file mode 100644 index 4ede1a43e..000000000 --- a/mdk-stage1/dietlibc/librpc/clnt_perror.c +++ /dev/null @@ -1,302 +0,0 @@ -/* @(#)clnt_perror.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)clnt_perror.c 1.15 87/10/07 Copyr 1984 Sun Micro"; -#endif - -/* - * clnt_perror.c - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - */ -#include - -#include -#include -#include - -//extern char *sys_errlist[]; -//static char *auth_errmsg(); - -extern char *strcpy(); - -#if 0 -static char *buf; - -static char *_buf() -{ - - if (buf == 0) - buf = (char *) malloc(256); - return (buf); -} -#endif - -/* - * Print reply error info - */ -char *clnt_sperror __P ((CLIENT *rpch, const char *s)) -{ -#if 0 - struct rpc_err e; - void clnt_perrno(); - char *err; - char *str = _buf(); - char *strstart = str; - - if (str == 0) - return (0); - CLNT_GETERR(rpch, &e); - - (void) sprintf(str, "%s: ", s); - str += strlen(str); - - (void) strcpy(str, clnt_sperrno(e.re_status)); - str += strlen(str); - - switch (e.re_status) { - case RPC_SUCCESS: - case RPC_CANTENCODEARGS: - case RPC_CANTDECODERES: - case RPC_TIMEDOUT: - case RPC_PROGUNAVAIL: - case RPC_PROCUNAVAIL: - case RPC_CANTDECODEARGS: - case RPC_SYSTEMERROR: - case RPC_UNKNOWNHOST: - case RPC_UNKNOWNPROTO: - case RPC_PMAPFAILURE: - case RPC_PROGNOTREGISTERED: - case RPC_FAILED: - break; - - case RPC_CANTSEND: - case RPC_CANTRECV: - (void) sprintf(str, "; errno = %s", sys_errlist[e.re_errno]); - str += strlen(str); - break; - - case RPC_VERSMISMATCH: - (void) sprintf(str, - "; low version = %lu, high version = %lu", - e.re_vers.low, e.re_vers.high); - str += strlen(str); - break; - - case RPC_AUTHERROR: - err = auth_errmsg(e.re_why); - (void) sprintf(str, "; why = "); - str += strlen(str); - if (err != NULL) { - (void) sprintf(str, "%s", err); - } else { - (void) sprintf(str, - "(unknown authentication error - %d)", - (int) e.re_why); - } - str += strlen(str); - break; - - case RPC_PROGVERSMISMATCH: - (void) sprintf(str, - "; low version = %lu, high version = %lu", - e.re_vers.low, e.re_vers.high); - str += strlen(str); - break; - - default: /* unknown */ - (void) sprintf(str, - "; s1 = %lu, s2 = %lu", e.re_lb.s1, e.re_lb.s2); - str += strlen(str); - break; - } - (void) sprintf(str, "\n"); - return (strstart); -#endif - return (0); -} - -void clnt_perror __P ((CLIENT *rpch, const char *s)) -{ - (void) fprintf(stderr, "%s", clnt_sperror(rpch, s)); -} - - -struct rpc_errtab { - enum clnt_stat status; - char *message; -}; - -#if 0 -static struct rpc_errtab rpc_errlist[] = { - {RPC_SUCCESS, - "RPC: Success"}, - {RPC_CANTENCODEARGS, - "RPC: Can't encode arguments"}, - {RPC_CANTDECODERES, - "RPC: Can't decode result"}, - {RPC_CANTSEND, - "RPC: Unable to send"}, - {RPC_CANTRECV, - "RPC: Unable to receive"}, - {RPC_TIMEDOUT, - "RPC: Timed out"}, - {RPC_VERSMISMATCH, - "RPC: Incompatible versions of RPC"}, - {RPC_AUTHERROR, - "RPC: Authentication error"}, - {RPC_PROGUNAVAIL, - "RPC: Program unavailable"}, - {RPC_PROGVERSMISMATCH, - "RPC: Program/version mismatch"}, - {RPC_PROCUNAVAIL, - "RPC: Procedure unavailable"}, - {RPC_CANTDECODEARGS, - "RPC: Server can't decode arguments"}, - {RPC_SYSTEMERROR, - "RPC: Remote system error"}, - {RPC_UNKNOWNHOST, - "RPC: Unknown host"}, - {RPC_UNKNOWNPROTO, - "RPC: Unknown protocol"}, - {RPC_PMAPFAILURE, - "RPC: Port mapper failure"}, - {RPC_PROGNOTREGISTERED, - "RPC: Program not registered"}, - {RPC_FAILED, - "RPC: Failed (unspecified error)"} -}; -#endif - -/* - * This interface for use by clntrpc - */ -char *clnt_sperrno(stat) -enum clnt_stat stat; -{ -#if 0 - int i; - - for (i = 0; i < sizeof(rpc_errlist) / sizeof(struct rpc_errtab); i++) { - if (rpc_errlist[i].status == stat) { - return (rpc_errlist[i].message); - } - } -#endif - return ("RPC: (unknown error code)"); -} - -void clnt_perrno(num) -enum clnt_stat num; -{ - (void) fprintf(stderr, "%s", clnt_sperrno(num)); -} - - -char *clnt_spcreateerror __P ((__const char *s)) -{ -#if 0 - extern int sys_nerr; - extern char *sys_errlist[]; - char *str = _buf(); - - if (str == 0) - return (0); - (void) sprintf(str, "%s: ", s); - (void) strcat(str, clnt_sperrno(rpc_createerr.cf_stat)); - switch (rpc_createerr.cf_stat) { - case RPC_PMAPFAILURE: - (void) strcat(str, " - "); - (void) strcat(str, clnt_sperrno(rpc_createerr.cf_error.re_status)); - break; - - case RPC_SYSTEMERROR: - (void) strcat(str, " - "); - if (rpc_createerr.cf_error.re_errno > 0 - && rpc_createerr.cf_error.re_errno < sys_nerr) - (void) strcat(str, - sys_errlist[rpc_createerr.cf_error.re_errno]); - else - (void) sprintf(&str[strlen(str)], "Error %d", - rpc_createerr.cf_error.re_errno); - break; - } - (void) strcat(str, "\n"); - return (str); -#endif - return(0); -} - -extern void clnt_pcreateerror __P ((__const char *s)) -{ - (void) fprintf(stderr, "%s", clnt_spcreateerror(s)); -} - -struct auth_errtab { - enum auth_stat status; - char *message; -}; - -#if 0 -static struct auth_errtab auth_errlist[] = { - {AUTH_OK, - "Authentication OK"}, - {AUTH_BADCRED, - "Invalid client credential"}, - {AUTH_REJECTEDCRED, - "Server rejected credential"}, - {AUTH_BADVERF, - "Invalid client verifier"}, - {AUTH_REJECTEDVERF, - "Server rejected verifier"}, - {AUTH_TOOWEAK, - "Client credential too weak"}, - {AUTH_INVALIDRESP, - "Invalid server verifier"}, - {AUTH_FAILED, - "Failed (unspecified error)"}, -}; - -static char *auth_errmsg(stat) -enum auth_stat stat; -{ - int i; - - for (i = 0; i < sizeof(auth_errlist) / sizeof(struct auth_errtab); i++) { - if (auth_errlist[i].status == stat) { - return (auth_errlist[i].message); - } - } - return (NULL); -} -#endif diff --git a/mdk-stage1/dietlibc/librpc/clnt_raw.c b/mdk-stage1/dietlibc/librpc/clnt_raw.c deleted file mode 100644 index 7479b55d6..000000000 --- a/mdk-stage1/dietlibc/librpc/clnt_raw.c +++ /dev/null @@ -1,230 +0,0 @@ -/* @(#)clnt_raw.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)clnt_raw.c 1.22 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * clnt_raw.c - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * Memory based rpc for simple testing and timing. - * Interface to create an rpc client and server in the same process. - * This lets us similate rpc and get round trip overhead, without - * any interference from the kernal. - */ - -#include - -#define MCALL_MSG_SIZE 24 - -/* - * This is the "network" we will be moving stuff over. - */ -static struct clntraw_private { - CLIENT client_object; - XDR xdr_stream; - char _raw_buf[UDPMSGSIZE]; - char mashl_callmsg[MCALL_MSG_SIZE]; - u_int mcnt; -} *clntraw_private; - -static enum clnt_stat clntraw_call(); -static void clntraw_abort(); -static void clntraw_geterr(); -static bool_t clntraw_freeres(); -static bool_t clntraw_control(); -static void clntraw_destroy(); - -static struct clnt_ops client_ops = { - clntraw_call, - clntraw_abort, - clntraw_geterr, - clntraw_freeres, - clntraw_destroy, - clntraw_control -}; - -void svc_getreq(); - -/* - * Create a client handle for memory based rpc. - */ -CLIENT *clntraw_create(prog, vers) -u_long prog; -u_long vers; -{ - register struct clntraw_private *clp = clntraw_private; - struct rpc_msg call_msg; - XDR *xdrs = &clp->xdr_stream; - CLIENT *client = &clp->client_object; - - if (clp == 0) { - clp = (struct clntraw_private *) calloc(1, sizeof(*clp)); - if (clp == 0) - return (0); - clntraw_private = clp; - } - /* - * pre-serialize the staic part of the call msg and stash it away - */ - call_msg.rm_direction = CALL; - call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION; - call_msg.rm_call.cb_prog = prog; - call_msg.rm_call.cb_vers = vers; - xdrmem_create(xdrs, clp->mashl_callmsg, MCALL_MSG_SIZE, XDR_ENCODE); - if (!xdr_callhdr(xdrs, &call_msg)) { - perror("clnt_raw.c - Fatal header serialization error."); - } - clp->mcnt = XDR_GETPOS(xdrs); - XDR_DESTROY(xdrs); - - /* - * Set xdrmem for client/server shared buffer - */ - xdrmem_create(xdrs, clp->_raw_buf, UDPMSGSIZE, XDR_FREE); - - /* - * create client handle - */ - client->cl_ops = &client_ops; - client->cl_auth = authnone_create(); - return (client); -} - -static enum clnt_stat -clntraw_call(h, proc, xargs, argsp, xresults, resultsp, timeout) -CLIENT *h; -u_long proc; -xdrproc_t xargs; -caddr_t argsp; -xdrproc_t xresults; -caddr_t resultsp; -struct timeval timeout; -{ - register struct clntraw_private *clp = clntraw_private; - register XDR *xdrs = &clp->xdr_stream; - struct rpc_msg msg; - enum clnt_stat status; - struct rpc_err error; - - if (clp == 0) - return (RPC_FAILED); - call_again: - /* - * send request - */ - xdrs->x_op = XDR_ENCODE; - XDR_SETPOS(xdrs, 0); - ((struct rpc_msg *) clp->mashl_callmsg)->rm_xid++; - if ((!XDR_PUTBYTES(xdrs, clp->mashl_callmsg, clp->mcnt)) || - (!XDR_PUTLONG(xdrs, (long *) &proc)) || - (!AUTH_MARSHALL(h->cl_auth, xdrs)) || (!(*xargs) (xdrs, argsp))) { - return (RPC_CANTENCODEARGS); - } - (void) XDR_GETPOS(xdrs); /* called just to cause overhead */ - - /* - * We have to call server input routine here because this is - * all going on in one process. Yuk. - */ - svc_getreq(1); - - /* - * get results - */ - xdrs->x_op = XDR_DECODE; - XDR_SETPOS(xdrs, 0); - msg.acpted_rply.ar_verf = _null_auth; - msg.acpted_rply.ar_results.where = resultsp; - msg.acpted_rply.ar_results.proc = xresults; - if (!xdr_replymsg(xdrs, &msg)) - return (RPC_CANTDECODERES); - _seterr_reply(&msg, &error); - status = error.re_status; - - if (status == RPC_SUCCESS) { - if (!AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) { - status = RPC_AUTHERROR; - } - } /* end successful completion */ - else { - if (AUTH_REFRESH(h->cl_auth)) - goto call_again; - } /* end of unsuccessful completion */ - - if (status == RPC_SUCCESS) { - if (!AUTH_VALIDATE(h->cl_auth, &msg.acpted_rply.ar_verf)) { - status = RPC_AUTHERROR; - } - if (msg.acpted_rply.ar_verf.oa_base != NULL) { - xdrs->x_op = XDR_FREE; - (void) xdr_opaque_auth(xdrs, &(msg.acpted_rply.ar_verf)); - } - } - - return (status); -} - -static void clntraw_geterr() -{ -} - - -static bool_t clntraw_freeres(cl, xdr_res, res_ptr) -CLIENT *cl; -xdrproc_t xdr_res; -caddr_t res_ptr; -{ - register struct clntraw_private *clp = clntraw_private; - register XDR *xdrs = &clp->xdr_stream; - bool_t rval; - - if (clp == 0) { - rval = (bool_t) RPC_FAILED; - return (rval); - } - xdrs->x_op = XDR_FREE; - return ((*xdr_res) (xdrs, res_ptr)); -} - -static void clntraw_abort() -{ -} - -static bool_t clntraw_control() -{ - return (FALSE); -} - -static void clntraw_destroy() -{ -} diff --git a/mdk-stage1/dietlibc/librpc/clnt_simple.c b/mdk-stage1/dietlibc/librpc/clnt_simple.c deleted file mode 100644 index f309f86ff..000000000 --- a/mdk-stage1/dietlibc/librpc/clnt_simple.c +++ /dev/null @@ -1,116 +0,0 @@ -/* @(#)clnt_simple.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)clnt_simple.c 1.35 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * clnt_simple.c - * Simplified front end to rpc. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#include -#include - -static struct callrpc_private { - CLIENT *client; - int socket; - int oldprognum, oldversnum, valid; - char *oldhost; -} *callrpc_private; - -int callrpc (const char *host, const u_long prognum, - const u_long versnum, const u_long procnum, - const xdrproc_t inproc, const char *in, - const xdrproc_t outproc, char *out) -{ - register struct callrpc_private *crp = callrpc_private; - struct sockaddr_in server_addr; - enum clnt_stat clnt_stat; - struct hostent *hp; - struct timeval timeout, tottimeout; - - if (crp == 0) { - crp = (struct callrpc_private *) calloc(1, sizeof(*crp)); - if (crp == 0) - return (0); - callrpc_private = crp; - } - if (crp->oldhost == NULL) { - crp->oldhost = malloc(256); - crp->oldhost[0] = 0; - crp->socket = RPC_ANYSOCK; - } - if (crp->valid && crp->oldprognum == prognum - && crp->oldversnum == versnum && strcmp(crp->oldhost, host) == 0) { - /* reuse old client */ - } else { - crp->valid = 0; - (void) close(crp->socket); - crp->socket = RPC_ANYSOCK; - if (crp->client) { - clnt_destroy(crp->client); - crp->client = NULL; - } - if ((hp = gethostbyname(host)) == NULL) - return ((int) RPC_UNKNOWNHOST); - timeout.tv_usec = 0; - timeout.tv_sec = 5; - bcopy(hp->h_addr, (char *) &server_addr.sin_addr, hp->h_length); - server_addr.sin_family = AF_INET; - server_addr.sin_port = 0; - if ((crp->client = clntudp_create(&server_addr, (u_long) prognum, - (u_long) versnum, timeout, - &crp->socket)) == NULL) - return ((int) rpc_createerr.cf_stat); - crp->valid = 1; - crp->oldprognum = prognum; - crp->oldversnum = versnum; - (void) strcpy(crp->oldhost, host); - } - tottimeout.tv_sec = 25; - tottimeout.tv_usec = 0; - clnt_stat = clnt_call(crp->client, procnum, inproc, (char*)in, - outproc, out, tottimeout); - /* - * if call failed, empty cache - */ - if (clnt_stat != RPC_SUCCESS) - crp->valid = 0; - return ((int) clnt_stat); -} diff --git a/mdk-stage1/dietlibc/librpc/clnt_tcp.c b/mdk-stage1/dietlibc/librpc/clnt_tcp.c deleted file mode 100644 index 8c39e8933..000000000 --- a/mdk-stage1/dietlibc/librpc/clnt_tcp.c +++ /dev/null @@ -1,463 +0,0 @@ -/* @(#)clnt_tcp.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)clnt_tcp.c 1.37 87/10/05 Copyr 1984 Sun Micro"; -#endif - -/* - * clnt_tcp.c, Implements a TCP/IP based, client side RPC. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * TCP based RPC supports 'batched calls'. - * A sequence of calls may be batched-up in a send buffer. The rpc call - * return immediately to the client even though the call was not necessarily - * sent. The batching occurs if the results' xdr routine is NULL (0) AND - * the rpc timeout value is zero (see clnt.h, rpc). - * - * Clients should NOT casually batch calls that in fact return results; that is, - * the server side should be aware that a call is batched and not produce any - * return message. Batched calls that produce many result messages can - * deadlock (netlock) the client and the server.... - * - * Now go hang yourself. - */ - -#include -#include -#include -#include -#include -#include -#include - -#define MCALL_MSG_SIZE 24 - -extern int errno; - -static int readtcp(); -static int writetcp(); - -static enum clnt_stat clnttcp_call(); -static void clnttcp_abort(); -static void clnttcp_geterr(); -static bool_t clnttcp_freeres(); -static bool_t clnttcp_control(); -static void clnttcp_destroy(); - -static struct clnt_ops tcp_ops = { - clnttcp_call, - clnttcp_abort, - clnttcp_geterr, - clnttcp_freeres, - clnttcp_destroy, - clnttcp_control -}; - -struct ct_data { - int ct_sock; - bool_t ct_closeit; - struct timeval ct_wait; - bool_t ct_waitset; /* wait set by clnt_control? */ - struct sockaddr_in ct_addr; - struct rpc_err ct_error; - char ct_mcall[MCALL_MSG_SIZE]; /* marshalled callmsg */ - u_int ct_mpos; /* pos after marshal */ - XDR ct_xdrs; -}; - -/* - * Create a client handle for a tcp/ip connection. - * If *sockp<0, *sockp is set to a newly created TCP socket and it is - * connected to raddr. If *sockp non-negative then - * raddr is ignored. The rpc/tcp package does buffering - * similar to stdio, so the client must pick send and receive buffer sizes,]; - * 0 => use the default. - * If raddr->sin_port is 0, then a binder on the remote machine is - * consulted for the right port number. - * NB: *sockp is copied into a private area. - * NB: It is the clients responsibility to close *sockp. - * NB: The rpch->cl_auth is set null authentication. Caller may wish to set this - * something more useful. - */ -CLIENT *clnttcp_create(raddr, prog, vers, sockp, sendsz, recvsz) -struct sockaddr_in *raddr; -u_long prog; -u_long vers; -register int *sockp; -u_int sendsz; -u_int recvsz; -{ - CLIENT *h; - register struct ct_data *ct; - struct timeval now; - struct rpc_msg call_msg; - - h = (CLIENT *) mem_alloc(sizeof(*h)); - if (h == NULL) { - (void) fprintf(stderr, "clnttcp_create: out of memory\n"); - rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = errno; - goto fooy; - } - ct = (struct ct_data *) mem_alloc(sizeof(*ct)); - if (ct == NULL) { - (void) fprintf(stderr, "clnttcp_create: out of memory\n"); - rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = errno; - goto fooy; - } - - /* - * If no port number given ask the pmap for one - */ - if (raddr->sin_port == 0) { - u_short port; - - if ((port = pmap_getport(raddr, prog, vers, IPPROTO_TCP)) == 0) { - mem_free((caddr_t) ct, sizeof(struct ct_data)); - - mem_free((caddr_t) h, sizeof(CLIENT)); - return ((CLIENT *) NULL); - } - raddr->sin_port = htons(port); - } - - /* - * If no socket given, open one - */ - if (*sockp < 0) { - *sockp = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - (void) bindresvport(*sockp, (struct sockaddr_in *) 0); - if ((*sockp < 0) - || (connect(*sockp, (struct sockaddr *) raddr, - sizeof(*raddr)) < 0)) { - rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = errno; - (void) close(*sockp); - goto fooy; - } - ct->ct_closeit = TRUE; - } else { - ct->ct_closeit = FALSE; - } - - /* - * Set up private data struct - */ - ct->ct_sock = *sockp; - ct->ct_wait.tv_usec = 0; - ct->ct_waitset = FALSE; - ct->ct_addr = *raddr; - - /* - * Initialize call message - */ - (void) gettimeofday(&now, (struct timezone *) 0); - call_msg.rm_xid = getpid() ^ now.tv_sec ^ now.tv_usec; - call_msg.rm_direction = CALL; - call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION; - call_msg.rm_call.cb_prog = prog; - call_msg.rm_call.cb_vers = vers; - - /* - * pre-serialize the staic part of the call msg and stash it away - */ - xdrmem_create(&(ct->ct_xdrs), ct->ct_mcall, MCALL_MSG_SIZE, - XDR_ENCODE); - if (!xdr_callhdr(&(ct->ct_xdrs), &call_msg)) { - if (ct->ct_closeit) { - (void) close(*sockp); - } - goto fooy; - } - ct->ct_mpos = XDR_GETPOS(&(ct->ct_xdrs)); - XDR_DESTROY(&(ct->ct_xdrs)); - - /* - * Create a client handle which uses xdrrec for serialization - * and authnone for authentication. - */ - xdrrec_create(&(ct->ct_xdrs), sendsz, recvsz, - (caddr_t) ct, readtcp, writetcp); - h->cl_ops = &tcp_ops; - h->cl_private = (caddr_t) ct; - h->cl_auth = authnone_create(); - return (h); - - fooy: - /* - * Something goofed, free stuff and barf - */ - mem_free((caddr_t) ct, sizeof(struct ct_data)); - - mem_free((caddr_t) h, sizeof(CLIENT)); - return ((CLIENT *) NULL); -} - -static enum clnt_stat -clnttcp_call(h, proc, xdr_args, args_ptr, xdr_results, results_ptr, - timeout) -register CLIENT *h; -u_long proc; -xdrproc_t xdr_args; -caddr_t args_ptr; -xdrproc_t xdr_results; -caddr_t results_ptr; -struct timeval timeout; -{ - register struct ct_data *ct = (struct ct_data *) h->cl_private; - register XDR *xdrs = &(ct->ct_xdrs); - struct rpc_msg reply_msg; - u_long x_id; - u_long *msg_x_id = (u_long *) (ct->ct_mcall); /* yuk */ - register bool_t shipnow; - int refreshes = 2; - - if (!ct->ct_waitset) { - ct->ct_wait = timeout; - } - - shipnow = - (xdr_results == (xdrproc_t) 0 && timeout.tv_sec == 0 - && timeout.tv_usec == 0) ? FALSE : TRUE; - - call_again: - xdrs->x_op = XDR_ENCODE; - ct->ct_error.re_status = RPC_SUCCESS; - x_id = ntohl(--(*msg_x_id)); - if ((!XDR_PUTBYTES(xdrs, ct->ct_mcall, ct->ct_mpos)) || - (!XDR_PUTLONG(xdrs, (long *) &proc)) || - (!AUTH_MARSHALL(h->cl_auth, xdrs)) || - (!(*xdr_args) (xdrs, args_ptr))) { - if (ct->ct_error.re_status == RPC_SUCCESS) - ct->ct_error.re_status = RPC_CANTENCODEARGS; - (void) xdrrec_endofrecord(xdrs, TRUE); - return (ct->ct_error.re_status); - } - if (!xdrrec_endofrecord(xdrs, shipnow)) - return (ct->ct_error.re_status = RPC_CANTSEND); - if (!shipnow) - return (RPC_SUCCESS); - /* - * Hack to provide rpc-based message passing - */ - if (timeout.tv_sec == 0 && timeout.tv_usec == 0) { - return (ct->ct_error.re_status = RPC_TIMEDOUT); - } - - - /* - * Keep receiving until we get a valid transaction id - */ - xdrs->x_op = XDR_DECODE; - while (TRUE) { - reply_msg.acpted_rply.ar_verf = _null_auth; - reply_msg.acpted_rply.ar_results.where = NULL; - reply_msg.acpted_rply.ar_results.proc = (xdrproc_t)xdr_void; - if (!xdrrec_skiprecord(xdrs)) - return (ct->ct_error.re_status); - /* now decode and validate the response header */ - if (!xdr_replymsg(xdrs, &reply_msg)) { - if (ct->ct_error.re_status == RPC_SUCCESS) - continue; - return (ct->ct_error.re_status); - } - if (reply_msg.rm_xid == x_id) - break; - } - - /* - * process header - */ - _seterr_reply(&reply_msg, &(ct->ct_error)); - if (ct->ct_error.re_status == RPC_SUCCESS) { - if (!AUTH_VALIDATE(h->cl_auth, &reply_msg.acpted_rply.ar_verf)) { - ct->ct_error.re_status = RPC_AUTHERROR; - ct->ct_error.re_why = AUTH_INVALIDRESP; - } else if (!(*xdr_results) (xdrs, results_ptr)) { - if (ct->ct_error.re_status == RPC_SUCCESS) - ct->ct_error.re_status = RPC_CANTDECODERES; - } - /* free verifier ... */ - if (reply_msg.acpted_rply.ar_verf.oa_base != NULL) { - xdrs->x_op = XDR_FREE; - (void) xdr_opaque_auth(xdrs, &(reply_msg.acpted_rply.ar_verf)); - } - } /* end successful completion */ - else { - /* maybe our credentials need to be refreshed ... */ - if (refreshes-- && AUTH_REFRESH(h->cl_auth)) - goto call_again; - } /* end of unsuccessful completion */ - return (ct->ct_error.re_status); -} - -static void clnttcp_geterr(h, errp) -CLIENT *h; -struct rpc_err *errp; -{ - register struct ct_data *ct = (struct ct_data *) h->cl_private; - - *errp = ct->ct_error; -} - -static bool_t clnttcp_freeres(cl, xdr_res, res_ptr) -CLIENT *cl; -xdrproc_t xdr_res; -caddr_t res_ptr; -{ - register struct ct_data *ct = (struct ct_data *) cl->cl_private; - register XDR *xdrs = &(ct->ct_xdrs); - - xdrs->x_op = XDR_FREE; - return ((*xdr_res) (xdrs, res_ptr)); -} - -static void clnttcp_abort() -{ -} - -static bool_t clnttcp_control(cl, request, info) -CLIENT *cl; -int request; -char *info; -{ - register struct ct_data *ct = (struct ct_data *) cl->cl_private; - - switch (request) { - case CLSET_TIMEOUT: - ct->ct_wait = *(struct timeval *) info; - ct->ct_waitset = TRUE; - break; - case CLGET_TIMEOUT: - *(struct timeval *) info = ct->ct_wait; - break; - case CLGET_SERVER_ADDR: - *(struct sockaddr_in *) info = ct->ct_addr; - break; - default: - return (FALSE); - } - return (TRUE); -} - - -static void clnttcp_destroy(h) -CLIENT *h; -{ - register struct ct_data *ct = (struct ct_data *) h->cl_private; - - if (ct->ct_closeit) { - (void) close(ct->ct_sock); - } - XDR_DESTROY(&(ct->ct_xdrs)); - mem_free((caddr_t) ct, sizeof(struct ct_data)); - - mem_free((caddr_t) h, sizeof(CLIENT)); -} - -/* - * Interface between xdr serializer and tcp connection. - * Behaves like the system calls, read & write, but keeps some error state - * around for the rpc level. - */ -static int readtcp(ct, buf, len) -register struct ct_data *ct; -caddr_t buf; -register int len; -{ -#ifdef FD_SETSIZE - fd_set mask; - fd_set readfds; - - if (len == 0) - return (0); - FD_ZERO(&mask); - FD_SET(ct->ct_sock, &mask); -#else - register int mask = 1 << (ct->ct_sock); - int readfds; - - if (len == 0) - return (0); - -#endif /* def FD_SETSIZE */ - while (TRUE) { - readfds = mask; - switch (select - (_rpc_dtablesize(), &readfds, 0, 0, - &(ct->ct_wait))) { - case 0: - ct->ct_error.re_status = RPC_TIMEDOUT; - return (-1); - - case -1: - if (errno == EINTR) - continue; - ct->ct_error.re_status = RPC_CANTRECV; - ct->ct_error.re_errno = errno; - return (-1); - } - break; - } - switch (len = read(ct->ct_sock, buf, len)) { - - case 0: - /* premature eof */ - ct->ct_error.re_errno = ECONNRESET; - ct->ct_error.re_status = RPC_CANTRECV; - len = -1; /* it's really an error */ - break; - - case -1: - ct->ct_error.re_errno = errno; - ct->ct_error.re_status = RPC_CANTRECV; - break; - } - return (len); -} - -static int writetcp(ct, buf, len) -struct ct_data *ct; -caddr_t buf; -int len; -{ - register int i, cnt; - - for (cnt = len; cnt > 0; cnt -= i, buf += i) { - if ((i = write(ct->ct_sock, buf, cnt)) == -1) { - ct->ct_error.re_errno = errno; - ct->ct_error.re_status = RPC_CANTSEND; - return (-1); - } - } - return (len); -} diff --git a/mdk-stage1/dietlibc/librpc/clnt_udp.c b/mdk-stage1/dietlibc/librpc/clnt_udp.c deleted file mode 100644 index 7305d3ff1..000000000 --- a/mdk-stage1/dietlibc/librpc/clnt_udp.c +++ /dev/null @@ -1,437 +0,0 @@ -/* @(#)clnt_udp.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)clnt_udp.c 1.39 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * clnt_udp.c, Implements a UDP/IP based, client side RPC. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -extern int errno; - -/* - * UDP bases client side rpc operations - */ -static enum clnt_stat clntudp_call(); -static void clntudp_abort(); -static void clntudp_geterr(); -static bool_t clntudp_freeres(); -static bool_t clntudp_control(); -static void clntudp_destroy(); - -static struct clnt_ops udp_ops = { - clntudp_call, - clntudp_abort, - clntudp_geterr, - clntudp_freeres, - clntudp_destroy, - clntudp_control -}; - -/* - * Private data kept per client handle - */ -struct cu_data { - int cu_sock; - bool_t cu_closeit; - struct sockaddr_in cu_raddr; - int cu_rlen; - struct timeval cu_wait; - struct timeval cu_total; - struct rpc_err cu_error; - XDR cu_outxdrs; - u_int cu_xdrpos; - u_int cu_sendsz; - char *cu_outbuf; - u_int cu_recvsz; - char cu_inbuf[1]; -}; - -/* - * Create a UDP based client handle. - * If *sockp<0, *sockp is set to a newly created UPD socket. - * If raddr->sin_port is 0 a binder on the remote machine - * is consulted for the correct port number. - * NB: It is the clients responsibility to close *sockp. - * NB: The rpch->cl_auth is initialized to null authentication. - * Caller may wish to set this something more useful. - * - * wait is the amount of time used between retransmitting a call if - * no response has been heard; retransmition occurs until the actual - * rpc call times out. - * - * sendsz and recvsz are the maximum allowable packet sizes that can be - * sent and received. - */ -CLIENT *clntudp_bufcreate(raddr, program, version, wait, sockp, sendsz, - recvsz) -struct sockaddr_in *raddr; -u_long program; -u_long version; -struct timeval wait; -register int *sockp; -u_int sendsz; -u_int recvsz; -{ - CLIENT *cl; - register struct cu_data *cu; - struct timeval now; - struct rpc_msg call_msg; - - cl = (CLIENT *) mem_alloc(sizeof(CLIENT)); - if (cl == NULL) { - (void) fprintf(stderr, "clntudp_create: out of memory\n"); - rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = errno; - goto fooy; - } - sendsz = ((sendsz + 3) / 4) * 4; - recvsz = ((recvsz + 3) / 4) * 4; - cu = (struct cu_data *) mem_alloc(sizeof(*cu) + sendsz + recvsz); - if (cu == NULL) { - (void) fprintf(stderr, "clntudp_create: out of memory\n"); - rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = errno; - goto fooy; - } - cu->cu_outbuf = &cu->cu_inbuf[recvsz]; - - (void) gettimeofday(&now, (struct timezone *) 0); - if (raddr->sin_port == 0) { - u_short port; - - if ((port = - pmap_getport(raddr, program, version, IPPROTO_UDP)) == 0) { - goto fooy; - } - raddr->sin_port = htons(port); - } - cl->cl_ops = &udp_ops; - cl->cl_private = (caddr_t) cu; - cu->cu_raddr = *raddr; - cu->cu_rlen = sizeof(cu->cu_raddr); - cu->cu_wait = wait; - cu->cu_total.tv_sec = -1; - cu->cu_total.tv_usec = -1; - cu->cu_sendsz = sendsz; - cu->cu_recvsz = recvsz; - call_msg.rm_xid = getpid() ^ now.tv_sec ^ now.tv_usec; - call_msg.rm_direction = CALL; - call_msg.rm_call.cb_rpcvers = RPC_MSG_VERSION; - call_msg.rm_call.cb_prog = program; - call_msg.rm_call.cb_vers = version; - xdrmem_create(&(cu->cu_outxdrs), cu->cu_outbuf, sendsz, XDR_ENCODE); - if (!xdr_callhdr(&(cu->cu_outxdrs), &call_msg)) { - goto fooy; - } - cu->cu_xdrpos = XDR_GETPOS(&(cu->cu_outxdrs)); - if (*sockp < 0) { - int dontblock = 1; - - *sockp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (*sockp < 0) { - rpc_createerr.cf_stat = RPC_SYSTEMERROR; - rpc_createerr.cf_error.re_errno = errno; - goto fooy; - } - /* attempt to bind to prov port */ - (void) bindresvport(*sockp, (struct sockaddr_in *) 0); - /* the sockets rpc controls are non-blocking */ - (void) ioctl(*sockp, FIONBIO, (char *) &dontblock); - cu->cu_closeit = TRUE; - } else { - cu->cu_closeit = FALSE; - } - cu->cu_sock = *sockp; - cl->cl_auth = authnone_create(); - return (cl); - fooy: - if (cu) - mem_free((caddr_t) cu, sizeof(*cu) + sendsz + recvsz); - if (cl) - mem_free((caddr_t) cl, sizeof(CLIENT)); - return ((CLIENT *) NULL); -} - -CLIENT *clntudp_create(raddr, program, version, wait, sockp) -struct sockaddr_in *raddr; -u_long program; -u_long version; -struct timeval wait; -register int *sockp; -{ - - return (clntudp_bufcreate(raddr, program, version, wait, sockp, - UDPMSGSIZE, UDPMSGSIZE)); -} - -static enum clnt_stat -clntudp_call(cl, proc, xargs, argsp, xresults, resultsp, utimeout) -register CLIENT *cl; /* client handle */ -u_long proc; /* procedure number */ -xdrproc_t xargs; /* xdr routine for args */ -caddr_t argsp; /* pointer to args */ -xdrproc_t xresults; /* xdr routine for results */ -caddr_t resultsp; /* pointer to results */ -struct timeval utimeout; /* seconds to wait before giving up */ -{ - register struct cu_data *cu = (struct cu_data *) cl->cl_private; - register XDR *xdrs; - register int outlen; - register int inlen; - int fromlen; - -#ifdef FD_SETSIZE - fd_set readfds; - fd_set mask; -#else - int readfds; - register int mask; -#endif /* def FD_SETSIZE */ - struct sockaddr_in from; - struct rpc_msg reply_msg; - XDR reply_xdrs; - struct timeval time_waited; - bool_t ok; - int nrefreshes = 2; /* number of times to refresh cred */ - struct timeval timeout; - - if (cu->cu_total.tv_usec == -1) { - timeout = utimeout; /* use supplied timeout */ - } else { - timeout = cu->cu_total; /* use default timeout */ - } - - time_waited.tv_sec = 0; - time_waited.tv_usec = 0; - call_again: - xdrs = &(cu->cu_outxdrs); - xdrs->x_op = XDR_ENCODE; - XDR_SETPOS(xdrs, cu->cu_xdrpos); - /* - * the transaction is the first thing in the out buffer - */ - (*(u_short *) (cu->cu_outbuf))++; - if ((!XDR_PUTLONG(xdrs, (long *) &proc)) || - (!AUTH_MARSHALL(cl->cl_auth, xdrs)) || (!(*xargs) (xdrs, argsp))) - return (cu->cu_error.re_status = RPC_CANTENCODEARGS); - outlen = (int) XDR_GETPOS(xdrs); - - send_again: - if (sendto(cu->cu_sock, cu->cu_outbuf, outlen, 0, - (struct sockaddr *) &(cu->cu_raddr), cu->cu_rlen) - != outlen) { - cu->cu_error.re_errno = errno; - return (cu->cu_error.re_status = RPC_CANTSEND); - } - - /* - * Hack to provide rpc-based message passing - */ - if (timeout.tv_sec == 0 && timeout.tv_usec == 0) { - return (cu->cu_error.re_status = RPC_TIMEDOUT); - } - /* - * sub-optimal code appears here because we have - * some clock time to spare while the packets are in flight. - * (We assume that this is actually only executed once.) - */ - reply_msg.acpted_rply.ar_verf = _null_auth; - reply_msg.acpted_rply.ar_results.where = resultsp; - reply_msg.acpted_rply.ar_results.proc = xresults; -#ifdef FD_SETSIZE - FD_ZERO(&mask); - FD_SET(cu->cu_sock, &mask); -#else - mask = 1 << cu->cu_sock; -#endif /* def FD_SETSIZE */ - for (;;) { - readfds = mask; - switch (select(_rpc_dtablesize(), &readfds, 0, 0, &(cu->cu_wait))) { - - case 0: - time_waited.tv_sec += cu->cu_wait.tv_sec; - time_waited.tv_usec += cu->cu_wait.tv_usec; - while (time_waited.tv_usec >= 1000000) { - time_waited.tv_sec++; - time_waited.tv_usec -= 1000000; - } - if ((time_waited.tv_sec < timeout.tv_sec) || - ((time_waited.tv_sec == timeout.tv_sec) && - (time_waited.tv_usec < timeout.tv_usec))) - goto send_again; - return (cu->cu_error.re_status = RPC_TIMEDOUT); - - /* - * buggy in other cases because time_waited is not being - * updated. - */ - case -1: - if (errno == EINTR) - continue; - cu->cu_error.re_errno = errno; - return (cu->cu_error.re_status = RPC_CANTRECV); - } - do { - fromlen = sizeof(struct sockaddr); - - inlen = recvfrom(cu->cu_sock, cu->cu_inbuf, - (int) cu->cu_recvsz, 0, - (struct sockaddr *) &from, &fromlen); - } while (inlen < 0 && errno == EINTR); - if (inlen < 0) { - if (errno == EWOULDBLOCK) - continue; - cu->cu_error.re_errno = errno; - return (cu->cu_error.re_status = RPC_CANTRECV); - } - if (inlen < sizeof(u_long)) - continue; - /* see if reply transaction id matches sent id */ - if (*((u_long *) (cu->cu_inbuf)) != *((u_long *) (cu->cu_outbuf))) - continue; - /* we now assume we have the proper reply */ - break; - } - - /* - * now decode and validate the response - */ - xdrmem_create(&reply_xdrs, cu->cu_inbuf, (u_int) inlen, XDR_DECODE); - ok = xdr_replymsg(&reply_xdrs, &reply_msg); - /* XDR_DESTROY(&reply_xdrs); save a few cycles on noop destroy */ - if (ok) { - _seterr_reply(&reply_msg, &(cu->cu_error)); - if (cu->cu_error.re_status == RPC_SUCCESS) { - if (!AUTH_VALIDATE(cl->cl_auth, - &reply_msg.acpted_rply.ar_verf)) { - cu->cu_error.re_status = RPC_AUTHERROR; - cu->cu_error.re_why = AUTH_INVALIDRESP; - } - if (reply_msg.acpted_rply.ar_verf.oa_base != NULL) { - xdrs->x_op = XDR_FREE; - (void) xdr_opaque_auth(xdrs, - &(reply_msg.acpted_rply.ar_verf)); - } - } /* end successful completion */ - else { - /* maybe our credentials need to be refreshed ... */ - if (nrefreshes > 0 && AUTH_REFRESH(cl->cl_auth)) { - nrefreshes--; - goto call_again; - } - } /* end of unsuccessful completion */ - } /* end of valid reply message */ - else { - cu->cu_error.re_status = RPC_CANTDECODERES; - } - return (cu->cu_error.re_status); -} - -static void clntudp_geterr(cl, errp) -CLIENT *cl; -struct rpc_err *errp; -{ - register struct cu_data *cu = (struct cu_data *) cl->cl_private; - - *errp = cu->cu_error; -} - - -static bool_t clntudp_freeres(cl, xdr_res, res_ptr) -CLIENT *cl; -xdrproc_t xdr_res; -caddr_t res_ptr; -{ - register struct cu_data *cu = (struct cu_data *) cl->cl_private; - register XDR *xdrs = &(cu->cu_outxdrs); - - xdrs->x_op = XDR_FREE; - return ((*xdr_res) (xdrs, res_ptr)); -} - -static void clntudp_abort( /*h */ ) - /*CLIENT *h; */ -{ -} - -static bool_t clntudp_control(cl, request, info) -CLIENT *cl; -int request; -char *info; -{ - register struct cu_data *cu = (struct cu_data *) cl->cl_private; - - switch (request) { - case CLSET_TIMEOUT: - cu->cu_total = *(struct timeval *) info; - break; - case CLGET_TIMEOUT: - *(struct timeval *) info = cu->cu_total; - break; - case CLSET_RETRY_TIMEOUT: - cu->cu_wait = *(struct timeval *) info; - break; - case CLGET_RETRY_TIMEOUT: - *(struct timeval *) info = cu->cu_wait; - break; - case CLGET_SERVER_ADDR: - *(struct sockaddr_in *) info = cu->cu_raddr; - break; - default: - return (FALSE); - } - return (TRUE); -} - -static void clntudp_destroy(cl) -CLIENT *cl; -{ - register struct cu_data *cu = (struct cu_data *) cl->cl_private; - - if (cu->cu_closeit) { - (void) close(cu->cu_sock); - } - XDR_DESTROY(&(cu->cu_outxdrs)); - mem_free((caddr_t) cu, (sizeof(*cu) + cu->cu_sendsz + cu->cu_recvsz)); - mem_free((caddr_t) cl, sizeof(CLIENT)); -} diff --git a/mdk-stage1/dietlibc/librpc/get_myaddress.c b/mdk-stage1/dietlibc/librpc/get_myaddress.c deleted file mode 100644 index cd63383d0..000000000 --- a/mdk-stage1/dietlibc/librpc/get_myaddress.c +++ /dev/null @@ -1,69 +0,0 @@ -/* @(#)get_myaddress.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)get_myaddress.c 1.4 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * get_myaddress.c - * - * Get client's IP address via ioctl. This avoids using the yellowpages. - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -//#include -#include -#include -#include - -/* DO use gethostbyname because it's portable */ -#include -#include -#include -void get_myaddress(struct sockaddr_in* addr) -{ - char localhost[256 + 1]; - struct hostent *hp; - - gethostname(localhost, 256); - if ((hp = gethostbyname(localhost)) == NULL) { - perror("get_myaddress: gethostbyname"); - exit(1); - } - addr->sin_family = AF_INET; - bcopy((char *) hp->h_addr, (char *) &addr->sin_addr, hp->h_length); - addr->sin_port = htons(PMAPPORT); -} diff --git a/mdk-stage1/dietlibc/librpc/getrpcent.c b/mdk-stage1/dietlibc/librpc/getrpcent.c deleted file mode 100644 index 5e7f694d2..000000000 --- a/mdk-stage1/dietlibc/librpc/getrpcent.c +++ /dev/null @@ -1,274 +0,0 @@ -/* @(#)getrpcent.c 2.2 88/07/29 4.0 RPCSRC */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)getrpcent.c 1.9 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * Copyright (c) 1985 by Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#include -#include - -/* - * Internet version. - */ -struct rpcdata { - FILE *rpcf; - char *current; - int currentlen; - int stayopen; -#define MAXALIASES 35 - char *rpc_aliases[MAXALIASES]; - struct rpcent rpc; - char line[BUFSIZ + 1]; - char *domain; -} *rpcdata; - -static struct rpcent *interpret(); -struct hostent *gethostent(); -char *inet_ntoa(); - -#ifndef __linux__ -static char *index(); -#else -char *index(); -#endif - -static char RPCDB[] = "/etc/rpc"; - -static struct rpcdata *_rpcdata() -{ - register struct rpcdata *d = rpcdata; - - if (d == 0) { - d = (struct rpcdata *) calloc(1, sizeof(struct rpcdata)); - - rpcdata = d; - } - return (d); -} - -struct rpcent *getrpcbynumber(number) -register int number; -{ - register struct rpcdata *d = _rpcdata(); - register struct rpcent *p; - - if (d == 0) - return (0); - setrpcent(0); - while ((p = getrpcent())) { - if (p->r_number == number) - break; - } - endrpcent(); - return (p); -} - -struct rpcent * -#ifdef __linux__ -getrpcbyname(const char *name) -#else -getrpcbyname(name) -char *name; -#endif -{ - struct rpcent *rpc; - char **rp; - - setrpcent(0); - while ((rpc = getrpcent())) { - if (strcmp(rpc->r_name, name) == 0) - return (rpc); - for (rp = rpc->r_aliases; *rp != NULL; rp++) { - if (strcmp(*rp, name) == 0) - return (rpc); - } - } - endrpcent(); - return (NULL); -} - -#ifdef __linux__ -void -#endif -setrpcent(f) -int f; -{ - register struct rpcdata *d = _rpcdata(); - - if (d == 0) - return; - if (d->rpcf == NULL) - d->rpcf = fopen(RPCDB, "r"); - else - rewind(d->rpcf); - if (d->current) - free(d->current); - d->current = NULL; - d->stayopen |= f; -} - -#ifdef __linux__ -void -#endif -endrpcent() -{ - register struct rpcdata *d = _rpcdata(); - - if (d == 0) - return; - if (d->current && !d->stayopen) { - free(d->current); - d->current = NULL; - } - if (d->rpcf && !d->stayopen) { - fclose(d->rpcf); - d->rpcf = NULL; - } -} - -struct rpcent *getrpcent() -{ - register struct rpcdata *d = _rpcdata(); - - if (d == 0) - return (NULL); - if (d->rpcf == NULL && (d->rpcf = fopen(RPCDB, "r")) == NULL) - return (NULL); - if (fgets(d->line, BUFSIZ, d->rpcf) == NULL) - return (NULL); - return interpret(d->line, strlen(d->line)); -} - -#ifdef __linux__ -static char *firstwhite(s) -char *s; -{ - char *s1, *s2; - - s1 = index(s, ' '); - s2 = index(s, '\t'); - if (s1) { - if (s2) - return (s1 < s2) ? s1 : s2; - else - return s1; - } else - return s2; -} -#endif - -static struct rpcent *interpret(const char* val, int len) -{ - register struct rpcdata *d = _rpcdata(); - char *p; - register char *cp, **q; - - if (d == 0) - return 0; - strncpy(d->line, val, len); - p = d->line; - d->line[len] = '\n'; - if (*p == '#') - return (getrpcent()); - cp = index(p, '#'); - if (cp == NULL) { - cp = index(p, '\n'); - if (cp == NULL) - return (getrpcent()); - } - *cp = '\0'; -#ifdef __linux__ - if ((cp = firstwhite(p))) - *cp++ = 0; - else - return (getrpcent()); -#else - cp = index(p, ' '); - if (cp == NULL) { - cp = index(p, '\t'); - if (cp == NULL) - return (getrpcent()); - } - *cp++ = '\0'; -#endif - /* THIS STUFF IS INTERNET SPECIFIC */ - d->rpc.r_name = d->line; - while (*cp == ' ' || *cp == '\t') - cp++; - d->rpc.r_number = atoi(cp); - q = d->rpc.r_aliases = d->rpc_aliases; -#ifdef __linux__ - if ((cp = firstwhite(cp))) - *cp++ = '\0'; -#else - cp = index(p, ' '); - if (cp != NULL) - *cp++ = '\0'; - else { - cp = index(p, '\t'); - if (cp != NULL) - *cp++ = '\0'; - } -#endif - while (cp && *cp) { - if (*cp == ' ' || *cp == '\t') { - cp++; - continue; - } - if (q < &(d->rpc_aliases[MAXALIASES - 1])) - *q++ = cp; -#ifdef __linux__ - if ((cp = firstwhite(cp))) - *cp++ = '\0'; -#else - cp = index(p, ' '); - if (cp != NULL) - *cp++ = '\0'; - else { - cp = index(p, '\t'); - if (cp != NULL) - *cp++ = '\0'; - } -#endif - } - *q = NULL; - return (&d->rpc); -} diff --git a/mdk-stage1/dietlibc/librpc/getrpcport.c b/mdk-stage1/dietlibc/librpc/getrpcport.c deleted file mode 100644 index a7085cbe7..000000000 --- a/mdk-stage1/dietlibc/librpc/getrpcport.c +++ /dev/null @@ -1,57 +0,0 @@ -/* @(#)getrpcport.c 2.1 88/07/29 4.0 RPCSRC */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)getrpcport.c 1.3 87/08/11 SMI"; -#endif -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * Copyright (c) 1985 by Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#include -#include - -extern int getrpcport (const char * host, u_long prognum, - u_long versnum, u_int proto) -{ - struct sockaddr_in addr; - struct hostent *hp; - - if ((hp = gethostbyname(host)) == NULL) - return (0); - bcopy(hp->h_addr, (char *) &addr.sin_addr, hp->h_length); - addr.sin_family = AF_INET; - addr.sin_port = 0; - return (pmap_getport(&addr, prognum, versnum, proto)); -} diff --git a/mdk-stage1/dietlibc/librpc/pmap_clnt.c b/mdk-stage1/dietlibc/librpc/pmap_clnt.c deleted file mode 100644 index 428675656..000000000 --- a/mdk-stage1/dietlibc/librpc/pmap_clnt.c +++ /dev/null @@ -1,118 +0,0 @@ -/* @(#)pmap_clnt.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)pmap_clnt.c 1.37 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * pmap_clnt.c - * Client interface to pmap rpc service. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include - -static struct timeval timeout = { 5, 0 }; -static struct timeval tottimeout = { 60, 0 }; - -void clnt_perror(); - - -/* - * Set a mapping between program,version and port. - * Calls the pmap service remotely to do the mapping. - */ -bool_t pmap_set(program, version, protocol, port) -u_long program; -u_long version; -int protocol; -u_short port; -{ - struct sockaddr_in myaddress; - int socket = -1; - register CLIENT *client; - struct pmap parms; - bool_t rslt; - - get_myaddress(&myaddress); - client = clntudp_bufcreate(&myaddress, PMAPPROG, PMAPVERS, - timeout, &socket, RPCSMALLMSGSIZE, - RPCSMALLMSGSIZE); - if (client == (CLIENT *) NULL) - return (FALSE); - parms.pm_prog = program; - parms.pm_vers = version; - parms.pm_prot = protocol; - parms.pm_port = port; - if (CLNT_CALL(client, PMAPPROC_SET, (xdrproc_t)xdr_pmap, (caddr_t)&parms, (xdrproc_t)xdr_bool, (caddr_t)&rslt, - tottimeout) != RPC_SUCCESS) { - clnt_perror(client, "Cannot register service"); - return (FALSE); - } - CLNT_DESTROY(client); - (void) close(socket); - return (rslt); -} - -/* - * Remove the mapping between program,version and port. - * Calls the pmap service remotely to do the un-mapping. - */ -bool_t pmap_unset(program, version) -u_long program; -u_long version; -{ - struct sockaddr_in myaddress; - int socket = -1; - register CLIENT *client; - struct pmap parms; - bool_t rslt; - - get_myaddress(&myaddress); - client = clntudp_bufcreate(&myaddress, PMAPPROG, PMAPVERS, - timeout, &socket, RPCSMALLMSGSIZE, - RPCSMALLMSGSIZE); - if (client == (CLIENT *) NULL) - return (FALSE); - parms.pm_prog = program; - parms.pm_vers = version; - parms.pm_port = parms.pm_prot = 0; - CLNT_CALL(client, PMAPPROC_UNSET, (xdrproc_t)xdr_pmap, (caddr_t)&parms, (xdrproc_t)xdr_bool, (caddr_t)&rslt, - tottimeout); - CLNT_DESTROY(client); - (void) close(socket); - return (rslt); -} diff --git a/mdk-stage1/dietlibc/librpc/pmap_getmaps.c b/mdk-stage1/dietlibc/librpc/pmap_getmaps.c deleted file mode 100644 index 6940783fb..000000000 --- a/mdk-stage1/dietlibc/librpc/pmap_getmaps.c +++ /dev/null @@ -1,85 +0,0 @@ -/* @(#)pmap_getmaps.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)pmap_getmaps.c 1.10 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * pmap_getmap.c - * Client interface to pmap rpc service. - * contains pmap_getmaps, which is only tcp service involved - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#define NAMELEN 255 -#define MAX_BROADCAST_SIZE 1400 -#include - -extern int errno; - -/* - * Get a copy of the current port maps. - * Calls the pmap service remotely to do get the maps. - */ -struct pmaplist *pmap_getmaps(address) -struct sockaddr_in *address; -{ - struct pmaplist *head = (struct pmaplist *) NULL; - int socket = -1; - struct timeval minutetimeout; - register CLIENT *client; - - minutetimeout.tv_sec = 60; - minutetimeout.tv_usec = 0; - address->sin_port = htons(PMAPPORT); - client = clnttcp_create(address, PMAPPROG, PMAPVERS, &socket, 50, 500); - if (client != (CLIENT *) NULL) { - if (CLNT_CALL(client, PMAPPROC_DUMP, (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_pmaplist, - (caddr_t)&head, minutetimeout) != RPC_SUCCESS) { - clnt_perror(client, "pmap_getmaps rpc problem"); - } - CLNT_DESTROY(client); - } - (void) close(socket); - address->sin_port = 0; - return (head); -} diff --git a/mdk-stage1/dietlibc/librpc/pmap_getport.c b/mdk-stage1/dietlibc/librpc/pmap_getport.c deleted file mode 100644 index 174dca41a..000000000 --- a/mdk-stage1/dietlibc/librpc/pmap_getport.c +++ /dev/null @@ -1,90 +0,0 @@ -/* @(#)pmap_getport.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)pmap_getport.c 1.9 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * pmap_getport.c - * Client interface to pmap rpc service. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -//#include -#include - -static struct timeval timeout = { 5, 0 }; -static struct timeval tottimeout = { 60, 0 }; - -/* - * Find the mapped port for program,version. - * Calls the pmap service remotely to do the lookup. - * Returns 0 if no map exists. - */ -u_short pmap_getport(address, program, version, protocol) -struct sockaddr_in *address; -u_long program; -u_long version; -u_int protocol; -{ - u_short port = 0; - int socket = -1; - register CLIENT *client; - struct pmap parms; - - address->sin_port = htons(PMAPPORT); - client = clntudp_bufcreate(address, PMAPPROG, - PMAPVERS, timeout, &socket, RPCSMALLMSGSIZE, - RPCSMALLMSGSIZE); - if (client != (CLIENT *) NULL) { - parms.pm_prog = program; - parms.pm_vers = version; - parms.pm_prot = protocol; - parms.pm_port = 0; /* not needed or used */ - if (CLNT_CALL(client, PMAPPROC_GETPORT, (xdrproc_t)xdr_pmap, (caddr_t)&parms, - (xdrproc_t)xdr_u_short, (caddr_t)&port, tottimeout) != RPC_SUCCESS) { - rpc_createerr.cf_stat = RPC_PMAPFAILURE; - clnt_geterr(client, &rpc_createerr.cf_error); - } else if (port == 0) { - rpc_createerr.cf_stat = RPC_PROGNOTREGISTERED; - } - CLNT_DESTROY(client); - } - (void) close(socket); - address->sin_port = 0; - return (port); -} diff --git a/mdk-stage1/dietlibc/librpc/pmap_prot.c b/mdk-stage1/dietlibc/librpc/pmap_prot.c deleted file mode 100644 index ec8b5af79..000000000 --- a/mdk-stage1/dietlibc/librpc/pmap_prot.c +++ /dev/null @@ -1,58 +0,0 @@ -/* @(#)pmap_prot.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)pmap_prot.c 1.17 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * pmap_prot.c - * Protocol for the local binder service, or pmap. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include - - -bool_t xdr_pmap(xdrs, regs) -XDR *xdrs; -struct pmap *regs; -{ - - if (xdr_u_long(xdrs, ®s->pm_prog) && - xdr_u_long(xdrs, ®s->pm_vers) && - xdr_u_long(xdrs, ®s->pm_prot)) - return (xdr_u_long(xdrs, ®s->pm_port)); - return (FALSE); -} diff --git a/mdk-stage1/dietlibc/librpc/pmap_prot2.c b/mdk-stage1/dietlibc/librpc/pmap_prot2.c deleted file mode 100644 index 870c844ed..000000000 --- a/mdk-stage1/dietlibc/librpc/pmap_prot2.c +++ /dev/null @@ -1,116 +0,0 @@ -/* @(#)pmap_prot2.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)pmap_prot2.c 1.3 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * pmap_prot2.c - * Protocol for the local binder service, or pmap. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include - - -/* - * What is going on with linked lists? (!) - * First recall the link list declaration from pmap_prot.h: - * - * struct pmaplist { - * struct pmap pml_map; - * struct pmaplist *pml_map; - * }; - * - * Compare that declaration with a corresponding xdr declaration that - * is (a) pointer-less, and (b) recursive: - * - * typedef union switch (bool_t) { - * - * case TRUE: struct { - * struct pmap; - * pmaplist_t foo; - * }; - * - * case FALSE: struct {}; - * } pmaplist_t; - * - * Notice that the xdr declaration has no nxt pointer while - * the C declaration has no bool_t variable. The bool_t can be - * interpreted as ``more data follows me''; if FALSE then nothing - * follows this bool_t; if TRUE then the bool_t is followed by - * an actual struct pmap, and then (recursively) by the - * xdr union, pamplist_t. - * - * This could be implemented via the xdr_union primitive, though this - * would cause a one recursive call per element in the list. Rather than do - * that we can ``unwind'' the recursion - * into a while loop and do the union arms in-place. - * - * The head of the list is what the C programmer wishes to past around - * the net, yet is the data that the pointer points to which is interesting; - * this sounds like a job for xdr_reference! - */ -bool_t xdr_pmaplist(XDR* xdrs, struct pmaplist** rp) -{ - /* - * more_elements is pre-computed in case the direction is - * XDR_ENCODE or XDR_FREE. more_elements is overwritten by - * xdr_bool when the direction is XDR_DECODE. - */ - bool_t more_elements; - register int freeing = (xdrs->x_op == XDR_FREE); - register struct pmaplist **next=0; - - while (TRUE) { - more_elements = (bool_t) (*rp != NULL); - if (!xdr_bool(xdrs, &more_elements)) - return (FALSE); - if (!more_elements) - return (TRUE); /* we are done */ - /* - * the unfortunate side effect of non-recursion is that in - * the case of freeing we must remember the next object - * before we free the current object ... - */ - if (freeing) - next = &((*rp)->pml_next); - if (!xdr_reference(xdrs, (caddr_t *) rp, - (u_int) sizeof(struct pmaplist), (xdrproc_t)xdr_pmap)) - return (FALSE); - - rp = (freeing) ? next : &((*rp)->pml_next); - } -} diff --git a/mdk-stage1/dietlibc/librpc/pmap_rmt.c b/mdk-stage1/dietlibc/librpc/pmap_rmt.c deleted file mode 100644 index 02efcf91c..000000000 --- a/mdk-stage1/dietlibc/librpc/pmap_rmt.c +++ /dev/null @@ -1,403 +0,0 @@ -/* @(#)pmap_rmt.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)pmap_rmt.c 1.21 87/08/27 Copyr 1984 Sun Micro"; -#endif - -/* - * pmap_rmt.c - * Client interface to pmap rpc service. - * remote call and broadcast service - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#define MAX_BROADCAST_SIZE 1400 -#include -#include - -extern int errno; -static struct timeval timeout = { 3, 0 }; - - -/* - * pmapper remote-call-service interface. - * This routine is used to call the pmapper remote call service - * which will look up a service program in the port maps, and then - * remotely call that routine with the given parameters. This allows - * programs to do a lookup and call in one step. -*/ -enum clnt_stat -pmap_rmtcall(addr, prog, vers, proc, xdrargs, argsp, xdrres, resp, tout, - port_ptr) -struct sockaddr_in *addr; -u_long prog, vers, proc; -xdrproc_t xdrargs, xdrres; -caddr_t argsp, resp; -struct timeval tout; -u_long *port_ptr; -{ - int socket = -1; - register CLIENT *client; - struct rmtcallargs a; - struct rmtcallres r; - enum clnt_stat stat; - - addr->sin_port = htons(PMAPPORT); - client = clntudp_create(addr, PMAPPROG, PMAPVERS, timeout, &socket); - if (client != (CLIENT *) NULL) { - a.prog = prog; - a.vers = vers; - a.proc = proc; - a.args_ptr = argsp; - a.xdr_args = xdrargs; - r.port_ptr = port_ptr; - r.results_ptr = resp; - r.xdr_results = xdrres; - stat = CLNT_CALL(client, PMAPPROC_CALLIT, (xdrproc_t)xdr_rmtcall_args, (caddr_t)&a, - (xdrproc_t)xdr_rmtcallres, (caddr_t)&r, tout); - CLNT_DESTROY(client); - } else { - stat = RPC_FAILED; - } - (void) close(socket); - addr->sin_port = 0; - return (stat); -} - - -/* - * XDR remote call arguments - * written for XDR_ENCODE direction only - */ -bool_t xdr_rmtcall_args(XDR* xdrs, struct rmtcallargs* cap) -{ - u_int lenposition, argposition, position; - - if (xdr_u_long(xdrs, &(cap->prog)) && - xdr_u_long(xdrs, &(cap->vers)) && xdr_u_long(xdrs, &(cap->proc))) { - lenposition = XDR_GETPOS(xdrs); - if (!xdr_u_long(xdrs, &(cap->arglen))) - return (FALSE); - argposition = XDR_GETPOS(xdrs); - if (!(*(cap->xdr_args)) (xdrs, cap->args_ptr)) - return (FALSE); - position = XDR_GETPOS(xdrs); - cap->arglen = (u_long) position - (u_long) argposition; - XDR_SETPOS(xdrs, lenposition); - if (!xdr_u_long(xdrs, &(cap->arglen))) - return (FALSE); - XDR_SETPOS(xdrs, position); - return (TRUE); - } - return (FALSE); -} - -/* - * XDR remote call results - * written for XDR_DECODE direction only - */ -bool_t xdr_rmtcallres(XDR* xdrs, struct rmtcallres* crp) -{ - caddr_t port_ptr; - - port_ptr = (caddr_t) crp->port_ptr; - if (xdr_reference(xdrs, &port_ptr, sizeof(u_long), - (xdrproc_t)xdr_u_long) && xdr_u_long(xdrs, &crp->resultslen)) { - crp->port_ptr = (u_long *) port_ptr; - return ((*(crp->xdr_results)) (xdrs, crp->results_ptr)); - } - return (FALSE); -} - - -/* - * The following is kludged-up support for simple rpc broadcasts. - * Someday a large, complicated system will replace these trivial - * routines which only support udp/ip . - */ - -static int getbroadcastnets(addrs, sock, buf) -struct in_addr *addrs; -int sock; /* any valid socket will do */ -char *buf; /* why allocxate more when we can use existing... */ -{ -#ifdef __linux__ - struct sockaddr_in addr; - - get_myaddress(&addr); -#if 1 - printf("%s(%d): no inet_makeaddr()\n", __FILE__, __LINE__); -#else - addrs[0] = inet_makeaddr(inet_netof(addr.sin_addr), INADDR_ANY); -#endif - return 1; -#else - struct ifconf ifc; - struct ifreq ifreq, *ifr; - struct sockaddr_in *sin; - int n, i; - - ifc.ifc_len = UDPMSGSIZE; - ifc.ifc_buf = buf; - if (ioctl(sock, SIOCGIFCONF, (char *) &ifc) < 0) { - perror("broadcast: ioctl (get interface configuration)"); - return (0); - } - ifr = ifc.ifc_req; - for (i = 0, n = ifc.ifc_len / sizeof(struct ifreq); n > 0; n--, ifr++) { - ifreq = *ifr; - if (ioctl(sock, SIOCGIFFLAGS, (char *) &ifreq) < 0) { - perror("broadcast: ioctl (get interface flags)"); - continue; - } - if ((ifreq.ifr_flags & IFF_BROADCAST) && - (ifreq.ifr_flags & IFF_UP) && - ifr->ifr_addr.sa_family == AF_INET) { - sin = (struct sockaddr_in *) &ifr->ifr_addr; -#ifdef SIOCGIFBRDADDR /* 4.3BSD */ - if (ioctl(sock, SIOCGIFBRDADDR, (char *) &ifreq) < 0) { -#if 1 - printf("%s(%d): no inet_makeaddr()\n", __FILE__, __LINE__); -#else - addrs[i++] = inet_makeaddr(inet_netof - (sin->sin_addr.s_addr), - INADDR_ANY); -#endif - } else { - addrs[i++] = ((struct sockaddr_in *) - &ifreq.ifr_addr)->sin_addr; - } -#else /* 4.2 BSD */ -#if 1 - printf("%s(%d): no inet_makeaddr()\n", __FILE__, __LINE__); -#else - addrs[i++] = inet_makeaddr(inet_netof - (sin->sin_addr.s_addr), INADDR_ANY); -#endif -#endif - } - } - return (i); -#endif -} - -enum clnt_stat -clnt_broadcast(prog, vers, proc, xargs, argsp, xresults, resultsp, - eachresult) -u_long prog; /* program number */ -u_long vers; /* version number */ -u_long proc; /* procedure number */ -xdrproc_t xargs; /* xdr routine for args */ -caddr_t argsp; /* pointer to args */ -xdrproc_t xresults; /* xdr routine for results */ -caddr_t resultsp; /* pointer to results */ -resultproc_t eachresult; /* call with each result obtained */ -{ - enum clnt_stat stat; - AUTH *unix_auth = authunix_create_default(); - XDR xdr_stream; - register XDR *xdrs = &xdr_stream; - int outlen, inlen, fromlen, nets; - register int sock; - int on = 1; - -#ifdef FD_SETSIZE - fd_set mask; - fd_set readfds; -#else - int readfds; - register int mask; -#endif /* def FD_SETSIZE */ - register int i; - bool_t done = FALSE; - register u_long xid; - u_long port; - struct in_addr addrs[20]; - struct sockaddr_in baddr, raddr; /* broadcast and response addresses */ - struct rmtcallargs a; - struct rmtcallres r; - struct rpc_msg msg; - struct timeval t; - char outbuf[MAX_BROADCAST_SIZE], inbuf[UDPMSGSIZE]; - - /* - * initialization: create a socket, a broadcast address, and - * preserialize the arguments into a send buffer. - */ - if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { - perror("Cannot create socket for broadcast rpc"); - stat = RPC_CANTSEND; - goto done_broad; - } -#ifdef SO_BROADCAST - if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) { - perror("Cannot set socket option SO_BROADCAST"); - stat = RPC_CANTSEND; - goto done_broad; - } -#endif /* def SO_BROADCAST */ -#ifdef FD_SETSIZE - FD_ZERO(&mask); - FD_SET(sock, &mask); -#else - mask = (1 << sock); -#endif /* def FD_SETSIZE */ - nets = getbroadcastnets(addrs, sock, inbuf); - bzero((char *) &baddr, sizeof(baddr)); - baddr.sin_family = AF_INET; - baddr.sin_port = htons(PMAPPORT); - baddr.sin_addr.s_addr = htonl(INADDR_ANY); -/* baddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); */ - (void) gettimeofday(&t, (struct timezone *) 0); - msg.rm_xid = xid = getpid() ^ t.tv_sec ^ t.tv_usec; - t.tv_usec = 0; - msg.rm_direction = CALL; - msg.rm_call.cb_rpcvers = RPC_MSG_VERSION; - msg.rm_call.cb_prog = PMAPPROG; - msg.rm_call.cb_vers = PMAPVERS; - msg.rm_call.cb_proc = PMAPPROC_CALLIT; - msg.rm_call.cb_cred = unix_auth->ah_cred; - msg.rm_call.cb_verf = unix_auth->ah_verf; - a.prog = prog; - a.vers = vers; - a.proc = proc; - a.xdr_args = xargs; - a.args_ptr = argsp; - r.port_ptr = &port; - r.xdr_results = xresults; - r.results_ptr = resultsp; - xdrmem_create(xdrs, outbuf, MAX_BROADCAST_SIZE, XDR_ENCODE); - if ((!xdr_callmsg(xdrs, &msg)) || (!xdr_rmtcall_args(xdrs, &a))) { - stat = RPC_CANTENCODEARGS; - goto done_broad; - } - outlen = (int) xdr_getpos(xdrs); - xdr_destroy(xdrs); - /* - * Basic loop: broadcast a packet and wait a while for response(s). - * The response timeout grows larger per iteration. - */ - for (t.tv_sec = 4; t.tv_sec <= 14; t.tv_sec += 2) { - for (i = 0; i < nets; i++) { - baddr.sin_addr = addrs[i]; - if (sendto(sock, outbuf, outlen, 0, - (struct sockaddr *) &baddr, - sizeof(struct sockaddr)) != outlen) { - perror("Cannot send broadcast packet"); - stat = RPC_CANTSEND; - goto done_broad; - } - } - if (eachresult == NULL) { - stat = RPC_SUCCESS; - goto done_broad; - } - recv_again: - msg.acpted_rply.ar_verf = _null_auth; - msg.acpted_rply.ar_results.where = (caddr_t) & r; - msg.acpted_rply.ar_results.proc = (xdrproc_t)xdr_rmtcallres; - readfds = mask; - switch (select(_rpc_dtablesize(), &readfds, 0, 0, &t)) { - - case 0: /* timed out */ - stat = RPC_TIMEDOUT; - continue; - - case -1: /* some kind of error */ - if (errno == EINTR) - goto recv_again; - perror("Broadcast select problem"); - stat = RPC_CANTRECV; - goto done_broad; - - } /* end of select results switch */ - try_again: - fromlen = sizeof(struct sockaddr); - - inlen = recvfrom(sock, inbuf, UDPMSGSIZE, 0, - (struct sockaddr *) &raddr, &fromlen); - if (inlen < 0) { - if (errno == EINTR) - goto try_again; - perror("Cannot receive reply to broadcast"); - stat = RPC_CANTRECV; - goto done_broad; - } - if (inlen < sizeof(u_long)) - goto recv_again; - /* - * see if reply transaction id matches sent id. - * If so, decode the results. - */ - xdrmem_create(xdrs, inbuf, (u_int) inlen, XDR_DECODE); - if (xdr_replymsg(xdrs, &msg)) { - if ((msg.rm_xid == xid) && - (msg.rm_reply.rp_stat == MSG_ACCEPTED) && - (msg.acpted_rply.ar_stat == SUCCESS)) { - raddr.sin_port = htons((u_short) port); - done = (*eachresult) (resultsp, &raddr); - } - /* otherwise, we just ignore the errors ... */ - } else { -#ifdef notdef - /* some kind of deserialization problem ... */ - if (msg.rm_xid == xid) - fprintf(stderr, "Broadcast deserialization problem"); - /* otherwise, just random garbage */ -#endif - } - xdrs->x_op = XDR_FREE; - msg.acpted_rply.ar_results.proc = (xdrproc_t)xdr_void; - (void) xdr_replymsg(xdrs, &msg); - (void) (*xresults) (xdrs, resultsp); - xdr_destroy(xdrs); - if (done) { - stat = RPC_SUCCESS; - goto done_broad; - } else { - goto recv_again; - } - } - done_broad: - (void) close(sock); - AUTH_DESTROY(unix_auth); - return (stat); -} diff --git a/mdk-stage1/dietlibc/librpc/rpc_callmsg.c b/mdk-stage1/dietlibc/librpc/rpc_callmsg.c deleted file mode 100644 index 4b3a9880e..000000000 --- a/mdk-stage1/dietlibc/librpc/rpc_callmsg.c +++ /dev/null @@ -1,189 +0,0 @@ -/* @(#)rpc_callmsg.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)rpc_callmsg.c 1.4 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * rpc_callmsg.c - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - */ - -#include - -#include -#include - -/* - * XDR a call message - */ -bool_t xdr_callmsg(xdrs, cmsg) -register XDR *xdrs; -register struct rpc_msg *cmsg; -{ - register int32_t *buf; - register struct opaque_auth *oa; - - if (xdrs->x_op == XDR_ENCODE) { - if (cmsg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES) { - return (FALSE); - } - if (cmsg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES) { - return (FALSE); - } - buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT - + RNDUP(cmsg->rm_call.cb_cred.oa_length) - + 2 * BYTES_PER_XDR_UNIT - + RNDUP(cmsg->rm_call.cb_verf.oa_length)); - if (buf != NULL) { - IXDR_PUT_LONG(buf, cmsg->rm_xid); - IXDR_PUT_ENUM(buf, cmsg->rm_direction); - if (cmsg->rm_direction != CALL) { - return (FALSE); - } - IXDR_PUT_LONG(buf, cmsg->rm_call.cb_rpcvers); - if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) { - return (FALSE); - } - IXDR_PUT_LONG(buf, cmsg->rm_call.cb_prog); - IXDR_PUT_LONG(buf, cmsg->rm_call.cb_vers); - IXDR_PUT_LONG(buf, cmsg->rm_call.cb_proc); - oa = &cmsg->rm_call.cb_cred; - IXDR_PUT_ENUM(buf, oa->oa_flavor); - IXDR_PUT_LONG(buf, oa->oa_length); - if (oa->oa_length) { - bcopy(oa->oa_base, (caddr_t) buf, oa->oa_length); - buf += RNDUP(oa->oa_length) / sizeof(long); - } - oa = &cmsg->rm_call.cb_verf; - IXDR_PUT_ENUM(buf, oa->oa_flavor); - IXDR_PUT_LONG(buf, oa->oa_length); - if (oa->oa_length) { - bcopy(oa->oa_base, (caddr_t) buf, oa->oa_length); - /* no real need.... - buf += RNDUP(oa->oa_length) / sizeof (long); - */ - } - return (TRUE); - } - } - if (xdrs->x_op == XDR_DECODE) { - buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT); - if (buf != NULL) { - cmsg->rm_xid = IXDR_GET_LONG(buf); - cmsg->rm_direction = IXDR_GET_ENUM(buf, enum msg_type); - - if (cmsg->rm_direction != CALL) { - return (FALSE); - } - cmsg->rm_call.cb_rpcvers = IXDR_GET_LONG(buf); - if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) { - return (FALSE); - } - cmsg->rm_call.cb_prog = IXDR_GET_LONG(buf); - cmsg->rm_call.cb_vers = IXDR_GET_LONG(buf); - cmsg->rm_call.cb_proc = IXDR_GET_LONG(buf); - oa = &cmsg->rm_call.cb_cred; - oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t); - oa->oa_length = IXDR_GET_LONG(buf); - if (oa->oa_length) { - if (oa->oa_length > MAX_AUTH_BYTES) { - return (FALSE); - } - if (oa->oa_base == NULL) { - oa->oa_base = (caddr_t) - mem_alloc(oa->oa_length); - } - buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length)); - if (buf == NULL) { - if (xdr_opaque(xdrs, oa->oa_base, - oa->oa_length) == FALSE) { - return (FALSE); - } - } else { - bcopy((caddr_t) buf, oa->oa_base, oa->oa_length); - /* no real need.... - buf += RNDUP(oa->oa_length) / - sizeof (long); - */ - } - } - oa = &cmsg->rm_call.cb_verf; - buf = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT); - if (buf == NULL) { - if (xdr_enum(xdrs, &oa->oa_flavor) == FALSE || - xdr_u_int(xdrs, &oa->oa_length) == FALSE) { - return (FALSE); - } - } else { - oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t); - oa->oa_length = IXDR_GET_LONG(buf); - } - if (oa->oa_length) { - if (oa->oa_length > MAX_AUTH_BYTES) { - return (FALSE); - } - if (oa->oa_base == NULL) { - oa->oa_base = (caddr_t) - mem_alloc(oa->oa_length); - } - buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length)); - if (buf == NULL) { - if (xdr_opaque(xdrs, oa->oa_base, - oa->oa_length) == FALSE) { - return (FALSE); - } - } else { - bcopy((caddr_t) buf, oa->oa_base, oa->oa_length); - /* no real need... - buf += RNDUP(oa->oa_length) / - sizeof (long); - */ - } - } - return (TRUE); - } - } - if (xdr_u_long(xdrs, &(cmsg->rm_xid)) && - xdr_enum(xdrs, (enum_t *) & (cmsg->rm_direction)) && - (cmsg->rm_direction == CALL) && - xdr_u_long(xdrs, &(cmsg->rm_call.cb_rpcvers)) && - (cmsg->rm_call.cb_rpcvers == RPC_MSG_VERSION) && - xdr_u_long(xdrs, &(cmsg->rm_call.cb_prog)) && - xdr_u_long(xdrs, &(cmsg->rm_call.cb_vers)) && - xdr_u_long(xdrs, &(cmsg->rm_call.cb_proc)) && - xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_cred))) - return (xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_verf))); - return (FALSE); -} diff --git a/mdk-stage1/dietlibc/librpc/rpc_commondata.c b/mdk-stage1/dietlibc/librpc/rpc_commondata.c deleted file mode 100644 index 39648d284..000000000 --- a/mdk-stage1/dietlibc/librpc/rpc_commondata.c +++ /dev/null @@ -1,42 +0,0 @@ -/* @(#)rpc_commondata.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#include -/* - * This file should only contain common data (global data) that is exported - * by public interfaces - */ -struct opaque_auth _null_auth; - -#ifdef FD_SETSIZE -fd_set svc_fdset; -#else -int svc_fds; -#endif /* def FD_SETSIZE */ -struct rpc_createerr rpc_createerr; diff --git a/mdk-stage1/dietlibc/librpc/rpc_dtablesize.c b/mdk-stage1/dietlibc/librpc/rpc_dtablesize.c deleted file mode 100644 index b08ebaccd..000000000 --- a/mdk-stage1/dietlibc/librpc/rpc_dtablesize.c +++ /dev/null @@ -1,50 +0,0 @@ -/* @(#)rpc_dtablesize.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)rpc_dtablesize.c 1.2 87/08/11 Copyr 1987 Sun Micro"; -#endif - -#include - -/* - * Cache the result of getdtablesize(), so we don't have to do an - * expensive system call every time. - */ -int _rpc_dtablesize() -{ - static int size; - - if (size == 0) { - size = getdtablesize(); - } - return (size); -} diff --git a/mdk-stage1/dietlibc/librpc/rpc_prot.c b/mdk-stage1/dietlibc/librpc/rpc_prot.c deleted file mode 100644 index 19a4db27f..000000000 --- a/mdk-stage1/dietlibc/librpc/rpc_prot.c +++ /dev/null @@ -1,281 +0,0 @@ -/* @(#)rpc_prot.c 2.3 88/08/07 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)rpc_prot.c 1.36 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * rpc_prot.c - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * This set of routines implements the rpc message definition, - * its serializer and some common rpc utility routines. - * The routines are meant for various implementations of rpc - - * they are NOT for the rpc client or rpc service implementations! - * Because authentication stuff is easy and is part of rpc, the opaque - * routines are also in this program. - */ - -#include - -#include - -/* * * * * * * * * * * * * * XDR Authentication * * * * * * * * * * * */ - -struct opaque_auth _null_auth; - -/* - * XDR an opaque authentication struct - * (see auth.h) - */ -bool_t xdr_opaque_auth(xdrs, ap) -register XDR *xdrs; -register struct opaque_auth *ap; -{ - - if (xdr_enum(xdrs, &(ap->oa_flavor))) - return (xdr_bytes(xdrs, &ap->oa_base, - &ap->oa_length, MAX_AUTH_BYTES)); - return (FALSE); -} - -/* - * XDR a DES block - */ -bool_t xdr_des_block(xdrs, blkp) -register XDR *xdrs; -register des_block *blkp; -{ - return (xdr_opaque(xdrs, (caddr_t) blkp, sizeof(des_block))); -} - -/* * * * * * * * * * * * * * XDR RPC MESSAGE * * * * * * * * * * * * * * * */ - -/* - * XDR the MSG_ACCEPTED part of a reply message union - */ -bool_t xdr_accepted_reply(xdrs, ar) -register XDR *xdrs; -register struct accepted_reply *ar; -{ - - /* personalized union, rather than calling xdr_union */ - if (!xdr_opaque_auth(xdrs, &(ar->ar_verf))) - return (FALSE); - if (!xdr_enum(xdrs, (enum_t *) & (ar->ar_stat))) - return (FALSE); - switch (ar->ar_stat) { - - case SUCCESS: - return ((*(ar->ar_results.proc)) (xdrs, ar->ar_results.where)); - - case PROG_MISMATCH: - if (!xdr_u_long(xdrs, &(ar->ar_vers.low))) - return (FALSE); - return (xdr_u_long(xdrs, &(ar->ar_vers.high))); - } - return (TRUE); /* TRUE => open ended set of problems */ -} - -/* - * XDR the MSG_DENIED part of a reply message union - */ -bool_t xdr_rejected_reply(xdrs, rr) -register XDR *xdrs; -register struct rejected_reply *rr; -{ - - /* personalized union, rather than calling xdr_union */ - if (!xdr_enum(xdrs, (enum_t *) & (rr->rj_stat))) - return (FALSE); - switch (rr->rj_stat) { - - case RPC_MISMATCH: - if (!xdr_u_long(xdrs, &(rr->rj_vers.low))) - return (FALSE); - return (xdr_u_long(xdrs, &(rr->rj_vers.high))); - - case AUTH_ERROR: - return (xdr_enum(xdrs, (enum_t *) & (rr->rj_why))); - } - return (FALSE); -} - -static struct xdr_discrim reply_dscrm[3] = { - {(int) MSG_ACCEPTED, (xdrproc_t)xdr_accepted_reply}, - {(int) MSG_DENIED, (xdrproc_t)xdr_rejected_reply}, - {__dontcare__, NULL_xdrproc_t} -}; - -/* - * XDR a reply message - */ -bool_t xdr_replymsg(xdrs, rmsg) -register XDR *xdrs; -register struct rpc_msg *rmsg; -{ - if (xdr_u_long(xdrs, &(rmsg->rm_xid)) && - xdr_enum(xdrs, (enum_t *) & (rmsg->rm_direction)) && - (rmsg->rm_direction == REPLY)) - return (xdr_union(xdrs, (enum_t *) & (rmsg->rm_reply.rp_stat), - (caddr_t) & (rmsg->rm_reply.ru), reply_dscrm, - NULL_xdrproc_t)); - return (FALSE); -} - - -/* - * Serializes the "static part" of a call message header. - * The fields include: rm_xid, rm_direction, rpcvers, prog, and vers. - * The rm_xid is not really static, but the user can easily munge on the fly. - */ -bool_t xdr_callhdr(xdrs, cmsg) -register XDR *xdrs; -register struct rpc_msg *cmsg; -{ - - cmsg->rm_direction = CALL; - cmsg->rm_call.cb_rpcvers = RPC_MSG_VERSION; - if ( - (xdrs->x_op == XDR_ENCODE) && - xdr_u_long(xdrs, &(cmsg->rm_xid)) && - xdr_enum(xdrs, (enum_t *) & (cmsg->rm_direction)) && - xdr_u_long(xdrs, &(cmsg->rm_call.cb_rpcvers)) && - xdr_u_long(xdrs, &(cmsg->rm_call.cb_prog))) - return (xdr_u_long(xdrs, &(cmsg->rm_call.cb_vers))); - return (FALSE); -} - -/* ************************** Client utility routine ************* */ - -static void accepted(acpt_stat, error) -register enum accept_stat acpt_stat; -register struct rpc_err *error; -{ - - switch (acpt_stat) { - - case PROG_UNAVAIL: - error->re_status = RPC_PROGUNAVAIL; - return; - - case PROG_MISMATCH: - error->re_status = RPC_PROGVERSMISMATCH; - return; - - case PROC_UNAVAIL: - error->re_status = RPC_PROCUNAVAIL; - return; - - case GARBAGE_ARGS: - error->re_status = RPC_CANTDECODEARGS; - return; - - case SYSTEM_ERR: - error->re_status = RPC_SYSTEMERROR; - return; - - case SUCCESS: - error->re_status = RPC_SUCCESS; - return; - } - /* something's wrong, but we don't know what ... */ - error->re_status = RPC_FAILED; - error->re_lb.s1 = (long) MSG_ACCEPTED; - error->re_lb.s2 = (long) acpt_stat; -} - -static void rejected(rjct_stat, error) -register enum reject_stat rjct_stat; -register struct rpc_err *error; -{ - - switch (rjct_stat) { - - case RPC_VERSMISMATCH: - error->re_status = RPC_VERSMISMATCH; - return; - - case AUTH_ERROR: - error->re_status = RPC_AUTHERROR; - return; - } - /* something's wrong, but we don't know what ... */ - error->re_status = RPC_FAILED; - error->re_lb.s1 = (long) MSG_DENIED; - error->re_lb.s2 = (long) rjct_stat; -} - -/* - * given a reply message, fills in the error - */ -void _seterr_reply(msg, error) -register struct rpc_msg *msg; -register struct rpc_err *error; -{ - - /* optimized for normal, SUCCESSful case */ - switch (msg->rm_reply.rp_stat) { - - case MSG_ACCEPTED: - if (msg->acpted_rply.ar_stat == SUCCESS) { - error->re_status = RPC_SUCCESS; - return; - }; - accepted(msg->acpted_rply.ar_stat, error); - break; - - case MSG_DENIED: - rejected(msg->rjcted_rply.rj_stat, error); - break; - - default: - error->re_status = RPC_FAILED; - error->re_lb.s1 = (long) (msg->rm_reply.rp_stat); - break; - } - switch (error->re_status) { - - case RPC_VERSMISMATCH: - error->re_vers.low = msg->rjcted_rply.rj_vers.low; - error->re_vers.high = msg->rjcted_rply.rj_vers.high; - break; - - case RPC_AUTHERROR: - error->re_why = msg->rjcted_rply.rj_why; - break; - - case RPC_PROGVERSMISMATCH: - error->re_vers.low = msg->acpted_rply.ar_vers.low; - error->re_vers.high = msg->acpted_rply.ar_vers.high; - break; - } -} diff --git a/mdk-stage1/dietlibc/librpc/svc.c b/mdk-stage1/dietlibc/librpc/svc.c deleted file mode 100644 index 4fcdb5216..000000000 --- a/mdk-stage1/dietlibc/librpc/svc.c +++ /dev/null @@ -1,479 +0,0 @@ -/* @(#)svc.c 2.4 88/08/11 4.0 RPCSRC; from 1.44 88/02/08 SMI */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)svc.c 1.41 87/10/13 Copyr 1984 Sun Micro"; -#endif - -/* - * svc.c, Server-side remote procedure call interface. - * - * There are two sets of procedures here. The xprt routines are - * for handling transport handles. The svc routines handle the - * list of service routines. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#ifdef __linux__ -#include -#endif - -extern int errno; - -#ifdef FD_SETSIZE -static SVCXPRT **xports; -#else -#define NOFILE 32 - -static SVCXPRT *xports[NOFILE]; -#endif /* def FD_SETSIZE */ - -#define NULL_SVC ((struct svc_callout *)0) -#define RQCRED_SIZE 400 /* this size is excessive */ - -/* - * The services list - * Each entry represents a set of procedures (an rpc program). - * The dispatch routine takes request structs and runs the - * apropriate procedure. - */ -static struct svc_callout { - struct svc_callout *sc_next; - u_long sc_prog; - u_long sc_vers; - void (*sc_dispatch) (); -} *svc_head; - -static struct svc_callout *svc_find(); - -/* *************** SVCXPRT related stuff **************** */ - -/* - * Activate a transport handle. - */ -void xprt_register(xprt) -SVCXPRT *xprt; -{ - register int sock = xprt->xp_sock; - -#ifdef FD_SETSIZE - if (xports == NULL) { - xports = (SVCXPRT **) - mem_alloc(FD_SETSIZE * sizeof(SVCXPRT *)); - } - if (sock < _rpc_dtablesize()) { - xports[sock] = xprt; - FD_SET(sock, &svc_fdset); - } -#else - if (sock < NOFILE) { - xports[sock] = xprt; - svc_fds |= (1 << sock); - } -#endif /* def FD_SETSIZE */ - -} - -/* - * De-activate a transport handle. - */ -void xprt_unregister(xprt) -SVCXPRT *xprt; -{ - register int sock = xprt->xp_sock; - -#ifdef FD_SETSIZE - if ((sock < _rpc_dtablesize()) && (xports[sock] == xprt)) { - xports[sock] = (SVCXPRT *) 0; - FD_CLR(sock, &svc_fdset); - } -#else - if ((sock < NOFILE) && (xports[sock] == xprt)) { - xports[sock] = (SVCXPRT *) 0; - svc_fds &= ~(1 << sock); - } -#endif /* def FD_SETSIZE */ -} - - -/* ********************** CALLOUT list related stuff ************* */ - -/* - * Add a service program to the callout list. - * The dispatch routine will be called when a rpc request for this - * program number comes in. - */ -bool_t svc_register(xprt, prog, vers, dispatch, protocol) -SVCXPRT *xprt; -u_long prog; -u_long vers; -void (*dispatch) (); -rpcprot_t protocol; -{ - struct svc_callout *prev; - register struct svc_callout *s; - - if ((s = svc_find(prog, vers, &prev)) != NULL_SVC) { - if (s->sc_dispatch == dispatch) - goto pmap_it; /* he is registering another xptr */ - return (FALSE); - } - s = (struct svc_callout *) mem_alloc(sizeof(struct svc_callout)); - - if (s == (struct svc_callout *) 0) { - return (FALSE); - } - s->sc_prog = prog; - s->sc_vers = vers; - s->sc_dispatch = dispatch; - s->sc_next = svc_head; - svc_head = s; - pmap_it: - /* now register the information with the local binder service */ - if (protocol) { - return (pmap_set(prog, vers, protocol, xprt->xp_port)); - } - return (TRUE); -} - -/* - * Remove a service program from the callout list. - */ -void svc_unregister(prog, vers) -u_long prog; -u_long vers; -{ - struct svc_callout *prev; - register struct svc_callout *s; - - if ((s = svc_find(prog, vers, &prev)) == NULL_SVC) - return; - if (prev == NULL_SVC) { - svc_head = s->sc_next; - } else { - prev->sc_next = s->sc_next; - } - s->sc_next = NULL_SVC; - mem_free((char *) s, (u_int) sizeof(struct svc_callout)); - - /* now unregister the information with the local binder service */ - (void) pmap_unset(prog, vers); -} - -/* - * Search the callout list for a program number, return the callout - * struct. - */ -static struct svc_callout *svc_find(prog, vers, prev) -u_long prog; -u_long vers; -struct svc_callout **prev; -{ - register struct svc_callout *s, *p; - - p = NULL_SVC; - for (s = svc_head; s != NULL_SVC; s = s->sc_next) { - if ((s->sc_prog == prog) && (s->sc_vers == vers)) - goto done; - p = s; - } - done: - *prev = p; - return (s); -} - -/* ******************* REPLY GENERATION ROUTINES ************ */ - -/* - * Send a reply to an rpc request - */ -bool_t svc_sendreply(xprt, xdr_results, xdr_location) -register SVCXPRT *xprt; -xdrproc_t xdr_results; -caddr_t xdr_location; -{ - struct rpc_msg rply; - - rply.rm_direction = REPLY; - rply.rm_reply.rp_stat = MSG_ACCEPTED; - rply.acpted_rply.ar_verf = xprt->xp_verf; - rply.acpted_rply.ar_stat = SUCCESS; - rply.acpted_rply.ar_results.where = xdr_location; - rply.acpted_rply.ar_results.proc = xdr_results; - return (SVC_REPLY(xprt, &rply)); -} - -/* - * No procedure error reply - */ -void svcerr_noproc(xprt) -register SVCXPRT *xprt; -{ - struct rpc_msg rply; - - rply.rm_direction = REPLY; - rply.rm_reply.rp_stat = MSG_ACCEPTED; - rply.acpted_rply.ar_verf = xprt->xp_verf; - rply.acpted_rply.ar_stat = PROC_UNAVAIL; - SVC_REPLY(xprt, &rply); -} - -/* - * Can't decode args error reply - */ -void svcerr_decode(xprt) -register SVCXPRT *xprt; -{ - struct rpc_msg rply; - - rply.rm_direction = REPLY; - rply.rm_reply.rp_stat = MSG_ACCEPTED; - rply.acpted_rply.ar_verf = xprt->xp_verf; - rply.acpted_rply.ar_stat = GARBAGE_ARGS; - SVC_REPLY(xprt, &rply); -} - -/* - * Some system error - */ -void svcerr_systemerr(xprt) -register SVCXPRT *xprt; -{ - struct rpc_msg rply; - - rply.rm_direction = REPLY; - rply.rm_reply.rp_stat = MSG_ACCEPTED; - rply.acpted_rply.ar_verf = xprt->xp_verf; - rply.acpted_rply.ar_stat = SYSTEM_ERR; - SVC_REPLY(xprt, &rply); -} - -/* - * Authentication error reply - */ -void svcerr_auth(xprt, why) -SVCXPRT *xprt; -enum auth_stat why; -{ - struct rpc_msg rply; - - rply.rm_direction = REPLY; - rply.rm_reply.rp_stat = MSG_DENIED; - rply.rjcted_rply.rj_stat = AUTH_ERROR; - rply.rjcted_rply.rj_why = why; - SVC_REPLY(xprt, &rply); -} - -/* - * Auth too weak error reply - */ -void svcerr_weakauth(xprt) -SVCXPRT *xprt; -{ - - svcerr_auth(xprt, AUTH_TOOWEAK); -} - -/* - * Program unavailable error reply - */ -void svcerr_noprog(xprt) -register SVCXPRT *xprt; -{ - struct rpc_msg rply; - - rply.rm_direction = REPLY; - rply.rm_reply.rp_stat = MSG_ACCEPTED; - rply.acpted_rply.ar_verf = xprt->xp_verf; - rply.acpted_rply.ar_stat = PROG_UNAVAIL; - SVC_REPLY(xprt, &rply); -} - -/* - * Program version mismatch error reply - */ -void svcerr_progvers(xprt, low_vers, high_vers) -register SVCXPRT *xprt; -u_long low_vers; -u_long high_vers; -{ - struct rpc_msg rply; - - rply.rm_direction = REPLY; - rply.rm_reply.rp_stat = MSG_ACCEPTED; - rply.acpted_rply.ar_verf = xprt->xp_verf; - rply.acpted_rply.ar_stat = PROG_MISMATCH; - rply.acpted_rply.ar_vers.low = low_vers; - rply.acpted_rply.ar_vers.high = high_vers; - SVC_REPLY(xprt, &rply); -} - -/* ******************* SERVER INPUT STUFF ******************* */ - -/* - * Get server side input from some transport. - * - * Statement of authentication parameters management: - * This function owns and manages all authentication parameters, specifically - * the "raw" parameters (msg.rm_call.cb_cred and msg.rm_call.cb_verf) and - * the "cooked" credentials (rqst->rq_clntcred). - * However, this function does not know the structure of the cooked - * credentials, so it make the following assumptions: - * a) the structure is contiguous (no pointers), and - * b) the cred structure size does not exceed RQCRED_SIZE bytes. - * In all events, all three parameters are freed upon exit from this routine. - * The storage is trivially management on the call stack in user land, but - * is mallocated in kernel land. - */ - -void svc_getreq(rdfds) -int rdfds; -{ -#ifdef FD_SETSIZE - fd_set readfds; - - FD_ZERO(&readfds); -/*#ifdef __linux__*/ -#if 0 - readfds = rdfds; -#else - readfds.fds_bits[0] = rdfds; -#endif - svc_getreqset(&readfds); -#else - int readfds = rdfds & svc_fds; - - svc_getreqset(&readfds); -#endif /* def FD_SETSIZE */ -} - -void svc_getreqset(readfds) -#ifdef FD_SETSIZE -fd_set *readfds; -{ -#else -int *readfds; -{ - int readfds_local = *readfds; -#endif /* def FD_SETSIZE */ - enum xprt_stat stat; - struct rpc_msg msg; - int prog_found; - u_long low_vers; - u_long high_vers; - struct svc_req r; - register SVCXPRT *xprt; - register u_long mask; - register int bit; - register u_long *maskp; - register int setsize; - register int sock; - char cred_area[2 * MAX_AUTH_BYTES + RQCRED_SIZE]; - - msg.rm_call.cb_cred.oa_base = cred_area; - msg.rm_call.cb_verf.oa_base = &(cred_area[MAX_AUTH_BYTES]); - r.rq_clntcred = &(cred_area[2 * MAX_AUTH_BYTES]); - - -#ifdef FD_SETSIZE - setsize = _rpc_dtablesize(); -#ifdef __linux__ -/*#define NFDBITS 32*/ - maskp = (u_long *) readfds; -#else - maskp = (u_long *) readfds->fds_bits; -#endif - for (sock = 0; sock < setsize; sock += NFDBITS) { - for (mask = *maskp++; (bit = ffs(mask)); mask ^= (1 << (bit - 1))) { - /* sock has input waiting */ - xprt = xports[sock + bit - 1]; -#else - for (sock = 0; readfds_local != 0; sock++, readfds_local >>= 1) { - if ((readfds_local & 1) != 0) { - /* sock has input waiting */ - xprt = xports[sock]; -#endif /* def FD_SETSIZE */ - /* now receive msgs from xprtprt (support batch calls) */ - do { - if (SVC_RECV(xprt, &msg)) { - - /* now find the exported program and call it */ - register struct svc_callout *s; - enum auth_stat why; - - r.rq_xprt = xprt; - r.rq_prog = msg.rm_call.cb_prog; - r.rq_vers = msg.rm_call.cb_vers; - r.rq_proc = msg.rm_call.cb_proc; - r.rq_cred = msg.rm_call.cb_cred; - /* first authenticate the message */ - if ((why = _authenticate(&r, &msg)) != AUTH_OK) { - svcerr_auth(xprt, why); - goto call_done; - } - /* now match message with a registered service */ - prog_found = FALSE; - low_vers = 0 - 1; - high_vers = 0; - for (s = svc_head; s != NULL_SVC; s = s->sc_next) { - if (s->sc_prog == r.rq_prog) { - if (s->sc_vers == r.rq_vers) { - (*s->sc_dispatch) (&r, xprt); - goto call_done; - } /* found correct version */ - prog_found = TRUE; - if (s->sc_vers < low_vers) - low_vers = s->sc_vers; - if (s->sc_vers > high_vers) - high_vers = s->sc_vers; - } /* found correct program */ - } - /* - * if we got here, the program or version - * is not served ... - */ - if (prog_found) - svcerr_progvers(xprt, low_vers, high_vers); - else - svcerr_noprog(xprt); - /* Fall through to ... */ - } - call_done: - if ((stat = SVC_STAT(xprt)) == XPRT_DIED) { - SVC_DESTROY(xprt); - break; - } - } while (stat == XPRT_MOREREQS); - } - } -} diff --git a/mdk-stage1/dietlibc/librpc/svc_auth.c b/mdk-stage1/dietlibc/librpc/svc_auth.c deleted file mode 100644 index 336586d95..000000000 --- a/mdk-stage1/dietlibc/librpc/svc_auth.c +++ /dev/null @@ -1,115 +0,0 @@ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)svc_auth.c 2.1 88/08/07 4.0 RPCSRC; from 1.19 87/08/11 Copyr 1984 Sun Micro"; -#endif -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * svc_auth_nodes.c, Server-side rpc authenticator interface, - * *WITHOUT* DES authentication. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include - -/* - * svcauthsw is the bdevsw of server side authentication. - * - * Server side authenticators are called from authenticate by - * using the client auth struct flavor field to index into svcauthsw. - * The server auth flavors must implement a routine that looks - * like: - * - * enum auth_stat - * flavorx_auth(rqst, msg) - * register struct svc_req *rqst; - * register struct rpc_msg *msg; - * - */ - -enum auth_stat _svcauth_null(); /* no authentication */ -enum auth_stat _svcauth_unix(); /* unix style (uid, gids) */ -enum auth_stat _svcauth_short(); /* short hand unix style */ - -static struct { - enum auth_stat (*authenticator) (); -} svcauthsw[] = { - { _svcauth_null }, /* AUTH_NULL */ - { _svcauth_unix }, /* AUTH_UNIX */ - { _svcauth_short }, /* AUTH_SHORT */ -}; - -#define AUTH_MAX 2 /* HIGHEST AUTH NUMBER */ - - -/* - * The call rpc message, msg has been obtained from the wire. The msg contains - * the raw form of credentials and verifiers. authenticate returns AUTH_OK - * if the msg is successfully authenticated. If AUTH_OK then the routine also - * does the following things: - * set rqst->rq_xprt->verf to the appropriate response verifier; - * sets rqst->rq_client_cred to the "cooked" form of the credentials. - * - * NB: rqst->rq_cxprt->verf must be pre-alloctaed; - * its length is set appropriately. - * - * The caller still owns and is responsible for msg->u.cmb.cred and - * msg->u.cmb.verf. The authentication system retains ownership of - * rqst->rq_client_cred, the cooked credentials. - * - * There is an assumption that any flavour less than AUTH_NULL is - * invalid. - */ -enum auth_stat _authenticate(rqst, msg) -register struct svc_req *rqst; -struct rpc_msg *msg; -{ - register int cred_flavor; - - rqst->rq_cred = msg->rm_call.cb_cred; - rqst->rq_xprt->xp_verf.oa_flavor = _null_auth.oa_flavor; - rqst->rq_xprt->xp_verf.oa_length = 0; - cred_flavor = rqst->rq_cred.oa_flavor; - if ((cred_flavor <= AUTH_MAX) && (cred_flavor >= AUTH_NULL)) { - return ((*(svcauthsw[cred_flavor].authenticator)) (rqst, msg)); - } - - return (AUTH_REJECTEDCRED); -} - -enum auth_stat _svcauth_null( /*rqst, msg */ ) - /*struct svc_req *rqst; - struct rpc_msg *msg; */ -{ - - return (AUTH_OK); -} diff --git a/mdk-stage1/dietlibc/librpc/svc_auth_unix.c b/mdk-stage1/dietlibc/librpc/svc_auth_unix.c deleted file mode 100644 index 7e0305f0a..000000000 --- a/mdk-stage1/dietlibc/librpc/svc_auth_unix.c +++ /dev/null @@ -1,136 +0,0 @@ -/* @(#)svc_auth_unix.c 2.3 88/08/01 4.0 RPCSRC; from 1.28 88/02/08 SMI */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)svc_auth_unix.c 1.28 88/02/08 Copyr 1984 Sun Micro"; -#endif - -/* - * svc_auth_unix.c - * Handles UNIX flavor authentication parameters on the service side of rpc. - * There are two svc auth implementations here: AUTH_UNIX and AUTH_SHORT. - * _svcauth_unix does full blown unix style uid,gid+gids auth, - * _svcauth_short uses a shorthand auth to index into a cache of longhand auths. - * Note: the shorthand has been gutted for efficiency. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include - -/* - * Unix longhand authenticator - */ -enum auth_stat _svcauth_unix(rqst, msg) -register struct svc_req *rqst; -register struct rpc_msg *msg; -{ - register enum auth_stat stat; - XDR xdrs; - register struct authunix_parms *aup; - register int32_t *buf; - struct area { - struct authunix_parms area_aup; - char area_machname[MAX_MACHINE_NAME + 1]; - gid_t area_gids[NGRPS]; - } *area; - u_int auth_len; - int str_len, gid_len; - register int i; - - area = (struct area *) rqst->rq_clntcred; - aup = &area->area_aup; - aup->aup_machname = area->area_machname; - aup->aup_gids = area->area_gids; - auth_len = (u_int) msg->rm_call.cb_cred.oa_length; - xdrmem_create(&xdrs, msg->rm_call.cb_cred.oa_base, auth_len, - XDR_DECODE); - buf = XDR_INLINE(&xdrs, auth_len); - if (buf != NULL) { - aup->aup_time = IXDR_GET_LONG(buf); - str_len = IXDR_GET_U_LONG(buf); - if (str_len > MAX_MACHINE_NAME) { - stat = AUTH_BADCRED; - goto done; - } - bcopy((caddr_t) buf, aup->aup_machname, (u_int) str_len); - aup->aup_machname[str_len] = 0; - str_len = RNDUP(str_len); - buf += str_len / sizeof(long); - - aup->aup_uid = IXDR_GET_LONG(buf); - aup->aup_gid = IXDR_GET_LONG(buf); - gid_len = IXDR_GET_U_LONG(buf); - if (gid_len > NGRPS) { - stat = AUTH_BADCRED; - goto done; - } - aup->aup_len = gid_len; - for (i = 0; i < gid_len; i++) { - aup->aup_gids[i] = IXDR_GET_LONG(buf); - } - /* - * five is the smallest unix credentials structure - - * timestamp, hostname len (0), uid, gid, and gids len (0). - */ - if ((5 + gid_len) * BYTES_PER_XDR_UNIT + str_len > auth_len) { - (void) printf("bad auth_len gid %d str %d auth %d\n", - gid_len, str_len, auth_len); - stat = AUTH_BADCRED; - goto done; - } - } else if (!xdr_authunix_parms(&xdrs, aup)) { - xdrs.x_op = XDR_FREE; - (void) xdr_authunix_parms(&xdrs, aup); - stat = AUTH_BADCRED; - goto done; - } - rqst->rq_xprt->xp_verf.oa_flavor = AUTH_NULL; - rqst->rq_xprt->xp_verf.oa_length = 0; - stat = AUTH_OK; - done: - XDR_DESTROY(&xdrs); - return (stat); -} - - -/* - * Shorthand unix authenticator - * Looks up longhand in a cache. - */ - /*ARGSUSED*/ enum auth_stat _svcauth_short(rqst, msg) -struct svc_req *rqst; -struct rpc_msg *msg; -{ - return (AUTH_REJECTEDCRED); -} diff --git a/mdk-stage1/dietlibc/librpc/svc_raw.c b/mdk-stage1/dietlibc/librpc/svc_raw.c deleted file mode 100644 index c13ea5e06..000000000 --- a/mdk-stage1/dietlibc/librpc/svc_raw.c +++ /dev/null @@ -1,159 +0,0 @@ -/* @(#)svc_raw.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)svc_raw.c 1.15 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * svc_raw.c, This a toy for simple testing and timing. - * Interface to create an rpc client and server in the same UNIX process. - * This lets us similate rpc and get rpc (round trip) overhead, without - * any interference from the kernal. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include - - -/* - * This is the "network" that we will be moving data over - */ -static struct svcraw_private { - char _raw_buf[UDPMSGSIZE]; - SVCXPRT server; - XDR xdr_stream; - char verf_body[MAX_AUTH_BYTES]; -} *svcraw_private; - -static bool_t svcraw_recv(); -static enum xprt_stat svcraw_stat(); -static bool_t svcraw_getargs(); -static bool_t svcraw_reply(); -static bool_t svcraw_freeargs(); -static void svcraw_destroy(); - -static struct xp_ops server_ops = { - svcraw_recv, - svcraw_stat, - svcraw_getargs, - svcraw_reply, - svcraw_freeargs, - svcraw_destroy -}; - -SVCXPRT *svcraw_create() -{ - register struct svcraw_private *srp = svcraw_private; - - if (srp == 0) { - srp = (struct svcraw_private *) calloc(1, sizeof(*srp)); - if (srp == 0) - return (0); - } - srp->server.xp_sock = 0; - srp->server.xp_port = 0; - srp->server.xp_ops = &server_ops; - srp->server.xp_verf.oa_base = srp->verf_body; - xdrmem_create(&srp->xdr_stream, srp->_raw_buf, UDPMSGSIZE, XDR_FREE); - return (&srp->server); -} - -static enum xprt_stat svcraw_stat() -{ - - return (XPRT_IDLE); -} - -static bool_t svcraw_recv(xprt, msg) -SVCXPRT *xprt; -struct rpc_msg *msg; -{ - register struct svcraw_private *srp = svcraw_private; - register XDR *xdrs; - - if (srp == 0) - return (0); - xdrs = &srp->xdr_stream; - xdrs->x_op = XDR_DECODE; - XDR_SETPOS(xdrs, 0); - if (!xdr_callmsg(xdrs, msg)) - return (FALSE); - return (TRUE); -} - -static bool_t svcraw_reply(xprt, msg) -SVCXPRT *xprt; -struct rpc_msg *msg; -{ - register struct svcraw_private *srp = svcraw_private; - register XDR *xdrs; - - if (srp == 0) - return (FALSE); - xdrs = &srp->xdr_stream; - xdrs->x_op = XDR_ENCODE; - XDR_SETPOS(xdrs, 0); - if (!xdr_replymsg(xdrs, msg)) - return (FALSE); - (void) XDR_GETPOS(xdrs); /* called just for overhead */ - return (TRUE); -} - -static bool_t svcraw_getargs(xprt, xdr_args, args_ptr) -SVCXPRT *xprt; -xdrproc_t xdr_args; -caddr_t args_ptr; -{ - register struct svcraw_private *srp = svcraw_private; - - if (srp == 0) - return (FALSE); - return ((*xdr_args) (&srp->xdr_stream, args_ptr)); -} - -static bool_t svcraw_freeargs(xprt, xdr_args, args_ptr) -SVCXPRT *xprt; -xdrproc_t xdr_args; -caddr_t args_ptr; -{ - register struct svcraw_private *srp = svcraw_private; - register XDR *xdrs; - - if (srp == 0) - return (FALSE); - xdrs = &srp->xdr_stream; - xdrs->x_op = XDR_FREE; - return ((*xdr_args) (xdrs, args_ptr)); -} - -static void svcraw_destroy() -{ -} diff --git a/mdk-stage1/dietlibc/librpc/svc_run.c b/mdk-stage1/dietlibc/librpc/svc_run.c deleted file mode 100644 index c7150e357..000000000 --- a/mdk-stage1/dietlibc/librpc/svc_run.c +++ /dev/null @@ -1,71 +0,0 @@ -/* @(#)svc_run.c 2.1 88/07/29 4.0 RPCSRC */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)svc_run.c 1.1 87/10/13 Copyr 1984 Sun Micro"; -#endif - -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ - -/* - * This is the rpc server side idle loop - * Wait for input, call server program. - */ -#include -#include -#include - -void svc_run() -{ -#ifdef FD_SETSIZE - fd_set readfds; -#else - int readfds; -#endif /* def FD_SETSIZE */ - extern int errno; - - for (;;) { -#ifdef FD_SETSIZE - readfds = svc_fdset; -#else - readfds = svc_fds; -#endif /* def FD_SETSIZE */ - switch (select(_rpc_dtablesize(), &readfds, 0, 0, 0)) { - case -1: - if (errno == EINTR) { - continue; - } - perror("svc_run: - select failed"); - return; - case 0: - continue; - default: - svc_getreqset(&readfds); - } - } -} diff --git a/mdk-stage1/dietlibc/librpc/svc_simple.c b/mdk-stage1/dietlibc/librpc/svc_simple.c deleted file mode 100644 index 0bb9a19eb..000000000 --- a/mdk-stage1/dietlibc/librpc/svc_simple.c +++ /dev/null @@ -1,144 +0,0 @@ -/* @(#)svc_simple.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)svc_simple.c 1.18 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * svc_simple.c - * Simplified front end to rpc. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#include -#include - -static struct proglst { - char *(*p_progname) (); - int p_prognum; - int p_procnum; - xdrproc_t p_inproc, p_outproc; - struct proglst *p_nxt; -} *proglst; -static void universal(); -static SVCXPRT *transp; -struct proglst *pl; - -int registerrpc(int prognum, int versnum, int procnum, char *(*progname)(), xdrproc_t inproc, xdrproc_t outproc) -{ - - if (procnum == NULLPROC) { - (void) fprintf(stderr, - "can't reassign procedure number %d\n", NULLPROC); - return (-1); - } - if (transp == 0) { - transp = svcudp_create(RPC_ANYSOCK); - if (transp == NULL) { - (void) fprintf(stderr, "couldn't create an rpc server\n"); - return (-1); - } - } - (void) pmap_unset((u_long) prognum, (u_long) versnum); - if (!svc_register(transp, (u_long) prognum, (u_long) versnum, - universal, IPPROTO_UDP)) { - (void) fprintf(stderr, "couldn't register prog %d vers %d\n", - prognum, versnum); - return (-1); - } - pl = (struct proglst *) malloc(sizeof(struct proglst)); - - if (pl == NULL) { - (void) fprintf(stderr, "registerrpc: out of memory\n"); - return (-1); - } - pl->p_progname = progname; - pl->p_prognum = prognum; - pl->p_procnum = procnum; - pl->p_inproc = inproc; - pl->p_outproc = outproc; - pl->p_nxt = proglst; - proglst = pl; - return (0); -} - -static void universal(rqstp, transp) -struct svc_req *rqstp; -SVCXPRT *transp; -{ - int prog, proc; - char *outdata; - char xdrbuf[UDPMSGSIZE]; - struct proglst *pl; - - /* - * enforce "procnum 0 is echo" convention - */ - if (rqstp->rq_proc == NULLPROC) { - if (svc_sendreply(transp, (xdrproc_t)xdr_void, (char *) NULL) == FALSE) { - (void) fprintf(stderr, "xxx\n"); - exit(1); - } - return; - } - prog = rqstp->rq_prog; - proc = rqstp->rq_proc; - for (pl = proglst; pl != NULL; pl = pl->p_nxt) - if (pl->p_prognum == prog && pl->p_procnum == proc) { - /* decode arguments into a CLEAN buffer */ - bzero(xdrbuf, sizeof(xdrbuf)); /* required ! */ - if (!svc_getargs(transp, pl->p_inproc, xdrbuf)) { - svcerr_decode(transp); - return; - } - outdata = (*(pl->p_progname)) (xdrbuf); - if (outdata == NULL && pl->p_outproc != (xdrproc_t)xdr_void) - /* there was an error */ - return; - if (!svc_sendreply(transp, pl->p_outproc, outdata)) { - (void) fprintf(stderr, - "trouble replying to prog %d\n", - pl->p_prognum); - exit(1); - } - /* free the decoded arguments */ - (void) svc_freeargs(transp, pl->p_inproc, xdrbuf); - return; - } - (void) fprintf(stderr, "never registered prog %d\n", prog); - exit(1); -} diff --git a/mdk-stage1/dietlibc/librpc/svc_tcp.c b/mdk-stage1/dietlibc/librpc/svc_tcp.c deleted file mode 100644 index 6edafa1b1..000000000 --- a/mdk-stage1/dietlibc/librpc/svc_tcp.c +++ /dev/null @@ -1,406 +0,0 @@ -/* @(#)svc_tcp.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)svc_tcp.c 1.21 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * svc_tcp.c, Server side for TCP/IP based RPC. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * Actually implements two flavors of transporter - - * a tcp rendezvouser (a listner and connection establisher) - * and a record/tcp stream. - */ - -#include -#include -#include -#include -#include -#include -#include - -/* - * Ops vector for TCP/IP based rpc service handle - */ -static bool_t svctcp_recv(); -static enum xprt_stat svctcp_stat(); -static bool_t svctcp_getargs(); -static bool_t svctcp_reply(); -static bool_t svctcp_freeargs(); -static void svctcp_destroy(); - -static struct xp_ops svctcp_op = { - svctcp_recv, - svctcp_stat, - svctcp_getargs, - svctcp_reply, - svctcp_freeargs, - svctcp_destroy -}; - -/* - * Ops vector for TCP/IP rendezvous handler - */ -static bool_t rendezvous_request(); -static enum xprt_stat rendezvous_stat(); - -static struct xp_ops svctcp_rendezvous_op = { - rendezvous_request, - rendezvous_stat, - (void*)abort, - (void*)abort, - (void*)abort, - svctcp_destroy -}; - -static int readtcp(), writetcp(); -static SVCXPRT *makefd_xprt(); - -struct tcp_rendezvous { /* kept in xprt->xp_p1 */ - u_int sendsize; - u_int recvsize; -}; - -struct tcp_conn { /* kept in xprt->xp_p1 */ - enum xprt_stat strm_stat; - u_long x_id; - XDR xdrs; - char verf_body[MAX_AUTH_BYTES]; -}; - -/* - * Usage: - * xprt = svctcp_create(sock, send_buf_size, recv_buf_size); - * - * Creates, registers, and returns a (rpc) tcp based transporter. - * Once *xprt is initialized, it is registered as a transporter - * see (svc.h, xprt_register). This routine returns - * a NULL if a problem occurred. - * - * If sock<0 then a socket is created, else sock is used. - * If the socket, sock is not bound to a port then svctcp_create - * binds it to an arbitrary port. The routine then starts a tcp - * listener on the socket's associated port. In any (successful) case, - * xprt->xp_sock is the registered socket number and xprt->xp_port is the - * associated port number. - * - * Since tcp streams do buffered io similar to stdio, the caller can specify - * how big the send and receive buffers are via the second and third parms; - * 0 => use the system default. - */ -SVCXPRT *svctcp_create(sock, sendsize, recvsize) -register int sock; -u_int sendsize; -u_int recvsize; -{ - bool_t madesock = FALSE; - register SVCXPRT *xprt; - register struct tcp_rendezvous *r; - struct sockaddr_in addr; - int len = sizeof(struct sockaddr_in); - - if (sock == RPC_ANYSOCK) { - if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { - perror("svc_tcp.c - tcp socket creation problem"); - return ((SVCXPRT *) NULL); - } - madesock = TRUE; - } - bzero((char *) &addr, sizeof(addr)); - addr.sin_family = AF_INET; - if (bindresvport(sock, &addr)) { - addr.sin_port = 0; - (void) bind(sock, (struct sockaddr *) &addr, len); - } - if ((getsockname(sock, (struct sockaddr *) &addr, &len) != 0) || - (listen(sock, 2) != 0)) { - perror("svctcp_.c - cannot getsockname or listen"); - if (madesock) - (void) close(sock); - return ((SVCXPRT *) NULL); - } - r = (struct tcp_rendezvous *) mem_alloc(sizeof(*r)); - if (r == NULL) { - (void) fprintf(stderr, "svctcp_create: out of memory\n"); - return (NULL); - } - r->sendsize = sendsize; - r->recvsize = recvsize; - xprt = (SVCXPRT *) mem_alloc(sizeof(SVCXPRT)); - if (xprt == NULL) { - (void) fprintf(stderr, "svctcp_create: out of memory\n"); - return (NULL); - } - xprt->xp_p2 = NULL; - xprt->xp_p1 = (caddr_t) r; - xprt->xp_verf = _null_auth; - xprt->xp_ops = &svctcp_rendezvous_op; - xprt->xp_port = ntohs(addr.sin_port); - xprt->xp_sock = sock; - xprt_register(xprt); - return (xprt); -} - -/* - * Like svtcp_create(), except the routine takes any *open* UNIX file - * descriptor as its first input. - */ -SVCXPRT *svcfd_create(fd, sendsize, recvsize) -int fd; -u_int sendsize; -u_int recvsize; -{ - - return (makefd_xprt(fd, sendsize, recvsize)); -} - -static SVCXPRT *makefd_xprt(fd, sendsize, recvsize) -int fd; -u_int sendsize; -u_int recvsize; -{ - register SVCXPRT *xprt; - register struct tcp_conn *cd; - - xprt = (SVCXPRT *) mem_alloc(sizeof(SVCXPRT)); - if (xprt == (SVCXPRT *) NULL) { - (void) fprintf(stderr, "svc_tcp: makefd_xprt: out of memory\n"); - goto done; - } - cd = (struct tcp_conn *) mem_alloc(sizeof(struct tcp_conn)); - - if (cd == (struct tcp_conn *) NULL) { - (void) fprintf(stderr, "svc_tcp: makefd_xprt: out of memory\n"); - mem_free((char *) xprt, sizeof(SVCXPRT)); - xprt = (SVCXPRT *) NULL; - goto done; - } - cd->strm_stat = XPRT_IDLE; - xdrrec_create(&(cd->xdrs), sendsize, recvsize, - (caddr_t) xprt, readtcp, writetcp); - xprt->xp_p2 = NULL; - xprt->xp_p1 = (caddr_t) cd; - xprt->xp_verf.oa_base = cd->verf_body; - xprt->xp_addrlen = 0; - xprt->xp_ops = &svctcp_op; /* truely deals with calls */ - xprt->xp_port = 0; /* this is a connection, not a rendezvouser */ - xprt->xp_sock = fd; - xprt_register(xprt); - done: - return (xprt); -} - -static bool_t rendezvous_request(xprt) -register SVCXPRT *xprt; -{ - int sock; - struct tcp_rendezvous *r; - struct sockaddr_in addr; - int len; - - r = (struct tcp_rendezvous *) xprt->xp_p1; - again: - len = sizeof(struct sockaddr_in); - - if ((sock = accept(xprt->xp_sock, (struct sockaddr *) &addr, - &len)) < 0) { - if (errno == EINTR) - goto again; - return (FALSE); - } - /* - * make a new transporter (re-uses xprt) - */ - xprt = makefd_xprt(sock, r->sendsize, r->recvsize); - xprt->xp_raddr = addr; - xprt->xp_addrlen = len; - return (FALSE); /* there is never an rpc msg to be processed */ -} - -static enum xprt_stat rendezvous_stat() -{ - - return (XPRT_IDLE); -} - -static void svctcp_destroy(xprt) -register SVCXPRT *xprt; -{ - register struct tcp_conn *cd = (struct tcp_conn *) xprt->xp_p1; - - xprt_unregister(xprt); - (void) close(xprt->xp_sock); - if (xprt->xp_port != 0) { - /* a rendezvouser socket */ - xprt->xp_port = 0; - } else { - /* an actual connection socket */ - XDR_DESTROY(&(cd->xdrs)); - } - mem_free((caddr_t) cd, sizeof(struct tcp_conn)); - - mem_free((caddr_t) xprt, sizeof(SVCXPRT)); -} - -/* - * All read operations timeout after 35 seconds. - * A timeout is fatal for the connection. - */ -static struct timeval wait_per_try = { 35, 0 }; - -/* - * reads data from the tcp conection. - * any error is fatal and the connection is closed. - * (And a read of zero bytes is a half closed stream => error.) - */ -static int readtcp(xprt, buf, len) -register SVCXPRT *xprt; -caddr_t buf; -register int len; -{ - register int sock = xprt->xp_sock; - -#ifdef FD_SETSIZE - fd_set mask; - fd_set readfds; - - FD_ZERO(&mask); - FD_SET(sock, &mask); -#else - register int mask = 1 << sock; - int readfds; -#endif /* def FD_SETSIZE */ - do { - readfds = mask; - if (select(_rpc_dtablesize(), &readfds, 0, 0, &wait_per_try) <= 0) { - if (errno == EINTR) { - continue; - } - goto fatal_err; - } -#ifdef FD_SETSIZE - } while (!FD_ISSET(sock, &readfds)); -#else - } while (readfds != mask); -#endif /* def FD_SETSIZE */ - if ((len = read(sock, buf, len)) > 0) { - return (len); - } - fatal_err: - ((struct tcp_conn *) (xprt->xp_p1))->strm_stat = XPRT_DIED; - return (-1); -} - -/* - * writes data to the tcp connection. - * Any error is fatal and the connection is closed. - */ -static int writetcp(xprt, buf, len) -register SVCXPRT *xprt; -caddr_t buf; -int len; -{ - register int i, cnt; - - for (cnt = len; cnt > 0; cnt -= i, buf += i) { - if ((i = write(xprt->xp_sock, buf, cnt)) < 0) { - ((struct tcp_conn *) (xprt->xp_p1))->strm_stat = XPRT_DIED; - return (-1); - } - } - return (len); -} - -static enum xprt_stat svctcp_stat(xprt) -SVCXPRT *xprt; -{ - register struct tcp_conn *cd = (struct tcp_conn *) (xprt->xp_p1); - - if (cd->strm_stat == XPRT_DIED) - return (XPRT_DIED); - if (!xdrrec_eof(&(cd->xdrs))) - return (XPRT_MOREREQS); - return (XPRT_IDLE); -} - -static bool_t svctcp_recv(xprt, msg) -SVCXPRT *xprt; -register struct rpc_msg *msg; -{ - register struct tcp_conn *cd = (struct tcp_conn *) (xprt->xp_p1); - register XDR *xdrs = &(cd->xdrs); - - xdrs->x_op = XDR_DECODE; - (void) xdrrec_skiprecord(xdrs); - if (xdr_callmsg(xdrs, msg)) { - cd->x_id = msg->rm_xid; - return (TRUE); - } - return (FALSE); -} - -static bool_t svctcp_getargs(xprt, xdr_args, args_ptr) -SVCXPRT *xprt; -xdrproc_t xdr_args; -caddr_t args_ptr; -{ - - return ((*xdr_args) - (&(((struct tcp_conn *) (xprt->xp_p1))->xdrs), args_ptr)); -} - -static bool_t svctcp_freeargs(xprt, xdr_args, args_ptr) -SVCXPRT *xprt; -xdrproc_t xdr_args; -caddr_t args_ptr; -{ - register XDR *xdrs = &(((struct tcp_conn *) (xprt->xp_p1))->xdrs); - - xdrs->x_op = XDR_FREE; - return ((*xdr_args) (xdrs, args_ptr)); -} - -static bool_t svctcp_reply(xprt, msg) -SVCXPRT *xprt; -register struct rpc_msg *msg; -{ - register struct tcp_conn *cd = (struct tcp_conn *) (xprt->xp_p1); - register XDR *xdrs = &(cd->xdrs); - register bool_t stat; - - xdrs->x_op = XDR_ENCODE; - msg->rm_xid = cd->x_id; - stat = xdr_replymsg(xdrs, msg); - (void) xdrrec_endofrecord(xdrs, TRUE); - return (stat); -} diff --git a/mdk-stage1/dietlibc/librpc/svc_udp.c b/mdk-stage1/dietlibc/librpc/svc_udp.c deleted file mode 100644 index 1cdb5ce91..000000000 --- a/mdk-stage1/dietlibc/librpc/svc_udp.c +++ /dev/null @@ -1,467 +0,0 @@ -/* @(#)svc_udp.c 2.2 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)svc_udp.c 1.24 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * svc_udp.c, - * Server side for UDP/IP based RPC. (Does some caching in the hopes of - * achieving execute-at-most-once semantics.) - * - * Copyright (C) 1984, Sun Microsystems, Inc. - */ - -#include -#include -#include -#include -#include -#include - - -#define rpc_buffer(xprt) ((xprt)->xp_p1) -#define MAX(a, b) ((a > b) ? a : b) - -static bool_t svcudp_recv(); -static bool_t svcudp_reply(); -static enum xprt_stat svcudp_stat(); -static bool_t svcudp_getargs(); -static bool_t svcudp_freeargs(); -static void svcudp_destroy(); - -static struct xp_ops svcudp_op = { - svcudp_recv, - svcudp_stat, - svcudp_getargs, - svcudp_reply, - svcudp_freeargs, - svcudp_destroy -}; - -extern int errno; - -/* - * kept in xprt->xp_p2 - */ -struct svcudp_data { - u_int su_iosz; /* byte size of send.recv buffer */ - u_long su_xid; /* transaction id */ - XDR su_xdrs; /* XDR handle */ - char su_verfbody[MAX_AUTH_BYTES]; /* verifier body */ - char *su_cache; /* cached data, NULL if no cache */ -}; - -#define su_data(xprt) ((struct svcudp_data *)(xprt->xp_p2)) - -static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, u_long* replylenp); -static void cache_set(SVCXPRT* xprt, u_long replylen); - -/* - * Usage: - * xprt = svcudp_create(sock); - * - * If sock<0 then a socket is created, else sock is used. - * If the socket, sock is not bound to a port then svcudp_create - * binds it to an arbitrary port. In any (successful) case, - * xprt->xp_sock is the registered socket number and xprt->xp_port is the - * associated port number. - * Once *xprt is initialized, it is registered as a transporter; - * see (svc.h, xprt_register). - * The routines returns NULL if a problem occurred. - */ -SVCXPRT *svcudp_bufcreate(sock, sendsz, recvsz) -register int sock; -u_int sendsz, recvsz; -{ - bool_t madesock = FALSE; - register SVCXPRT *xprt; - register struct svcudp_data *su; - struct sockaddr_in addr; - int len = sizeof(struct sockaddr_in); - - if (sock == RPC_ANYSOCK) { - if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { - perror("svcudp_create: socket creation problem"); - return ((SVCXPRT *) NULL); - } - madesock = TRUE; - } - bzero((char *) &addr, sizeof(addr)); - addr.sin_family = AF_INET; - if (bindresvport(sock, &addr)) { - addr.sin_port = 0; - (void) bind(sock, (struct sockaddr *) &addr, len); - } - if (getsockname(sock, (struct sockaddr *) &addr, &len) != 0) { - perror("svcudp_create - cannot getsockname"); - if (madesock) - (void) close(sock); - return ((SVCXPRT *) NULL); - } - xprt = (SVCXPRT *) mem_alloc(sizeof(SVCXPRT)); - if (xprt == NULL) { - (void) fprintf(stderr, "svcudp_create: out of memory\n"); - return (NULL); - } - su = (struct svcudp_data *) mem_alloc(sizeof(*su)); - if (su == NULL) { - (void) fprintf(stderr, "svcudp_create: out of memory\n"); - return (NULL); - } - su->su_iosz = ((MAX(sendsz, recvsz) + 3) / 4) * 4; - if ((rpc_buffer(xprt) = mem_alloc(su->su_iosz)) == NULL) { - (void) fprintf(stderr, "svcudp_create: out of memory\n"); - return (NULL); - } - xdrmem_create(&(su->su_xdrs), rpc_buffer(xprt), su->su_iosz, - XDR_DECODE); - su->su_cache = NULL; - xprt->xp_p2 = (caddr_t) su; - xprt->xp_verf.oa_base = su->su_verfbody; - xprt->xp_ops = &svcudp_op; - xprt->xp_port = ntohs(addr.sin_port); - xprt->xp_sock = sock; - xprt_register(xprt); - return (xprt); -} - -SVCXPRT *svcudp_create(sock) -int sock; -{ - - return (svcudp_bufcreate(sock, UDPMSGSIZE, UDPMSGSIZE)); -} - -static enum xprt_stat svcudp_stat(xprt) -SVCXPRT *xprt; -{ - - return (XPRT_IDLE); -} - -static bool_t svcudp_recv(xprt, msg) -register SVCXPRT *xprt; -struct rpc_msg *msg; -{ - register struct svcudp_data *su = su_data(xprt); - register XDR *xdrs = &(su->su_xdrs); - register int rlen; - char *reply; - u_long replylen; - - again: - xprt->xp_addrlen = sizeof(struct sockaddr_in); - - rlen = recvfrom(xprt->xp_sock, rpc_buffer(xprt), (int) su->su_iosz, - 0, (struct sockaddr *) &(xprt->xp_raddr), - &(xprt->xp_addrlen)); - if (rlen == -1 && errno == EINTR) - goto again; - if (rlen < 4 * sizeof(u_long)) - return (FALSE); - xdrs->x_op = XDR_DECODE; - XDR_SETPOS(xdrs, 0); - if (!xdr_callmsg(xdrs, msg)) - return (FALSE); - su->su_xid = msg->rm_xid; - if (su->su_cache != NULL) { - if (cache_get(xprt, msg, &reply, &replylen)) { - (void) sendto(xprt->xp_sock, reply, (int) replylen, 0, - (struct sockaddr *) &xprt->xp_raddr, - xprt->xp_addrlen); - return (TRUE); - } - } - return (TRUE); -} - -static bool_t svcudp_reply(xprt, msg) -register SVCXPRT *xprt; -struct rpc_msg *msg; -{ - register struct svcudp_data *su = su_data(xprt); - register XDR *xdrs = &(su->su_xdrs); - register int slen; - register bool_t stat = FALSE; - - xdrs->x_op = XDR_ENCODE; - XDR_SETPOS(xdrs, 0); - msg->rm_xid = su->su_xid; - if (xdr_replymsg(xdrs, msg)) { - slen = (int) XDR_GETPOS(xdrs); - if (sendto(xprt->xp_sock, rpc_buffer(xprt), slen, 0, - (struct sockaddr *) &(xprt->xp_raddr), xprt->xp_addrlen) - == slen) { - stat = TRUE; - if (su->su_cache && slen >= 0) { - cache_set(xprt, (u_long) slen); - } - } - } - return (stat); -} - -static bool_t svcudp_getargs(xprt, xdr_args, args_ptr) -SVCXPRT *xprt; -xdrproc_t xdr_args; -caddr_t args_ptr; -{ - - return ((*xdr_args) (&(su_data(xprt)->su_xdrs), args_ptr)); -} - -static bool_t svcudp_freeargs(xprt, xdr_args, args_ptr) -SVCXPRT *xprt; -xdrproc_t xdr_args; -caddr_t args_ptr; -{ - register XDR *xdrs = &(su_data(xprt)->su_xdrs); - - xdrs->x_op = XDR_FREE; - return ((*xdr_args) (xdrs, args_ptr)); -} - -static void svcudp_destroy(xprt) -register SVCXPRT *xprt; -{ - register struct svcudp_data *su = su_data(xprt); - - xprt_unregister(xprt); - (void) close(xprt->xp_sock); - XDR_DESTROY(&(su->su_xdrs)); - mem_free(rpc_buffer(xprt), su->su_iosz); - mem_free((caddr_t) su, sizeof(struct svcudp_data)); - - mem_free((caddr_t) xprt, sizeof(SVCXPRT)); -} - - -/***********this could be a separate file*********************/ - -/* - * Fifo cache for udp server - * Copies pointers to reply buffers into fifo cache - * Buffers are sent again if retransmissions are detected. - */ - -#define SPARSENESS 4 /* 75% sparse */ - -#define CACHE_PERROR(msg) \ - (void) fprintf(stderr,"%s\n", msg) - -#define ALLOC(type, size) \ - (type *) mem_alloc((unsigned) (sizeof(type) * (size))) - -#define BZERO(addr, type, size) \ - bzero((char *) addr, sizeof(type) * (int) (size)) - -/* - * An entry in the cache - */ -typedef struct cache_node *cache_ptr; -struct cache_node { - /* - * Index into cache is xid, proc, vers, prog and address - */ - u_long cache_xid; - u_long cache_proc; - u_long cache_vers; - u_long cache_prog; - struct sockaddr_in cache_addr; - /* - * The cached reply and length - */ - char *cache_reply; - u_long cache_replylen; - /* - * Next node on the list, if there is a collision - */ - cache_ptr cache_next; -}; - - - -/* - * The entire cache - */ -struct udp_cache { - u_long uc_size; /* size of cache */ - cache_ptr *uc_entries; /* hash table of entries in cache */ - cache_ptr *uc_fifo; /* fifo list of entries in cache */ - u_long uc_nextvictim; /* points to next victim in fifo list */ - u_long uc_prog; /* saved program number */ - u_long uc_vers; /* saved version number */ - u_long uc_proc; /* saved procedure number */ - struct sockaddr_in uc_addr; /* saved caller's address */ -}; - - -/* - * the hashing function - */ -#define CACHE_LOC(transp, xid) \ - (xid % (SPARSENESS*((struct udp_cache *) su_data(transp)->su_cache)->uc_size)) - - -/* - * Enable use of the cache. - * Note: there is no disable. - */ -int svcudp_enablecache(SVCXPRT* transp, u_long size) -{ - struct svcudp_data *su = su_data(transp); - struct udp_cache *uc; - - if (su->su_cache != NULL) { - CACHE_PERROR("enablecache: cache already enabled"); - return (0); - } - uc = ALLOC(struct udp_cache, 1); - if (uc == NULL) { - CACHE_PERROR("enablecache: could not allocate cache"); - return (0); - } - uc->uc_size = size; - uc->uc_nextvictim = 0; - uc->uc_entries = ALLOC(cache_ptr, size * SPARSENESS); - if (uc->uc_entries == NULL) { - CACHE_PERROR("enablecache: could not allocate cache data"); - return (0); - } - BZERO(uc->uc_entries, cache_ptr, size * SPARSENESS); - uc->uc_fifo = ALLOC(cache_ptr, size); - if (uc->uc_fifo == NULL) { - CACHE_PERROR("enablecache: could not allocate cache fifo"); - return (0); - } - BZERO(uc->uc_fifo, cache_ptr, size); - su->su_cache = (char *) uc; - return (1); -} - - -/* - * Set an entry in the cache - */ -static void cache_set(SVCXPRT* xprt, u_long replylen) -{ - register cache_ptr victim; - register cache_ptr *vicp; - register struct svcudp_data *su = su_data(xprt); - struct udp_cache *uc = (struct udp_cache *) su->su_cache; - u_int loc; - char *newbuf; - - /* - * Find space for the new entry, either by - * reusing an old entry, or by mallocing a new one - */ - victim = uc->uc_fifo[uc->uc_nextvictim]; - if (victim != NULL) { - loc = CACHE_LOC(xprt, victim->cache_xid); - for (vicp = &uc->uc_entries[loc]; - *vicp != NULL && *vicp != victim; - vicp = &(*vicp)->cache_next); - if (*vicp == NULL) { - CACHE_PERROR("cache_set: victim not found"); - return; - } - *vicp = victim->cache_next; /* remote from cache */ - newbuf = victim->cache_reply; - } else { - victim = ALLOC(struct cache_node, 1); - - if (victim == NULL) { - CACHE_PERROR("cache_set: victim alloc failed"); - return; - } - newbuf = mem_alloc(su->su_iosz); - if (newbuf == NULL) { - CACHE_PERROR("cache_set: could not allocate new rpc_buffer"); - return; - } - } - - /* - * Store it away - */ - victim->cache_replylen = replylen; - victim->cache_reply = rpc_buffer(xprt); - rpc_buffer(xprt) = newbuf; - xdrmem_create(&(su->su_xdrs), rpc_buffer(xprt), su->su_iosz, - XDR_ENCODE); - victim->cache_xid = su->su_xid; - victim->cache_proc = uc->uc_proc; - victim->cache_vers = uc->uc_vers; - victim->cache_prog = uc->uc_prog; - victim->cache_addr = uc->uc_addr; - loc = CACHE_LOC(xprt, victim->cache_xid); - victim->cache_next = uc->uc_entries[loc]; - uc->uc_entries[loc] = victim; - uc->uc_fifo[uc->uc_nextvictim++] = victim; - uc->uc_nextvictim %= uc->uc_size; -} - -/* - * Try to get an entry from the cache - * return 1 if found, 0 if not found - */ -static int cache_get(SVCXPRT* xprt, struct rpc_msg* msg, char** replyp, u_long* replylenp) -{ - u_int loc; - register cache_ptr ent; - register struct svcudp_data *su = su_data(xprt); - register struct udp_cache *uc = (struct udp_cache *) su->su_cache; - -# define EQADDR(a1, a2) (bcmp((char*)&a1, (char*)&a2, sizeof(a1)) == 0) - - loc = CACHE_LOC(xprt, su->su_xid); - for (ent = uc->uc_entries[loc]; ent != NULL; ent = ent->cache_next) { - if (ent->cache_xid == su->su_xid && - ent->cache_proc == uc->uc_proc && - ent->cache_vers == uc->uc_vers && - ent->cache_prog == uc->uc_prog && - EQADDR(ent->cache_addr, uc->uc_addr)) { - *replyp = ent->cache_reply; - *replylenp = ent->cache_replylen; - return (1); - } - } - /* - * Failed to find entry - * Remember a few things so we can do a set later - */ - uc->uc_proc = msg->rm_call.cb_proc; - uc->uc_vers = msg->rm_call.cb_vers; - uc->uc_prog = msg->rm_call.cb_prog; - uc->uc_addr = xprt->xp_raddr; - return (0); -} diff --git a/mdk-stage1/dietlibc/librpc/xdr.c b/mdk-stage1/dietlibc/librpc/xdr.c deleted file mode 100644 index 864b47dea..000000000 --- a/mdk-stage1/dietlibc/librpc/xdr.c +++ /dev/null @@ -1,536 +0,0 @@ -/* @(#)xdr.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)xdr.c 1.35 87/08/12"; -#endif - -/* - * xdr.c, Generic XDR routines implementation. - * - * Copyright (C) 1986, Sun Microsystems, Inc. - * - * These are the "generic" xdr routines used to serialize and de-serialize - * most common data items. See xdr.h for more info on the interface to - * xdr. - */ - -#include -#include -#include -#include -#include - -/* - * constants specific to the xdr "protocol" - */ -#define XDR_FALSE ((long) 0) -#define XDR_TRUE ((long) 1) -#define LASTUNSIGNED ((u_int) 0-1) - -/* - * for unit alignment - */ -static char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 }; - -/* - * Free a data structure using XDR - * Not a filter, but a convenient utility nonetheless - */ -void xdr_free(xdrproc_t proc, char* objp) -{ - XDR x; - - x.x_op = XDR_FREE; - (*proc) (&x, objp); -} - -/* - * XDR nothing - */ -bool_t xdr_void( /* xdrs, addr */ ) - /* XDR *xdrs; */ - /* caddr_t addr; */ -{ - - return (TRUE); -} - -/* - * XDR integers - */ -bool_t xdr_int(XDR* xdrs, int* ip) -{ - -#ifdef lint - (void) (xdr_short(xdrs, (short *) ip)); - return (xdr_long(xdrs, (long *) ip)); -#else - if (sizeof(int) == sizeof(long)) { - return (xdr_long(xdrs, (long *) ip)); - } else { - return (xdr_short(xdrs, (short *) ip)); - } -#endif -} - -/* - * XDR unsigned integers - */ -bool_t xdr_u_int(XDR* xdrs, unsigned int* up) -{ - -#ifdef lint - (void) (xdr_short(xdrs, (short *) up)); - return (xdr_u_long(xdrs, (u_long *) up)); -#else - if (sizeof(u_int) == sizeof(u_long)) { - return (xdr_u_long(xdrs, (u_long *) up)); - } else { - return (xdr_short(xdrs, (short *) up)); - } -#endif -} - -/* - * XDR long integers - * same as xdr_u_long - open coded to save a proc call! - */ -bool_t xdr_long(XDR* xdrs, long* lp) -{ - - if (xdrs->x_op == XDR_ENCODE) - return (XDR_PUTLONG(xdrs, lp)); - - if (xdrs->x_op == XDR_DECODE) - return (XDR_GETLONG(xdrs, lp)); - - if (xdrs->x_op == XDR_FREE) - return (TRUE); - - return (FALSE); -} - -/* - * XDR unsigned long integers - * same as xdr_long - open coded to save a proc call! - */ -bool_t xdr_u_long(XDR* xdrs, unsigned long* ulp) -{ - - if (xdrs->x_op == XDR_DECODE) - return (XDR_GETLONG(xdrs, (long *) ulp)); - if (xdrs->x_op == XDR_ENCODE) - return (XDR_PUTLONG(xdrs, (long *) ulp)); - if (xdrs->x_op == XDR_FREE) - return (TRUE); - return (FALSE); -} - -/* - * XDR short integers - */ -bool_t xdr_short(XDR* xdrs, short* sp) -{ - long l; - - switch (xdrs->x_op) { - - case XDR_ENCODE: - l = (long) *sp; - return (XDR_PUTLONG(xdrs, &l)); - - case XDR_DECODE: - if (!XDR_GETLONG(xdrs, &l)) { - return (FALSE); - } - *sp = (short) l; - return (TRUE); - - case XDR_FREE: - return (TRUE); - } - return (FALSE); -} - -/* - * XDR unsigned short integers - */ -bool_t xdr_u_short(XDR* xdrs, unsigned short* usp) -{ - u_long l; - - switch (xdrs->x_op) { - - case XDR_ENCODE: - l = (u_long) * usp; - return (XDR_PUTLONG(xdrs, &l)); - - case XDR_DECODE: - if (!XDR_GETLONG(xdrs, &l)) { - return (FALSE); - } - *usp = (u_short) l; - return (TRUE); - - case XDR_FREE: - return (TRUE); - } - return (FALSE); -} - - -/* - * XDR a char - */ -bool_t xdr_char(XDR* xdrs, char* cp) -{ - int i; - - i = (*cp); - if (!xdr_int(xdrs, &i)) { - return (FALSE); - } - *cp = i; - return (TRUE); -} - -/* - * XDR an unsigned char - */ -bool_t xdr_u_char(XDR* xdrs, unsigned char* cp) -{ - u_int u; - - u = (*cp); - if (!xdr_u_int(xdrs, &u)) { - return (FALSE); - } - *cp = u; - return (TRUE); -} - -/* - * XDR booleans - */ -bool_t xdr_bool(xdrs, bp) -register XDR *xdrs; -bool_t *bp; -{ - long lb; - - switch (xdrs->x_op) { - - case XDR_ENCODE: - lb = *bp ? XDR_TRUE : XDR_FALSE; - return (XDR_PUTLONG(xdrs, &lb)); - - case XDR_DECODE: - if (!XDR_GETLONG(xdrs, &lb)) { - return (FALSE); - } - *bp = (lb == XDR_FALSE) ? FALSE : TRUE; - return (TRUE); - - case XDR_FREE: - return (TRUE); - } - return (FALSE); -} - -/* - * XDR enumerations - */ -bool_t xdr_enum(xdrs, ep) -XDR *xdrs; -enum_t *ep; -{ -#ifndef lint - enum sizecheck { SIZEVAL }; /* used to find the size of an enum */ - - /* - * enums are treated as ints - */ - if (sizeof(enum sizecheck) == sizeof(long)) { - return (xdr_long(xdrs, (long *) ep)); - } else if (sizeof(enum sizecheck) == sizeof(short)) { - return (xdr_short(xdrs, (short *) ep)); - } else { - return (FALSE); - } -#else - (void) (xdr_short(xdrs, (short *) ep)); - return (xdr_long(xdrs, (long *) ep)); -#endif -} - -/* - * XDR opaque data - * Allows the specification of a fixed size sequence of opaque bytes. - * cp points to the opaque object and cnt gives the byte length. - */ -bool_t xdr_opaque(xdrs, cp, cnt) -register XDR *xdrs; -caddr_t cp; -register u_int cnt; -{ - register u_int rndup; - static char crud[BYTES_PER_XDR_UNIT]; - - /* - * if no data we are done - */ - if (cnt == 0) - return (TRUE); - - /* - * round byte count to full xdr units - */ - rndup = cnt % BYTES_PER_XDR_UNIT; - if (rndup > 0) - rndup = BYTES_PER_XDR_UNIT - rndup; - - if (xdrs->x_op == XDR_DECODE) { - if (!XDR_GETBYTES(xdrs, cp, cnt)) { - return (FALSE); - } - if (rndup == 0) - return (TRUE); - return (XDR_GETBYTES(xdrs, crud, rndup)); - } - - if (xdrs->x_op == XDR_ENCODE) { - if (!XDR_PUTBYTES(xdrs, cp, cnt)) { - return (FALSE); - } - if (rndup == 0) - return (TRUE); - return (XDR_PUTBYTES(xdrs, xdr_zero, rndup)); - } - - if (xdrs->x_op == XDR_FREE) { - return (TRUE); - } - - return (FALSE); -} - -/* - * XDR counted bytes - * *cpp is a pointer to the bytes, *sizep is the count. - * If *cpp is NULL maxsize bytes are allocated - */ -bool_t xdr_bytes(xdrs, cpp, sizep, maxsize) -register XDR *xdrs; -char **cpp; -register u_int *sizep; -u_int maxsize; -{ - register char *sp = *cpp; /* sp is the actual string pointer */ - register u_int nodesize; - - /* - * first deal with the length since xdr bytes are counted - */ - if (!xdr_u_int(xdrs, sizep)) { - return (FALSE); - } - nodesize = *sizep; - if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) { - return (FALSE); - } - - /* - * now deal with the actual bytes - */ - switch (xdrs->x_op) { - - case XDR_DECODE: - if (nodesize == 0) { - return (TRUE); - } - if (sp == NULL) { - *cpp = sp = (char *) mem_alloc(nodesize); - } - if (sp == NULL) { - (void) fprintf(stderr, "xdr_bytes: out of memory\n"); - return (FALSE); - } - /* fall into ... */ - - case XDR_ENCODE: - return (xdr_opaque(xdrs, sp, nodesize)); - - case XDR_FREE: - if (sp != NULL) { - mem_free(sp, nodesize); - *cpp = NULL; - } - return (TRUE); - } - return (FALSE); -} - -/* - * Implemented here due to commonality of the object. - */ -bool_t xdr_netobj(xdrs, np) -XDR *xdrs; -struct netobj *np; -{ - - return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ)); -} - -/* - * XDR a descriminated union - * Support routine for discriminated unions. - * You create an array of xdrdiscrim structures, terminated with - * an entry with a null procedure pointer. The routine gets - * the discriminant value and then searches the array of xdrdiscrims - * looking for that value. It calls the procedure given in the xdrdiscrim - * to handle the discriminant. If there is no specific routine a default - * routine may be called. - * If there is no specific or default routine an error is returned. - */ -bool_t xdr_union(XDR* xdrs, enum_t* dscmp, char* unp, const struct xdr_discrim* choices, xdrproc_t dfault) -{ - register enum_t dscm; - - /* - * we deal with the discriminator; it's an enum - */ - if (!xdr_enum(xdrs, dscmp)) { - return (FALSE); - } - dscm = *dscmp; - - /* - * search choices for a value that matches the discriminator. - * if we find one, execute the xdr routine for that value. - */ - for (; choices->proc != NULL_xdrproc_t; choices++) { - if (choices->value == dscm) - return ((*(choices->proc)) (xdrs, unp, LASTUNSIGNED)); - } - - /* - * no match - execute the default xdr routine if there is one - */ - return ((dfault == NULL_xdrproc_t) ? FALSE : - (*dfault) (xdrs, unp, LASTUNSIGNED)); -} - - -/* - * Non-portable xdr primitives. - * Care should be taken when moving these routines to new architectures. - */ - - -/* - * XDR null terminated ASCII strings - * xdr_string deals with "C strings" - arrays of bytes that are - * terminated by a NULL character. The parameter cpp references a - * pointer to storage; If the pointer is null, then the necessary - * storage is allocated. The last parameter is the max allowed length - * of the string as specified by a protocol. - */ -bool_t xdr_string(xdrs, cpp, maxsize) -register XDR *xdrs; -char **cpp; -u_int maxsize; -{ - register char *sp = *cpp; /* sp is the actual string pointer */ - u_int size; - u_int nodesize; - - /* - * first deal with the length since xdr strings are counted-strings - */ - switch (xdrs->x_op) { - case XDR_FREE: - if (sp == NULL) { - return (TRUE); /* already free */ - } - /* fall through... */ - case XDR_ENCODE: - size = strlen(sp); - break; - } - if (!xdr_u_int(xdrs, &size)) { - return (FALSE); - } - if (size > maxsize) { - return (FALSE); - } - nodesize = size + 1; - - /* - * now deal with the actual bytes - */ - switch (xdrs->x_op) { - - case XDR_DECODE: - if (nodesize == 0) { - return (TRUE); - } - if (sp == NULL) - *cpp = sp = (char *) mem_alloc(nodesize); - if (sp == NULL) { - (void) fprintf(stderr, "xdr_string: out of memory\n"); - return (FALSE); - } - sp[size] = 0; - /* fall into ... */ - - case XDR_ENCODE: - return (xdr_opaque(xdrs, sp, size)); - - case XDR_FREE: - mem_free(sp, nodesize); - *cpp = NULL; - return (TRUE); - } - return (FALSE); -} - -/* - * Wrapper for xdr_string that can be called directly from - * routines like clnt_call - */ -bool_t xdr_wrapstring(xdrs, cpp) -XDR *xdrs; -char **cpp; -{ - if (xdr_string(xdrs, cpp, LASTUNSIGNED)) { - return (TRUE); - } - return (FALSE); -} diff --git a/mdk-stage1/dietlibc/librpc/xdr_array.c b/mdk-stage1/dietlibc/librpc/xdr_array.c deleted file mode 100644 index f8ae12b19..000000000 --- a/mdk-stage1/dietlibc/librpc/xdr_array.c +++ /dev/null @@ -1,152 +0,0 @@ -/* @(#)xdr_array.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)xdr_array.c 1.10 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * xdr_array.c, Generic XDR routines impelmentation. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * These are the "non-trivial" xdr primitives used to serialize and de-serialize - * arrays. See xdr.h for more info on the interface to xdr. - */ - -#include - -#include -#include -#include - -#define LASTUNSIGNED ((u_int)0-1) - - -/* - * XDR an array of arbitrary elements - * *addrp is a pointer to the array, *sizep is the number of elements. - * If addrp is NULL (*sizep * elsize) bytes are allocated. - * elsize is the size (in bytes) of each element, and elproc is the - * xdr procedure to call to handle each element of the array. - */ -bool_t xdr_array(xdrs, addrp, sizep, maxsize, elsize, elproc) -register XDR *xdrs; -caddr_t *addrp; /* array pointer */ -u_int *sizep; /* number of elements */ -u_int maxsize; /* max numberof elements */ -u_int elsize; /* size in bytes of each element */ -xdrproc_t elproc; /* xdr routine to handle each element */ -{ - register u_int i; - register caddr_t target = *addrp; - register u_int c; /* the actual element count */ - register bool_t stat = TRUE; - register u_int nodesize; - - /* like strings, arrays are really counted arrays */ - if (!xdr_u_int(xdrs, sizep)) { - return (FALSE); - } - c = *sizep; - if ((c > maxsize) && (xdrs->x_op != XDR_FREE)) { - return (FALSE); - } - nodesize = c * elsize; - - /* - * if we are deserializing, we may need to allocate an array. - * We also save time by checking for a null array if we are freeing. - */ - if (target == NULL) - switch (xdrs->x_op) { - case XDR_DECODE: - if (c == 0) - return (TRUE); - *addrp = target = mem_alloc(nodesize); - if (target == NULL) { - (void) fprintf(stderr, "xdr_array: out of memory\n"); - return (FALSE); - } - bzero(target, nodesize); - break; - - case XDR_FREE: - return (TRUE); - } - - /* - * now we xdr each element of array - */ - for (i = 0; (i < c) && stat; i++) { - stat = (*elproc) (xdrs, target, LASTUNSIGNED); - target += elsize; - } - - /* - * the array may need freeing - */ - if (xdrs->x_op == XDR_FREE) { - mem_free(*addrp, nodesize); - *addrp = NULL; - } - return (stat); -} - -/* - * xdr_vector(): - * - * XDR a fixed length array. Unlike variable-length arrays, - * the storage of fixed length arrays is static and unfreeable. - * > basep: base of the array - * > size: size of the array - * > elemsize: size of each element - * > xdr_elem: routine to XDR each element - */ -bool_t xdr_vector(xdrs, basep, nelem, elemsize, xdr_elem) -register XDR *xdrs; -register char *basep; -register u_int nelem; -register u_int elemsize; -register xdrproc_t xdr_elem; -{ - register u_int i; - register char *elptr; - - elptr = basep; - for (i = 0; i < nelem; i++) { - if (!(*xdr_elem) (xdrs, elptr, LASTUNSIGNED)) { - return (FALSE); - } - elptr += elemsize; - } - return (TRUE); -} diff --git a/mdk-stage1/dietlibc/librpc/xdr_float.c b/mdk-stage1/dietlibc/librpc/xdr_float.c deleted file mode 100644 index f8eb5e99c..000000000 --- a/mdk-stage1/dietlibc/librpc/xdr_float.c +++ /dev/null @@ -1,284 +0,0 @@ -/* @(#)xdr_float.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)xdr_float.c 1.12 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * xdr_float.c, Generic XDR routines impelmentation. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * These are the "floating point" xdr routines used to (de)serialize - * most common data items. See xdr.h for more info on the interface to - * xdr. - */ - -#include - -#include -#include - -/* - * NB: Not portable. - * This routine works on Suns (Sky / 68000's) and Vaxen. - */ - -#ifdef __linux__ -/* cheat big time */ -#define sparc -#endif - -#ifdef vax - -/* What IEEE single precision floating point looks like on a Vax */ -struct ieee_single { - unsigned int mantissa:23; - unsigned int exp:8; - unsigned int sign:1; -}; - -/* Vax single precision floating point */ -struct vax_single { - unsigned int mantissa1:7; - unsigned int exp:8; - unsigned int sign:1; - unsigned int mantissa2:16; -}; - -#define VAX_SNG_BIAS 0x81 -#define IEEE_SNG_BIAS 0x7f - -static struct sgl_limits { - struct vax_single s; - struct ieee_single ieee; -} sgl_limits[2] = { - { { - 0x7f, 0xff, 0x0, 0xffff}, /* Max Vax */ - { - 0x0, 0xff, 0x0}}, /* Max IEEE */ - { { - 0x0, 0x0, 0x0, 0x0}, /* Min Vax */ - { - 0x0, 0x0, 0x0}} /* Min IEEE */ -}; -#endif /* vax */ - -bool_t xdr_float(xdrs, fp) -register XDR *xdrs; -register float *fp; -{ -#if !defined(mc68000) && !defined(sparc) - struct ieee_single is; - struct vax_single vs, *vsp; - struct sgl_limits *lim; - int i; -#endif - switch (xdrs->x_op) { - - case XDR_ENCODE: -#if defined(mc68000) || defined(sparc) - return (XDR_PUTLONG(xdrs, (long *) fp)); -#else - vs = *((struct vax_single *) fp); - for (i = 0, lim = sgl_limits; - - i < sizeof(sgl_limits) / sizeof(struct sgl_limits); - i++, lim++) { - if ((vs.mantissa2 == lim->s.mantissa2) && - (vs.exp == lim->s.exp) && - (vs.mantissa1 == lim->s.mantissa1)) { - is = lim->ieee; - goto shipit; - } - } - is.exp = vs.exp - VAX_SNG_BIAS + IEEE_SNG_BIAS; - is.mantissa = (vs.mantissa1 << 16) | vs.mantissa2; - shipit: - is.sign = vs.sign; - return (XDR_PUTLONG(xdrs, (long *) &is)); -#endif - - case XDR_DECODE: -#if defined(mc68000) || defined(sparc) - return (XDR_GETLONG(xdrs, (long *) fp)); -#else - vsp = (struct vax_single *) fp; - if (!XDR_GETLONG(xdrs, (long *) &is)) - return (FALSE); - for (i = 0, lim = sgl_limits; - - i < sizeof(sgl_limits) / sizeof(struct sgl_limits); - i++, lim++) { - if ((is.exp == lim->ieee.exp) && - (is.mantissa == lim->ieee.mantissa)) { - *vsp = lim->s; - goto doneit; - } - } - vsp->exp = is.exp - IEEE_SNG_BIAS + VAX_SNG_BIAS; - vsp->mantissa2 = is.mantissa; - vsp->mantissa1 = (is.mantissa >> 16); - doneit: - vsp->sign = is.sign; - return (TRUE); -#endif - - case XDR_FREE: - return (TRUE); - } - return (FALSE); -} - -/* - * This routine works on Suns (Sky / 68000's) and Vaxen. - */ - -#ifdef vax -/* What IEEE double precision floating point looks like on a Vax */ -struct ieee_double { - unsigned int mantissa1:20; - unsigned int exp:11; - unsigned int sign:1; - unsigned int mantissa2:32; -}; - -/* Vax double precision floating point */ -struct vax_double { - unsigned int mantissa1:7; - unsigned int exp:8; - unsigned int sign:1; - unsigned int mantissa2:16; - unsigned int mantissa3:16; - unsigned int mantissa4:16; -}; - -#define VAX_DBL_BIAS 0x81 -#define IEEE_DBL_BIAS 0x3ff -#define MASK(nbits) ((1 << nbits) - 1) - -static struct dbl_limits { - struct vax_double d; - struct ieee_double ieee; -} dbl_limits[2] = { - { { - 0x7f, 0xff, 0x0, 0xffff, 0xffff, 0xffff}, /* Max Vax */ - { - 0x0, 0x7ff, 0x0, 0x0}}, /* Max IEEE */ - { { - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, /* Min Vax */ - { - 0x0, 0x0, 0x0, 0x0}} /* Min IEEE */ -}; - -#endif /* vax */ - - -bool_t xdr_double(xdrs, dp) -register XDR *xdrs; -double *dp; -{ - register long *lp; - -#if !defined(mc68000) && !defined(sparc) - struct ieee_double id; - struct vax_double vd; - register struct dbl_limits *lim; - int i; -#endif - - switch (xdrs->x_op) { - - case XDR_ENCODE: -#if defined(mc68000) || defined(sparc) - lp = (long *) dp; -#else - vd = *((struct vax_double *) dp); - for (i = 0, lim = dbl_limits; - - i < sizeof(dbl_limits) / sizeof(struct dbl_limits); - i++, lim++) { - if ((vd.mantissa4 == lim->d.mantissa4) && - (vd.mantissa3 == lim->d.mantissa3) && - (vd.mantissa2 == lim->d.mantissa2) && - (vd.mantissa1 == lim->d.mantissa1) && - (vd.exp == lim->d.exp)) { - id = lim->ieee; - goto shipit; - } - } - id.exp = vd.exp - VAX_DBL_BIAS + IEEE_DBL_BIAS; - id.mantissa1 = (vd.mantissa1 << 13) | (vd.mantissa2 >> 3); - id.mantissa2 = ((vd.mantissa2 & MASK(3)) << 29) | - (vd.mantissa3 << 13) | ((vd.mantissa4 >> 3) & MASK(13)); - shipit: - id.sign = vd.sign; - lp = (long *) &id; -#endif - return (XDR_PUTLONG(xdrs, lp++) && XDR_PUTLONG(xdrs, lp)); - - case XDR_DECODE: -#if defined(mc68000) || defined(sparc) - lp = (long *) dp; - return (XDR_GETLONG(xdrs, lp++) && XDR_GETLONG(xdrs, lp)); -#else - lp = (long *) &id; - if (!XDR_GETLONG(xdrs, lp++) || !XDR_GETLONG(xdrs, lp)) - return (FALSE); - for (i = 0, lim = dbl_limits; - - i < sizeof(dbl_limits) / sizeof(struct dbl_limits); - i++, lim++) { - if ((id.mantissa2 == lim->ieee.mantissa2) && - (id.mantissa1 == lim->ieee.mantissa1) && - (id.exp == lim->ieee.exp)) { - vd = lim->d; - goto doneit; - } - } - vd.exp = id.exp - IEEE_DBL_BIAS + VAX_DBL_BIAS; - vd.mantissa1 = (id.mantissa1 >> 13); - vd.mantissa2 = ((id.mantissa1 & MASK(13)) << 3) | - (id.mantissa2 >> 29); - vd.mantissa3 = (id.mantissa2 >> 13); - vd.mantissa4 = (id.mantissa2 << 3); - doneit: - vd.sign = id.sign; - *dp = *((double *) &vd); - return (TRUE); -#endif - - case XDR_FREE: - return (TRUE); - } - return (FALSE); -} diff --git a/mdk-stage1/dietlibc/librpc/xdr_mem.c b/mdk-stage1/dietlibc/librpc/xdr_mem.c deleted file mode 100644 index 755f6abf1..000000000 --- a/mdk-stage1/dietlibc/librpc/xdr_mem.c +++ /dev/null @@ -1,180 +0,0 @@ -/* @(#)xdr_mem.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)xdr_mem.c 1.19 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * xdr_mem.h, XDR implementation using memory buffers. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * If you have some data to be interpreted as external data representation - * or to be converted to external data representation in a memory buffer, - * then this is the package for you. - * - */ - - -#include -#include -#include -#include - -static bool_t xdrmem_getlong(); -static bool_t xdrmem_putlong(); -static bool_t xdrmem_getbytes(); -static bool_t xdrmem_putbytes(); -static u_int xdrmem_getpos(); -static bool_t xdrmem_setpos(); -static int32_t *xdrmem_inline(); -static void xdrmem_destroy(); - -static struct xdr_ops xdrmem_ops = { - xdrmem_getlong, - xdrmem_putlong, - xdrmem_getbytes, - xdrmem_putbytes, - xdrmem_getpos, - xdrmem_setpos, - xdrmem_inline, - xdrmem_destroy -}; - -/* - * The procedure xdrmem_create initializes a stream descriptor for a - * memory buffer. - */ -void xdrmem_create(xdrs, addr, size, op) -register XDR *xdrs; -caddr_t addr; -u_int size; -enum xdr_op op; -{ - - xdrs->x_op = op; - xdrs->x_ops = &xdrmem_ops; - xdrs->x_private = xdrs->x_base = addr; - xdrs->x_handy = size; -} - -static void xdrmem_destroy( /*xdrs */ ) - /*XDR *xdrs; */ -{ -} - -static bool_t xdrmem_getlong(xdrs, lp) -register XDR *xdrs; -long *lp; -{ - - if ((xdrs->x_handy -= sizeof(long)) < 0) - return (FALSE); - - *lp = (long) ntohl((u_long) (*((long *) (xdrs->x_private)))); - xdrs->x_private += sizeof(long); - - return (TRUE); -} - -static bool_t xdrmem_putlong(xdrs, lp) -register XDR *xdrs; -long *lp; -{ - - if ((xdrs->x_handy -= sizeof(long)) < 0) - return (FALSE); - - *(long *) xdrs->x_private = (long) htonl((u_long) (*lp)); - xdrs->x_private += sizeof(long); - - return (TRUE); -} - -static bool_t xdrmem_getbytes(xdrs, addr, len) -register XDR *xdrs; -caddr_t addr; -register u_int len; -{ - - if ((xdrs->x_handy -= len) < 0) - return (FALSE); - bcopy(xdrs->x_private, addr, len); - xdrs->x_private += len; - return (TRUE); -} - -static bool_t xdrmem_putbytes(xdrs, addr, len) -register XDR *xdrs; -caddr_t addr; -register u_int len; -{ - - if ((xdrs->x_handy -= len) < 0) - return (FALSE); - bcopy(addr, xdrs->x_private, len); - xdrs->x_private += len; - return (TRUE); -} - -static u_int xdrmem_getpos(xdrs) -register XDR *xdrs; -{ - - return ((u_int) xdrs->x_private - (u_int) xdrs->x_base); -} - -static bool_t xdrmem_setpos(xdrs, pos) -register XDR *xdrs; -u_int pos; -{ - register caddr_t newaddr = xdrs->x_base + pos; - register caddr_t lastaddr = xdrs->x_private + xdrs->x_handy; - - if ((long) newaddr > (long) lastaddr) - return (FALSE); - xdrs->x_private = newaddr; - xdrs->x_handy = (int) lastaddr - (int) newaddr; - return (TRUE); -} - -static int32_t *xdrmem_inline(xdrs, len) -register XDR *xdrs; -int len; -{ - int32_t *buf = 0; - - if (xdrs->x_handy >= len) { - xdrs->x_handy -= len; - buf = (int32_t *) xdrs->x_private; - xdrs->x_private += len; - } - return (buf); -} diff --git a/mdk-stage1/dietlibc/librpc/xdr_rec.c b/mdk-stage1/dietlibc/librpc/xdr_rec.c deleted file mode 100644 index 83e800f5e..000000000 --- a/mdk-stage1/dietlibc/librpc/xdr_rec.c +++ /dev/null @@ -1,573 +0,0 @@ -/* @(#)xdr_rec.c 2.2 88/08/01 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)xdr_rec.c 1.21 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * xdr_rec.c, Implements TCP/IP based XDR streams with a "record marking" - * layer above tcp (for rpc's use). - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * These routines interface XDRSTREAMS to a tcp/ip connection. - * There is a record marking layer between the xdr stream - * and the tcp transport level. A record is composed on one or more - * record fragments. A record fragment is a thirty-two bit header followed - * by n bytes of data, where n is contained in the header. The header - * is represented as a htonl(u_long). Thegh order bit encodes - * whether or not the fragment is the last fragment of the record - * (1 => fragment is last, 0 => more fragments to follow. - * The other 31 bits encode the byte length of the fragment. - */ - -#include -#include -#include -#include -#include - -extern long lseek(); - -static u_int fix_buf_size(); - -static bool_t xdrrec_getlong(); -static bool_t xdrrec_putlong(); -static bool_t xdrrec_getbytes(); -static bool_t xdrrec_putbytes(); -static u_int xdrrec_getpos(); -static bool_t xdrrec_setpos(); -static int32_t *xdrrec_inline(); -static void xdrrec_destroy(); - -static struct xdr_ops xdrrec_ops = { - xdrrec_getlong, - xdrrec_putlong, - xdrrec_getbytes, - xdrrec_putbytes, - xdrrec_getpos, - xdrrec_setpos, - xdrrec_inline, - xdrrec_destroy -}; - -/* - * A record is composed of one or more record fragments. - * A record fragment is a two-byte header followed by zero to - * 2**32-1 bytes. The header is treated as a long unsigned and is - * encode/decoded to the network via htonl/ntohl. The low order 31 bits - * are a byte count of the fragment. The highest order bit is a boolean: - * 1 => this fragment is the last fragment of the record, - * 0 => this fragment is followed by more fragment(s). - * - * The fragment/record machinery is not general; it is constructed to - * meet the needs of xdr and rpc based on tcp. - */ - -#define LAST_FRAG ((u_long)(1 << 31)) - -typedef struct rec_strm { - caddr_t tcp_handle; - caddr_t the_buffer; - /* - * out-goung bits - */ - int (*writeit) (); - caddr_t out_base; /* output buffer (points to frag header) */ - caddr_t out_finger; /* next output position */ - caddr_t out_boundry; /* data cannot up to this address */ - u_long *frag_header; /* beginning of curren fragment */ - bool_t frag_sent; /* true if buffer sent in middle of record */ - /* - * in-coming bits - */ - int (*readit) (); - u_long in_size; /* fixed size of the input buffer */ - caddr_t in_base; - caddr_t in_finger; /* location of next byte to be had */ - caddr_t in_boundry; /* can read up to this location */ - long fbtbc; /* fragment bytes to be consumed */ - bool_t last_frag; - u_int sendsize; - u_int recvsize; -} RECSTREAM; - - -/* - * Create an xdr handle for xdrrec - * xdrrec_create fills in xdrs. Sendsize and recvsize are - * send and recv buffer sizes (0 => use default). - * tcp_handle is an opaque handle that is passed as the first parameter to - * the procedures readit and writeit. Readit and writeit are read and - * write respectively. They are like the system - * calls expect that they take an opaque handle rather than an fd. - */ -void xdrrec_create(xdrs, sendsize, recvsize, tcp_handle, readit, writeit) -register XDR *xdrs; -register u_int sendsize; -register u_int recvsize; -caddr_t tcp_handle; -int (*readit) (); /* like read, but pass it a tcp_handle, not sock */ -int (*writeit) (); /* like write, but pass it a tcp_handle, not sock */ -{ - register RECSTREAM *rstrm = (RECSTREAM *) mem_alloc(sizeof(RECSTREAM)); - - if (rstrm == NULL) { - (void) fprintf(stderr, "xdrrec_create: out of memory\n"); - /* - * This is bad. Should rework xdrrec_create to - * return a handle, and in this case return NULL - */ - return; - } - /* - * adjust sizes and allocate buffer quad byte aligned - */ - rstrm->sendsize = sendsize = fix_buf_size(sendsize); - rstrm->recvsize = recvsize = fix_buf_size(recvsize); - rstrm->the_buffer = - mem_alloc(sendsize + recvsize + BYTES_PER_XDR_UNIT); - if (rstrm->the_buffer == NULL) { - (void) fprintf(stderr, "xdrrec_create: out of memory\n"); - return; - } - for (rstrm->out_base = rstrm->the_buffer; - (u_int) rstrm->out_base % BYTES_PER_XDR_UNIT != 0; - rstrm->out_base++); - rstrm->in_base = rstrm->out_base + sendsize; - /* - * now the rest ... - */ - xdrs->x_ops = &xdrrec_ops; - xdrs->x_private = (caddr_t) rstrm; - rstrm->tcp_handle = tcp_handle; - rstrm->readit = readit; - rstrm->writeit = writeit; - rstrm->out_finger = rstrm->out_boundry = rstrm->out_base; - rstrm->frag_header = (u_long *) rstrm->out_base; - rstrm->out_finger += sizeof(u_long); - rstrm->out_boundry += sendsize; - rstrm->frag_sent = FALSE; - rstrm->in_size = recvsize; - rstrm->in_boundry = rstrm->in_base; - rstrm->in_finger = (rstrm->in_boundry += recvsize); - rstrm->fbtbc = 0; - rstrm->last_frag = TRUE; -} - - -/* - * The reoutines defined below are the xdr ops which will go into the - * xdr handle filled in by xdrrec_create. - */ - -static bool_t xdrrec_getlong(xdrs, lp) -XDR *xdrs; -long *lp; -{ - register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); - register long *buflp = (long *) (rstrm->in_finger); - long mylong; - - /* first try the inline, fast case */ - if ((rstrm->fbtbc >= sizeof(long)) && - (((int) rstrm->in_boundry - (int) buflp) >= sizeof(long))) { - *lp = (long) ntohl((u_long) (*buflp)); - rstrm->fbtbc -= sizeof(long); - rstrm->in_finger += sizeof(long); - } else { - if (!xdrrec_getbytes(xdrs, (caddr_t) & mylong, sizeof(long))) - return (FALSE); - - *lp = (long) ntohl((u_long) mylong); - } - return (TRUE); -} - -/* - * Internal useful routines - */ -static bool_t flush_out(RECSTREAM* rstrm, bool_t eor) -{ - register u_long eormask = (eor == TRUE) ? LAST_FRAG : 0; - register u_long len = (u_long) (rstrm->out_finger) - - (u_long) (rstrm->frag_header) - sizeof(u_long); - - *(rstrm->frag_header) = htonl(len | eormask); - len = (u_long) (rstrm->out_finger) - (u_long) (rstrm->out_base); - if ((*(rstrm->writeit)) (rstrm->tcp_handle, rstrm->out_base, (int) len) - != (int) len) - return (FALSE); - rstrm->frag_header = (u_long *) rstrm->out_base; - rstrm->out_finger = (caddr_t) rstrm->out_base + sizeof(u_long); - return (TRUE); -} - -static bool_t -/* knows nothing about records! Only about input buffers */ -fill_input_buf(rstrm) -register RECSTREAM *rstrm; -{ - register caddr_t where; - u_int i; - register int len; - - where = rstrm->in_base; - i = (u_int) rstrm->in_boundry % BYTES_PER_XDR_UNIT; - where += i; - len = rstrm->in_size - i; - if ((len = (*(rstrm->readit)) (rstrm->tcp_handle, where, len)) == -1) - return (FALSE); - rstrm->in_finger = where; - where += len; - rstrm->in_boundry = where; - return (TRUE); -} - -static bool_t -/* knows nothing about records! Only about input buffers */ -get_input_bytes(rstrm, addr, len) -register RECSTREAM *rstrm; -register caddr_t addr; -register int len; -{ - register int current; - - while (len > 0) { - current = (int) rstrm->in_boundry - (int) rstrm->in_finger; - if (current == 0) { - if (!fill_input_buf(rstrm)) - return (FALSE); - continue; - } - current = (len < current) ? len : current; - bcopy(rstrm->in_finger, addr, current); - rstrm->in_finger += current; - addr += current; - len -= current; - } - return (TRUE); -} - -static bool_t -/* next two bytes of the input stream are treated as a header */ -set_input_fragment(rstrm) -register RECSTREAM *rstrm; -{ - u_long header; - - if (!get_input_bytes(rstrm, (caddr_t) & header, sizeof(header))) - return (FALSE); - header = (long) ntohl(header); - rstrm->last_frag = ((header & LAST_FRAG) == 0) ? FALSE : TRUE; - rstrm->fbtbc = header & (~LAST_FRAG); - return (TRUE); -} - -static bool_t -/* consumes input bytes; knows nothing about records! */ -skip_input_bytes(rstrm, cnt) -register RECSTREAM *rstrm; -long cnt; -{ - register int current; - - while (cnt > 0) { - current = (int) rstrm->in_boundry - (int) rstrm->in_finger; - if (current == 0) { - if (!fill_input_buf(rstrm)) - return (FALSE); - continue; - } - current = (cnt < current) ? cnt : current; - rstrm->in_finger += current; - cnt -= current; - } - return (TRUE); -} - -static u_int fix_buf_size(s) -register u_int s; -{ - - if (s < 100) - s = 4000; - return (RNDUP(s)); -} -static bool_t xdrrec_putlong(xdrs, lp) -XDR *xdrs; -long *lp; -{ - register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); - register long *dest_lp = ((long *) (rstrm->out_finger)); - - if ((rstrm->out_finger += sizeof(long)) > rstrm->out_boundry) { - /* - * this case should almost never happen so the code is - * inefficient - */ - rstrm->out_finger -= sizeof(long); - - rstrm->frag_sent = TRUE; - if (!flush_out(rstrm, FALSE)) - return (FALSE); - dest_lp = ((long *) (rstrm->out_finger)); - rstrm->out_finger += sizeof(long); - } - *dest_lp = (long) htonl((u_long) (*lp)); - return (TRUE); -} - -static bool_t -/* must manage buffers, fragments, and records */ -xdrrec_getbytes(xdrs, addr, len) -XDR *xdrs; -register caddr_t addr; -register u_int len; -{ - register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); - register int current; - - while (len > 0) { - current = rstrm->fbtbc; - if (current == 0) { - if (rstrm->last_frag) - return (FALSE); - if (!set_input_fragment(rstrm)) - return (FALSE); - continue; - } - current = (len < current) ? len : current; - if (!get_input_bytes(rstrm, addr, current)) - return (FALSE); - addr += current; - rstrm->fbtbc -= current; - len -= current; - } - return (TRUE); -} - -static bool_t xdrrec_putbytes(xdrs, addr, len) -XDR *xdrs; -register caddr_t addr; -register u_int len; -{ - register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); - register int current; - - while (len > 0) { - current = (u_int) rstrm->out_boundry - (u_int) rstrm->out_finger; - current = (len < current) ? len : current; - bcopy(addr, rstrm->out_finger, current); - rstrm->out_finger += current; - addr += current; - len -= current; - if (rstrm->out_finger == rstrm->out_boundry) { - rstrm->frag_sent = TRUE; - if (!flush_out(rstrm, FALSE)) - return (FALSE); - } - } - return (TRUE); -} - -static u_int xdrrec_getpos(xdrs) -register XDR *xdrs; -{ - register RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private; - register long pos; - - pos = lseek((int) rstrm->tcp_handle, (long) 0, 1); - if (pos != -1) - switch (xdrs->x_op) { - - case XDR_ENCODE: - pos += rstrm->out_finger - rstrm->out_base; - break; - - case XDR_DECODE: - pos -= rstrm->in_boundry - rstrm->in_finger; - break; - - default: - pos = (u_int) - 1; - break; - } - return ((u_int) pos); -} - -static bool_t xdrrec_setpos(xdrs, pos) -register XDR *xdrs; -u_int pos; -{ - register RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private; - u_int currpos = xdrrec_getpos(xdrs); - int delta = currpos - pos; - caddr_t newpos; - - if ((int) currpos != -1) - switch (xdrs->x_op) { - - case XDR_ENCODE: - newpos = rstrm->out_finger - delta; - if ((newpos > (caddr_t) (rstrm->frag_header)) && - (newpos < rstrm->out_boundry)) { - rstrm->out_finger = newpos; - return (TRUE); - } - break; - - case XDR_DECODE: - newpos = rstrm->in_finger - delta; - if ((delta < (int) (rstrm->fbtbc)) && - (newpos <= rstrm->in_boundry) && - (newpos >= rstrm->in_base)) { - rstrm->in_finger = newpos; - rstrm->fbtbc -= delta; - return (TRUE); - } - break; - } - return (FALSE); -} - -static int32_t *xdrrec_inline(xdrs, len) -register XDR *xdrs; -int len; -{ - register RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private; - int32_t *buf = NULL; - - switch (xdrs->x_op) { - - case XDR_ENCODE: - if ((rstrm->out_finger + len) <= rstrm->out_boundry) { - buf = (int32_t *) rstrm->out_finger; - rstrm->out_finger += len; - } - break; - - case XDR_DECODE: - if ((len <= rstrm->fbtbc) && - ((rstrm->in_finger + len) <= rstrm->in_boundry)) { - buf = (int32_t *) rstrm->in_finger; - rstrm->fbtbc -= len; - rstrm->in_finger += len; - } - break; - } - return (buf); -} - -static void xdrrec_destroy(xdrs) -register XDR *xdrs; -{ - register RECSTREAM *rstrm = (RECSTREAM *) xdrs->x_private; - - mem_free(rstrm->the_buffer, - rstrm->sendsize + rstrm->recvsize + BYTES_PER_XDR_UNIT); - mem_free((caddr_t) rstrm, sizeof(RECSTREAM)); -} - - -/* - * Exported routines to manage xdr records - */ - -/* - * Before reading (deserializing from the stream, one should always call - * this procedure to guarantee proper record alignment. - */ -bool_t xdrrec_skiprecord(xdrs) -XDR *xdrs; -{ - register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); - - while (rstrm->fbtbc > 0 || (!rstrm->last_frag)) { - if (!skip_input_bytes(rstrm, rstrm->fbtbc)) - return (FALSE); - rstrm->fbtbc = 0; - if ((!rstrm->last_frag) && (!set_input_fragment(rstrm))) - return (FALSE); - } - rstrm->last_frag = FALSE; - return (TRUE); -} - -/* - * Look ahead fuction. - * Returns TRUE iff there is no more input in the buffer - * after consuming the rest of the current record. - */ -bool_t xdrrec_eof(xdrs) -XDR *xdrs; -{ - register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); - - while (rstrm->fbtbc > 0 || (!rstrm->last_frag)) { - if (!skip_input_bytes(rstrm, rstrm->fbtbc)) - return (TRUE); - rstrm->fbtbc = 0; - if ((!rstrm->last_frag) && (!set_input_fragment(rstrm))) - return (TRUE); - } - if (rstrm->in_finger == rstrm->in_boundry) - return (TRUE); - return (FALSE); -} - -/* - * The client must tell the package when an end-of-record has occurred. - * The second paraemters tells whether the record should be flushed to the - * (output) tcp stream. (This let's the package support batched or - * pipelined procedure calls.) TRUE => immmediate flush to tcp connection. - */ -bool_t xdrrec_endofrecord(xdrs, sendnow) -XDR *xdrs; -bool_t sendnow; -{ - register RECSTREAM *rstrm = (RECSTREAM *) (xdrs->x_private); - register u_long len; /* fragment length */ - - if (sendnow || rstrm->frag_sent || - ((u_long) rstrm->out_finger + sizeof(u_long) >= - (u_long) rstrm->out_boundry)) { - rstrm->frag_sent = FALSE; - return (flush_out(rstrm, TRUE)); - } - len = (u_long) (rstrm->out_finger) - (u_long) (rstrm->frag_header) - - sizeof(u_long); - *(rstrm->frag_header) = htonl((u_long) len | LAST_FRAG); - rstrm->frag_header = (u_long *) rstrm->out_finger; - rstrm->out_finger += sizeof(u_long); - return (TRUE); -} - - diff --git a/mdk-stage1/dietlibc/librpc/xdr_reference.c b/mdk-stage1/dietlibc/librpc/xdr_reference.c deleted file mode 100644 index 7715d821c..000000000 --- a/mdk-stage1/dietlibc/librpc/xdr_reference.c +++ /dev/null @@ -1,130 +0,0 @@ -/* @(#)xdr_reference.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = "@(#)xdr_reference.c 1.11 87/08/11 SMI"; -#endif - -/* - * xdr_reference.c, Generic XDR routines impelmentation. - * - * Copyright (C) 1987, Sun Microsystems, Inc. - * - * These are the "non-trivial" xdr primitives used to serialize and de-serialize - * "pointers". See xdr.h for more info on the interface to xdr. - */ - -#include -#include -#include -#include - -#define LASTUNSIGNED ((u_int)0-1) - -/* - * XDR an indirect pointer - * xdr_reference is for recursively translating a structure that is - * referenced by a pointer inside the structure that is currently being - * translated. pp references a pointer to storage. If *pp is null - * the necessary storage is allocated. - * size is the sizeof the referneced structure. - * proc is the routine to handle the referenced structure. - */ -bool_t xdr_reference(xdrs, pp, size, proc) -register XDR *xdrs; -caddr_t *pp; /* the pointer to work on */ -u_int size; /* size of the object pointed to */ -xdrproc_t proc; /* xdr routine to handle the object */ -{ - register caddr_t loc = *pp; - register bool_t stat; - - if (loc == NULL) - switch (xdrs->x_op) { - case XDR_FREE: - return (TRUE); - - case XDR_DECODE: - *pp = loc = (caddr_t) mem_alloc(size); - if (loc == NULL) { - (void) fprintf(stderr, "xdr_reference: out of memory\n"); - return (FALSE); - } - bzero(loc, (int) size); - break; - } - - stat = (*proc) (xdrs, loc, LASTUNSIGNED); - - if (xdrs->x_op == XDR_FREE) { - mem_free(loc, size); - *pp = NULL; - } - return (stat); -} - - -/* - * xdr_pointer(): - * - * XDR a pointer to a possibly recursive data structure. This - * differs with xdr_reference in that it can serialize/deserialiaze - * trees correctly. - * - * What's sent is actually a union: - * - * union object_pointer switch (boolean b) { - * case TRUE: object_data data; - * case FALSE: void nothing; - * } - * - * > objpp: Pointer to the pointer to the object. - * > obj_size: size of the object. - * > xdr_obj: routine to XDR an object. - * - */ -bool_t xdr_pointer(xdrs, objpp, obj_size, xdr_obj) -register XDR *xdrs; -char **objpp; -u_int obj_size; -xdrproc_t xdr_obj; -{ - - bool_t more_data; - - more_data = (*objpp != NULL); - if (!xdr_bool(xdrs, &more_data)) { - return (FALSE); - } - if (!more_data) { - *objpp = NULL; - return (TRUE); - } - return (xdr_reference(xdrs, objpp, obj_size, xdr_obj)); -} diff --git a/mdk-stage1/dietlibc/librpc/xdr_stdio.c b/mdk-stage1/dietlibc/librpc/xdr_stdio.c deleted file mode 100644 index e3190e0a9..000000000 --- a/mdk-stage1/dietlibc/librpc/xdr_stdio.c +++ /dev/null @@ -1,187 +0,0 @@ -/* @(#)xdr_stdio.c 2.1 88/07/29 4.0 RPCSRC */ -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -#if !defined(lint) && defined(SCCSIDS) -static char sccsid[] = - - "@(#)xdr_stdio.c 1.16 87/08/11 Copyr 1984 Sun Micro"; -#endif - -/* - * xdr_stdio.c, XDR implementation on standard i/o file. - * - * Copyright (C) 1984, Sun Microsystems, Inc. - * - * This set of routines implements a XDR on a stdio stream. - * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes - * from the stream. - */ - -#include -#include -#include - -static bool_t xdrstdio_getlong(); -static bool_t xdrstdio_putlong(); -static bool_t xdrstdio_getbytes(); -static bool_t xdrstdio_putbytes(); -static u_int xdrstdio_getpos(); -static bool_t xdrstdio_setpos(); -static int32_t *xdrstdio_inline(); -static void xdrstdio_destroy(); - -/* - * Ops vector for stdio type XDR - */ -static struct xdr_ops xdrstdio_ops = { - xdrstdio_getlong, /* deseraialize a long int */ - xdrstdio_putlong, /* seraialize a long int */ - xdrstdio_getbytes, /* deserialize counted bytes */ - xdrstdio_putbytes, /* serialize counted bytes */ - xdrstdio_getpos, /* get offset in the stream */ - xdrstdio_setpos, /* set offset in the stream */ - xdrstdio_inline, /* prime stream for inline macros */ - xdrstdio_destroy /* destroy stream */ -}; - -/* - * Initialize a stdio xdr stream. - * Sets the xdr stream handle xdrs for use on the stream file. - * Operation flag is set to op. - */ -void xdrstdio_create(xdrs, file, op) -register XDR *xdrs; -FILE *file; -enum xdr_op op; -{ - - xdrs->x_op = op; - xdrs->x_ops = &xdrstdio_ops; - xdrs->x_private = (caddr_t) file; - xdrs->x_handy = 0; - xdrs->x_base = 0; -} - -/* - * Destroy a stdio xdr stream. - * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create. - */ -static void xdrstdio_destroy(xdrs) -register XDR *xdrs; -{ - (void) fflush((FILE *) xdrs->x_private); - /* xx should we close the file ?? */ -}; - -static bool_t xdrstdio_getlong(xdrs, lp) -XDR *xdrs; -register long *lp; -{ - - if (fread((caddr_t) lp, sizeof(long), 1, (FILE *) xdrs->x_private) != - 1) return (FALSE); - -#ifndef mc68000 - *lp = ntohl(*lp); -#endif - return (TRUE); -} - -static bool_t xdrstdio_putlong(xdrs, lp) -XDR *xdrs; -long *lp; -{ - -#ifndef mc68000 - long mycopy = htonl(*lp); - - lp = &mycopy; -#endif - if (fwrite((caddr_t) lp, sizeof(long), 1, (FILE *) xdrs->x_private) != - 1) return (FALSE); - - return (TRUE); -} - -static bool_t xdrstdio_getbytes(xdrs, addr, len) -XDR *xdrs; -caddr_t addr; -u_int len; -{ - - if ((len != 0) - && (fread(addr, (int) len, 1, (FILE *) xdrs->x_private) != 1)) - return (FALSE); - return (TRUE); -} - -static bool_t xdrstdio_putbytes(xdrs, addr, len) -XDR *xdrs; -caddr_t addr; -u_int len; -{ - - if ((len != 0) - && (fwrite(addr, (int) len, 1, (FILE *) xdrs->x_private) != 1)) - return (FALSE); - return (TRUE); -} - -static u_int xdrstdio_getpos(xdrs) -XDR *xdrs; -{ - - return ((u_int) ftell((FILE *) xdrs->x_private)); -} - -static bool_t xdrstdio_setpos(xdrs, pos) -XDR *xdrs; -u_int pos; -{ - - return ((fseek((FILE *) xdrs->x_private, (long) pos, 0) < 0) ? - FALSE : TRUE); -} - -static int32_t *xdrstdio_inline(xdrs, len) -XDR *xdrs; -u_int len; -{ - - /* - * Must do some work to implement this: must insure - * enough data in the underlying stdio buffer, - * that the buffer is aligned so that we can indirect through a - * long *, and stuff this pointer in xdrs->x_buf. Doing - * a fread or fwrite to a scratch buffer would defeat - * most of the gains to be had here and require storage - * management on this buffer, so we don't do this. - */ - return (NULL); -} diff --git a/mdk-stage1/dietlibc/libshell/fnmatch.c b/mdk-stage1/dietlibc/libshell/fnmatch.c deleted file mode 100644 index 4e7664510..000000000 --- a/mdk-stage1/dietlibc/libshell/fnmatch.c +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include - -#define NOTFIRST 128 - -static int match(char c,char d,int flags) { - if (flags&FNM_CASEFOLD) - return (tolower(c)==tolower(d)); - else - return (c==d); -} - -int fnmatch(const char *pattern, const char *string, int flags) { - if (*string==0) { - while (*pattern=='*') ++pattern; - return (!!*pattern); - } - if (*string=='.' && *pattern!='.' && (flags&FNM_PERIOD)) { - /* don't match if FNM_PERIOD and this is the first char */ - if ((flags&FNM_PERIOD) && (!(flags&NOTFIRST))) - return 1; - /* don't match if FNM_PERIOD and FNM_FILE_NAME and previous was '/' */ - if ((flags&(FNM_FILE_NAME|FNM_PERIOD)) && string[-1]=='/') - return 1; - } - flags|=NOTFIRST; - switch (*pattern) { - case '[': - ++pattern; - while (*pattern && *pattern!=']') { - if (flags&FNM_PATHNAME || *string!='/') { - int res=0; - if (pattern[1]=='-') { - if (*string>=*pattern && *string<=pattern[2]) res=1; - if (flags&FNM_CASEFOLD) { - if (tolower(*string)>=tolower(*pattern) && tolower(*string)<=tolower(pattern[2])) res=1; - } - } else - res=match(*pattern,*string,flags); - if (res) { - while (*pattern && *pattern!=']') ++pattern; - return fnmatch(pattern+1,string+1,flags); - } - } - ++pattern; - } - break; - case '\\': - if (flags&FNM_NOESCAPE) { - if (*string=='\\') - return fnmatch(pattern+1,string+1,flags); - } else { - if (*string==pattern[1]) - return fnmatch(pattern+2,string+1,flags); - } - break; - case '*': - if (!pattern[1] || fnmatch(pattern+1,string,flags)==0) - return 0; - else - if (*string!='/') - return fnmatch(pattern,string+1,flags); - break; - case 0: - if (*string==0 || (*string=='/' && (flags&FNM_LEADING_DIR))) - return 0; - break; - default: - if (match(*pattern,*string,flags)) - return fnmatch(pattern+1,string+1,flags); - break; - } - return 1; -} diff --git a/mdk-stage1/dietlibc/libshell/glob.c b/mdk-stage1/dietlibc/libshell/glob.c deleted file mode 100644 index 34d09d87a..000000000 --- a/mdk-stage1/dietlibc/libshell/glob.c +++ /dev/null @@ -1,350 +0,0 @@ -/* - * dietlibc/libshell/glob.c - * - * Copyright 2001 Guillaume Cottenceau - * - * This is free software, licensed under the Gnu General Public License. - * - */ - -/* - * unsupported: GLOB_BRACE GLOB_ALTDIRFUNC GLOB_MAGCHAR - */ - -#define DEBUG(x) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - - -/* If i18n, should be using strcoll */ -static int cmp_func(const void * a, const void * b) -{ - const char *const s1 = *(const char *const * const) a; - const char *const s2 = *(const char *const * const) b; - if (s1 == NULL) - return 1; - if (s2 == NULL) - return -1; - return strcmp(s1, s2); -} - - -/* Like `glob', but PATTERN is a final pathname component, - and matches are searched for in DIRECTORY. - The GLOB_NOSORT bit in FLAGS is ignored. No sorting is ever done. - The GLOB_APPEND flag is assumed to be set (always appends). - Prepends DIRECTORY in constructed PGLOB. */ -static int glob_in_dir(const char *pattern, const char *directory, int flags, - int errfunc(const char * epath, int eerrno), - glob_t *pglob) -{ - DIR *dp = opendir(directory); - int nfound = 0; - - int i; - char * ptr; - - void close_dir_keep_errno(void) { - int save = errno; - if (dp) - closedir (dp); - __set_errno(save); - } - int add_entry(const char * name) { - pglob->gl_pathv = (char **) realloc(pglob->gl_pathv, - (pglob->gl_pathc + pglob->gl_offs + 2) - * sizeof (char *)); - if (pglob->gl_pathv == NULL) - return 1; - pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc] = strdup(name); - pglob->gl_pathv[pglob->gl_offs + pglob->gl_pathc + 1] = NULL; - pglob->gl_pathc++; - nfound++; - return 0; - } - void build_fullname(char * fullname, int fullnamesize, const char * directory, const char * filename) { - if (!strcmp(directory, "/")) - snprintf(fullname, fullnamesize, "/%s", filename); - else if (!strcmp(directory, ".")) - snprintf(fullname, fullnamesize, "%s", filename); - else - snprintf(fullname, fullnamesize, "%s/%s", directory, filename); - } - - if (!dp) { - if (errno != ENOTDIR - && ((errfunc != NULL && (*errfunc) (directory, errno)) - || (flags & GLOB_ERR))) - return GLOB_ABORTED; - } else { - int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) - | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)); - struct dirent *ep; - while ((ep = readdir(dp))) { - i = strlen(directory) + strlen(ep->d_name) + 2; - ptr = (char *) alloca(i); - build_fullname(ptr, i, directory, ep->d_name); - if (flags & GLOB_ONLYDIR) { - struct stat statr; - if (stat(ptr, &statr) || !S_ISDIR(statr.st_mode)) - continue; - } - if (fnmatch(pattern, ep->d_name, fnm_flags) == 0) - if (add_entry(ptr)) - goto memory_error; - } - } - - close_dir_keep_errno(); - - if (nfound != 0) - pglob->gl_flags = flags; - else if (flags & GLOB_NOCHECK) { - /* nfound == 0 */ - i = strlen(directory) + strlen(pattern) + 2; - ptr = (char *) alloca(i); - build_fullname(ptr, i, directory, pattern); - if (add_entry(ptr)) - goto memory_error; - } - - return (nfound == 0) ? GLOB_NOMATCH : 0; - - memory_error: - /* We're in trouble since we can't free the already allocated memory. [allocated from strdup(filame)] - * Well, after all, when malloc returns NULL we're already in a bad mood, and no doubt the - * program will manage to segfault by itself very soon :-). */ - close_dir_keep_errno(); - return GLOB_NOSPACE; -} - - - -int glob(const char *pattern, int flags, int errfunc(const char * epath, int eerrno), glob_t *pglob) -{ - char * pattern_; - char * filename; - char * dirname; - size_t oldcount; - struct stat statr; - - size_t i; /* tmp variables are declared here to save a bit of object space */ - int j, k; /* */ - char * ptr, * ptr2; - - if (pattern == NULL || pglob == NULL || (flags & ~__GLOB_FLAGS) != 0) { - __set_errno (EINVAL); - return -1; - } - - if (!(flags & GLOB_DOOFFS)) - pglob->gl_offs = 0; - - - /* Duplicate pattern so I can make modif to it later (to handle - TILDE stuff replacing old contents, and to null-terminate the - directory) */ - pattern_ = alloca(strlen(pattern) + 1); - strcpy(pattern_, pattern); - - /* Check for TILDE stuff */ - if ((flags & (GLOB_TILDE|GLOB_TILDE_CHECK)) && pattern_[0] == '~') { - char * home_dir = NULL; - if (pattern_[1] == '\0' || pattern_[1] == '/') { - /* She's asking for ~, her homedir */ - home_dir = getenv("HOME"); - } else { - /* She's asking for another one's homedir */ - struct passwd * p; - ptr2 = alloca(strlen(pattern_) + 1); - strcpy(ptr2, pattern_ + 1); - ptr = strchr(ptr2, '/'); - if (ptr != NULL) - *ptr = '\0'; - if (((p = getpwnam(ptr2)) != NULL)) - home_dir = p->pw_dir; - } - if (home_dir != NULL) { - i = strlen(home_dir) + strlen(pattern_); /* pessimistic (the ~ case) */ - ptr = alloca(i); - strncpy(ptr, home_dir, i); - ptr2 = pattern_ + 1; - while (*ptr2 != '/' && *ptr2 != '\0') - ptr2++; - strncat(ptr, ptr2, i); - pattern_ = ptr; - } else if (flags & GLOB_TILDE_CHECK) - return GLOB_NOMATCH; - } - - /* Find the filename */ - filename = strrchr(pattern_, '/'); - - if (filename == NULL) { - /* We have no '/' in the pattern */ - filename = pattern_; - dirname = "."; - } else if (filename == pattern_) { - /* "/pattern". */ - dirname = "/"; - filename++; - } else { - dirname = pattern_; - filename++; - /* allow dirname to be null terminated */ - *(filename-1) = '\0'; - - if (filename[0] == '\0' && strcmp(pattern_, "/")) { - /* "pattern/". Expand "pattern", appending slashes. */ - j = glob(dirname, flags | GLOB_MARK, errfunc, pglob); - if (j == 0) - pglob->gl_flags = ((pglob->gl_flags & ~GLOB_MARK) - | (flags & GLOB_MARK)); - return j; - } - } - - - /* Reserve memory for pglob */ - if (!(flags & GLOB_APPEND)) { - pglob->gl_pathc = 0; - if (!(flags & GLOB_DOOFFS)) - pglob->gl_pathv = NULL; - else { - pglob->gl_pathv = (char **) malloc((pglob->gl_offs + 1) * sizeof (char *)); - if (pglob->gl_pathv == NULL) - return GLOB_NOSPACE; - for (i = 0; i <= pglob->gl_offs; i++) - pglob->gl_pathv[i] = NULL; - } - } - - - oldcount = pglob->gl_pathc + pglob->gl_offs; - - - /* Begin real work */ - if (!strcmp(dirname, "/") || !strcmp(dirname, ".") - || (!strchr(dirname, '*') && !strchr(dirname, '?') && !strchr(dirname, '['))) { - /* Approx of a terminal state, glob directly in dir. */ - j = glob_in_dir(filename, dirname, flags, errfunc, pglob); - if (j != 0) - return j; - } else { - /* We are not in a terminal state, so we have to glob for - the directory, and then glob for the pattern in each - directory found. */ - glob_t dirs; - - j = glob(dirname, ((flags & (GLOB_ERR | GLOB_NOCHECK | GLOB_NOESCAPE | GLOB_ALTDIRFUNC)) - | GLOB_NOSORT | GLOB_ONLYDIR), - errfunc, &dirs); - if (j != 0) - return j; - - /* We have successfully globbed the directory name. - For each name we found, call glob_in_dir on it and FILENAME, - appending the results to PGLOB. */ - for (i = 0; i < dirs.gl_pathc; i++) { - j = glob_in_dir(filename, dirs.gl_pathv[i], ((flags | GLOB_APPEND) & ~GLOB_NOCHECK), - errfunc, pglob); - if (j == GLOB_NOMATCH) - /* No matches in this directory. Try the next. */ - continue; - if (j != 0) { - globfree(&dirs); - globfree(pglob); - return j; - } - } - - /* We have ignored the GLOB_NOCHECK flag in the `glob_in_dir' calls. - But if we have not found any matching entry and the GLOB_NOCHECK - flag was set we must return the list consisting of the disrectory - names followed by the filename. */ - if (pglob->gl_pathc + pglob->gl_offs == oldcount) - { - /* No matches. */ - if (flags & GLOB_NOCHECK) - { - for (i = 0; i < dirs.gl_pathc; i++) { - if (stat(dirs.gl_pathv[i], &statr) || !S_ISDIR(statr.st_mode)) - continue; - - /* stat is okay, we will add the entry, but before let's resize the pathv */ - j = pglob->gl_pathc + pglob->gl_offs; - pglob->gl_pathv = (char **) realloc(pglob->gl_pathv, (j + 2) * sizeof (char *)); - if (pglob->gl_pathv == NULL) { - globfree (&dirs); - return GLOB_NOSPACE; - } - - /* okay now we add the new entry */ - k = strlen(dirs.gl_pathv[i]) + 1 + strlen(filename) + 1; - if ((pglob->gl_pathv[j] = malloc(k)) == NULL) { - globfree(&dirs); - globfree(pglob); - return GLOB_NOSPACE; - } - snprintf(pglob->gl_pathv[j], k, "%s/%s", dirs.gl_pathv[i], filename); - pglob->gl_pathc++; - pglob->gl_pathv[j+1] = NULL; - } - } else { - globfree(&dirs); - return GLOB_NOMATCH; - } - } - - globfree (&dirs); - } - - - if (flags & GLOB_MARK) { - for (i = oldcount; i < pglob->gl_pathc + pglob->gl_offs; i++) - if (!stat(pglob->gl_pathv[i], &statr) && S_ISDIR(statr.st_mode)) { - size_t len = strlen(pglob->gl_pathv[i]) + 2; - ptr = realloc(pglob->gl_pathv[i], len); - if (ptr == NULL) { - globfree(pglob); - return GLOB_NOSPACE; - } - strcpy(&ptr[len - 2], "/"); - pglob->gl_pathv[i] = ptr; - } - } - - if (!(flags & GLOB_NOSORT)) { - qsort(&pglob->gl_pathv[oldcount], - pglob->gl_pathc + pglob->gl_offs - oldcount, - sizeof(char *), cmp_func); - } - - return 0; -} - - -/* Free storage allocated in PGLOB by a previous `glob' call. */ -void globfree (glob_t * pglob) -{ - if (pglob->gl_pathv != NULL) { - size_t i; - for (i = 0; i < pglob->gl_pathc; i++) - if (pglob->gl_pathv[pglob->gl_offs + i] != NULL) - free((void *) pglob->gl_pathv[pglob->gl_offs + i]); - free((void *) pglob->gl_pathv); - } -} diff --git a/mdk-stage1/dietlibc/libshell/realpath.c b/mdk-stage1/dietlibc/libshell/realpath.c deleted file mode 100644 index 1377018e5..000000000 --- a/mdk-stage1/dietlibc/libshell/realpath.c +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include -#include -#include -#include -#include "dietfeatures.h" - -char *realpath(const char *path, char *resolved_path) { - int fd=open(".",O_RDONLY); - char *tmp=""; - if (chdir(path)) { -#ifdef WANT_THREAD_SAFE - if (*__errno_location()==ENOTDIR) -#else - if (errno==ENOTDIR) -#endif - { - if ((tmp=strrchr(path,'/'))) { - memmove(resolved_path,path,tmp-path); - resolved_path[tmp-path]=0; - if (chdir(resolved_path)) { resolved_path=0; goto abort; } - } - } - } - if (!getcwd(resolved_path,PATH_MAX)) { resolved_path=0; goto abort; } - strcat(resolved_path,tmp); -abort: - fchdir(fd); - close(fd); - return resolved_path; -} diff --git a/mdk-stage1/dietlibc/libstdio/clearerr.c b/mdk-stage1/dietlibc/libstdio/clearerr.c deleted file mode 100644 index 8bde8c702..000000000 --- a/mdk-stage1/dietlibc/libstdio/clearerr.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "dietstdio.h" - -void clearerr( FILE *stream) { - stream->flags&=~(ERRORINDICATOR|EOFINDICATOR); -} diff --git a/mdk-stage1/dietlibc/libstdio/fclose.c b/mdk-stage1/dietlibc/libstdio/fclose.c deleted file mode 100644 index 6958a48e7..000000000 --- a/mdk-stage1/dietlibc/libstdio/fclose.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "dietstdio.h" -#include -#include - -int fclose(FILE *stream) { - int res; -#ifdef WANT_BUFFERED_STDIO - FILE *f,*fl; -#endif - fflush(stream); - res=close(stream->fd); -#ifdef WANT_BUFFERED_STDIO - for (fl=0,f=__stdio_root; f; fl=f,f=f->next) - if (f==stream) { - if (fl) - fl->next=f->next; - else - __stdio_root=f->next; - break; - } -#endif - free(stream); - return res; -} diff --git a/mdk-stage1/dietlibc/libstdio/fdglue.c b/mdk-stage1/dietlibc/libstdio/fdglue.c deleted file mode 100644 index eeedd513d..000000000 --- a/mdk-stage1/dietlibc/libstdio/fdglue.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "dietstdio.h" -#include -#include -#include -#include - -#ifdef WANT_BUFFERED_STDIO -extern int __stdio_atexit; -extern void __stdio_flushall(); -#endif - -int __stdio_parse_mode(const char *mode) { - int f=0; - for (;;) { - switch (*mode) { - case 0: return f; - case 'b': break; - case 'r': f=O_RDONLY; break; - case 'w': f=O_WRONLY|O_CREAT|O_TRUNC; break; - case 'a': f=O_WRONLY|O_CREAT|O_APPEND; break; - case '+': f=(f&(~O_WRONLY))|O_RDWR; break; - } - ++mode; - } -} - -FILE* __stdio_init_file(int fd) { - FILE *tmp=(FILE*)malloc(sizeof(FILE)); - if (!tmp) { - close(fd); - errno=ENOMEM; - return 0; - } - tmp->fd=fd; -#ifdef WANT_BUFFERED_STDIO - tmp->bm=0; - tmp->bs=0; -#endif - tmp->flags=0; -#ifdef WANT_BUFFERED_STDIO - if (__stdio_atexit==0) { - __stdio_atexit=1; - atexit(__stdio_flushall); - } - tmp->next=__stdio_root; - __stdio_root=tmp; -#endif - return tmp; -} diff --git a/mdk-stage1/dietlibc/libstdio/fdopen.c b/mdk-stage1/dietlibc/libstdio/fdopen.c deleted file mode 100644 index aee14fb0c..000000000 --- a/mdk-stage1/dietlibc/libstdio/fdopen.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include - -#define SEEK_END 2 - -int __stdio_parse_mode(const char *mode); -FILE* __stdio_init_file(int fd); - -FILE *fdopen (int filedes, const char *mode) { - int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */ - int fd; - - f=__stdio_parse_mode(mode); - if ((fd=filedes)<0) return 0; - { - FILE * ret = __stdio_init_file(fd); - ret->flags |= UNSEEKABLE; - return ret; - } -} diff --git a/mdk-stage1/dietlibc/libstdio/feof.c b/mdk-stage1/dietlibc/libstdio/feof.c deleted file mode 100644 index b7e86fe3b..000000000 --- a/mdk-stage1/dietlibc/libstdio/feof.c +++ /dev/null @@ -1,9 +0,0 @@ -#include - -int feof(FILE *stream) { -#ifdef WANT_UNGETC - /* yuck!!! */ - if (stream->ungotten) return 0; -#endif - return (stream->flags&EOFINDICATOR); -} diff --git a/mdk-stage1/dietlibc/libstdio/ferror.c b/mdk-stage1/dietlibc/libstdio/ferror.c deleted file mode 100644 index e86873be0..000000000 --- a/mdk-stage1/dietlibc/libstdio/ferror.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -int ferror(FILE *stream) { - return (stream->flags&ERRORINDICATOR); -} diff --git a/mdk-stage1/dietlibc/libstdio/fflush.c b/mdk-stage1/dietlibc/libstdio/fflush.c deleted file mode 100644 index 7078e04f4..000000000 --- a/mdk-stage1/dietlibc/libstdio/fflush.c +++ /dev/null @@ -1,62 +0,0 @@ -#include "dietstdio.h" -#include -#include -#include "dietwarning.h" - -FILE *__stdio_root; - -#ifdef WANT_BUFFERED_STDIO -int __stdio_atexit=0; - -void __stdio_flushall() { - fflush(0); -} - -extern int __fflush_stdin(); -extern int __fflush_stdout(); -extern int __fflush_stderr(); - -int fflush(FILE *stream) { - if (stream==0) { - int res; - FILE *f; - __fflush_stdin(); - __fflush_stdout(); - __fflush_stderr(); - for (res=0, f=__stdio_root; f; f=f->next) - if (fflush(f)) - res=-1; - return res; - } - if (stream->flags&BUFINPUT) { - register int tmp; - if ((tmp=stream->bm-stream->bs)) lseek(stream->fd,tmp,SEEK_CUR); - } else - if (stream->bm && write(stream->fd,stream->buf,stream->bm)!=stream->bm) { - stream->flags|=ERRORINDICATOR; - return -1; - } - stream->bm=0; - return 0; -} - -int __fflush4(FILE *stream,int next) { - if (!__stdio_atexit) { - __stdio_atexit=1; - atexit(__stdio_flushall); - } - if ((stream->flags&BUFINPUT)!=next) { - int res=fflush(stream); - stream->flags=(stream->flags&~BUFINPUT)|next; - return res; - } - return 0; -} - -#else -int fflush(FILE *stream) { - return 0; -} -#endif - -link_warning("fflush","warning: your code uses stdio (several kilobytes of bloat).") diff --git a/mdk-stage1/dietlibc/libstdio/fgetc.c b/mdk-stage1/dietlibc/libstdio/fgetc.c deleted file mode 100644 index 90d83961a..000000000 --- a/mdk-stage1/dietlibc/libstdio/fgetc.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "dietstdio.h" -#include - -extern int feof(FILE *stream); - -int fgetc(FILE *stream) { - unsigned char c; -#ifdef WANT_UNGETC - if (stream->ungotten) { - stream->ungotten=0; - return stream->ungetbuf; - } -#endif - if (feof(stream)) - return EOF; -#ifdef WANT_BUFFERED_STDIO - if (__fflush4(stream,BUFINPUT)) return EOF; - if (stream->bm>=stream->bs) { - int len=read(stream->fd,stream->buf,BUFSIZE); - if (len==0) { - stream->flags|=EOFINDICATOR; - return EOF; - } else if (len<0) { - stream->flags|=ERRORINDICATOR; - return EOF; - } - stream->bm=0; - stream->bs=len; - } - c=stream->buf[stream->bm]; - ++stream->bm; - return c; -#else - if (read(stream->fd,&c,1)!=1) { - stream->flags|=ERRORINDICATOR; - return EOF; - } - return c; -#endif -} diff --git a/mdk-stage1/dietlibc/libstdio/fgets.c b/mdk-stage1/dietlibc/libstdio/fgets.c deleted file mode 100644 index c613d452d..000000000 --- a/mdk-stage1/dietlibc/libstdio/fgets.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "dietstdio.h" - -extern int ferror(FILE *stream); - -char *fgets(char *s, int size, FILE *stream) { - char *orig=s; - int l; - for (l=size; l>0;) { - int c=fgetc(stream); - if (c==EOF) break; - *s=c; - ++s; - --l; - if (c=='\n') break; - } - if (l==size || ferror(stream)) - return 0; - *s=0; - return orig; -} diff --git a/mdk-stage1/dietlibc/libstdio/fileno.c b/mdk-stage1/dietlibc/libstdio/fileno.c deleted file mode 100644 index f021d3881..000000000 --- a/mdk-stage1/dietlibc/libstdio/fileno.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -int fileno(FILE *stream) { - return stream->fd; -} diff --git a/mdk-stage1/dietlibc/libstdio/fopen.c b/mdk-stage1/dietlibc/libstdio/fopen.c deleted file mode 100644 index aac17be42..000000000 --- a/mdk-stage1/dietlibc/libstdio/fopen.c +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include - -#define SEEK_END 2 - -extern int __stdio_atexit; -extern void __stdio_flushall(); - -extern int __stdio_parse_mode(const char *mode); -extern FILE* __stdio_init_file(int fd); - -FILE *fopen (const char *path, const char *mode) { - int f=0; /* O_RDONLY, O_WRONLY or O_RDWR */ - int fd; - - f=__stdio_parse_mode(mode); - if ((fd=open(path,f,0666))<0) - return 0; - return __stdio_init_file(fd); -} diff --git a/mdk-stage1/dietlibc/libstdio/fprintf.c b/mdk-stage1/dietlibc/libstdio/fprintf.c deleted file mode 100644 index 237fd1e51..000000000 --- a/mdk-stage1/dietlibc/libstdio/fprintf.c +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include -#include - -extern int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int fprintf(FILE *f,const char *format,...) { - int n; - char *printf_buf; -/* char printf_buf[1024]; */ - va_list arg_ptr; - va_start(arg_ptr, format); - n=vsnprintf(0,1000000,format,arg_ptr); -/* write(1,printf_buf,strlen(printf_buf)); */ - va_end (arg_ptr); - va_start (arg_ptr, format); - printf_buf=alloca(n+2); - n=vsnprintf(printf_buf,n+1,format,arg_ptr); - va_end (arg_ptr); - fwrite(printf_buf,n,1,f); - return n; -} diff --git a/mdk-stage1/dietlibc/libstdio/fputc.c b/mdk-stage1/dietlibc/libstdio/fputc.c deleted file mode 100644 index b816f7c4d..000000000 --- a/mdk-stage1/dietlibc/libstdio/fputc.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#ifndef WANT_BUFFERED_STDIO -#include -#endif - -int fputc(int c, FILE *stream) { -#ifdef WANT_BUFFERED_STDIO - if (__fflush4(stream,0)) return EOF; - if (stream->bm>=BUFSIZE-1) - if (fflush(stream)) return EOF; - stream->buf[stream->bm]=c; - ++stream->bm; - if ((stream->flags&BUFLINEWISE) && c=='\n') /* puke */ - if (fflush(stream)) return EOF; -#else - write(stream->fd,&c,1); -#endif - return 0; -} diff --git a/mdk-stage1/dietlibc/libstdio/fputs.c b/mdk-stage1/dietlibc/libstdio/fputs.c deleted file mode 100644 index 51ee9a96e..000000000 --- a/mdk-stage1/dietlibc/libstdio/fputs.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "dietstdio.h" -#include - -int fputs(const char *s, FILE *stream) { - return fwrite(s,strlen(s),1,stream); -} diff --git a/mdk-stage1/dietlibc/libstdio/fread.c b/mdk-stage1/dietlibc/libstdio/fread.c deleted file mode 100644 index 29afa1489..000000000 --- a/mdk-stage1/dietlibc/libstdio/fread.c +++ /dev/null @@ -1,51 +0,0 @@ -#include -#include "dietstdio.h" -#include - -size_t fread( void *ptr, size_t size, size_t nmemb, FILE *stream) { - int res; -#ifdef WANT_BUFFERED_STDIO - unsigned long i,j; - j=size*nmemb; -#ifdef WANT_UNGETC - if (stream->ungotten) { - *(char*)ptr=stream->ungetbuf; - ptr=((char*)ptr)+1; - --j; - } - if (!j) return 1; -#endif - for (i=0; iungotten) { - *(char*)ptr=stream->ungetbuf; - ptr=((char*)ptr)+1; - --j; - } - if (!j) return 1; - res=read(stream->fd,ptr,j); -#else - res=read(stream->fd,ptr,size*nmemb); -#endif - if (res<0) { - stream->flags|=ERRORINDICATOR; - return 0; - } else if (resflags & UNSEEKABLE) - || ((stream->flags & UNSEEKABLE) && res == 0)) - stream->flags|=EOFINDICATOR; - return res/size; -#endif -} diff --git a/mdk-stage1/dietlibc/libstdio/freopen.c b/mdk-stage1/dietlibc/libstdio/freopen.c deleted file mode 100644 index 8d4644a10..000000000 --- a/mdk-stage1/dietlibc/libstdio/freopen.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include - -FILE *freopen (const char *path, const char *mode, FILE *stream) { - fclose(stream); - stream=fopen(path,mode); - return stream; -} diff --git a/mdk-stage1/dietlibc/libstdio/fseek.c b/mdk-stage1/dietlibc/libstdio/fseek.c deleted file mode 100644 index 5bb96bc6e..000000000 --- a/mdk-stage1/dietlibc/libstdio/fseek.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include - -long fseek(FILE *stream, long offset, int whence) { - fflush(stream); -#ifdef WANT_BUFFERED_STDIO - stream->bm=0; stream->bs=0; -#endif - stream->flags&=~(ERRORINDICATOR|EOFINDICATOR); - return (lseek(stream->fd,offset,whence)); -} diff --git a/mdk-stage1/dietlibc/libstdio/ftell.c b/mdk-stage1/dietlibc/libstdio/ftell.c deleted file mode 100644 index 42d2c9f26..000000000 --- a/mdk-stage1/dietlibc/libstdio/ftell.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -long ftell(FILE *stream) { - fflush(stream); - return (lseek(stream->fd,0,SEEK_CUR)); -} diff --git a/mdk-stage1/dietlibc/libstdio/fwrite.c b/mdk-stage1/dietlibc/libstdio/fwrite.c deleted file mode 100644 index 5691661a5..000000000 --- a/mdk-stage1/dietlibc/libstdio/fwrite.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include "dietstdio.h" -#include - -size_t fwrite( const void *ptr, size_t size, size_t nmemb, FILE *stream) { - int res; -#ifdef WANT_BUFFERED_STDIO - long len=size*nmemb; - long i; - if (len>BUFSIZE || (stream->flags&NOBUF)) { - if (!(stream->flags&NOBUF)) fflush(stream); - res=write(stream->fd,ptr,size*nmemb); - } else { - register const unsigned char *c=ptr; - for (i=size*nmemb; i>0; --i,++c) - if (fputc(*c,stream)) { - res=-1; - break; - } - res=size*nmemb; - } -#else - res=write(stream->fd,ptr,size*nmemb); -#endif - if (res<0) { - stream->flags|=ERRORINDICATOR; - return 0; - } - return size?res/size:0; -} diff --git a/mdk-stage1/dietlibc/libstdio/printf.c b/mdk-stage1/dietlibc/libstdio/printf.c deleted file mode 100644 index 571420dc3..000000000 --- a/mdk-stage1/dietlibc/libstdio/printf.c +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include -#include -#include "dietstdio.h" - -int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int printf(const char *format,...) -{ - int n; - char *printf_buf; -/* char printf_buf[1024]; */ - va_list arg_ptr; - va_start(arg_ptr, format); - n=vsnprintf(0,1000000,format,arg_ptr); -/* write(1,printf_buf,strlen(printf_buf)); */ - va_end (arg_ptr); - va_start (arg_ptr, format); - printf_buf=alloca(n+2); - n=vsnprintf(printf_buf,n+1,format,arg_ptr); -#ifdef WANT_BUFFERED_STDIO - fwrite(printf_buf,n,1,stdout); -#else - write(1,printf_buf,n); -#endif - va_end (arg_ptr); - return n; -} diff --git a/mdk-stage1/dietlibc/libstdio/putchar.c b/mdk-stage1/dietlibc/libstdio/putchar.c deleted file mode 100644 index 7e5285a48..000000000 --- a/mdk-stage1/dietlibc/libstdio/putchar.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -#undef putchar -int putchar(int c) { - return fputc(c,stdout); -} diff --git a/mdk-stage1/dietlibc/libstdio/setvbuf.c b/mdk-stage1/dietlibc/libstdio/setvbuf.c deleted file mode 100644 index d0b1b7640..000000000 --- a/mdk-stage1/dietlibc/libstdio/setvbuf.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include "dietstdio.h" -#include -#include "dietwarning.h" - -int setvbuf(FILE *stream, char *buf, int flags , size_t size) { -#ifdef WANT_BUFFERED_STDIO - switch (flags) { - case _IONBF: stream->flags = (stream->flags & ~(BUFLINEWISE)) | NOBUF; break; - case _IOLBF: stream->flags = (stream->flags & ~(BUFLINEWISE|NOBUF)) | BUFLINEWISE; break; - case _IOFBF: stream->flags = stream->flags & ~(NOBUF | BUFLINEWISE); break; - default: return -1; - } -#endif - return 0; -} - -link_warning("setvbuf","setvbuf does not implement changing the buffer in diet libc.") diff --git a/mdk-stage1/dietlibc/libstdio/stderr.c b/mdk-stage1/dietlibc/libstdio/stderr.c deleted file mode 100644 index a82b1b727..000000000 --- a/mdk-stage1/dietlibc/libstdio/stderr.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -#ifdef WANT_BUFFERED_STDIO -static FILE __stderr = { 2, NOBUF, 0, 0 }; - -int __fflush_stderr() { - return fflush(stderr); -} -#else -static FILE __stderr = { 2, 0 }; -#endif - -FILE *stderr=&__stderr; diff --git a/mdk-stage1/dietlibc/libstdio/stdin.c b/mdk-stage1/dietlibc/libstdio/stdin.c deleted file mode 100644 index 2db82f9ab..000000000 --- a/mdk-stage1/dietlibc/libstdio/stdin.c +++ /dev/null @@ -1,13 +0,0 @@ -#include - -#ifdef WANT_BUFFERED_STDIO -static FILE __stdin = { 0, BUFINPUT, 0, 0 }; - -int __fflush_stdin() { - return fflush(stdin); -} -#else -static FILE __stdin = { 0, 0 }; -#endif - -FILE *stdin=&__stdin; diff --git a/mdk-stage1/dietlibc/libstdio/stdout.c b/mdk-stage1/dietlibc/libstdio/stdout.c deleted file mode 100644 index 481fb1014..000000000 --- a/mdk-stage1/dietlibc/libstdio/stdout.c +++ /dev/null @@ -1,14 +0,0 @@ -#include - -#ifdef WANT_BUFFERED_STDIO -static FILE __stdout = { 1, BUFLINEWISE, 0, 0 }; - -int __fflush_stdout() { - return fflush(stdout); -} -#else -static FILE __stdout = { 1, 0 }; -#endif - -FILE *stdout=&__stdout; - diff --git a/mdk-stage1/dietlibc/libstdio/ungetc.c b/mdk-stage1/dietlibc/libstdio/ungetc.c deleted file mode 100644 index ae03e9381..000000000 --- a/mdk-stage1/dietlibc/libstdio/ungetc.c +++ /dev/null @@ -1,11 +0,0 @@ -#include "dietstdio.h" - -#ifdef WANT_UNGETC -int ungetc(int c, FILE *stream) { - if (stream->ungotten) - return EOF; - stream->ungotten=1; - stream->ungetbuf=(char)(unsigned char)c; - return c; -} -#endif diff --git a/mdk-stage1/dietlibc/libugly/asctime.c b/mdk-stage1/dietlibc/libugly/asctime.c deleted file mode 100644 index e1fcc8706..000000000 --- a/mdk-stage1/dietlibc/libugly/asctime.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -static char buf[25]; - -char *asctime(const struct tm *timeptr) { - return asctime_r(timeptr,buf); -} diff --git a/mdk-stage1/dietlibc/libugly/asctime_r.c b/mdk-stage1/dietlibc/libugly/asctime_r.c deleted file mode 100644 index 46325927c..000000000 --- a/mdk-stage1/dietlibc/libugly/asctime_r.c +++ /dev/null @@ -1,29 +0,0 @@ -#include - -static const char days[] = "Sun Mon Tue Wed Thu Fri Sat "; -static const char months[] = "Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "; - -static void num2str(char *c,int i) { - c[0]=i/10+'0'; - c[1]=i%10+'0'; -} - -char *asctime_r(const struct tm *t, char *buf) { - /* "Wed Jun 30 21:49:08 1993\n" */ - *(int*)buf=*(int*)(days+(t->tm_wday<<2)); - *(int*)(buf+4)=*(int*)(months+(t->tm_mon<<2)); - num2str(buf+8,t->tm_mday); - if (buf[8]=='0') buf[8]=' '; - buf[10]=' '; - num2str(buf+11,t->tm_hour); - if (buf[11]=='0') buf[11]=' '; - buf[13]=':'; - num2str(buf+14,t->tm_min); - buf[16]=':'; - num2str(buf+17,t->tm_sec); - buf[19]=' '; - num2str(buf+20,(t->tm_year+1900)/100); - num2str(buf+22,(t->tm_year+1900)%100); - buf[24]='\n'; - return buf; -} diff --git a/mdk-stage1/dietlibc/libugly/asprintf.c b/mdk-stage1/dietlibc/libugly/asprintf.c deleted file mode 100644 index d10c20b4a..000000000 --- a/mdk-stage1/dietlibc/libugly/asprintf.c +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include -#include "dietwarning.h" - -extern int vsnprintf (char *str,size_t size,const char *format, va_list arg_ptr); - -int asprintf(char **s, const char *format,...) -{ - int n; - va_list arg_ptr; - va_start(arg_ptr, format); - n=vsnprintf(0,1000000,format,arg_ptr); - va_end (arg_ptr); - va_start (arg_ptr, format); - if ((*s=malloc(n+2))) { - n=vsnprintf(*s,n+1,format,arg_ptr); - va_end(arg_ptr); - return n; - } - return -1; -} diff --git a/mdk-stage1/dietlibc/libugly/ctime.c b/mdk-stage1/dietlibc/libugly/ctime.c deleted file mode 100644 index a0e12d673..000000000 --- a/mdk-stage1/dietlibc/libugly/ctime.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -char *ctime(const time_t *timep) { - return asctime(localtime(timep)); -} diff --git a/mdk-stage1/dietlibc/libugly/daemon.c b/mdk-stage1/dietlibc/libugly/daemon.c deleted file mode 100644 index 6748cc3c9..000000000 --- a/mdk-stage1/dietlibc/libugly/daemon.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include -#include -#include -#include - -#include "daemon.h" - -int daemon (int nochdir,int noclose) -{ - int fd; - switch (fork ()) - { - case -1: - return (-1); - case 0: - break; - default: - _exit (0); - } - if (setsid () == -1) - return (-1); - if (!nochdir) chdir ("/"); - if (!noclose) - { - fd = open (_PATH_DEVNULL,O_RDWR,0); - if (fd == -1) return (-1); - dup2 (fd,STDIN_FILENO); - dup2 (fd,STDOUT_FILENO); - dup2 (fd,STDERR_FILENO); - close (fd); - } - return (0); -} - diff --git a/mdk-stage1/dietlibc/libugly/endmntent.c b/mdk-stage1/dietlibc/libugly/endmntent.c deleted file mode 100644 index 00ade38e5..000000000 --- a/mdk-stage1/dietlibc/libugly/endmntent.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -int endmntent(FILE *filep) { - return fclose(filep); -} - diff --git a/mdk-stage1/dietlibc/libugly/facilitynames.c b/mdk-stage1/dietlibc/libugly/facilitynames.c deleted file mode 100644 index 8b0e1f21f..000000000 --- a/mdk-stage1/dietlibc/libugly/facilitynames.c +++ /dev/null @@ -1,32 +0,0 @@ -#include - -#ifndef INTERNAL_MARK -#define INTERNAL_MARK 0x300 -#endif - -CODE facilitynames[] = - { - { "auth", LOG_AUTH }, - { "authpriv", LOG_AUTHPRIV }, - { "cron", LOG_CRON }, - { "daemon", LOG_DAEMON }, - { "ftp", LOG_FTP }, - { "kern", LOG_KERN }, - { "lpr", LOG_LPR }, - { "mail", LOG_MAIL }, - { "mark", INTERNAL_MARK }, /* INTERNAL */ - { "news", LOG_NEWS }, - { "security", LOG_AUTH }, /* DEPRECATED */ - { "syslog", LOG_SYSLOG }, - { "user", LOG_USER }, - { "uucp", LOG_UUCP }, - { "local0", LOG_LOCAL0 }, - { "local1", LOG_LOCAL1 }, - { "local2", LOG_LOCAL2 }, - { "local3", LOG_LOCAL3 }, - { "local4", LOG_LOCAL4 }, - { "local5", LOG_LOCAL5 }, - { "local6", LOG_LOCAL6 }, - { "local7", LOG_LOCAL7 }, - { 0, -1 } - }; diff --git a/mdk-stage1/dietlibc/libugly/getmntent.c b/mdk-stage1/dietlibc/libugly/getmntent.c deleted file mode 100644 index 250a77b7f..000000000 --- a/mdk-stage1/dietlibc/libugly/getmntent.c +++ /dev/null @@ -1,30 +0,0 @@ -#include -#include -#include -#include - -struct mntent *getmntent(FILE *filep) { - static struct mntent m; - char buf[1024]; - do { - char *tmp=buf; - int num; - fgets(buf,1024,filep); -/* "/dev/ide/host0/bus0/target0/lun0/part2 / reiserfs defaults 1 1" */ - for (num=0; num<6; ++num) { - switch (num) { - case 0: m.mnt_fsname=tmp; break; - case 1: m.mnt_dir=tmp; break; - case 2: m.mnt_type=tmp; break; - case 3: m.mnt_opts=tmp; break; - case 4: m.mnt_freq=strtol(tmp,&tmp,0); if (*tmp!=' ') continue; break; - case 5: m.mnt_passno=strtol(tmp,&tmp,0); if (*tmp=='\n') return &m; break; - } - if ((tmp=strchr(tmp,' '))) { - if (num<4) *tmp++=0; - while (*tmp==' ') ++tmp; - } else - continue; - } - } while (1); -} diff --git a/mdk-stage1/dietlibc/libugly/getprotoent.c b/mdk-stage1/dietlibc/libugly/getprotoent.c deleted file mode 100644 index a648e2307..000000000 --- a/mdk-stage1/dietlibc/libugly/getprotoent.c +++ /dev/null @@ -1,130 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -static int protofd=-1; -static char* protomap; -static unsigned int protolen; - -static char* aliases[10]; - -static char *cur; - -/* ip 0 IP # internet protocol, pseudo protocol number */ -struct protoent *getprotoent(void) { - static struct protoent pe; - char *last; - int aliasidx; - if (protofd<0) { - protofd=open(_PATH_SERVICES,O_RDONLY); - if (protofd<0) return 0; - protolen=lseek(protofd,0,SEEK_END); - protomap=mmap(0,protolen,PROT_READ|PROT_WRITE,MAP_PRIVATE,protofd,0); - if ((long)protomap==(-1)) goto error; - cur=protomap; - } - last=protomap+protolen; -again: - pe.p_name=0; - pe.p_aliases=aliases; aliases[0]=0; - pe.p_proto=0; - if (cur>=last) return 0; - if (*cur=='#' || *cur=='\n') goto parseerror; - /* first, the primary name */ - if (!isalpha(*cur)) goto parseerror; - pe.p_name=cur; - pe.p_aliases=aliases; - while (cur=last) return 0; - if (*cur=='\n') goto parseerror; - *cur=0; cur++; - /* second, the protocol number */ - while (cur=last) return 0; - if (*cur=='\n') { *cur++=0; return &pe; } - *cur=0; cur++; - /* now the aliases */ - for (aliasidx=0;aliasidx<10;++aliasidx) { - while (cur=last || !isblank(*cur)) break; - *cur++=0; - } - aliases[aliasidx]=0; - return &pe; -parseerror: - while (curp_name,strlen(s->p_name)); - write(1,"/",1); - write(1,s->p_proto,strlen(s->p_proto)); - write(1,"\n",1); - if (!strcmp(name,"auth")) { - tmp=s->p_aliases; - write(1," aka ",5); - while (*tmp) { - write(1,*tmp,strlen(*tmp)); - write(1,", ",2); - ++tmp; - } - write(1,"\n",1); - } -#endif - if (!strcmp(name,s->p_name)) - return s; - tmp=s->p_aliases; - while (*tmp) - if (!strcmp(name,*tmp++)) return s; - } - return 0; -} - -struct protoent *getprotobynumber(int proto) { - struct protoent *s; - for (s=getprotoent(); s; s=getprotoent()) { - if (proto==s->p_proto) - return s; - } - return 0; -} - -void endprotoent(void) { - if (protomap!=(char*)-1) munmap(protomap,protolen); - if (protofd!=-1) close(protofd); - protomap=(char*)-1; - protofd=-1; -} - diff --git a/mdk-stage1/dietlibc/libugly/gmtime.c b/mdk-stage1/dietlibc/libugly/gmtime.c deleted file mode 100644 index d33af7972..000000000 --- a/mdk-stage1/dietlibc/libugly/gmtime.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -struct tm* gmtime(const time_t *t) { - static struct tm tmp; - return gmtime_r(t,&tmp); -} diff --git a/mdk-stage1/dietlibc/libugly/gmtime_r.c b/mdk-stage1/dietlibc/libugly/gmtime_r.c deleted file mode 100644 index c102d10fa..000000000 --- a/mdk-stage1/dietlibc/libugly/gmtime_r.c +++ /dev/null @@ -1,35 +0,0 @@ -#include - -/* seconds per day */ -#define SPD 24*60*60 - -extern unsigned int __spm[]; - -struct tm *gmtime_r(const time_t *timep, struct tm *r) { - time_t i; - register time_t work=*timep%(SPD); - r->tm_sec=work%60; work/=60; - r->tm_min=work%60; r->tm_hour=work/60; - work=*timep/(SPD); - r->tm_wday=(4+work)%7; - for (i=1970; ; ++i) { - register time_t k=__isleap(i)?366:365; - if (work>k) - work-=k; - else - break; - } - r->tm_year=i-1900; - r->tm_yday=work; - - r->tm_mday=1; - if (__isleap(i) && (work>58)) { - if (work==59) r->tm_mday=2; /* 29.2. */ - work-=1; - } - - for (i=11; i && __spm[i]>work; --i) ; - r->tm_mon=i; - r->tm_mday+=work-__spm[i]; - return r; -} diff --git a/mdk-stage1/dietlibc/libugly/isleap.c b/mdk-stage1/dietlibc/libugly/isleap.c deleted file mode 100644 index dcfa1ced6..000000000 --- a/mdk-stage1/dietlibc/libugly/isleap.c +++ /dev/null @@ -1,6 +0,0 @@ -int __isleap(int year) { - /* every fourth year is a leap year except for century years that are - * not divisible by 400. */ -/* return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); */ - return (!(year%4) && ((year%100) || !(year%400))); -} diff --git a/mdk-stage1/dietlibc/libugly/localtime.c b/mdk-stage1/dietlibc/libugly/localtime.c deleted file mode 100644 index 6fa6acf8a..000000000 --- a/mdk-stage1/dietlibc/libugly/localtime.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -struct tm* localtime(const time_t* t) { - static struct tm tmp; - return localtime_r(t,&tmp); -} diff --git a/mdk-stage1/dietlibc/libugly/localtime_r.c b/mdk-stage1/dietlibc/libugly/localtime_r.c deleted file mode 100644 index d4bc073ce..000000000 --- a/mdk-stage1/dietlibc/libugly/localtime_r.c +++ /dev/null @@ -1,21 +0,0 @@ -#include "dietfeatures.h" -#include -#include - -#ifdef WANT_TZFILE_PARSER -extern void __maplocaltime(); -extern time_t __tzfile_map(time_t t, int *isdst); -#endif - -struct tm* localtime_r(const time_t* t, struct tm* r) { - time_t tmp; -#ifdef WANT_TZFILE_PARSER - __maplocaltime(); - tmp=__tzfile_map(*t,&r->tm_isdst); -#else - struct timezone tz; - gettimeofday(0, &tz); - tmp=*t-tz.tz_minuteswest*60L; -#endif - return gmtime_r(&tmp,r); -} diff --git a/mdk-stage1/dietlibc/libugly/logging.c b/mdk-stage1/dietlibc/libugly/logging.c deleted file mode 100644 index 69c2c2337..000000000 --- a/mdk-stage1/dietlibc/libugly/logging.c +++ /dev/null @@ -1,211 +0,0 @@ -#include "dietfeatures.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define _PATH_CONSOLE "/dev/console" -#define BUF_SIZE 512 /* messagebuffer size (>= 200) */ - -#define MAX_LOGTAG 80 - -/* those have to be global *sigh* */ -static volatile int connected = 0; /* have done connect */ -static volatile int LogMask = 0xff; /* mask of priorities to be logged */ -static char LogTag[MAX_LOGTAG]; /* string to tag the entry with */ -static int LogFile = -1; /* fd for log */ -static int LogType = SOCK_DGRAM; /* type of socket connection */ -static int LogFacility = LOG_USER; /* default facility code */ -static int LogStat; /* status bits, set by openlog() */ -extern char *__progname; /* Program name, from crt0. */ -static struct sockaddr SyslogAddr; /* AF_UNIX address of local logger */ - -static void closelog_intern(void) -{ - if (!connected) return; - close(LogFile); - LogFile = -1; - connected = 0; -} - -void closelog(void) -{ - closelog_intern(); - - LogTag[0]=0; - LogType = SOCK_DGRAM; -} - -static void openlog_intern(int option, int facility) -{ - LogStat = option; - if (facility && ((facility & ~LOG_FACMASK) == 0)) - LogFacility = facility; - - /* yep, there is a continue inside ;) */ - while(1) { - if (LogFile == -1) { - SyslogAddr.sa_family = AF_UNIX; - strncpy(SyslogAddr.sa_data, _PATH_LOG, sizeof(SyslogAddr.sa_data)); - if (LogStat & LOG_NDELAY) - { - if ((LogFile = socket(AF_UNIX, LogType, 0)) == -1) return; - fcntl(LogFile, F_SETFD, 1); - } - } - if ((LogFile != -1) && !connected) { -#ifdef WANT_THREAD_SAFE - int old_errno = (*(__errno_location())); -#else - int old_errno=errno; -#endif - if(connect(LogFile, &SyslogAddr, sizeof(SyslogAddr)) == -1) { -#ifdef WANT_THREAD_SAFE - int saved_errno = (*(__errno_location())); -#else - int saved_errno=errno; -#endif - close(LogFile); - LogFile = -1; - if((LogType == SOCK_DGRAM) && (saved_errno == EPROTOTYPE)) { - /* retry with SOCK_STREAM instead of SOCK_DGRAM */ - LogType = SOCK_STREAM; -#ifdef WANT_THREAD_SAFE - (*(__errno_location()))=old_errno; -#else - errno=old_errno; -#endif - continue; - } - } - else connected = 1; - } - break; - } -} - -/* has to be secured against multiple, simultanious call's in threaded environment */ -void openlog(const char *ident, int option, int facility) -{ - if (ident) { - strncpy(LogTag,ident,MAX_LOGTAG); - LogTag[MAX_LOGTAG-1]=0; - } - openlog_intern(option, facility); -} - -int setlogmask(int mask) -{ - int old = LogMask; - if (mask) LogMask = mask; - return old; -} - -void vsyslog(int priority, const char *format, va_list arg_ptr) -{ - char buffer[BUF_SIZE]; - char time_buf[20]; - int buflen, headerlen; - time_t now; - struct tm now_tm; - pid_t pid; - int fd; - int sigpipe; - struct sigaction action, oldaction; - struct sigaction *oldaction_ptr = NULL; -#ifdef WANT_THREAD_SAFE - int saved_errno = (*(__errno_location())); -#else - int saved_errno = errno; -#endif - - /* check for invalid priority/facility bits */ - if (priority & ~(LOG_PRIMASK|LOG_FACMASK)) { - syslog(LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID, "syslog: unknown facility/priorityority: %x", priority); - priority &= LOG_PRIMASK|LOG_FACMASK; - } - - /* check priority against setlogmask */ - if ((LOG_MASK(LOG_PRI(priority)) && LogMask) == 0) return; - - /* Set default facility if none specified. */ - if ((priority & LOG_FACMASK) == 0) priority |= LogFacility; - - pid = getpid(); - time(&now); - strftime(time_buf, 20, "%h %e %T", localtime_r (&now, &now_tm)); - - if (LogStat & LOG_PID) - headerlen = snprintf(buffer, 130, "<%d>%s %s[%d]: ", priority, time_buf, LogTag, pid); - else - headerlen = snprintf(buffer, 130, "<%d>%s %s: ", priority, time_buf, LogTag); - - if (!LogTag[0]) { - if ((LogStat & LOG_PID) != LOG_PID) - headerlen = snprintf(buffer, 130, "<%d>%s (unknown)[%d]: ", priority, time_buf, pid); - strcat(buffer+headerlen, "syslog without openlog w/ ident, please check code!"); - buflen = 41; - } - else { -#ifdef WANT_THREAD_SAFE - (*(__errno_location()))=saved_errno; -#else - errno=saved_errno; -#endif - buflen = vsnprintf(buffer+headerlen, BUF_SIZE - headerlen, format, arg_ptr); - } - if (LogStat & LOG_PERROR) { - write(1, buffer+headerlen, buflen); - if (buffer[headerlen+buflen] != '\n') write(1,"\n", 1); - } - - /* prepare for broken connection */ - memset(&action, 0, sizeof(action)); - action.sa_handler = SIG_IGN; - sigemptyset(&action.sa_mask); - - if ((sigpipe = sigaction (SIGPIPE, &action, &oldaction))==0) - oldaction_ptr = &oldaction; - - if (!connected) openlog_intern(LogStat | LOG_NDELAY, 0); - - /* If we have a SOCK_STREAM connection, also send ASCII NUL as a - * record terminator. */ - if (LogType == SOCK_STREAM) buflen++; - - if (!connected || (send(LogFile, buffer, buflen+headerlen, 0) != buflen+headerlen)) { - if (LogType == SOCK_STREAM) buflen--; - closelog_intern(); - /* - * Output the message to the console; don't worry about blocking, - * if console blocks everything will. Make sure the error reported - * is the one from the syslogd failure. - */ - if ((LogStat & LOG_CONS) && - ((fd = open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY, 0)) >= 0)) - { - write(fd, buffer, buflen+headerlen); - write(fd, "\r\n", 2); - } - } - - if (sigpipe == 0) - sigaction(SIGPIPE, &oldaction, (struct sigaction *) NULL); -} - -void syslog(int priority, const char *format, ...) -{ - va_list arg_ptr; - va_start(arg_ptr, format); - vsyslog(priority, format, arg_ptr); - va_end(arg_ptr); -} diff --git a/mdk-stage1/dietlibc/libugly/mktime.c b/mdk-stage1/dietlibc/libugly/mktime.c deleted file mode 100644 index ee4dab6c1..000000000 --- a/mdk-stage1/dietlibc/libugly/mktime.c +++ /dev/null @@ -1,21 +0,0 @@ -#include - -/* seconds per day */ -#define SPD 24*60*60 - -extern unsigned int __spm[]; - -time_t mktime(struct tm *t) { - time_t x=0; - unsigned int i; - if (t->tm_year<70) return (time_t)(-1); - for (i=70; itm_year; ++i) { - x+=__isleap(i+1900)?366:365; - } - t->tm_yday=__spm[t->tm_mon] + t->tm_mday-1 + ((t->tm_mon>2) && __isleap(t->tm_year)?1:0); - x+=t->tm_yday; - /* x is now the number of days since Jan 1 1970 */ - t->tm_wday=(4+x)%7; - x = x*SPD + t->tm_hour*60*60 + t->tm_min*60 + t->tm_sec; - return x; -} diff --git a/mdk-stage1/dietlibc/libugly/pclose.c b/mdk-stage1/dietlibc/libugly/pclose.c deleted file mode 100644 index e33076c19..000000000 --- a/mdk-stage1/dietlibc/libugly/pclose.c +++ /dev/null @@ -1,11 +0,0 @@ -#include -#include -#include "dietstdio.h" - -int pclose(FILE *f) { - int status; - fclose(f); - if (waitpid(f->popen_kludge,&status,0)>=0) - return status; - return -1; -} diff --git a/mdk-stage1/dietlibc/libugly/popen.c b/mdk-stage1/dietlibc/libugly/popen.c deleted file mode 100644 index e0e441495..000000000 --- a/mdk-stage1/dietlibc/libugly/popen.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "dietstdio.h" -#include - -extern char **environ; - -FILE *popen(const char *command, const char *type) { - int pfd[2]; - int fd0; - pid_t pid; - if (pipe(pfd)<0) return 0; - fd0=(*type=='r'); - if ((pid=vfork())<0) { - close(pfd[0]); - close(pfd[1]); - return 0; - } - if (!pid) { /* child */ - char *argv[]={"sh","-c",0,0}; - close(pfd[!fd0]); close(fd0); - dup2(pfd[fd0],fd0); close(pfd[fd0]); - argv[2]=(char*)command; - execve("/bin/sh",argv,environ); - _exit(255); - } - close(pfd[fd0]); - { - register FILE* f; - if ((f=fdopen(pfd[!fd0],type))) - f->popen_kludge=pid; - return f; - } -} diff --git a/mdk-stage1/dietlibc/libugly/prioritynames.c b/mdk-stage1/dietlibc/libugly/prioritynames.c deleted file mode 100644 index 87a99b76d..000000000 --- a/mdk-stage1/dietlibc/libugly/prioritynames.c +++ /dev/null @@ -1,22 +0,0 @@ -#include - -#ifndef INTERNAL_NOPRI -#define INTERNAL_NOPRI 0x10 -#endif - -CODE prioritynames[] = - { - { "alert", LOG_ALERT }, - { "crit", LOG_CRIT }, - { "debug", LOG_DEBUG }, - { "emerg", LOG_EMERG }, - { "err", LOG_ERR }, - { "error", LOG_ERR }, /* DEPRECATED */ - { "info", LOG_INFO }, - { "none", INTERNAL_NOPRI }, /* INTERNAL */ - { "notice", LOG_NOTICE }, - { "panic", LOG_EMERG }, /* DEPRECATED */ - { "warn", LOG_WARNING }, /* DEPRECATED */ - { "warning", LOG_WARNING }, - { 0, -1 } - }; diff --git a/mdk-stage1/dietlibc/libugly/setenv.c b/mdk-stage1/dietlibc/libugly/setenv.c deleted file mode 100644 index bf47cdb79..000000000 --- a/mdk-stage1/dietlibc/libugly/setenv.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -#include -link_warning("setenv","setenv calls malloc. Avoid it in small programs."); - -int setenv(const char *name, const char *value, int overwrite) { - char *c=malloc(strlen(name)+strlen(value)+3); - if (getenv(name)) { - if (!overwrite) return 0; - unsetenv(name); - } - strcpy(c,name); - strcat(c,"="); - strcat(c,value); - return putenv(c); -} diff --git a/mdk-stage1/dietlibc/libugly/setmntent.c b/mdk-stage1/dietlibc/libugly/setmntent.c deleted file mode 100644 index a91d3902b..000000000 --- a/mdk-stage1/dietlibc/libugly/setmntent.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include - -FILE *setmntent(const char *filename, const char *type) { - return fopen(filename,type); -} - diff --git a/mdk-stage1/dietlibc/libugly/strftime.c b/mdk-stage1/dietlibc/libugly/strftime.c deleted file mode 100644 index b7e750ab1..000000000 --- a/mdk-stage1/dietlibc/libugly/strftime.c +++ /dev/null @@ -1,182 +0,0 @@ -#include -#include - -static char *sweekdays[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -static char *weekdays[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; -static char *smonths[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; -static char *months[]={"January","February","March","April","May","June","July","August","September","October","November","December"}; -static char *ampm[]={"am","pm","AM","PM"}; - -static int i2a(char* dest,unsigned int x) { - register unsigned int tmp=x; - register int len=0; - *dest++=tmp/10+'0'; tmp=tmp%10; ++len; - *dest++=tmp+'0'; - return 2; -} - -static int i2as(char* dest,unsigned int x) { - int len=i2a(dest,x); - if (*dest=='0') *dest=' '; - return len; -} - -size_t strftime(char *s, size_t max, const char *format, const struct tm *tm) { - char *t=s; - const char *src; - char buf[5]; - while (*format) { - switch (*format) { - case 0: break; - case '%': - switch (*++format) { - case '%': *t='%'; ++t; break; - case 'a': src=sweekdays[tm->tm_wday]; goto append; - case 'A': src=weekdays[tm->tm_wday]; goto append; - case 'h': - case 'b': src=smonths[tm->tm_mon]; goto append; - case 'B': src=months[tm->tm_mon]; goto append; - case 'c': t+=strftime(t,max-(t-s),"%b %a %d %k:%M:%S %Z %Y",tm); break; - case 'C': buf[i2a(buf,(tm->tm_year+1900)/100)]=0; src=buf; goto append; - case 'd': buf[i2a(buf,tm->tm_mday)]=0; src=buf; goto append; - case 'e': buf[i2as(buf,tm->tm_mday)]=0; src=buf; goto append; - case 'H': buf[i2a(buf,tm->tm_hour)]=0; src=buf; goto append; - case 'I': buf[i2a(buf,tm->tm_hour%12)]=0; src=buf; goto append; - case 'j': buf[i2a(buf,tm->tm_yday)]=0; src=buf; goto append; - case 'k': buf[i2as(buf,tm->tm_hour)]=0; src=buf; goto append; - case 'l': buf[i2as(buf,tm->tm_hour%12)]=0; src=buf; goto append; - case 'm': buf[i2a(buf,tm->tm_mon+1)]=0; src=buf; goto append; - case 'M': buf[i2a(buf,tm->tm_min)]=0; src=buf; goto append; - case 'n': *t='\n'; break; - case 'p': src=ampm[tm->tm_hour>11?3:2]; goto append; - case 'P': src=ampm[tm->tm_hour>11?1:0]; goto append; - case 'r': t+=strftime(t,max-(t-s),"%I:%M:%S %p",tm); break; - case 'R': t+=strftime(t,max-(t-s),"%H:%M",tm); break; - case 'S': buf[i2a(buf,tm->tm_sec)]=0; src=buf; goto append; - case 't': *t='\t'; break; - case 'T': t+=strftime(t,max-(t-s),"%H:%M:%S",tm); break; - case 'u': buf[i2a(buf,tm->tm_wday?tm->tm_wday:7)]=0; src=buf; goto append; - case 'w': buf[i2a(buf,tm->tm_wday)]=0; src=buf; goto append; - case 'x': t+=strftime(t,max-(t-s),"%b %a %d",tm); break; - case 'X': t+=strftime(t,max-(t-s),"%k:%M:%S",tm); break; - case 'y': buf[i2a(buf,tm->tm_year%100)]=0; src=buf; goto append; - case 'Y': i2a(buf,(tm->tm_year+1900)/100); buf[i2a(buf+2,(tm->tm_year%100))+2]=0; src=buf; goto append; - case 'Z': src="GMT"; goto append; /* hehe */ -append: - while (*src && t=s+max) break; - continue; - } - *t=0; return t-s; -} - - - -/* - %u The day of the week as a decimal, range 1 to 7, - Monday being 1. See also %w. (SU) - - %U The week number of the current year as a decimal - number, range 00 to 53, starting with the first - Sunday as the first day of week 01. See also %V and - %W. - - %V The ISO 8601:1988 week number of the current year - as a decimal number, range 01 to 53, where week 1 - is the first week that has at least 4 days in the - current year, and with Monday as the first day of - the week. See also %U and %W. (SU) - - %w The day of the week as a decimal, range 0 to 6, - Sunday being 0. See also %u. - - %W The week number of the current year as a decimal - number, range 00 to 53, starting with the first - Monday as the first day of week 01. - - %x The preferred date representation for the current - locale without the time. - - %X The preferred time representation for the current - locale without the date. - - %y The year as a decimal number without a century - (range 00 to 99). - - %Y The year as a decimal number including the century. - - %z The time-zone as hour offset from GMT. Required to - emit RFC822-conformant dates (using "%a, %d %b %Y - %H:%M:%S %z"). (GNU) - - %Z The time zone or name or abbreviation. - - %+ The date and time in date(1) format. (TZ) - - %% A literal `%' character. - - Some conversion specifiers can be modified by preceding - them by the E or O modifier to indicate that an alterna­ - tive format should be used. If the alternative format or - specification does not exist for the current locale, the - behaviour will be as if the unmodified conversion specifi­ - cation were used. (SU) The Single Unix Specification men­ - tions %Ec, %EC, %Ex, %EX, %Ry, %EY, %Od, %Oe, %OH, %OI, - %Om, %OM, %OS, %Ou, %OU, %OV, %Ow, %OW, %Oy, where the - effect of the O modifier is to use alternative numeric - symbols (say, roman numerals), and that of the E modifier - - - -GNU 29 March 1999 3 - - - - - -STRFTIME(3) Linux Programmer's Manual STRFTIME(3) - - - is to use a locale-dependent alternative representation. - - The broken-down time structure tm is defined in . - See also ctime(3). - - -RETURN VALUE - The strftime() function returns the number of characters - placed in the array s, not including the terminating NUL - character, provided the string, including the terminating - NUL, fits. Otherwise, it returns 0, and the contents of - the array is undefined. (Thus at least since libc 4.4.4; - very old versions of libc, such as libc 4.4.1, would - return max if the array was too small.) - - Note that the return value 0 does not necessarily indicate - an error; for example, in many locales %p yields an empty - string. - -ENVIRONMENT - The environment variables TZ and LC_TIME are used. - -CONFORMING TO - ANSI C, SVID 3, ISO 9899. There are strict inclusions - between the set of conversions given in ANSI C (unmarked), - those given in the Single Unix Specification (marked SU), - those given in Olson's timezone package (marked TZ), and - those given in glibc (marked GNU), except that %+ is not - supported in glibc2. On the other hand glibc2 has several - more extensions. POSIX.1 only refers to ANSI C; POSIX.2 - describes under date(1) several extensions that could - apply to strftime as well. - -SEE ALSO - date(1), time(2), ctime(3), setlocale(3), sprintf(3) - -*/ diff --git a/mdk-stage1/dietlibc/libugly/strsignal.c b/mdk-stage1/dietlibc/libugly/strsignal.c deleted file mode 100644 index 54314d2c7..000000000 --- a/mdk-stage1/dietlibc/libugly/strsignal.c +++ /dev/null @@ -1,92 +0,0 @@ -#include -/* F....ng Kernel haeder is damn broken... */ -#ifndef _NSIG -#define _NSIG 64 -#endif -#include - -char * strsignal(int sig) { - if (sig==SIGHUP) - return "Hangup"; - else if (sig==SIGINT) - return "Interrupt"; - else if (sig==SIGQUIT) - return "Quit"; - else if (sig==SIGILL) - return "Illegal instruction"; - else if (sig==SIGTRAP) - return "Trace/breakpoint trap"; - else if (sig==SIGABRT) - return "Aborted"; - else if (sig==SIGFPE) - return "Floating point exception"; - else if (sig==SIGKILL) - return "Killed"; - else if (sig==SIGBUS) - return "Bus error"; - else if (sig==SIGSEGV) - return "Segmentation fault"; - else if (sig==SIGPIPE) - return "Broken pipe"; - else if (sig==SIGALRM) - return "Alarm clock"; - else if (sig==SIGTERM) - return "Terminated"; - else if (sig==SIGURG) - return "Urgent I/O condition"; - else if (sig==SIGSTOP) - return "Stopped (signal)"; - else if (sig==SIGTSTP) - return "Stopped"; - else if (sig==SIGCONT) - return "Continue"; - else if (sig==SIGCHLD) - return "Child exited"; - else if (sig==SIGTTIN) - return "Stopped (tty input)"; - else if (sig==SIGTTOU) - return "Stopped (tty output)"; - else if (sig==SIGIO) - return "I/O possible"; - else if (sig==SIGXCPU) - return "CPU time limit exceeded"; - else if (sig==SIGXFSZ) - return "File size limit exceeded"; - else if (sig==SIGVTALRM) - return "Virtual timer expired"; - else if (sig==SIGPROF) - return "Profiling timer expired"; - else if (sig==SIGWINCH) - return "Window changed"; - else if (sig==SIGUSR1) - return "User defined signal 1"; - else if (sig==SIGUSR2) - return "User defined signal 1"; -#ifdef SIGEMT - else if (sig==SIGEMT) - return "EMT trap"; -#endif -#ifdef SIGSYS - else if (sig==SIGSYS) - return "Bad system call"; -#endif -#ifdef SIGSTKFLT - else if (sig==SIGSTKFLT) - return "Stack fault"; -#endif -#ifdef SIGINFO - else if (sig==SIGINFO) - return "Information request"; -#elif defined(SIGPWR) && (!defined(SIGLOST) || (SIGPWR!=SIGLOST)) - else if (sig==SIGPWR) - return "Power falure"; -#endif -#ifdef SIGLOST - else if (sig==SIGLOST) - return "Resource lost"; -#endif - else if ((sig>=SIGRTMIN)&&(sig<=SIGRTMAX)) - return "Real time signal"; - else - return "(unknown signal)"; -} diff --git a/mdk-stage1/dietlibc/libugly/system.c b/mdk-stage1/dietlibc/libugly/system.c deleted file mode 100644 index b9eea20eb..000000000 --- a/mdk-stage1/dietlibc/libugly/system.c +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include -#include -#include "dietwarning.h" - -#define SHELL_PATH "/bin/sh" /* Path of the shell. */ -#define SHELL_NAME "sh" /* Name to give it. */ - -extern char **environ; - -int __libc_fork(); -int __libc_waitpid(int pid, int *status, int options); -int execve(const char*filename, char *const argv[], char *const envp[]); -void __set_errno(int errno); -int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); - -int __libc_system (const char *line) -{ - struct sigaction sa, intr, quit; - int save,pid,ret=-1; - - if (line == 0) return __libc_system("exit 0") == 0; - - sa.sa_handler = SIG_IGN; - sa.sa_flags = 0; - sigemptyset (&sa.sa_mask); - - if (sigaction(SIGINT, &sa, &intr)<0) return -1; - if (sigaction(SIGQUIT, &sa, &quit)<0) { - save = errno; - sigaction (SIGINT, &intr, (struct sigaction*)0); - __set_errno (save); - return -1; - } - - pid=__libc_fork(); - if (pid>0) - { /* parent */ - int n; - do - n=__libc_waitpid(pid, &ret, 0); - while ((n==-1) && (errno==EINTR)); - if (n!=pid) ret=-1; - } - else if (!pid) - { /* child */ - const char *nargs[4]; - nargs[0] = SHELL_NAME; - nargs[1] = "-c"; - nargs[2] = line; - nargs[3] = 0; - - sigaction(SIGINT, &intr, (struct sigaction*)0); - sigaction(SIGQUIT, &quit, (struct sigaction*)0); - - execve(SHELL_PATH,(char *const *)nargs, environ); - _exit(127); - } - save = errno; - sigaction (SIGINT, &intr, (struct sigaction *)0); - sigaction (SIGQUIT, &quit, (struct sigaction *)0); - __set_errno(save); - return ret; -} - -int system (const char *line) __attribute__((weak,alias("__libc_system"))); - -link_warning("system","warning: system() is a security risk. Use fork and execvp instead!") diff --git a/mdk-stage1/dietlibc/libugly/time_table_spd.c b/mdk-stage1/dietlibc/libugly/time_table_spd.c deleted file mode 100644 index bfe1cf86d..000000000 --- a/mdk-stage1/dietlibc/libugly/time_table_spd.c +++ /dev/null @@ -1,17 +0,0 @@ - -/* seconds per month -- nonleap! */ -const unsigned int __spm[12] = - { 0, - (31), - (31+28), - (31+28+31), - (31+28+31+30), - (31+28+31+30+31), - (31+28+31+30+31+30), - (31+28+31+30+31+30+31), - (31+28+31+30+31+30+31+31), - (31+28+31+30+31+30+31+31+30), - (31+28+31+30+31+30+31+31+30+31), - (31+28+31+30+31+30+31+31+30+31+30), - }; - diff --git a/mdk-stage1/dietlibc/libugly/tzfile.c b/mdk-stage1/dietlibc/libugly/tzfile.c deleted file mode 100644 index 5702d4bea..000000000 --- a/mdk-stage1/dietlibc/libugly/tzfile.c +++ /dev/null @@ -1,86 +0,0 @@ -#include "dietfeatures.h" -#include -#include -#include -#include - -#include - -#ifdef WANT_TZFILE_PARSER -static char *tzfile=0; -static int tzlen=-1; - -void __maplocaltime() { - int fd; - unsigned int len; - if (tzlen>=0) return; - tzlen=0; - if ((fd=open("/etc/localtime",O_RDONLY))<0) return; - len=lseek(fd,0,SEEK_END); - if ((tzfile=mmap(0,len,PROT_READ,MAP_SHARED,fd,0))==MAP_FAILED) return; - close(fd); - if (ntohl(*(int*)tzfile) != 0x545a6966) return; - tzlen=len; -} - -char *tzset(void) __attribute__((weak,alias("__maplocaltime"))); - -static unsigned long __myntohl(const unsigned char* c) { - return (((unsigned long)c[0])<<24) + - (((unsigned long)c[1])<<16) + - (((unsigned long)c[2])<<8) + - ((unsigned long)c[3]); -} - -time_t __tzfile_map(time_t t, int *isdst) { - /* "TZif" plus 16 reserved bytes. */ - char *tmp; - int i; - int tzh_ttisgmtcnt, tzh_ttisstdcnt, tzh_leapcnt, tzh_timecnt, tzh_typecnt, tzh_charcnt; - *isdst=0; - if (!tzfile) return t; - tzh_ttisgmtcnt=ntohl(*(int*)(tzfile+20)); - tzh_ttisstdcnt=ntohl(*(int*)(tzfile+24)); - tzh_leapcnt=ntohl(*(int*)(tzfile+28)); - tzh_timecnt=ntohl(*(int*)(tzfile+32)); - tzh_typecnt=ntohl(*(int*)(tzfile+36)); - tzh_charcnt=ntohl(*(int*)(tzfile+40)); - -#if 0 - tmp=tzfile+20+6*4; - printf("ttisgmtcnt %d ttisstdcnt %d leapcnt %d timecnt %d typecnt %d charcnt %d\n",tzh_ttisgmtcnt,tzh_ttisstdcnt, tzh_leapcnt, tzh_timecnt, tzh_typecnt, tzh_charcnt); - printf("transition times: "); - for (i=0; i= t) { -/* printf("match at %d\n",i); */ - tmp+=tzh_timecnt*4; - i=tmp[i-1]; -/* printf("using index %d\n",i); */ - tmp+=tzh_timecnt; - tmp+=i*6; -/* printf("(%lu,%d,%d)\n",ntohl(*(int*)tmp),tmp[4],tmp[5]); */ - *isdst=tmp[4]; - return t+__myntohl(tmp); - } - return t; -} -#else -void tzset(void) __attribute__((weak,alias("return0"))); -#endif diff --git a/mdk-stage1/dietlibc/libugly/unsetenv.c b/mdk-stage1/dietlibc/libugly/unsetenv.c deleted file mode 100644 index 46e880271..000000000 --- a/mdk-stage1/dietlibc/libugly/unsetenv.c +++ /dev/null @@ -1,6 +0,0 @@ -#include - -void unsetenv(const char *name) { - putenv(name); -} - diff --git a/mdk-stage1/dietlibc/ppc/Makefile.add b/mdk-stage1/dietlibc/ppc/Makefile.add deleted file mode 100644 index 641cf1ade..000000000 --- a/mdk-stage1/dietlibc/ppc/Makefile.add +++ /dev/null @@ -1,3 +0,0 @@ - -CFLAGS+=-mpowerpc-gpopt -mpowerpc-gfxopt -Os -VPATH:=ppc:syscalls.s:$(VPATH) diff --git a/mdk-stage1/dietlibc/ppc/__longjmp.S b/mdk-stage1/dietlibc/ppc/__longjmp.S deleted file mode 100644 index 8113eeeea..000000000 --- a/mdk-stage1/dietlibc/ppc/__longjmp.S +++ /dev/null @@ -1,59 +0,0 @@ -#include - - -#ifdef PIC -#define JUMPTARGET(name) name##@plt -#else -#define JUMPTARGET(name) name -#endif - -.global __longjmp -.type __longjmp,@function -.align 2 -__longjmp: - lwz 1,(JB_GPR1*4)(3) - lwz 2,(JB_GPR2*4)(3) - lwz 0,(JB_LR*4)(3) - lwz 14,((JB_GPRS+0)*4)(3) - lfd 14,((JB_FPRS+0*2)*4)(3) - lwz 15,((JB_GPRS+1)*4)(3) - lfd 15,((JB_FPRS+1*2)*4)(3) - lwz 16,((JB_GPRS+2)*4)(3) - lfd 16,((JB_FPRS+2*2)*4)(3) - lwz 17,((JB_GPRS+3)*4)(3) - lfd 17,((JB_FPRS+3*2)*4)(3) - lwz 18,((JB_GPRS+4)*4)(3) - lfd 18,((JB_FPRS+4*2)*4)(3) - lwz 19,((JB_GPRS+5)*4)(3) - lfd 19,((JB_FPRS+5*2)*4)(3) - lwz 20,((JB_GPRS+6)*4)(3) - lfd 20,((JB_FPRS+6*2)*4)(3) - mtlr 0 - lwz 21,((JB_GPRS+7)*4)(3) - lfd 21,((JB_FPRS+7*2)*4)(3) - lwz 22,((JB_GPRS+8)*4)(3) - lfd 22,((JB_FPRS+8*2)*4)(3) - lwz 0,(JB_CR*4)(3) - lwz 23,((JB_GPRS+9)*4)(3) - lfd 23,((JB_FPRS+9*2)*4)(3) - lwz 24,((JB_GPRS+10)*4)(3) - lfd 24,((JB_FPRS+10*2)*4)(3) - lwz 25,((JB_GPRS+11)*4)(3) - lfd 25,((JB_FPRS+11*2)*4)(3) - mtcrf 0xFF,0 - lwz 26,((JB_GPRS+12)*4)(3) - lfd 26,((JB_FPRS+12*2)*4)(3) - lwz 27,((JB_GPRS+13)*4)(3) - lfd 27,((JB_FPRS+13*2)*4)(3) - lwz 28,((JB_GPRS+14)*4)(3) - lfd 28,((JB_FPRS+14*2)*4)(3) - lwz 29,((JB_GPRS+15)*4)(3) - lfd 29,((JB_FPRS+15*2)*4)(3) - lwz 30,((JB_GPRS+16)*4)(3) - lfd 30,((JB_FPRS+16*2)*4)(3) - lwz 31,((JB_GPRS+17)*4)(3) - lfd 31,((JB_FPRS+17*2)*4)(3) - mr 3,4 - blr -.size __longjmp,.-__longjmp - diff --git a/mdk-stage1/dietlibc/ppc/__testandset.S b/mdk-stage1/dietlibc/ppc/__testandset.S deleted file mode 100644 index a6063fbb2..000000000 --- a/mdk-stage1/dietlibc/ppc/__testandset.S +++ /dev/null @@ -1,11 +0,0 @@ -.global __testandset -.type __testandset,@function -.align 2 -__testandset: - lwarx 5,0,3 - add 0,4,5 - stwcx 0,0,3 - bne __testandset - blr -.size __testandset,.-__testandset - diff --git a/mdk-stage1/dietlibc/ppc/mmap.c b/mdk-stage1/dietlibc/ppc/mmap.c deleted file mode 100644 index 25d2926b2..000000000 --- a/mdk-stage1/dietlibc/ppc/mmap.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include - -int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) { - unsigned long __sc_ret, __sc_err; - { - register unsigned long __sc_0 __asm__ ("r0"); - register unsigned long __sc_3 __asm__ ("r3"); - register unsigned long __sc_4 __asm__ ("r4"); - register unsigned long __sc_5 __asm__ ("r5"); - register unsigned long __sc_6 __asm__ ("r6"); - register unsigned long __sc_7 __asm__ ("r7"); - register unsigned long __sc_8 __asm__ ("r8"); - - __sc_3 = (unsigned long) (start); - __sc_4 = (unsigned long) (length); - __sc_5 = (unsigned long) (prot); - __sc_6 = (unsigned long) (flags); - __sc_7 = (unsigned long) (fd); - __sc_8 = (unsigned long) (offset); - __sc_0 = __NR_mmap; - __asm__ __volatile__ - ("sc \n\t" - "mfcr %1 " - : "=&r" (__sc_3), "=&r" (__sc_0) - : "0" (__sc_3), "1" (__sc_0), - "r" (__sc_4), - "r" (__sc_5), - "r" (__sc_6), - "r" (__sc_7), - "r" (__sc_8) - : __syscall_clobbers); - __sc_ret = __sc_3; - __sc_err = __sc_0; - } - __syscall_return (int); -} diff --git a/mdk-stage1/dietlibc/ppc/setjmp.S b/mdk-stage1/dietlibc/ppc/setjmp.S deleted file mode 100644 index 50fa2bdd4..000000000 --- a/mdk-stage1/dietlibc/ppc/setjmp.S +++ /dev/null @@ -1,56 +0,0 @@ -#include - -#ifdef PIC -#define JUMPTARGET(name) name##@plt -#else -#define JUMPTARGET(name) name -#endif - -.global __sigsetjmp -.type __sigsetjmp,@function -.align 2 -__sigsetjmp: - stw 1,(JB_GPR1*4)(3) - mflr 0 - stw 2,(JB_GPR2*4)(3) - stw 14,((JB_GPRS+0)*4)(3) - stfd 14,((JB_FPRS+0*2)*4)(3) - stw 0,(JB_LR*4)(3) - stw 15,((JB_GPRS+1)*4)(3) - stfd 15,((JB_FPRS+1*2)*4)(3) - mfcr 0 - stw 16,((JB_GPRS+2)*4)(3) - stfd 16,((JB_FPRS+2*2)*4)(3) - stw 0,(JB_CR*4)(3) - stw 17,((JB_GPRS+3)*4)(3) - stfd 17,((JB_FPRS+3*2)*4)(3) - stw 18,((JB_GPRS+4)*4)(3) - stfd 18,((JB_FPRS+4*2)*4)(3) - stw 19,((JB_GPRS+5)*4)(3) - stfd 19,((JB_FPRS+5*2)*4)(3) - stw 20,((JB_GPRS+6)*4)(3) - stfd 20,((JB_FPRS+6*2)*4)(3) - stw 21,((JB_GPRS+7)*4)(3) - stfd 21,((JB_FPRS+7*2)*4)(3) - stw 22,((JB_GPRS+8)*4)(3) - stfd 22,((JB_FPRS+8*2)*4)(3) - stw 23,((JB_GPRS+9)*4)(3) - stfd 23,((JB_FPRS+9*2)*4)(3) - stw 24,((JB_GPRS+10)*4)(3) - stfd 24,((JB_FPRS+10*2)*4)(3) - stw 25,((JB_GPRS+11)*4)(3) - stfd 25,((JB_FPRS+11*2)*4)(3) - stw 26,((JB_GPRS+12)*4)(3) - stfd 26,((JB_FPRS+12*2)*4)(3) - stw 27,((JB_GPRS+13)*4)(3) - stfd 27,((JB_FPRS+13*2)*4)(3) - stw 28,((JB_GPRS+14)*4)(3) - stfd 28,((JB_FPRS+14*2)*4)(3) - stw 29,((JB_GPRS+15)*4)(3) - stfd 29,((JB_FPRS+15*2)*4)(3) - stw 30,((JB_GPRS+16)*4)(3) - stfd 30,((JB_FPRS+16*2)*4)(3) - stw 31,((JB_GPRS+17)*4)(3) - stfd 31,((JB_FPRS+17*2)*4)(3) - b JUMPTARGET (__sigjmp_save) -.size __sigsetjmp,.-__sigsetjmp diff --git a/mdk-stage1/dietlibc/ppc/start.S b/mdk-stage1/dietlibc/ppc/start.S deleted file mode 100644 index c7afeecd2..000000000 --- a/mdk-stage1/dietlibc/ppc/start.S +++ /dev/null @@ -1,44 +0,0 @@ -#include "start.h" - -#ifdef __powerpc__ - -.text -.global _start -.type _start,@function -_start: - /* Save the stack pointer, in case we're statically linked under Linux. */ - mr 9,1 - /* Set up an initial stack frame, and clear the LR. */ - clrrwi 1,1,4 - li 0,0 - stwu 1,-16(1) - mtlr 0 - stw 0,0(1) - - /* r9 enthält den initialen Stackpointer. - argc = (r9) - argv = (r9+4) - envp = argv+(argc+1)*4 */ - - lwzu 3,0(9) /* argc */ - addi 4,9,4 /* argv */ - add 5,0,3 /* argc... */ - addi 5,5,1 /* argc+1...*/ - slwi 5,5,2 /* (argc+1)*4 */ - add 5,5,4 /* argv+(argc+1)*4 */ - - lis 6,environ@ha - stw 5,environ@l(6) - - bl main - b exit -.size _start,.-_start - - -/* Define a symbol for the first piece of initialized data. */ - .section ".data" -__data_start: - - -#endif - diff --git a/mdk-stage1/dietlibc/ppc/unified.S b/mdk-stage1/dietlibc/ppc/unified.S deleted file mode 100644 index d2b419f0b..000000000 --- a/mdk-stage1/dietlibc/ppc/unified.S +++ /dev/null @@ -1,21 +0,0 @@ -#include - -.text -.global __unified_syscall -__unified_syscall: - sc - mfcr 0 - andis. 9,0,4096 - mr 0,3 - beq .L1 -#ifdef WANT_THREAD_SAVE - bl __set_errno -#else - lis 9,errno@ha - stw 3,errno@l(9) -#endif - li 0,-1 -.L1: - mr 3,0 - blr - diff --git a/mdk-stage1/dietlibc/sparc/Makefile.add b/mdk-stage1/dietlibc/sparc/Makefile.add deleted file mode 100644 index 0de05b1db..000000000 --- a/mdk-stage1/dietlibc/sparc/Makefile.add +++ /dev/null @@ -1,3 +0,0 @@ - -CFLAGS+=-mcpu=supersparc -Os -VPATH:=sparc:syscalls.s:$(VPATH) diff --git a/mdk-stage1/dietlibc/sparc/__longjmp.S b/mdk-stage1/dietlibc/sparc/__longjmp.S deleted file mode 100644 index 72e001a2f..000000000 --- a/mdk-stage1/dietlibc/sparc/__longjmp.S +++ /dev/null @@ -1,67 +0,0 @@ -#include - -#define JB_SP 0 -#define JB_FP 1 -#define JB_PC 2 - -#define ENV(base,reg) [%base + (reg * 4)] -#define ST_FLUSH_WINDOWS 3 -#define RW_FP [%fp + 0x48] - -.text -.global __longjmp -__longjmp: - /* Store our arguments in global registers so we can still - use them while unwinding frames and their register windows. */ - - ld ENV(o0,JB_FP), %g3 /* Cache target FP in register %g3. */ - mov %o0, %g1 /* ENV in %g1 */ - orcc %o1, %g0, %g2 /* VAL in %g2 */ - be,a 0f /* Branch if zero; else skip delay slot. */ - mov 1, %g2 /* Delay slot only hit if zero: VAL = 1. */ -0: - xor %fp, %g3, %o0 - add %fp, 512, %o1 - andncc %o0, 4095, %o0 - bne .Lthread - cmp %o1, %g3 - bl .Lthread - - /* Now we will loop, unwinding the register windows up the stack - until the restored %fp value matches the target value in %g3. */ - -.Lloop: - cmp %fp, %g3 /* Have we reached the target frame? */ - bl,a .Lloop /* Loop while current fp is below target. */ - restore /* Unwind register window in delay slot. */ - be,a .Lfound /* Better have hit it exactly. */ - ld ENV(g1,JB_SP), %o0 /* Delay slot: extract target SP. */ - -.Lthread: - /* - * Do a "flush register windows trap". The trap handler in the - * kernel writes all the register windows to their stack slots, and - * marks them all as invalid (needing to be sucked up from the - * stack when used). This ensures that all information needed to - * unwind to these callers is in memory, not in the register - * windows. - */ - ta ST_FLUSH_WINDOWS - ld ENV(g1,JB_PC), %o7 /* Set return PC. */ - ld ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */ - sub %fp, 64, %sp /* Allocate a register frame. */ - st %g3, RW_FP /* Set saved FP on restore below. */ - retl - restore %g2, 0, %o0 /* Restore values from above register frame. */ - -.Lfound: - /* We have unwound register windows so %fp matches the target. */ - mov %o0, %sp /* OK, install new SP. */ - -.Lsp_ok: - ld ENV(g1,JB_PC), %o0 /* Extract target return PC. */ - jmp %o0 + 8 /* Return there. */ - mov %g2, %o0 /* Delay slot: set return value. */ - -.size __longjmp, . - __longjmp - diff --git a/mdk-stage1/dietlibc/sparc/__testandset.S b/mdk-stage1/dietlibc/sparc/__testandset.S deleted file mode 100644 index 84f6cf597..000000000 --- a/mdk-stage1/dietlibc/sparc/__testandset.S +++ /dev/null @@ -1,6 +0,0 @@ -.text -.align 4 -.global __testandset -__testandset: - retl - ldstub [%o0], %o0 diff --git a/mdk-stage1/dietlibc/sparc/clone.S b/mdk-stage1/dietlibc/sparc/clone.S deleted file mode 100644 index 58b438249..000000000 --- a/mdk-stage1/dietlibc/sparc/clone.S +++ /dev/null @@ -1,45 +0,0 @@ -#include -#include - -.text -.align 4 -.weak clone -clone: -.global __clone -__clone: - save %sp, -96, %sp - - tst %i0 /* check for function pointer */ - be .Lerror - tst %i1 /* check for stack pointer */ - be .Lerror - nop - - mov %i1, %o1 /* child-stack */ - mov %i2, %o0 /* clone-flags */ - mov __NR_clone, %g1 - ta 0x10 /* syscall: clone */ - bcs .Lerror - - tst %o1 - bne .Lstart /* we are the child :) */ - nop - mov %o0, %i0 /* return child pid */ - ret - restore - -.Lerror: - call __errno_location - nop - mov EINVAL, %l0 - st %l0, [%o0] - ret - restore %g0, -1, %o0 - -.Lstart: - call %i0 /* call child-function */ - mov %i3, %o0 /* put arg in the right place for the child */ - - call _exit /* child returned */ - nop - diff --git a/mdk-stage1/dietlibc/sparc/fork.S b/mdk-stage1/dietlibc/sparc/fork.S deleted file mode 100644 index 869c9b30c..000000000 --- a/mdk-stage1/dietlibc/sparc/fork.S +++ /dev/null @@ -1,25 +0,0 @@ -#include "syscalls.h" - -.text -.weak fork -fork: -.global __libc_fork -__libc_fork: - mov 2, %g1 - ta 0x10 - bcc,a 1f - nop - save %sp, -96, %sp -#ifdef WANT_THREAD_SAVE - call __errno_location - nop -#else - sethi %hi(errno), %o0 - or %o0, %lo(errno), %o0 -#endif - st %i0, [ %o0 ] - retl - restore %g0, -1, %o0 -1: dec %o1 - retl - and %o0, %o1, %o0 diff --git a/mdk-stage1/dietlibc/sparc/mmap.c b/mdk-stage1/dietlibc/sparc/mmap.c deleted file mode 100644 index 25ebdc24e..000000000 --- a/mdk-stage1/dietlibc/sparc/mmap.c +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include - -#define __SYSCALL_STRING \ - "ta 0x10;" \ - "bcs 2f;" \ - " nop;" \ - "1:" \ - ".subsection 2;" \ - "2:" \ - "save %%sp, -192, %%sp;" \ - "call __errno_location;" \ - " nop;" \ - "st %%i0,[%%o0];" \ - "ba 1b;" \ - " restore %%g0, -1, %%o0;" \ - ".previous;" - -#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g7", \ - "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ - "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \ - "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \ - "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \ - "cc", "memory" - -#define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \ -({ \ - register long __o0 __asm__ ("o0") = (long)(arg1); \ - register long __o1 __asm__ ("o1") = (long)(arg2); \ - register long __o2 __asm__ ("o2") = (long)(arg3); \ - register long __o3 __asm__ ("o3") = (long)(arg4); \ - register long __o4 __asm__ ("o4") = (long)(arg5); \ - register long __o5 __asm__ ("o5") = (long)(arg6); \ - register long __g1 __asm__ ("g1") = __NR_##name; \ - __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \ - "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2), \ - "r" (__o3), "r" (__o4), "r" (__o5) : \ - __SYSCALL_CLOBBERS); \ - __o0; \ -}) -int mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset) { - return inline_syscall6(mmap,start,length,prot,flags,fd,offset); -} diff --git a/mdk-stage1/dietlibc/sparc/pipe.S b/mdk-stage1/dietlibc/sparc/pipe.S deleted file mode 100644 index 820da2570..000000000 --- a/mdk-stage1/dietlibc/sparc/pipe.S +++ /dev/null @@ -1,26 +0,0 @@ -#include "syscalls.h" - -.text -.global pipe -pipe: - mov %o0, %o2 - mov __NR_pipe, %g1 - ta 0x10 - bcc,a 1f - nop - save %sp, -96, %sp -#ifdef WANT_THREAD_SAVE - call __errno_location - nop -#else - sethi %hi(errno), %o0 - or %o0, %lo(errno), %o0 -#endif - st %i0, [ %o0 ] - ret - restore %g0, -1, %o0 - -1: st %o0, [ %o2 ] - st %o1, [ %o2 + 4 ] - retl - mov %g0, %o0 diff --git a/mdk-stage1/dietlibc/sparc/setjmp.S b/mdk-stage1/dietlibc/sparc/setjmp.S deleted file mode 100644 index efc5a7013..000000000 --- a/mdk-stage1/dietlibc/sparc/setjmp.S +++ /dev/null @@ -1,37 +0,0 @@ -#include - -#define JB_SP 0 -#define JB_FP 1 -#define JB_PC 2 - -#define ST_FLUSH_WINDOWS 0x03 - -.section .rodata -.text -.globl __setjmp -__setjmp: - b 1f - set 0, %o1 -.size __setjmp,.-__setjmp - -.globl setjmp -setjmp: - set 1, %o1 -.size setjmp,.-setjmp - -.globl __sigsetjmp -__sigsetjmp: -1: - /* Save our PC, SP and FP. Save the signal mask if requested with - a tail-call for simplicity; it always returns zero. */ - ta ST_FLUSH_WINDOWS - - st %o7, [%o0 + (JB_PC * 4)] - st %sp, [%o0 + (JB_SP * 4)] - st %fp, [%o0 + (JB_FP * 4)] - - mov %o7, %g1 - call __sigjmp_save - mov %g1, %o7 -.size __sigsetjmp,.-__sigsetjmp - diff --git a/mdk-stage1/dietlibc/sparc/shmat.c b/mdk-stage1/dietlibc/sparc/shmat.c deleted file mode 100644 index 73b2d89a9..000000000 --- a/mdk-stage1/dietlibc/sparc/shmat.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include -#include - -extern void* __ipc(); - -#ifndef PAGE_SIZE -#define PAGE_SIZE 4096 -#endif - -void* shmat(int shmid,const void* shmaddr,int shmflg) { - void* raddr; - register void* result; - result=__ipc(SHMAT,shmid,shmflg,&raddr,shmaddr); - if ((unsigned long)result <= -(unsigned long)PAGE_SIZE) - result=raddr; - return result; -} diff --git a/mdk-stage1/dietlibc/sparc/start.S b/mdk-stage1/dietlibc/sparc/start.S deleted file mode 100644 index e948aaddc..000000000 --- a/mdk-stage1/dietlibc/sparc/start.S +++ /dev/null @@ -1,46 +0,0 @@ -#include "start.h" - -#ifdef __sparc__ - .section ".text" - .align 4 - .global _start - .type _start,@function -_start: - - /* Terminate the stack frame, and reserve space for functions to - drop their arguments. */ - mov %g0, %fp - sub %sp, 6*4, %sp - - /* Extract the arguments and environment as encoded on the stack. The - argument info starts after one register window (16 words) past the SP. */ - ld [%sp+22*4], %o0 - add %sp, 23*4, %o1 - add %o1, %o0, %o2 - add %o2, %o0, %o2 - add %o2, %o0, %o2 - add %o2, %o0, %o2 - add %o2, 4, %o2 - - sethi %hi(environ), %o3 - or %o3, %lo(environ), %o3 - st %o2, [%o3] - - /* When starting a binary via the dynamic linker, %g1 contains the - address of the shared library termination function, which will be - registered with atexit(). If we are statically linked, this will - be NULL. */ - - /* Let libc do the rest of the initialization, and call main. */ - call main - mov %g1, %o5 - - b exit - mov %o0, %i0 - - /* Die very horribly if exit returns. */ - unimp - - .size _start, .-_start -#endif - diff --git a/mdk-stage1/dietlibc/sparc/udiv.S b/mdk-stage1/dietlibc/sparc/udiv.S deleted file mode 100644 index 87479e7bd..000000000 --- a/mdk-stage1/dietlibc/sparc/udiv.S +++ /dev/null @@ -1,363 +0,0 @@ -#ifdef __sparc__ - /* This file is generated from divrem.m4; DO NOT EDIT! */ -/* - * Division and remainder, from Appendix E of the Sparc Version 8 - * Architecture Manual, with fixes from Gordon Irlam. - */ - -/* - * Input: dividend and divisor in %o0 and %o1 respectively. - * - * m4 parameters: - * .udiv name of function to generate - * div div=div => %o0 / %o1; div=rem => %o0 % %o1 - * false false=true => signed; false=false => unsigned - * - * Algorithm parameters: - * N how many bits per iteration we try to get (4) - * WORDSIZE total number of bits (32) - * - * Derived constants: - * TOPBITS number of bits in the top decade of a number - * - * Important variables: - * Q the partial quotient under development (initially 0) - * R the remainder so far, initially the dividend - * ITER number of main division loop iterations required; - * equal to ceil(log2(quotient) / N). Note that this - * is the log base (2^N) of the quotient. - * V the current comparand, initially divisor*2^(ITER*N-1) - * - * Cost: - * Current estimate for non-large dividend is - * ceil(log2(quotient) / N) * (10 + 7N/2) + C - * A large dividend is one greater than 2^(31-TOPBITS) and takes a - * different path, as the upper bits of the quotient must be developed - * one bit at a time. - */ - - - -#define C_LABEL(name) name: - -#define C_SYMBOL_NAME(name) name - -#define ENTRY(name) \ - .global C_SYMBOL_NAME(name); \ - .align 4;\ - C_LABEL(name);\ - .type name,@function; - -#define LOC(name) . ## L ## name - -#define END(name) \ - .size name, . - name - -#define ST_DIV0 0x02 - -ENTRY(.udiv) - - ! Ready to divide. Compute size of quotient; scale comparand. - orcc %o1, %g0, %o5 - bne 1f - mov %o0, %o3 - - ! Divide by zero trap. If it returns, return 0 (about as - ! wrong as possible, but that is what SunOS does...). - ta ST_DIV0 - retl - clr %o0 - -1: - cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu LOC(got_result) ! (and algorithm fails otherwise) - clr %o2 - sethi %hi(1 << (32 - 4 - 1)), %g1 - cmp %o3, %g1 - blu LOC(not_really_big) - clr %o4 - - ! Here the dividend is >= 2**(31-N) or so. We must be careful here, - ! as our usual N-at-a-shot divide step will cause overflow and havoc. - ! The number of bits in the result here is N*ITER+SC, where SC <= N. - ! Compute ITER in an unorthodox manner: know we need to shift V into - ! the top decade: so do not even bother to compare to R. - 1: - cmp %o5, %g1 - bgeu 3f - mov 1, %g2 - sll %o5, 4, %o5 - b 1b - add %o4, 1, %o4 - - ! Now compute %g2. - 2: addcc %o5, %o5, %o5 - bcc LOC(not_too_big) - add %g2, 1, %g2 - - ! We get here if the %o1 overflowed while shifting. - ! This means that %o3 has the high-order bit set. - ! Restore %o5 and subtract from %o3. - sll %g1, 4, %g1 ! high order bit - srl %o5, 1, %o5 ! rest of %o5 - add %o5, %g1, %o5 - b LOC(do_single_div) - sub %g2, 1, %g2 - - LOC(not_too_big): - 3: cmp %o5, %o3 - blu 2b - nop - be LOC(do_single_div) - nop - /* NB: these are commented out in the V8-Sparc manual as well */ - /* (I do not understand this) */ - ! %o5 > %o3: went too far: back up 1 step - ! srl %o5, 1, %o5 - ! dec %g2 - ! do single-bit divide steps - ! - ! We have to be careful here. We know that %o3 >= %o5, so we can do the - ! first divide step without thinking. BUT, the others are conditional, - ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- - ! order bit set in the first step, just falling into the regular - ! division loop will mess up the first time around. - ! So we unroll slightly... - LOC(do_single_div): - subcc %g2, 1, %g2 - bl LOC(end_regular_divide) - nop - sub %o3, %o5, %o3 - mov 1, %o2 - b LOC(end_single_divloop) - nop - LOC(single_divloop): - sll %o2, 1, %o2 - bl 1f - srl %o5, 1, %o5 - ! %o3 >= 0 - sub %o3, %o5, %o3 - b 2f - add %o2, 1, %o2 - 1: ! %o3 < 0 - add %o3, %o5, %o3 - sub %o2, 1, %o2 - 2: - LOC(end_single_divloop): - subcc %g2, 1, %g2 - bge LOC(single_divloop) - tst %o3 - b,a LOC(end_regular_divide) - -LOC(not_really_big): -1: - sll %o5, 4, %o5 - cmp %o5, %o3 - bleu 1b - addcc %o4, 1, %o4 - be LOC(got_result) - sub %o4, 1, %o4 - - tst %o3 ! set up for initial iteration -LOC(divloop): - sll %o2, 4, %o2 - ! depth 1, accumulated bits 0 - bl LOC(1.16) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 2, accumulated bits 1 - bl LOC(2.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits 3 - bl LOC(3.19) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 7 - bl LOC(4.23) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (7*2+1), %o2 - -LOC(4.23): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (7*2-1), %o2 - - -LOC(3.19): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 5 - bl LOC(4.21) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (5*2+1), %o2 - -LOC(4.21): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (5*2-1), %o2 - - - -LOC(2.17): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits 1 - bl LOC(3.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 3 - bl LOC(4.19) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (3*2+1), %o2 - -LOC(4.19): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (3*2-1), %o2 - - -LOC(3.17): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 1 - bl LOC(4.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (1*2+1), %o2 - -LOC(4.17): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (1*2-1), %o2 - - - - -LOC(1.16): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 2, accumulated bits -1 - bl LOC(2.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits -1 - bl LOC(3.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -1 - bl LOC(4.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2+1), %o2 - -LOC(4.15): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2-1), %o2 - - -LOC(3.15): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -3 - bl LOC(4.13) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2+1), %o2 - -LOC(4.13): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2-1), %o2 - - - -LOC(2.15): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits -3 - bl LOC(3.13) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -5 - bl LOC(4.11) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2+1), %o2 - -LOC(4.11): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2-1), %o2 - - -LOC(3.13): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -7 - bl LOC(4.9) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2+1), %o2 - -LOC(4.9): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2-1), %o2 - - - - - 9: -LOC(end_regular_divide): - subcc %o4, 1, %o4 - bge LOC(divloop) - tst %o3 - bl,a LOC(got_result) - ! non-restoring fixup here (one instruction only!) - sub %o2, 1, %o2 - - -LOC(got_result): - - retl - mov %o2, %o0 - -END(.udiv) - -#endif diff --git a/mdk-stage1/dietlibc/sparc/umul.S b/mdk-stage1/dietlibc/sparc/umul.S deleted file mode 100644 index 15038ab2a..000000000 --- a/mdk-stage1/dietlibc/sparc/umul.S +++ /dev/null @@ -1,170 +0,0 @@ -#ifdef __sparc__ -/* - * Unsigned multiply. Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the - * upper 32 bits of the 64-bit product). - * - * This code optimizes short (less than 13-bit) multiplies. Short - * multiplies require 25 instruction cycles, and long ones require - * 45 instruction cycles. - * - * On return, overflow has occurred (%o1 is not zero) if and only if - * the Z condition code is clear, allowing, e.g., the following: - * - * call .umul - * nop - * bnz overflow (or tnz) - */ - -#define C_LABEL(name) name: - -#define C_SYMBOL_NAME(name) name - -#define ENTRY(name) \ - .global C_SYMBOL_NAME(name); \ - .align 4;\ - C_LABEL(name);\ - .type name,@function; - -#define LOC(name) . ## L ## name - -#define END(name) \ - .size name, . - name - -ENTRY(.umul) - or %o0, %o1, %o4 - mov %o0, %y ! multiplier -> Y - andncc %o4, 0xfff, %g0 ! test bits 12..31 of *both* args - be LOC(mul_shortway) ! if zero, can do it the short way - andcc %g0, %g0, %o4 ! zero the partial product; clear N & V - - /* - * Long multiply. 32 steps, followed by a final shift step. - */ - mulscc %o4, %o1, %o4 ! 1 - mulscc %o4, %o1, %o4 ! 2 - mulscc %o4, %o1, %o4 ! 3 - mulscc %o4, %o1, %o4 ! 4 - mulscc %o4, %o1, %o4 ! 5 - mulscc %o4, %o1, %o4 ! 6 - mulscc %o4, %o1, %o4 ! 7 - mulscc %o4, %o1, %o4 ! 8 - mulscc %o4, %o1, %o4 ! 9 - mulscc %o4, %o1, %o4 ! 10 - mulscc %o4, %o1, %o4 ! 11 - mulscc %o4, %o1, %o4 ! 12 - mulscc %o4, %o1, %o4 ! 13 - mulscc %o4, %o1, %o4 ! 14 - mulscc %o4, %o1, %o4 ! 15 - mulscc %o4, %o1, %o4 ! 16 - mulscc %o4, %o1, %o4 ! 17 - mulscc %o4, %o1, %o4 ! 18 - mulscc %o4, %o1, %o4 ! 19 - mulscc %o4, %o1, %o4 ! 20 - mulscc %o4, %o1, %o4 ! 21 - mulscc %o4, %o1, %o4 ! 22 - mulscc %o4, %o1, %o4 ! 23 - mulscc %o4, %o1, %o4 ! 24 - mulscc %o4, %o1, %o4 ! 25 - mulscc %o4, %o1, %o4 ! 26 - mulscc %o4, %o1, %o4 ! 27 - mulscc %o4, %o1, %o4 ! 28 - mulscc %o4, %o1, %o4 ! 29 - mulscc %o4, %o1, %o4 ! 30 - mulscc %o4, %o1, %o4 ! 31 - mulscc %o4, %o1, %o4 ! 32 - mulscc %o4, %g0, %o4 ! final shift - - /* - * Normally, with the shift-and-add approach, if both numbers are - * positive you get the correct result. With 32-bit two's-complement - * numbers, -x is represented as - * - * x 32 - * ( 2 - ------ ) mod 2 * 2 - * 32 - * 2 - * - * (the `mod 2' subtracts 1 from 1.bbbb). To avoid lots of 2^32s, - * we can treat this as if the radix point were just to the left - * of the sign bit (multiply by 2^32), and get - * - * -x = (2 - x) mod 2 - * - * Then, ignoring the `mod 2's for convenience: - * - * x * y = xy - * -x * y = 2y - xy - * x * -y = 2x - xy - * -x * -y = 4 - 2x - 2y + xy - * - * For signed multiplies, we subtract (x << 32) from the partial - * product to fix this problem for negative multipliers (see mul.s). - * Because of the way the shift into the partial product is calculated - * (N xor V), this term is automatically removed for the multiplicand, - * so we don't have to adjust. - * - * But for unsigned multiplies, the high order bit wasn't a sign bit, - * and the correction is wrong. So for unsigned multiplies where the - * high order bit is one, we end up with xy - (y << 32). To fix it - * we add y << 32. - */ -#if 0 - tst %o1 - bl,a 1f ! if %o1 < 0 (high order bit = 1), - add %o4, %o0, %o4 ! %o4 += %o0 (add y to upper half) -1: rd %y, %o0 ! get lower half of product - retl - addcc %o4, %g0, %o1 ! put upper half in place and set Z for %o1==0 -#else - /* Faster code from tege@sics.se. */ - sra %o1, 31, %o2 ! make mask from sign bit - and %o0, %o2, %o2 ! %o2 = 0 or %o0, depending on sign of %o1 - rd %y, %o0 ! get lower half of product - retl - addcc %o4, %o2, %o1 ! add compensation and put upper half in place -#endif - -LOC(mul_shortway): - /* - * Short multiply. 12 steps, followed by a final shift step. - * The resulting bits are off by 12 and (32-12) = 20 bit positions, - * but there is no problem with %o0 being negative (unlike above), - * and overflow is impossible (the answer is at most 24 bits long). - */ - mulscc %o4, %o1, %o4 ! 1 - mulscc %o4, %o1, %o4 ! 2 - mulscc %o4, %o1, %o4 ! 3 - mulscc %o4, %o1, %o4 ! 4 - mulscc %o4, %o1, %o4 ! 5 - mulscc %o4, %o1, %o4 ! 6 - mulscc %o4, %o1, %o4 ! 7 - mulscc %o4, %o1, %o4 ! 8 - mulscc %o4, %o1, %o4 ! 9 - mulscc %o4, %o1, %o4 ! 10 - mulscc %o4, %o1, %o4 ! 11 - mulscc %o4, %o1, %o4 ! 12 - mulscc %o4, %g0, %o4 ! final shift - - /* - * %o4 has 20 of the bits that should be in the result; %y has - * the bottom 12 (as %y's top 12). That is: - * - * %o4 %y - * +----------------+----------------+ - * | -12- | -20- | -12- | -20- | - * +------(---------+------)---------+ - * -----result----- - * - * The 12 bits of %o4 left of the `result' area are all zero; - * in fact, all top 20 bits of %o4 are zero. - */ - - rd %y, %o5 - sll %o4, 12, %o0 ! shift middle bits left 12 - srl %o5, 20, %o5 ! shift low bits right 20 - or %o5, %o0, %o0 - retl - addcc %g0, %g0, %o1 ! %o1 = zero, and set Z - -END(.umul) -#endif diff --git a/mdk-stage1/dietlibc/sparc/unified.S b/mdk-stage1/dietlibc/sparc/unified.S deleted file mode 100644 index 3cd609da5..000000000 --- a/mdk-stage1/dietlibc/sparc/unified.S +++ /dev/null @@ -1,28 +0,0 @@ -#include - -.text -.global __unified_syscall -__unified_syscall: - ta 0x10 - - bcc 1f - save %sp, -104, %sp - - neg %i0, %i0 -1: - add %i0, 0xff, %l2 - cmp %l2, 0xfe - bgu 2f - neg %i0, %l3 -#ifdef WANT_THREAD_SAVE - call __errno_location - nop -#else - sethi %hi(errno), %o0 - or %o0, %lo(errno), %o0 -#endif - st %l3, [ %o0 ] - mov -1, %i0 -2: - ret - restore diff --git a/mdk-stage1/dietlibc/sparc/urem.S b/mdk-stage1/dietlibc/sparc/urem.S deleted file mode 100644 index 943cb7873..000000000 --- a/mdk-stage1/dietlibc/sparc/urem.S +++ /dev/null @@ -1,362 +0,0 @@ -#ifdef __sparc__ - /* This file is generated from divrem.m4; DO NOT EDIT! */ -/* - * Division and remainder, from Appendix E of the Sparc Version 8 - * Architecture Manual, with fixes from Gordon Irlam. - */ - -/* - * Input: dividend and divisor in %o0 and %o1 respectively. - * - * m4 parameters: - * .urem name of function to generate - * rem rem=div => %o0 / %o1; rem=rem => %o0 % %o1 - * false false=true => signed; false=false => unsigned - * - * Algorithm parameters: - * N how many bits per iteration we try to get (4) - * WORDSIZE total number of bits (32) - * - * Derived constants: - * TOPBITS number of bits in the top decade of a number - * - * Important variables: - * Q the partial quotient under development (initially 0) - * R the remainder so far, initially the dividend - * ITER number of main division loop iterations required; - * equal to ceil(log2(quotient) / N). Note that this - * is the log base (2^N) of the quotient. - * V the current comparand, initially divisor*2^(ITER*N-1) - * - * Cost: - * Current estimate for non-large dividend is - * ceil(log2(quotient) / N) * (10 + 7N/2) + C - * A large dividend is one greater than 2^(31-TOPBITS) and takes a - * different path, as the upper bits of the quotient must be developed - * one bit at a time. - */ - - - -#define C_LABEL(name) name: - -#define C_SYMBOL_NAME(name) name - -#define ENTRY(name) \ - .global C_SYMBOL_NAME(name); \ - .align 4;\ - C_LABEL(name);\ - .type name,@function; - -#define LOC(name) . ## L ## name - -#define END(name) \ - .size name, . - name - -#define ST_DIV0 0x02 - -ENTRY(.urem) - - ! Ready to divide. Compute size of quotient; scale comparand. - orcc %o1, %g0, %o5 - bne 1f - mov %o0, %o3 - - ! Divide by zero trap. If it returns, return 0 (about as - ! wrong as possible, but that is what SunOS does...). - ta ST_DIV0 - retl - clr %o0 - -1: - cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu LOC(got_result) ! (and algorithm fails otherwise) - clr %o2 - sethi %hi(1 << (32 - 4 - 1)), %g1 - cmp %o3, %g1 - blu LOC(not_really_big) - clr %o4 - - ! Here the dividend is >= 2**(31-N) or so. We must be careful here, - ! as our usual N-at-a-shot divide step will cause overflow and havoc. - ! The number of bits in the result here is N*ITER+SC, where SC <= N. - ! Compute ITER in an unorthodox manner: know we need to shift V into - ! the top decade: so do not even bother to compare to R. - 1: - cmp %o5, %g1 - bgeu 3f - mov 1, %g2 - sll %o5, 4, %o5 - b 1b - add %o4, 1, %o4 - - ! Now compute %g2. - 2: addcc %o5, %o5, %o5 - bcc LOC(not_too_big) - add %g2, 1, %g2 - - ! We get here if the %o1 overflowed while shifting. - ! This means that %o3 has the high-order bit set. - ! Restore %o5 and subtract from %o3. - sll %g1, 4, %g1 ! high order bit - srl %o5, 1, %o5 ! rest of %o5 - add %o5, %g1, %o5 - b LOC(do_single_div) - sub %g2, 1, %g2 - - LOC(not_too_big): - 3: cmp %o5, %o3 - blu 2b - nop - be LOC(do_single_div) - nop - /* NB: these are commented out in the V8-Sparc manual as well */ - /* (I do not understand this) */ - ! %o5 > %o3: went too far: back up 1 step - ! srl %o5, 1, %o5 - ! dec %g2 - ! do single-bit divide steps - ! - ! We have to be careful here. We know that %o3 >= %o5, so we can do the - ! first divide step without thinking. BUT, the others are conditional, - ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- - ! order bit set in the first step, just falling into the regular - ! division loop will mess up the first time around. - ! So we unroll slightly... - LOC(do_single_div): - subcc %g2, 1, %g2 - bl LOC(end_regular_divide) - nop - sub %o3, %o5, %o3 - mov 1, %o2 - b LOC(end_single_divloop) - nop - LOC(single_divloop): - sll %o2, 1, %o2 - bl 1f - srl %o5, 1, %o5 - ! %o3 >= 0 - sub %o3, %o5, %o3 - b 2f - add %o2, 1, %o2 - 1: ! %o3 < 0 - add %o3, %o5, %o3 - sub %o2, 1, %o2 - 2: - LOC(end_single_divloop): - subcc %g2, 1, %g2 - bge LOC(single_divloop) - tst %o3 - b,a LOC(end_regular_divide) - -LOC(not_really_big): -1: - sll %o5, 4, %o5 - cmp %o5, %o3 - bleu 1b - addcc %o4, 1, %o4 - be LOC(got_result) - sub %o4, 1, %o4 - - tst %o3 ! set up for initial iteration -LOC(divloop): - sll %o2, 4, %o2 - ! depth 1, accumulated bits 0 - bl LOC(1.16) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 2, accumulated bits 1 - bl LOC(2.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits 3 - bl LOC(3.19) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 7 - bl LOC(4.23) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (7*2+1), %o2 - -LOC(4.23): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (7*2-1), %o2 - - -LOC(3.19): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 5 - bl LOC(4.21) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (5*2+1), %o2 - -LOC(4.21): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (5*2-1), %o2 - - - -LOC(2.17): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits 1 - bl LOC(3.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 3 - bl LOC(4.19) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (3*2+1), %o2 - -LOC(4.19): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (3*2-1), %o2 - - -LOC(3.17): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 1 - bl LOC(4.17) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (1*2+1), %o2 - -LOC(4.17): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (1*2-1), %o2 - - - - -LOC(1.16): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 2, accumulated bits -1 - bl LOC(2.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits -1 - bl LOC(3.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -1 - bl LOC(4.15) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2+1), %o2 - -LOC(4.15): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2-1), %o2 - - -LOC(3.15): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -3 - bl LOC(4.13) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2+1), %o2 - -LOC(4.13): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2-1), %o2 - - - -LOC(2.15): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits -3 - bl LOC(3.13) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -5 - bl LOC(4.11) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2+1), %o2 - -LOC(4.11): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2-1), %o2 - - -LOC(3.13): - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -7 - bl LOC(4.9) - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2+1), %o2 - -LOC(4.9): - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2-1), %o2 - - - - - 9: -LOC(end_regular_divide): - subcc %o4, 1, %o4 - bge LOC(divloop) - tst %o3 - bl,a LOC(got_result) - ! non-restoring fixup here (one instruction only!) - add %o3, %o1, %o3 - - -LOC(got_result): - - retl - mov %o3, %o0 - -END(.urem) -#endif diff --git a/mdk-stage1/dietlibc/start.h b/mdk-stage1/dietlibc/start.h deleted file mode 100644 index 7f9e6be28..000000000 --- a/mdk-stage1/dietlibc/start.h +++ /dev/null @@ -1,14 +0,0 @@ -.section ".bss" -.align 8 - -.weak errno -errno: -.global __errno -__errno: - .long 0 - -.weak environ -environ: -.global __environ -__environ: - .long 0 diff --git a/mdk-stage1/dietlibc/syscalls.c/_llseek.c b/mdk-stage1/dietlibc/syscalls.c/_llseek.c deleted file mode 100644 index fdf49eba5..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/_llseek.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include -#include "syscalls.h" - -_syscall5(int,_llseek,uint,fd,ulong,hi,ulong,lo,loff_t*,res,uint,wh); diff --git a/mdk-stage1/dietlibc/syscalls.c/_newselect.c b/mdk-stage1/dietlibc/syscalls.c/_newselect.c deleted file mode 100644 index cb42193bd..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/_newselect.c +++ /dev/null @@ -1,6 +0,0 @@ -#include -#include -#include "syscalls.h" - -_syscall5(int,_newselect,int,n,fd_set *,rd,fd_set *,wr,fd_set *,ex,struct timeval *,timeval); - diff --git a/mdk-stage1/dietlibc/syscalls.c/access.c b/mdk-stage1/dietlibc/syscalls.c/access.c deleted file mode 100644 index 80944733a..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/access.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,access,const char*,pathname,int,mode) diff --git a/mdk-stage1/dietlibc/syscalls.c/chdir.c b/mdk-stage1/dietlibc/syscalls.c/chdir.c deleted file mode 100644 index a679f528d..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/chdir.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,chdir,void*,path) diff --git a/mdk-stage1/dietlibc/syscalls.c/chmod.c b/mdk-stage1/dietlibc/syscalls.c/chmod.c deleted file mode 100644 index 80ad33b40..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/chmod.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,chmod,const char * ,path,mode_t,mode) - diff --git a/mdk-stage1/dietlibc/syscalls.c/chown.c b/mdk-stage1/dietlibc/syscalls.c/chown.c deleted file mode 100644 index 5a9352684..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/chown.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall3(int,chown,char*,path,uid_t,owner,gid_t,group) - diff --git a/mdk-stage1/dietlibc/syscalls.c/chroot.c b/mdk-stage1/dietlibc/syscalls.c/chroot.c deleted file mode 100644 index ab39f7ebe..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/chroot.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,chroot,void*,path) - diff --git a/mdk-stage1/dietlibc/syscalls.c/clone.c b/mdk-stage1/dietlibc/syscalls.c/clone.c deleted file mode 100644 index 985eee4c8..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/clone.c +++ /dev/null @@ -1 +0,0 @@ -#warning "No CLONE support yet" diff --git a/mdk-stage1/dietlibc/syscalls.c/close.c b/mdk-stage1/dietlibc/syscalls.c/close.c deleted file mode 100644 index a7d7f0076..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/close.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,close,int,fd) diff --git a/mdk-stage1/dietlibc/syscalls.c/dup.c b/mdk-stage1/dietlibc/syscalls.c/dup.c deleted file mode 100644 index 9c28f0bd6..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/dup.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,dup,int,fd) - diff --git a/mdk-stage1/dietlibc/syscalls.c/dup2.c b/mdk-stage1/dietlibc/syscalls.c/dup2.c deleted file mode 100644 index 399314aa8..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/dup2.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,dup2,int,one,int,two) - diff --git a/mdk-stage1/dietlibc/syscalls.c/execve.c b/mdk-stage1/dietlibc/syscalls.c/execve.c deleted file mode 100644 index c2bac0117..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/execve.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,execve,const char *,fn,void *,argv,void *,envp) - diff --git a/mdk-stage1/dietlibc/syscalls.c/exit.c b/mdk-stage1/dietlibc/syscalls.c/exit.c deleted file mode 100644 index 87087c939..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/exit.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,exit,int,exitcode) diff --git a/mdk-stage1/dietlibc/syscalls.c/fchdir.c b/mdk-stage1/dietlibc/syscalls.c/fchdir.c deleted file mode 100644 index b3a41dc7a..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/fchdir.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,fchdir,int,fd) diff --git a/mdk-stage1/dietlibc/syscalls.c/fchmod.c b/mdk-stage1/dietlibc/syscalls.c/fchmod.c deleted file mode 100644 index 09e52b6c7..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/fchmod.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,fchmod,int,filedes,mode_t,mode) - diff --git a/mdk-stage1/dietlibc/syscalls.c/fchown.c b/mdk-stage1/dietlibc/syscalls.c/fchown.c deleted file mode 100644 index 58923a137..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/fchown.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall3(int,fchown,int,fd,uid_t,owner,gid_t,group) - diff --git a/mdk-stage1/dietlibc/syscalls.c/fcntl.c b/mdk-stage1/dietlibc/syscalls.c/fcntl.c deleted file mode 100644 index b21be9531..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/fcntl.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,fcntl,int,fd,int,cmd,long,arg) - diff --git a/mdk-stage1/dietlibc/syscalls.c/flock.c b/mdk-stage1/dietlibc/syscalls.c/flock.c deleted file mode 100644 index 6fcb336ef..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/flock.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,flock,int,fd,int,op) - diff --git a/mdk-stage1/dietlibc/syscalls.c/fork.c b/mdk-stage1/dietlibc/syscalls.c/fork.c deleted file mode 100644 index 1d4b892b6..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/fork.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "syscalls.h" - -#ifndef __sparc__ - -_syscall0(int,fork) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.c/fsync.c b/mdk-stage1/dietlibc/syscalls.c/fsync.c deleted file mode 100644 index db6198b8a..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/fsync.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,fsync,int,fd) - diff --git a/mdk-stage1/dietlibc/syscalls.c/ftruncate.c b/mdk-stage1/dietlibc/syscalls.c/ftruncate.c deleted file mode 100644 index 5f002a899..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/ftruncate.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,ftruncate,int,fd,off_t,length) diff --git a/mdk-stage1/dietlibc/syscalls.c/getcwd.c b/mdk-stage1/dietlibc/syscalls.c/getcwd.c deleted file mode 100644 index 9e5e4a3e2..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getcwd.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -/* this syscall exists since Linux 2.1.92 */ - -_syscall2(int,getcwd,char*,buf,unsigned long,size) diff --git a/mdk-stage1/dietlibc/syscalls.c/getdents.c b/mdk-stage1/dietlibc/syscalls.c/getdents.c deleted file mode 100644 index be941b21e..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getdents.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall3(int, getdents, unsigned int, fd, void *, dirp, unsigned int, count); - diff --git a/mdk-stage1/dietlibc/syscalls.c/getegid.c b/mdk-stage1/dietlibc/syscalls.c/getegid.c deleted file mode 100644 index 3213d640c..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getegid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall0(gid_t,getegid) diff --git a/mdk-stage1/dietlibc/syscalls.c/geteuid.c b/mdk-stage1/dietlibc/syscalls.c/geteuid.c deleted file mode 100644 index 5b31a3cca..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/geteuid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall0(uid_t,geteuid) diff --git a/mdk-stage1/dietlibc/syscalls.c/getgid.c b/mdk-stage1/dietlibc/syscalls.c/getgid.c deleted file mode 100644 index 2f7d96286..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getgid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall0(gid_t,getgid) diff --git a/mdk-stage1/dietlibc/syscalls.c/getgroups.c b/mdk-stage1/dietlibc/syscalls.c/getgroups.c deleted file mode 100644 index 3e4d6797a..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getgroups.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,getgroups,int,size,int*,list) diff --git a/mdk-stage1/dietlibc/syscalls.c/getpgid.c b/mdk-stage1/dietlibc/syscalls.c/getpgid.c deleted file mode 100644 index 0b4ff528b..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getpgid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall1(pid_t,getpgid,pid_t,pid) diff --git a/mdk-stage1/dietlibc/syscalls.c/getpid.c b/mdk-stage1/dietlibc/syscalls.c/getpid.c deleted file mode 100644 index d60a8db9a..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getpid.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall0(int,getpid) diff --git a/mdk-stage1/dietlibc/syscalls.c/getppid.c b/mdk-stage1/dietlibc/syscalls.c/getppid.c deleted file mode 100644 index ee87a8eae..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getppid.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall0(int,getppid) diff --git a/mdk-stage1/dietlibc/syscalls.c/getpriority.c b/mdk-stage1/dietlibc/syscalls.c/getpriority.c deleted file mode 100644 index 6f94bcf42..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getpriority.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,getpriority,int,which,int,who) - diff --git a/mdk-stage1/dietlibc/syscalls.c/getresgid.c b/mdk-stage1/dietlibc/syscalls.c/getresgid.c deleted file mode 100644 index 264ec7dce..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getresgid.c +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include "syscalls.h" - -#ifdef __NR_getresgid - -_syscall3(int,getresgid,gid_t*,rgid,gid_t*,egid,gid_t*,sgid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.c/getresuid.c b/mdk-stage1/dietlibc/syscalls.c/getresuid.c deleted file mode 100644 index 74e2daec2..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getresuid.c +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include "syscalls.h" - -#ifdef __getresuid - -_syscall3(int,getresuid,uid_t*,ruid,uid_t*,euid,uid_t*,suid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.c/getrlimit.c b/mdk-stage1/dietlibc/syscalls.c/getrlimit.c deleted file mode 100644 index 635b2baf4..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getrlimit.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,getrlimit,int,resource,void*,rlim) diff --git a/mdk-stage1/dietlibc/syscalls.c/getrusage.c b/mdk-stage1/dietlibc/syscalls.c/getrusage.c deleted file mode 100644 index 815d3e617..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getrusage.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,getrusage,int,who,void*,rusage) diff --git a/mdk-stage1/dietlibc/syscalls.c/getsid.c b/mdk-stage1/dietlibc/syscalls.c/getsid.c deleted file mode 100644 index 69974c36c..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getsid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall1(pid_t,getsid,pid_t,pid) diff --git a/mdk-stage1/dietlibc/syscalls.c/gettimeofday.c b/mdk-stage1/dietlibc/syscalls.c/gettimeofday.c deleted file mode 100644 index 5f4931a0c..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/gettimeofday.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include -#include "syscalls.h" - -_syscall2(int,gettimeofday,struct timeval *,tv,void *,tz) diff --git a/mdk-stage1/dietlibc/syscalls.c/getuid.c b/mdk-stage1/dietlibc/syscalls.c/getuid.c deleted file mode 100644 index bf38447a6..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/getuid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall0(uid_t,getuid) diff --git a/mdk-stage1/dietlibc/syscalls.c/ioctl.c b/mdk-stage1/dietlibc/syscalls.c/ioctl.c deleted file mode 100644 index 1612109d3..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/ioctl.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,ioctl,int,fd,int,request,void *,argp) - diff --git a/mdk-stage1/dietlibc/syscalls.c/kill.c b/mdk-stage1/dietlibc/syscalls.c/kill.c deleted file mode 100644 index e56b0ac1b..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/kill.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,kill,pid_t,pid,int,sig) diff --git a/mdk-stage1/dietlibc/syscalls.c/lchown.c b/mdk-stage1/dietlibc/syscalls.c/lchown.c deleted file mode 100644 index 976d2ee1f..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/lchown.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall3(int,lchown,char*,path,uid_t,owner,gid_t,group) - diff --git a/mdk-stage1/dietlibc/syscalls.c/link.c b/mdk-stage1/dietlibc/syscalls.c/link.c deleted file mode 100644 index ab9b427d9..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/link.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,link,const char *,a,const char *,b) - diff --git a/mdk-stage1/dietlibc/syscalls.c/lseek.c b/mdk-stage1/dietlibc/syscalls.c/lseek.c deleted file mode 100644 index 9925a2185..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/lseek.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall3(unsigned long,lseek,int,fd,unsigned long,offset,int,whence) - diff --git a/mdk-stage1/dietlibc/syscalls.c/mkdir.c b/mdk-stage1/dietlibc/syscalls.c/mkdir.c deleted file mode 100644 index aac682c99..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/mkdir.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,mkdir,void*,path,mode_t,mode) diff --git a/mdk-stage1/dietlibc/syscalls.c/mknod.c b/mdk-stage1/dietlibc/syscalls.c/mknod.c deleted file mode 100644 index 00e836b73..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/mknod.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall3(int,mknod,const char*,pathname,mode_t,mode,dev_t,dev) - diff --git a/mdk-stage1/dietlibc/syscalls.c/mount.c b/mdk-stage1/dietlibc/syscalls.c/mount.c deleted file mode 100644 index 2d71ee812..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/mount.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall5(int,mount,const char *,spec,const char *,dir,const char *,type,unsigned long,rwflag,const void *,data); - diff --git a/mdk-stage1/dietlibc/syscalls.c/mprotect.c b/mdk-stage1/dietlibc/syscalls.c/mprotect.c deleted file mode 100644 index 634a12089..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/mprotect.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall3(int,mprotect,const void *,addr, size_t, len, int, prot) diff --git a/mdk-stage1/dietlibc/syscalls.c/mremap.c b/mdk-stage1/dietlibc/syscalls.c/mremap.c deleted file mode 100644 index 37d066bac..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/mremap.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall4(int,mremap,void*,old_address,size_t,old_size,size_t,new_size,unsigned long,flags) - diff --git a/mdk-stage1/dietlibc/syscalls.c/munmap.c b/mdk-stage1/dietlibc/syscalls.c/munmap.c deleted file mode 100644 index 40bc98270..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/munmap.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,munmap,void*,start,size_t,len) - diff --git a/mdk-stage1/dietlibc/syscalls.c/nanosleep.c b/mdk-stage1/dietlibc/syscalls.c/nanosleep.c deleted file mode 100644 index 71aca1f09..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/nanosleep.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include -#include "syscalls.h" - -_syscall2(int,nanosleep,struct timeval *,in,struct timeval *,out) diff --git a/mdk-stage1/dietlibc/syscalls.c/open.c b/mdk-stage1/dietlibc/syscalls.c/open.c deleted file mode 100644 index 8b3ccfcc3..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/open.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall3(int,open,const char *,fn,int,flags,mode_t,mode) diff --git a/mdk-stage1/dietlibc/syscalls.c/pipe.c b/mdk-stage1/dietlibc/syscalls.c/pipe.c deleted file mode 100644 index 42197c881..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/pipe.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall1(int,pipe,int *,filedes) diff --git a/mdk-stage1/dietlibc/syscalls.c/poll.c b/mdk-stage1/dietlibc/syscalls.c/poll.c deleted file mode 100644 index 10d0d1f78..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/poll.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall3(int,poll,void *,ufds,int,nfds,int,timeout) diff --git a/mdk-stage1/dietlibc/syscalls.c/read.c b/mdk-stage1/dietlibc/syscalls.c/read.c deleted file mode 100644 index f5532054e..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/read.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,read,int,fd,const char *,buf,unsigned long,count) diff --git a/mdk-stage1/dietlibc/syscalls.c/readlink.c b/mdk-stage1/dietlibc/syscalls.c/readlink.c deleted file mode 100644 index 482f8fe27..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/readlink.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" -#include - -_syscall3(int,readlink,char*,path,char*,buf,size_t,bufsiz) - diff --git a/mdk-stage1/dietlibc/syscalls.c/reboot.c b/mdk-stage1/dietlibc/syscalls.c/reboot.c deleted file mode 100644 index 0ad474894..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/reboot.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,reboot,int,magic,int,magic_too,int,flag) - diff --git a/mdk-stage1/dietlibc/syscalls.c/rename.c b/mdk-stage1/dietlibc/syscalls.c/rename.c deleted file mode 100644 index f86d50728..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/rename.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,rename,char*,oldpath,char*,newpath) - diff --git a/mdk-stage1/dietlibc/syscalls.c/rmdir.c b/mdk-stage1/dietlibc/syscalls.c/rmdir.c deleted file mode 100644 index 303885264..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/rmdir.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,rmdir,void*,path) diff --git a/mdk-stage1/dietlibc/syscalls.c/setdomainname.c b/mdk-stage1/dietlibc/syscalls.c/setdomainname.c deleted file mode 100644 index 83d3aa8b8..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setdomainname.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,setdomainname,const char *,name,int,len) - diff --git a/mdk-stage1/dietlibc/syscalls.c/setgid.c b/mdk-stage1/dietlibc/syscalls.c/setgid.c deleted file mode 100644 index 1f7263aeb..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setgid.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,setgid,int,gid) diff --git a/mdk-stage1/dietlibc/syscalls.c/setgroups.c b/mdk-stage1/dietlibc/syscalls.c/setgroups.c deleted file mode 100644 index fed3b85c1..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setgroups.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,setgroups,int,size,const int*,list) - diff --git a/mdk-stage1/dietlibc/syscalls.c/sethostname.c b/mdk-stage1/dietlibc/syscalls.c/sethostname.c deleted file mode 100644 index e4b736f87..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/sethostname.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,sethostname,const char *,name,int,len) - diff --git a/mdk-stage1/dietlibc/syscalls.c/setitimer.c b/mdk-stage1/dietlibc/syscalls.c/setitimer.c deleted file mode 100644 index 28935cab7..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setitimer.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,setitimer,int,which,void *,value,void *,ovalue) - diff --git a/mdk-stage1/dietlibc/syscalls.c/setpgid.c b/mdk-stage1/dietlibc/syscalls.c/setpgid.c deleted file mode 100644 index 66fbf82dd..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setpgid.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,setpgid,int,name,int,len) diff --git a/mdk-stage1/dietlibc/syscalls.c/setpriority.c b/mdk-stage1/dietlibc/syscalls.c/setpriority.c deleted file mode 100644 index bc04227d2..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setpriority.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,setpriority,int,which,int,who,int,prio) - diff --git a/mdk-stage1/dietlibc/syscalls.c/setregid.c b/mdk-stage1/dietlibc/syscalls.c/setregid.c deleted file mode 100644 index c6911aca8..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setregid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,setregid,gid_t,rgid,gid_t,egid) diff --git a/mdk-stage1/dietlibc/syscalls.c/setresgid.c b/mdk-stage1/dietlibc/syscalls.c/setresgid.c deleted file mode 100644 index 817fd2942..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setresgid.c +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include "syscalls.h" - -#ifdef __NR_setresgid - -_syscall3(int,setresgid,gid_t*,rgid,gid_t*,egid,gid_t*,sgid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.c/setresuid.c b/mdk-stage1/dietlibc/syscalls.c/setresuid.c deleted file mode 100644 index 7073d8ac2..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setresuid.c +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include "syscalls.h" - -#ifdef __NR_setresuid - -_syscall3(int,setresuid,uid_t*,ruid,uid_t*,euid,uid_t*,suid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.c/setreuid.c b/mdk-stage1/dietlibc/syscalls.c/setreuid.c deleted file mode 100644 index c0c23a12d..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setreuid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,setreuid,uid_t,ruid,uid_t,euid) diff --git a/mdk-stage1/dietlibc/syscalls.c/setrlimit.c b/mdk-stage1/dietlibc/syscalls.c/setrlimit.c deleted file mode 100644 index 213234282..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setrlimit.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,setrlimit,int,resource,void*,rlim) diff --git a/mdk-stage1/dietlibc/syscalls.c/setsid.c b/mdk-stage1/dietlibc/syscalls.c/setsid.c deleted file mode 100644 index 4b35a1316..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setsid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall0(pid_t,setsid) diff --git a/mdk-stage1/dietlibc/syscalls.c/setuid.c b/mdk-stage1/dietlibc/syscalls.c/setuid.c deleted file mode 100644 index 620876c9f..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/setuid.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,setuid,int,uid) diff --git a/mdk-stage1/dietlibc/syscalls.c/sigaction.c b/mdk-stage1/dietlibc/syscalls.c/sigaction.c deleted file mode 100644 index cfa5c683f..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/sigaction.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,sigaction,int,signum,void*,act,void*,oldact) diff --git a/mdk-stage1/dietlibc/syscalls.c/signal.c b/mdk-stage1/dietlibc/syscalls.c/signal.c deleted file mode 100644 index 1a913be45..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/signal.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,signal,int,num,void *,len) diff --git a/mdk-stage1/dietlibc/syscalls.c/sigpending.c b/mdk-stage1/dietlibc/syscalls.c/sigpending.c deleted file mode 100644 index 08fb23991..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/sigpending.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,sigpending,void*,set) diff --git a/mdk-stage1/dietlibc/syscalls.c/sigprocmask.c b/mdk-stage1/dietlibc/syscalls.c/sigprocmask.c deleted file mode 100644 index e9dcc2d67..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/sigprocmask.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,sigprocmask,int,how,void*,set,void*,oldset) diff --git a/mdk-stage1/dietlibc/syscalls.c/sigsuspend.c b/mdk-stage1/dietlibc/syscalls.c/sigsuspend.c deleted file mode 100644 index 0fe90e623..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/sigsuspend.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,sigsuspend,void*,mask) diff --git a/mdk-stage1/dietlibc/syscalls.c/socketcall.c b/mdk-stage1/dietlibc/syscalls.c/socketcall.c deleted file mode 100644 index eee1ae86d..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/socketcall.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,socketcall,int,code,unsigned long *, args) diff --git a/mdk-stage1/dietlibc/syscalls.c/swapoff.c b/mdk-stage1/dietlibc/syscalls.c/swapoff.c deleted file mode 100644 index e1daa89a9..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/swapoff.c +++ /dev/null @@ -1,4 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,swapoff,const char *,fn) - diff --git a/mdk-stage1/dietlibc/syscalls.c/swapon.c b/mdk-stage1/dietlibc/syscalls.c/swapon.c deleted file mode 100644 index 543e41e79..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/swapon.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,swapon,const char*,path,int,swapflags) diff --git a/mdk-stage1/dietlibc/syscalls.c/symlink.c b/mdk-stage1/dietlibc/syscalls.c/symlink.c deleted file mode 100644 index b3f4d0b1c..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/symlink.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,symlink,const char *,a,const char *,b) diff --git a/mdk-stage1/dietlibc/syscalls.c/sync.c b/mdk-stage1/dietlibc/syscalls.c/sync.c deleted file mode 100644 index cca17461f..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/sync.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall0(int,sync) diff --git a/mdk-stage1/dietlibc/syscalls.c/syslog.c b/mdk-stage1/dietlibc/syscalls.c/syslog.c deleted file mode 100644 index aace870ea..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/syslog.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,syslog,int, type, char *, buf, int, len); diff --git a/mdk-stage1/dietlibc/syscalls.c/time.c b/mdk-stage1/dietlibc/syscalls.c/time.c deleted file mode 100644 index dc15b28f9..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/time.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall1(time_t,time,time_t*,path) diff --git a/mdk-stage1/dietlibc/syscalls.c/truncate.c b/mdk-stage1/dietlibc/syscalls.c/truncate.c deleted file mode 100644 index 721bd7134..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/truncate.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall2(int,truncate,const char*,path,off_t,length) diff --git a/mdk-stage1/dietlibc/syscalls.c/umask.c b/mdk-stage1/dietlibc/syscalls.c/umask.c deleted file mode 100644 index 506038243..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/umask.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall1(int,umask,mode_t,mask) - diff --git a/mdk-stage1/dietlibc/syscalls.c/umount.c b/mdk-stage1/dietlibc/syscalls.c/umount.c deleted file mode 100644 index 4d3ef7637..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/umount.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,umount,const char *,dir) diff --git a/mdk-stage1/dietlibc/syscalls.c/uname.c b/mdk-stage1/dietlibc/syscalls.c/uname.c deleted file mode 100644 index 68f135007..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/uname.c +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include "syscalls.h" - -_syscall1(int,uname,void *,utsname) - diff --git a/mdk-stage1/dietlibc/syscalls.c/unlink.c b/mdk-stage1/dietlibc/syscalls.c/unlink.c deleted file mode 100644 index 860ccebbf..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/unlink.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall1(int,unlink,const char *,fn) diff --git a/mdk-stage1/dietlibc/syscalls.c/utime.c b/mdk-stage1/dietlibc/syscalls.c/utime.c deleted file mode 100644 index 185bdf9e8..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/utime.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall2(int,utime,void*,filename,void*,buf) diff --git a/mdk-stage1/dietlibc/syscalls.c/vhangup.c b/mdk-stage1/dietlibc/syscalls.c/vhangup.c deleted file mode 100644 index bb0669765..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/vhangup.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall0(int,vhangup) diff --git a/mdk-stage1/dietlibc/syscalls.c/wait4.c b/mdk-stage1/dietlibc/syscalls.c/wait4.c deleted file mode 100644 index 4ae7eabcd..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/wait4.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall4(int,wait4,pid_t,pid,int *,status,int,opts,void *,rusage) diff --git a/mdk-stage1/dietlibc/syscalls.c/waitpid.c b/mdk-stage1/dietlibc/syscalls.c/waitpid.c deleted file mode 100644 index b7167f9ce..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/waitpid.c +++ /dev/null @@ -1,4 +0,0 @@ -#include -#include "syscalls.h" - -_syscall3(int,waitpid,int,pid,int *,status,int,options) diff --git a/mdk-stage1/dietlibc/syscalls.c/write.c b/mdk-stage1/dietlibc/syscalls.c/write.c deleted file mode 100644 index d1f7347d5..000000000 --- a/mdk-stage1/dietlibc/syscalls.c/write.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -_syscall3(int,write,int,fd,const char *,buf,unsigned long,count) diff --git a/mdk-stage1/dietlibc/syscalls.h b/mdk-stage1/dietlibc/syscalls.h deleted file mode 100644 index eba7a3c00..000000000 --- a/mdk-stage1/dietlibc/syscalls.h +++ /dev/null @@ -1,142 +0,0 @@ -#ifdef __ASSEMBLER__ - -#include - -#else - -#include - -#endif - -#ifdef __i386__ - -#define syscall_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -sym: \ - movb $__NR_##name,%al; \ - jmp __unified_syscall - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - movb $__NR_##name,%al; \ - jmp __unified_syscall - -#endif - -#ifdef __sparc__ - -#define syscall_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -sym: \ - b __unified_syscall; \ - mov __NR_##name, %g1 - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - b __unified_syscall; \ - mov __NR_##name, %g1 - -#endif - -#ifdef __powerpc__ - -#define syscall_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -sym: \ - li 0,__NR_##name; \ - b __unified_syscall - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - li 0,__NR_##name; \ - b __unified_syscall - -#endif - - -#ifdef __mips__ - -#define syscall_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -.ent sym; \ -sym: \ - li $2,__NR_##name; \ - la $25,__unified_syscall; \ - jr $25; \ -.end sym - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -.ent sym; \ -sym: \ - li $2,__NR_##name; \ - la $25,__unified_syscall; \ - jr $25; \ -.end sym - -#endif - -#ifdef __arm__ - -#define syscall_weak(name,wsym,sym) \ -.text; \ -.weak wsym; \ -wsym: ; \ -.global sym; \ -sym: \ - swi __NR_##name; \ - b __unified_syscall - -#define syscall(name,sym) \ -.text; \ -.global sym; \ -sym: \ - swi __NR_##name; \ - b __unified_syscall - -#endif - - -#ifdef __alpha__ - -#define syscall_weak(name,wsym,sym) \ -.text ; \ -.align 2 ; \ -.weak wsym; \ -.type wsym,@function ; \ -wsym: ; \ -.global sym ; \ -.type sym,@function ; \ -sym: ; \ - lda $0, __NR_##name($31) ; \ - br __unified_syscall - -#define syscall(name,sym) \ -.text ; \ -.align 2 ; \ -.global sym ; \ -.type sym,@function ; \ -sym: ; \ - lda $0, __NR_##name($31) ; \ - br __unified_syscall - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/__getpagesize.S b/mdk-stage1/dietlibc/syscalls.s/__getpagesize.S deleted file mode 100644 index c9fd97898..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/__getpagesize.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -#ifdef __NR_getpagesize -syscall(getpagesize,getpagesize) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/__pread.S b/mdk-stage1/dietlibc/syscalls.s/__pread.S deleted file mode 100644 index ad47c7873..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/__pread.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(pread,__pread,__libc__pread) diff --git a/mdk-stage1/dietlibc/syscalls.s/__reboot.S b/mdk-stage1/dietlibc/syscalls.s/__reboot.S deleted file mode 100644 index 0de4f25b2..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/__reboot.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(reboot,__reboot) diff --git a/mdk-stage1/dietlibc/syscalls.s/_llseek.S b/mdk-stage1/dietlibc/syscalls.s/_llseek.S deleted file mode 100644 index 3e240d822..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/_llseek.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(_llseek,_llseek) diff --git a/mdk-stage1/dietlibc/syscalls.s/access.S b/mdk-stage1/dietlibc/syscalls.s/access.S deleted file mode 100644 index d1edafd8c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/access.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(access,access) diff --git a/mdk-stage1/dietlibc/syscalls.s/brk.S b/mdk-stage1/dietlibc/syscalls.s/brk.S deleted file mode 100644 index 6e21810bd..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/brk.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(brk,__diet_brk) diff --git a/mdk-stage1/dietlibc/syscalls.s/chdir.S b/mdk-stage1/dietlibc/syscalls.s/chdir.S deleted file mode 100644 index 204f3dd6c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/chdir.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(chdir,chdir) diff --git a/mdk-stage1/dietlibc/syscalls.s/chmod.S b/mdk-stage1/dietlibc/syscalls.s/chmod.S deleted file mode 100644 index c1b85f5a4..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/chmod.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(chmod,chmod) diff --git a/mdk-stage1/dietlibc/syscalls.s/chown.S b/mdk-stage1/dietlibc/syscalls.s/chown.S deleted file mode 100644 index daac3bf13..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/chown.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(chown,chown) diff --git a/mdk-stage1/dietlibc/syscalls.s/chroot.S b/mdk-stage1/dietlibc/syscalls.s/chroot.S deleted file mode 100644 index 65de1e473..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/chroot.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(chroot,chroot) diff --git a/mdk-stage1/dietlibc/syscalls.s/close.S b/mdk-stage1/dietlibc/syscalls.s/close.S deleted file mode 100644 index 361ca5272..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/close.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(close,close,__libc_close) diff --git a/mdk-stage1/dietlibc/syscalls.s/dup.S b/mdk-stage1/dietlibc/syscalls.s/dup.S deleted file mode 100644 index b2977fd43..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/dup.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(dup,dup) diff --git a/mdk-stage1/dietlibc/syscalls.s/dup2.S b/mdk-stage1/dietlibc/syscalls.s/dup2.S deleted file mode 100644 index 774bfbfe7..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/dup2.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(dup2,dup2) diff --git a/mdk-stage1/dietlibc/syscalls.s/execve.S b/mdk-stage1/dietlibc/syscalls.s/execve.S deleted file mode 100644 index ff952ae7d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/execve.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(execve,execve) diff --git a/mdk-stage1/dietlibc/syscalls.s/exit.S b/mdk-stage1/dietlibc/syscalls.s/exit.S deleted file mode 100644 index 11c989529..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/exit.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(exit,exit,_exit) diff --git a/mdk-stage1/dietlibc/syscalls.s/fchdir.S b/mdk-stage1/dietlibc/syscalls.s/fchdir.S deleted file mode 100644 index 0aeaf610b..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fchdir.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fchdir,fchdir) diff --git a/mdk-stage1/dietlibc/syscalls.s/fchmod.S b/mdk-stage1/dietlibc/syscalls.s/fchmod.S deleted file mode 100644 index 30bc2e210..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fchmod.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fchmod,fchmod) diff --git a/mdk-stage1/dietlibc/syscalls.s/fchown.S b/mdk-stage1/dietlibc/syscalls.s/fchown.S deleted file mode 100644 index bc2a296ea..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fchown.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fchown,fchown) diff --git a/mdk-stage1/dietlibc/syscalls.s/fcntl.S b/mdk-stage1/dietlibc/syscalls.s/fcntl.S deleted file mode 100644 index 2285929a0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fcntl.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(fcntl,fcntl,__libc_fcntl) diff --git a/mdk-stage1/dietlibc/syscalls.s/flock.S b/mdk-stage1/dietlibc/syscalls.s/flock.S deleted file mode 100644 index 7b4daeff7..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/flock.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(flock,flock) diff --git a/mdk-stage1/dietlibc/syscalls.s/fork.S b/mdk-stage1/dietlibc/syscalls.s/fork.S deleted file mode 100644 index b40c3f708..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fork.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(fork,fork,__libc_fork) diff --git a/mdk-stage1/dietlibc/syscalls.s/fstat.S b/mdk-stage1/dietlibc/syscalls.s/fstat.S deleted file mode 100644 index 9dd465cda..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fstat.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fstat,fstat) diff --git a/mdk-stage1/dietlibc/syscalls.s/fstat64.S b/mdk-stage1/dietlibc/syscalls.s/fstat64.S deleted file mode 100644 index 0c7a41609..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fstat64.S +++ /dev/null @@ -1,8 +0,0 @@ -#include "dietfeatures.h" -#include "syscalls.h" - -#ifdef WANT_LARGEFILE_BACKCOMPAT -syscall(fstat64,__dietlibc_fstat64) -#else -syscall(fstat64,fstat64) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/fstatfs.S b/mdk-stage1/dietlibc/syscalls.s/fstatfs.S deleted file mode 100644 index a23c8770c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fstatfs.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(fstatfs,fstatfs) diff --git a/mdk-stage1/dietlibc/syscalls.s/fsync.S b/mdk-stage1/dietlibc/syscalls.s/fsync.S deleted file mode 100644 index 66af59ef9..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/fsync.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(fsync,fsync,__libc_fsync) diff --git a/mdk-stage1/dietlibc/syscalls.s/ftruncate.S b/mdk-stage1/dietlibc/syscalls.s/ftruncate.S deleted file mode 100644 index dde57a615..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/ftruncate.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(ftruncate,ftruncate) diff --git a/mdk-stage1/dietlibc/syscalls.s/getcwd.S b/mdk-stage1/dietlibc/syscalls.s/getcwd.S deleted file mode 100644 index e13262f20..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getcwd.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getcwd,__syscall_getcwd) diff --git a/mdk-stage1/dietlibc/syscalls.s/getdents.S b/mdk-stage1/dietlibc/syscalls.s/getdents.S deleted file mode 100644 index f476e939d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getdents.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getdents,getdents) diff --git a/mdk-stage1/dietlibc/syscalls.s/getdents64.S b/mdk-stage1/dietlibc/syscalls.s/getdents64.S deleted file mode 100644 index 16859addf..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getdents64.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -#ifdef __NR_getdents64 -syscall(getdents64,getdents64) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/getegid.S b/mdk-stage1/dietlibc/syscalls.s/getegid.S deleted file mode 100644 index 64843ee35..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getegid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getegid,getegid) diff --git a/mdk-stage1/dietlibc/syscalls.s/geteuid.S b/mdk-stage1/dietlibc/syscalls.s/geteuid.S deleted file mode 100644 index 55dc00981..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/geteuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(geteuid,geteuid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getgid.S b/mdk-stage1/dietlibc/syscalls.s/getgid.S deleted file mode 100644 index 39f092685..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getgid,getgid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getgroups.S b/mdk-stage1/dietlibc/syscalls.s/getgroups.S deleted file mode 100644 index b4c57689c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getgroups.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getgroups,getgroups) diff --git a/mdk-stage1/dietlibc/syscalls.s/getitimer.S b/mdk-stage1/dietlibc/syscalls.s/getitimer.S deleted file mode 100644 index 9a2084080..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getitimer.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getitimer,getitimer) diff --git a/mdk-stage1/dietlibc/syscalls.s/getpgid.S b/mdk-stage1/dietlibc/syscalls.s/getpgid.S deleted file mode 100644 index e568f060f..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getpgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getpgid,getpgid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getpid.S b/mdk-stage1/dietlibc/syscalls.s/getpid.S deleted file mode 100644 index 093884785..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getpid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getpid,getpid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getppid.S b/mdk-stage1/dietlibc/syscalls.s/getppid.S deleted file mode 100644 index b05e64ae3..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getppid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getppid,getppid) diff --git a/mdk-stage1/dietlibc/syscalls.s/getpriority.S b/mdk-stage1/dietlibc/syscalls.s/getpriority.S deleted file mode 100644 index 848b27ed7..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getpriority.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getpriority,getpriority) diff --git a/mdk-stage1/dietlibc/syscalls.s/getresgid.S b/mdk-stage1/dietlibc/syscalls.s/getresgid.S deleted file mode 100644 index a1d873c15..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getresgid.S +++ /dev/null @@ -1,7 +0,0 @@ -#include "syscalls.h" - -#ifdef __NR_getresgid - -syscall(getresgid,getresgid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/getresuid.S b/mdk-stage1/dietlibc/syscalls.s/getresuid.S deleted file mode 100644 index 62f6d764f..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getresuid.S +++ /dev/null @@ -1,7 +0,0 @@ -#include "syscalls.h" - -#ifdef __getresuid - -syscall(getresuid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/getrlimit.S b/mdk-stage1/dietlibc/syscalls.s/getrlimit.S deleted file mode 100644 index 1c63c0196..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getrlimit.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getrlimit,getrlimit) diff --git a/mdk-stage1/dietlibc/syscalls.s/getrusage.S b/mdk-stage1/dietlibc/syscalls.s/getrusage.S deleted file mode 100644 index 2972c4938..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getrusage.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getrusage,getrusage) diff --git a/mdk-stage1/dietlibc/syscalls.s/getsid.S b/mdk-stage1/dietlibc/syscalls.s/getsid.S deleted file mode 100644 index cf5cce9d5..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getsid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getsid,getsid) diff --git a/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S b/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S deleted file mode 100644 index f364b787a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/gettimeofday.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(gettimeofday,gettimeofday) diff --git a/mdk-stage1/dietlibc/syscalls.s/getuid.S b/mdk-stage1/dietlibc/syscalls.s/getuid.S deleted file mode 100644 index c53c25a7a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/getuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(getuid,getuid) diff --git a/mdk-stage1/dietlibc/syscalls.s/ioctl.S b/mdk-stage1/dietlibc/syscalls.s/ioctl.S deleted file mode 100644 index 463d319dc..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/ioctl.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(ioctl,ioctl) diff --git a/mdk-stage1/dietlibc/syscalls.s/ioperm.S b/mdk-stage1/dietlibc/syscalls.s/ioperm.S deleted file mode 100644 index 0acfde07a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/ioperm.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(ioperm,ioperm) diff --git a/mdk-stage1/dietlibc/syscalls.s/iopl.S b/mdk-stage1/dietlibc/syscalls.s/iopl.S deleted file mode 100644 index 06a6c53fb..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/iopl.S +++ /dev/null @@ -1,6 +0,0 @@ - -#include "syscalls.h" - -#ifdef __NR_iopl -syscall(iopl,iopl) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/ipc.S b/mdk-stage1/dietlibc/syscalls.s/ipc.S deleted file mode 100644 index 40479400d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/ipc.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(ipc,__ipc) diff --git a/mdk-stage1/dietlibc/syscalls.s/kill.S b/mdk-stage1/dietlibc/syscalls.s/kill.S deleted file mode 100644 index eb466dd33..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/kill.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(kill,kill) diff --git a/mdk-stage1/dietlibc/syscalls.s/lchown.S b/mdk-stage1/dietlibc/syscalls.s/lchown.S deleted file mode 100644 index 19dfefaef..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/lchown.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(lchown,lchown) diff --git a/mdk-stage1/dietlibc/syscalls.s/link.S b/mdk-stage1/dietlibc/syscalls.s/link.S deleted file mode 100644 index 8015d11c8..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/link.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(link,link) diff --git a/mdk-stage1/dietlibc/syscalls.s/llseek.S b/mdk-stage1/dietlibc/syscalls.s/llseek.S deleted file mode 100644 index 0318b492e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/llseek.S +++ /dev/null @@ -1,6 +0,0 @@ -#include "dietfeatures.h" -#include "syscalls.h" - -#ifdef __NR__llseek -syscall(_llseek,llseek) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/lseek.S b/mdk-stage1/dietlibc/syscalls.s/lseek.S deleted file mode 100644 index 93707a22a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/lseek.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(lseek,lseek,__libc_lseek) diff --git a/mdk-stage1/dietlibc/syscalls.s/lstat.S b/mdk-stage1/dietlibc/syscalls.s/lstat.S deleted file mode 100644 index 5720161c0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/lstat.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(lstat,lstat) diff --git a/mdk-stage1/dietlibc/syscalls.s/lstat64.S b/mdk-stage1/dietlibc/syscalls.s/lstat64.S deleted file mode 100644 index 33fd5ab94..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/lstat64.S +++ /dev/null @@ -1,8 +0,0 @@ -#include "dietfeatures.h" -#include "syscalls.h" - -#ifdef WANT_LARGEFILE_BACKCOMPAT -syscall(lstat64,__dietlibc_lstat64) -#else -syscall(lstat64,lstat64) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/mkdir.S b/mdk-stage1/dietlibc/syscalls.s/mkdir.S deleted file mode 100644 index d6214ee46..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mkdir.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mkdir,mkdir) diff --git a/mdk-stage1/dietlibc/syscalls.s/mknod.S b/mdk-stage1/dietlibc/syscalls.s/mknod.S deleted file mode 100644 index c1b2af12d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mknod.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mknod,mknod) diff --git a/mdk-stage1/dietlibc/syscalls.s/mlockall.S b/mdk-stage1/dietlibc/syscalls.s/mlockall.S deleted file mode 100644 index 6ad0eef9d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mlockall.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mlockall,mlockall) diff --git a/mdk-stage1/dietlibc/syscalls.s/mount.S b/mdk-stage1/dietlibc/syscalls.s/mount.S deleted file mode 100644 index 2fd845561..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mount.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mount,mount) diff --git a/mdk-stage1/dietlibc/syscalls.s/mprotect.S b/mdk-stage1/dietlibc/syscalls.s/mprotect.S deleted file mode 100644 index 73e9a8e17..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mprotect.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mprotect,mprotect) diff --git a/mdk-stage1/dietlibc/syscalls.s/mremap.S b/mdk-stage1/dietlibc/syscalls.s/mremap.S deleted file mode 100644 index 259ccec99..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/mremap.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(mremap,mremap) diff --git a/mdk-stage1/dietlibc/syscalls.s/munlockall.S b/mdk-stage1/dietlibc/syscalls.s/munlockall.S deleted file mode 100644 index 776811dea..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/munlockall.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(munlockall,munlockall) diff --git a/mdk-stage1/dietlibc/syscalls.s/munmap.S b/mdk-stage1/dietlibc/syscalls.s/munmap.S deleted file mode 100644 index b43a7b22d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/munmap.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(munmap,munmap) diff --git a/mdk-stage1/dietlibc/syscalls.s/nanosleep.S b/mdk-stage1/dietlibc/syscalls.s/nanosleep.S deleted file mode 100644 index 279a52604..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/nanosleep.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(nanosleep,nanosleep,__libc_nanosleep) diff --git a/mdk-stage1/dietlibc/syscalls.s/nice.S b/mdk-stage1/dietlibc/syscalls.s/nice.S deleted file mode 100644 index 7d3f740b2..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/nice.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(nice,nice) diff --git a/mdk-stage1/dietlibc/syscalls.s/open.S b/mdk-stage1/dietlibc/syscalls.s/open.S deleted file mode 100644 index 280efd0d9..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/open.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(open,open,__libc_open) diff --git a/mdk-stage1/dietlibc/syscalls.s/pause.S b/mdk-stage1/dietlibc/syscalls.s/pause.S deleted file mode 100644 index cdf42cabd..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/pause.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(pause,pause,__libc_pause) diff --git a/mdk-stage1/dietlibc/syscalls.s/personality.S b/mdk-stage1/dietlibc/syscalls.s/personality.S deleted file mode 100644 index 34b467084..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/personality.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -#ifdef __NR_personality -syscall(personality,personality) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/pipe.S b/mdk-stage1/dietlibc/syscalls.s/pipe.S deleted file mode 100644 index 03994d055..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/pipe.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(pipe,pipe) diff --git a/mdk-stage1/dietlibc/syscalls.s/poll.S b/mdk-stage1/dietlibc/syscalls.s/poll.S deleted file mode 100644 index 359f55ddd..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/poll.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(poll,poll) diff --git a/mdk-stage1/dietlibc/syscalls.s/ptrace.s b/mdk-stage1/dietlibc/syscalls.s/ptrace.s deleted file mode 100644 index 392e6a4ed..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/ptrace.s +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(ptrace,ptrace) diff --git a/mdk-stage1/dietlibc/syscalls.s/pwrite.S b/mdk-stage1/dietlibc/syscalls.s/pwrite.S deleted file mode 100644 index f52ead7b2..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/pwrite.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(pwrite,__pwrite) diff --git a/mdk-stage1/dietlibc/syscalls.s/query_module.S b/mdk-stage1/dietlibc/syscalls.s/query_module.S deleted file mode 100644 index cb2f1d852..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/query_module.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -#ifdef __NR_query_module -syscall(query_module,query_module) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/read.S b/mdk-stage1/dietlibc/syscalls.s/read.S deleted file mode 100644 index 33fdb7531..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/read.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(read,read,__libc_read) diff --git a/mdk-stage1/dietlibc/syscalls.s/readlink.S b/mdk-stage1/dietlibc/syscalls.s/readlink.S deleted file mode 100644 index 850e77c4e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/readlink.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(readlink,readlink) diff --git a/mdk-stage1/dietlibc/syscalls.s/readv.S b/mdk-stage1/dietlibc/syscalls.s/readv.S deleted file mode 100644 index 757c26bfb..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/readv.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(readv,readv) diff --git a/mdk-stage1/dietlibc/syscalls.s/rename.S b/mdk-stage1/dietlibc/syscalls.s/rename.S deleted file mode 100644 index f92f1dc5d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/rename.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(rename,rename) diff --git a/mdk-stage1/dietlibc/syscalls.s/rmdir.S b/mdk-stage1/dietlibc/syscalls.s/rmdir.S deleted file mode 100644 index 341216e8c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/rmdir.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(rmdir,rmdir) diff --git a/mdk-stage1/dietlibc/syscalls.s/sched_get_priority_max.S b/mdk-stage1/dietlibc/syscalls.s/sched_get_priority_max.S deleted file mode 100644 index caf403672..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sched_get_priority_max.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sched_get_priority_max,sched_get_priority_max) diff --git a/mdk-stage1/dietlibc/syscalls.s/sched_get_priority_min.S b/mdk-stage1/dietlibc/syscalls.s/sched_get_priority_min.S deleted file mode 100644 index a0c3337dc..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sched_get_priority_min.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sched_get_priority_min,sched_get_priority_min) diff --git a/mdk-stage1/dietlibc/syscalls.s/sched_getparam.S b/mdk-stage1/dietlibc/syscalls.s/sched_getparam.S deleted file mode 100644 index 7190a40ae..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sched_getparam.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sched_getparam,sched_getparam) diff --git a/mdk-stage1/dietlibc/syscalls.s/sched_getscheduler.S b/mdk-stage1/dietlibc/syscalls.s/sched_getscheduler.S deleted file mode 100644 index 08709b65e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sched_getscheduler.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sched_getscheduler,sched_getscheduler) diff --git a/mdk-stage1/dietlibc/syscalls.s/sched_rr_get_interval.S b/mdk-stage1/dietlibc/syscalls.s/sched_rr_get_interval.S deleted file mode 100644 index 150b9a98d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sched_rr_get_interval.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sched_rr_get_interval,sched_rr_get_interval) diff --git a/mdk-stage1/dietlibc/syscalls.s/sched_setparam.S b/mdk-stage1/dietlibc/syscalls.s/sched_setparam.S deleted file mode 100644 index 3a6dd1dcc..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sched_setparam.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sched_setparam,sched_setparam) diff --git a/mdk-stage1/dietlibc/syscalls.s/sched_setscheduler.S b/mdk-stage1/dietlibc/syscalls.s/sched_setscheduler.S deleted file mode 100644 index 27869d6ce..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sched_setscheduler.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sched_setscheduler,sched_setscheduler) diff --git a/mdk-stage1/dietlibc/syscalls.s/sched_yield.S b/mdk-stage1/dietlibc/syscalls.s/sched_yield.S deleted file mode 100644 index ccb9ac1d0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sched_yield.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sched_yield,sched_yield) diff --git a/mdk-stage1/dietlibc/syscalls.s/select.S b/mdk-stage1/dietlibc/syscalls.s/select.S deleted file mode 100644 index f585d0449..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/select.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(select,select) diff --git a/mdk-stage1/dietlibc/syscalls.s/sendfile.S b/mdk-stage1/dietlibc/syscalls.s/sendfile.S deleted file mode 100644 index 12d6195dd..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sendfile.S +++ /dev/null @@ -1,6 +0,0 @@ -#include "syscalls.h" -#include "dietwarning.h" - -syscall_weak(sendfile,sendfile,__libc_sendfile) - -link_warning(sendfile,"sendfile is not portable and does not support large files") diff --git a/mdk-stage1/dietlibc/syscalls.s/setdomainname.S b/mdk-stage1/dietlibc/syscalls.s/setdomainname.S deleted file mode 100644 index eaade25da..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setdomainname.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setdomainname,setdomainname) diff --git a/mdk-stage1/dietlibc/syscalls.s/setgid.S b/mdk-stage1/dietlibc/syscalls.s/setgid.S deleted file mode 100644 index 69b18a9c9..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setgid,setgid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setgroups.S b/mdk-stage1/dietlibc/syscalls.s/setgroups.S deleted file mode 100644 index ce8e800a6..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setgroups.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setgroups,setgroups) diff --git a/mdk-stage1/dietlibc/syscalls.s/sethostname.S b/mdk-stage1/dietlibc/syscalls.s/sethostname.S deleted file mode 100644 index 7616d4848..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sethostname.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sethostname,sethostname) diff --git a/mdk-stage1/dietlibc/syscalls.s/setitimer.S b/mdk-stage1/dietlibc/syscalls.s/setitimer.S deleted file mode 100644 index bcb0623ba..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setitimer.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setitimer,setitimer) diff --git a/mdk-stage1/dietlibc/syscalls.s/setpgid.S b/mdk-stage1/dietlibc/syscalls.s/setpgid.S deleted file mode 100644 index e93db31dc..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setpgid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setpgid,setpgid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setpriority.S b/mdk-stage1/dietlibc/syscalls.s/setpriority.S deleted file mode 100644 index 57d7bc388..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setpriority.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setpriority,setpriority) diff --git a/mdk-stage1/dietlibc/syscalls.s/setregid.S b/mdk-stage1/dietlibc/syscalls.s/setregid.S deleted file mode 100644 index 3a7abbc28..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setregid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setregid,setregid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setresgid.S b/mdk-stage1/dietlibc/syscalls.s/setresgid.S deleted file mode 100644 index 64cbac94e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setresgid.S +++ /dev/null @@ -1,7 +0,0 @@ -#include "syscalls.h" - -#ifdef __setresgid - -syscall(setresgid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/setresuid.S b/mdk-stage1/dietlibc/syscalls.s/setresuid.S deleted file mode 100644 index 20b6abee9..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setresuid.S +++ /dev/null @@ -1,7 +0,0 @@ -#include "syscalls.h" - -#ifdef __setresuid - -syscall(setresuid) - -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/setreuid.S b/mdk-stage1/dietlibc/syscalls.s/setreuid.S deleted file mode 100644 index 33ca8deed..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setreuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setreuid,setreuid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setrlimit.S b/mdk-stage1/dietlibc/syscalls.s/setrlimit.S deleted file mode 100644 index 605105658..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setrlimit.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setrlimit,setrlimit) diff --git a/mdk-stage1/dietlibc/syscalls.s/setsid.S b/mdk-stage1/dietlibc/syscalls.s/setsid.S deleted file mode 100644 index d1ef1c58e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setsid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setsid,setsid) diff --git a/mdk-stage1/dietlibc/syscalls.s/setuid.S b/mdk-stage1/dietlibc/syscalls.s/setuid.S deleted file mode 100644 index d20571cbf..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/setuid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(setuid,setuid) diff --git a/mdk-stage1/dietlibc/syscalls.s/sigaction.S b/mdk-stage1/dietlibc/syscalls.s/sigaction.S deleted file mode 100644 index 32382870c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sigaction.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sigaction,sigaction) diff --git a/mdk-stage1/dietlibc/syscalls.s/sigaltstack.S b/mdk-stage1/dietlibc/syscalls.s/sigaltstack.S deleted file mode 100644 index b07d90f40..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sigaltstack.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(sigaltstack,sigaltstack,__sigaltstack) diff --git a/mdk-stage1/dietlibc/syscalls.s/signal.S b/mdk-stage1/dietlibc/syscalls.s/signal.S deleted file mode 100644 index 86c4d5db0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/signal.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(signal,signal) diff --git a/mdk-stage1/dietlibc/syscalls.s/sigpending.S b/mdk-stage1/dietlibc/syscalls.s/sigpending.S deleted file mode 100644 index 08715bef5..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sigpending.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sigpending,sigpending) diff --git a/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S b/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S deleted file mode 100644 index 07f5b9d26..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sigprocmask.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(sigprocmask,sigprocmask,__sigprocmask) diff --git a/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S b/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S deleted file mode 100644 index 062264ab6..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sigsuspend.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(sigsuspend,sigsuspend,__libc_sigsuspend) diff --git a/mdk-stage1/dietlibc/syscalls.s/socketcall.S b/mdk-stage1/dietlibc/syscalls.s/socketcall.S deleted file mode 100644 index 5837c049a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/socketcall.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(socketcall,socketcall) diff --git a/mdk-stage1/dietlibc/syscalls.s/stat.S b/mdk-stage1/dietlibc/syscalls.s/stat.S deleted file mode 100644 index 2aa3bc088..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/stat.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(stat,stat) diff --git a/mdk-stage1/dietlibc/syscalls.s/stat64.S b/mdk-stage1/dietlibc/syscalls.s/stat64.S deleted file mode 100644 index 734fcab20..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/stat64.S +++ /dev/null @@ -1,8 +0,0 @@ -#include "dietfeatures.h" -#include "syscalls.h" - -#ifdef WANT_LARGEFILE_BACKCOMPAT -syscall(stat64,__dietlibc_stat64) -#else -syscall(stat64,stat64) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/statfs.S b/mdk-stage1/dietlibc/syscalls.s/statfs.S deleted file mode 100644 index 7560f569d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/statfs.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(statfs,statfs) diff --git a/mdk-stage1/dietlibc/syscalls.s/stime.S b/mdk-stage1/dietlibc/syscalls.s/stime.S deleted file mode 100644 index 9d9f5bf0a..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/stime.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(stime,stime) diff --git a/mdk-stage1/dietlibc/syscalls.s/swapoff.S b/mdk-stage1/dietlibc/syscalls.s/swapoff.S deleted file mode 100644 index f75ec94e0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/swapoff.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(swapoff,swapoff) diff --git a/mdk-stage1/dietlibc/syscalls.s/swapon.S b/mdk-stage1/dietlibc/syscalls.s/swapon.S deleted file mode 100644 index d10594168..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/swapon.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(swapon,swapon) diff --git a/mdk-stage1/dietlibc/syscalls.s/symlink.S b/mdk-stage1/dietlibc/syscalls.s/symlink.S deleted file mode 100644 index 07a6a7fdc..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/symlink.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(symlink,symlink) diff --git a/mdk-stage1/dietlibc/syscalls.s/sync.S b/mdk-stage1/dietlibc/syscalls.s/sync.S deleted file mode 100644 index 1ee021693..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sync.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sync,sync) diff --git a/mdk-stage1/dietlibc/syscalls.s/sysctl.S b/mdk-stage1/dietlibc/syscalls.s/sysctl.S deleted file mode 100644 index 536e62b3d..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sysctl.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "syscalls.h" - -#ifdef __NR_sysctl -syscall(sysctl,_sysctl) -#endif diff --git a/mdk-stage1/dietlibc/syscalls.s/sysinfo.S b/mdk-stage1/dietlibc/syscalls.s/sysinfo.S deleted file mode 100644 index eaec7941e..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/sysinfo.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(sysinfo,sysinfo) diff --git a/mdk-stage1/dietlibc/syscalls.s/syslog.S b/mdk-stage1/dietlibc/syscalls.s/syslog.S deleted file mode 100644 index 6af3c4eac..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/syslog.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(syslog,__syscall_syslog) diff --git a/mdk-stage1/dietlibc/syscalls.s/time.S b/mdk-stage1/dietlibc/syscalls.s/time.S deleted file mode 100644 index 26c79091c..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/time.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(time,time) diff --git a/mdk-stage1/dietlibc/syscalls.s/times.S b/mdk-stage1/dietlibc/syscalls.s/times.S deleted file mode 100644 index dcc8a6dd0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/times.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(times,times) diff --git a/mdk-stage1/dietlibc/syscalls.s/truncate.S b/mdk-stage1/dietlibc/syscalls.s/truncate.S deleted file mode 100644 index 7052bdcee..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/truncate.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(truncate,truncate) diff --git a/mdk-stage1/dietlibc/syscalls.s/umask.S b/mdk-stage1/dietlibc/syscalls.s/umask.S deleted file mode 100644 index 9f8ffeda6..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/umask.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(umask,umask) diff --git a/mdk-stage1/dietlibc/syscalls.s/umount.S b/mdk-stage1/dietlibc/syscalls.s/umount.S deleted file mode 100644 index 4a423d964..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/umount.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(umount,umount) diff --git a/mdk-stage1/dietlibc/syscalls.s/umount2.S b/mdk-stage1/dietlibc/syscalls.s/umount2.S deleted file mode 100644 index 4cdd6a200..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/umount2.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(umount2,umount2) diff --git a/mdk-stage1/dietlibc/syscalls.s/uname.S b/mdk-stage1/dietlibc/syscalls.s/uname.S deleted file mode 100644 index a460d2aa6..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/uname.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(uname,uname) diff --git a/mdk-stage1/dietlibc/syscalls.s/unlink.S b/mdk-stage1/dietlibc/syscalls.s/unlink.S deleted file mode 100644 index bd6713061..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/unlink.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(unlink,unlink) diff --git a/mdk-stage1/dietlibc/syscalls.s/utime.S b/mdk-stage1/dietlibc/syscalls.s/utime.S deleted file mode 100644 index 08cd22158..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/utime.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(utime,utime) diff --git a/mdk-stage1/dietlibc/syscalls.s/vhangup.S b/mdk-stage1/dietlibc/syscalls.s/vhangup.S deleted file mode 100644 index 6e2d1d343..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/vhangup.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(vhangup,vhangup) diff --git a/mdk-stage1/dietlibc/syscalls.s/wait4.S b/mdk-stage1/dietlibc/syscalls.s/wait4.S deleted file mode 100644 index ca6773569..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/wait4.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(wait4,wait4) diff --git a/mdk-stage1/dietlibc/syscalls.s/waitpid.S b/mdk-stage1/dietlibc/syscalls.s/waitpid.S deleted file mode 100644 index 5cdc18afb..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/waitpid.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(waitpid,waitpid,__libc_waitpid) diff --git a/mdk-stage1/dietlibc/syscalls.s/write.S b/mdk-stage1/dietlibc/syscalls.s/write.S deleted file mode 100644 index ba20395df..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/write.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall_weak(write,write,__libc_write) diff --git a/mdk-stage1/dietlibc/syscalls.s/writev.S b/mdk-stage1/dietlibc/syscalls.s/writev.S deleted file mode 100644 index 8ec7aa6b0..000000000 --- a/mdk-stage1/dietlibc/syscalls.s/writev.S +++ /dev/null @@ -1,3 +0,0 @@ -#include "syscalls.h" - -syscall(writev,writev) diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c deleted file mode 100644 index 9b47ce466..000000000 --- a/mdk-stage1/disk.c +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include "stage1.h" -#include "frontend.h" -#include "modules.h" -#include "probing.h" -#include "log.h" -#include "mount.h" -#include "lomount.h" -#include "automatic.h" - -#include "disk.h" - -static char * disk_extract_list_directory(char * direct) -{ - char ** full = list_directory(direct); - char tmp[2000] = ""; - int i; - for (i=0; i<5 ; i++) { - if (!full || !*full) - break; - strcat(tmp, *full); - strcat(tmp, "\n"); - full++; - } - return strdup(tmp); -} - -static enum return_type try_with_device(char *dev_name) -{ - char * questions_location[] = { "Directory or ISO image", NULL }; - char * questions_location_auto[] = { "directory", NULL }; - static char ** answers_location = NULL; - char device_fullname[50]; - char location_full[500]; - - char * disk_own_mount = "/tmp/hdimage"; - - int major, minor, blocks; - char name[100]; - - char buf[512]; - FILE * f; - char * parts[50]; - char * parts_comments[50]; - struct stat statbuf; - int i = 0; - enum return_type results; - char * choice; - - if (!(f = fopen("/proc/partitions", "rb")) || !fgets(buf, sizeof(buf), f) || !fgets(buf, sizeof(buf), f)) { - log_perror(dev_name); - stg1_error_message("Could not read partitions information."); - return RETURN_ERROR; - } - - while (fgets(buf, sizeof(buf), f)) { - bzero(name, sizeof(name)); - sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name); - if ((strstr(name, dev_name) == name) && (blocks > 1) && (name[strlen(dev_name)] != '\0')) { - parts[i] = strdup(name); - parts_comments[i] = (char *) malloc(sizeof(char) * 25); - snprintf(parts_comments[i], 24, "size: %d Mbytes", blocks >> 10); - i++; - } - } - parts[i] = NULL; - fclose(f); - - if (parts[0] == NULL) { - stg1_error_message("No partitions found."); - return RETURN_ERROR; - } - - results = ask_from_list_comments_auto("Please choose the partition where is copied the " DISTRIB_NAME " Distribution.", - parts, parts_comments, &choice, "partition", parts); - if (results != RETURN_OK) - return results; - - strcpy(device_fullname, "/dev/"); - strcat(device_fullname, choice); - - if (my_mount(device_fullname, disk_own_mount, "ext2") == -1 && - my_mount(device_fullname, disk_own_mount, "vfat") == -1 && - my_mount(device_fullname, disk_own_mount, "reiserfs") == -1) { - stg1_error_message("I can't find a valid filesystem (tried: ext2, vfat, reiserfs)."); - return try_with_device(dev_name); - } - - if (ask_from_entries_auto("Please enter the directory (or ISO image file) containing the " DISTRIB_NAME " Distribution.", - questions_location, &answers_location, 24, questions_location_auto, NULL) != RETURN_OK) { - umount(disk_own_mount); - return try_with_device(dev_name); - } - - strcpy(location_full, disk_own_mount); - strcat(location_full, "/"); - strcat(location_full, answers_location[0]); - - if (access(location_full, R_OK)) { - stg1_error_message("Directory or ISO image file could not be found on partition.\n" - "Here's a short extract of the files in the root of the partition:\n" - "%s", disk_extract_list_directory(disk_own_mount)); - umount(disk_own_mount); - return try_with_device(dev_name); - } - - unlink(IMAGE_LOCATION); - - if (!stat(location_full, &statbuf) && !S_ISDIR(statbuf.st_mode)) { - log_message("%s exists and is not a directory, assuming this is an ISO image", location_full); - if (lomount(location_full, IMAGE_LOCATION)) { - stg1_error_message("Could not mount file %s as an ISO image of the " DISTRIB_NAME " Distribution.", answers_location[0]); - umount(disk_own_mount); - return try_with_device(dev_name); - } - } else - symlink(location_full, IMAGE_LOCATION); - - if (IS_SPECIAL_STAGE2 || ramdisk_possible()) { - /* RAMDISK install */ - if (access(IMAGE_LOCATION RAMDISK_LOCATION, R_OK)) { - stg1_error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. " - "(I need the subdirectory " RAMDISK_LOCATION ")\n" - "Here's a short extract of the files in the directory:\n" - "%s", disk_extract_list_directory(IMAGE_LOCATION)); - loumount(); - umount(disk_own_mount); - return try_with_device(dev_name); - } - if (load_ramdisk() != RETURN_OK) { - stg1_error_message("Could not load program into memory."); - loumount(); - umount(disk_own_mount); - return try_with_device(dev_name); - } - } else { - /* LIVE install */ - char p; - if (access(IMAGE_LOCATION LIVE_LOCATION, R_OK)) { - stg1_error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. " - "(I need the subdirectory " LIVE_LOCATION ")\n" - "Here's a short extract of the files in the directory:\n" - "%s", disk_extract_list_directory(IMAGE_LOCATION)); - loumount(); - umount(disk_own_mount); - return try_with_device(dev_name); - } - if (readlink(IMAGE_LOCATION LIVE_LOCATION "/usr/bin/runinstall2", &p, 1) != 1) { - stg1_error_message("The " DISTRIB_NAME " Distribution seems to be copied on a Windows partition. " - "You need more memory to perform an installation from a Windows partition. " - "Another solution if to copy the " DISTRIB_NAME " Distribution on a Linux partition."); - loumount(); - umount(disk_own_mount); - return try_with_device(dev_name); - } - log_message("found the " DISTRIB_NAME " Installation, good news!"); - } - - if (IS_RESCUE) { - loumount(); - umount(disk_own_mount); - } - - method_name = strdup("disk"); - return RETURN_OK; -} - -enum return_type disk_prepare(void) -{ - char ** medias, ** ptr, ** medias_models; - char * choice; - int i, count = 0; - enum return_type results; - - my_insmod("sd_mod", ANY_DRIVER_TYPE, NULL); - - get_medias(DISK, &medias, &medias_models); - - ptr = medias; - while (ptr && *ptr) { - count++; - ptr++; - } - - if (count == 0) { - stg1_error_message("No DISK drive found."); - i = ask_insmod(SCSI_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return disk_prepare(); - } - - if (count == 1) { - results = try_with_device(*medias); - if (results == RETURN_OK) - return RETURN_OK; - i = ask_insmod(SCSI_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return disk_prepare(); - } - - results = ask_from_list_comments_auto("Please choose the DISK drive on which you copied the " DISTRIB_NAME " Distribution.", - medias, medias_models, &choice, "disk", medias); - - if (results != RETURN_OK) - return results; - - results = try_with_device(choice); - if (results == RETURN_OK) - return RETURN_OK; - i = ask_insmod(SCSI_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return disk_prepare(); -} diff --git a/mdk-stage1/disk.h b/mdk-stage1/disk.h deleted file mode 100644 index 54213cf68..000000000 --- a/mdk-stage1/disk.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#ifndef _DISK_H_ -#define _DISK_H_ - -enum return_type disk_prepare(void); - -#endif diff --git a/mdk-stage1/dns.c b/mdk-stage1/dns.c deleted file mode 100644 index d1e67c78d..000000000 --- a/mdk-stage1/dns.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include - -// dietlibc can do hostname lookup, whereas glibc can't when linked statically :-( - -#ifdef __LIBC_DIETLIBC__ - -#include -#include -#include -#include -#include - -#include "network.h" -#include "log.h" - -#include "dns.h" - -int mygethostbyname(char * name, struct in_addr * addr) -{ - struct hostent * h = gethostbyname(name); - if (!h) { - if (domain) { - // gethostbyname from dietlibc doesn't support domain handling - char fully_qualified[500]; - sprintf(fully_qualified, "%s.%s", name, domain); - h = gethostbyname(fully_qualified); - if (!h) { - log_message("unknown host %s", name); - return -1; - } - } else - return -1; - } - - if (h->h_addr_list && (h->h_addr_list)[0]) { - memcpy(addr, (h->h_addr_list)[0], sizeof(*addr)); - log_message("is-at: %s", inet_ntoa(*addr)); - return 0; - } - return -1; -} - -char * mygethostbyaddr(char * ipnum) -{ - struct in_addr in; - struct hostent * host; - if (!inet_aton(ipnum, &in)) - return NULL; - host = gethostbyaddr(&in, strlen((void *) &in), AF_INET); - if (host && host->h_name) - return host->h_name; - return NULL; -} - - -#else // __LIBC_DIETLIBC__ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "log.h" - -#include "dns.h" - -/* This is dumb, but glibc doesn't like to do hostname lookups w/o libc.so */ - -union dns_response { - HEADER hdr; - u_char buf[PACKETSZ]; -} ; - -static int do_query(char * query, int queryType, char ** domainName, struct in_addr * ipNum) -{ - int len, ancount, type; - u_char * data, * end; - char name[MAXDNAME]; - union dns_response response; - -#ifdef __sparc__ - /* from jj: */ - /* We have to wait till ethernet negotiation is done */ - _res.retry = 3; -#else - _res.retry = 2; -#endif - - - len = res_search(query, C_IN, queryType, (void *) &response, sizeof(response)); - if (len <= 0) - return -1; - - if (ntohs(response.hdr.rcode) != NOERROR) - return -1; - - ancount = ntohs(response.hdr.ancount); - if (ancount < 1) - return -1; - - data = response.buf + sizeof(HEADER); - end = response.buf + len; - - /* skip the question */ - data += dn_skipname(data, end) + QFIXEDSZ; - - /* parse the answer(s) */ - while (--ancount >= 0 && data < end) { - - /* skip the domain name portion of the RR record */ - data += dn_skipname(data, end); - - /* get RR information */ - GETSHORT(type, data); - data += INT16SZ; /* skipp class */ - data += INT32SZ; /* skipp TTL */ - GETSHORT(len, data); - - if (type == T_PTR) { - /* we got a pointer */ - len = dn_expand(response.buf, end, data, name, sizeof(name)); - if (len <= 0) return -1; - if (queryType == T_PTR && domainName) { - /* we wanted a pointer */ - *domainName = malloc(strlen(name) + 1); - strcpy(*domainName, name); - return 0; - } - } else if (type == T_A) { - /* we got an address */ - if (queryType == T_A && ipNum) { - /* we wanted an address */ - memcpy(ipNum, data, sizeof(*ipNum)); - return 0; - } - } - - /* move ahead to next RR */ - data += len; - } - - return -1; -} - -char * mygethostbyaddr(char * ipnum) { - int rc; - char * result; - char * strbuf; - char * chptr; - char * splits[4]; - int i; - - _res.retry = 1; - - strbuf = alloca(strlen(ipnum) + 1); - strcpy(strbuf, ipnum); - - ipnum = alloca(strlen(strbuf) + 20); - - for (i = 0; i < 4; i++) { - chptr = strbuf; - while (*chptr && *chptr != '.') - chptr++; - *chptr = '\0'; - - if (chptr - strbuf > 3) return NULL; - splits[i] = strbuf; - strbuf = chptr + 1; - } - - sprintf(ipnum, "%s.%s.%s.%s.in-addr.arpa", splits[3], splits[2], splits[1], splits[0]); - - rc = do_query(ipnum, T_PTR, &result, NULL); - - if (rc) - return NULL; - else - return result; -} - -int mygethostbyname(char * name, struct in_addr * addr) { - int rc = do_query(name, T_A, NULL, addr); - if (!rc) - log_message("is-at %s", inet_ntoa(*addr)); - return rc; -} - -#endif diff --git a/mdk-stage1/dns.h b/mdk-stage1/dns.h deleted file mode 100644 index 97af9c08a..000000000 --- a/mdk-stage1/dns.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#ifndef H_DNS -#define H_DNS - -#include - -int mygethostbyname(char * name, struct in_addr * addr); -char * mygethostbyaddr(char * ipnum); - -#endif diff --git a/mdk-stage1/doc/HACKING b/mdk-stage1/doc/HACKING deleted file mode 100644 index d196c8010..000000000 --- a/mdk-stage1/doc/HACKING +++ /dev/null @@ -1,31 +0,0 @@ -If you have to boot pretty often, you'll appreciate to speed the things up -a little. - -Here's what we use: the GRUB feature to boot from the network using the -DHCP protocol and the TFTP protocol. - -Here's the "menu.lst" to do that: - --=-=-- - -timeout 0 - -title linux -dhcp -tftpserver 192.168.1.17 -kernel (nd)/tftpboot/gc/vmlinuz ramdisk=32000 vga=788 -initrd (nd)/tftpboot/gc/network.rdz - --=-=-- - - -The option "tftpserver" is used to override the tftpserver address given -as an answer by the DHCP server. That way, you'll not need to bother your -system administrator to modify his dhcp server configuration. - -The directory /tftpboot seems to be the only one defaultly accepted by the -server, and its subdirs. - - -Of course, your GRUB needs to be compiled with the specific code for your -network card; use ./configure --help in the GRUB build dir for more infos. diff --git a/mdk-stage1/doc/README b/mdk-stage1/doc/README deleted file mode 100644 index e3747cf30..000000000 --- a/mdk-stage1/doc/README +++ /dev/null @@ -1,185 +0,0 @@ -------------------------------------------------------- -* Stage1 of the Linux-Mandrake installation program * -------------------------------------------------------- - - -[ Author ] - - Guillaume Cottenceau (gc@mandrakesoft.com) - - -[ Copyright ] - - Copyright 2000 MandrakeSoft - - Partially inspired by Redhat stuff (install from 5.x and 7.x) copyright - Red Hat Software, and Debian stuff (boot-floppies) copyright by their - respective holders. - - -[ Licence ] - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - - *** WARNING! *** - - This General Public License does not permit incorporating any part - of this program as a library into proprietary programs. - - -[ Online ] - - http://us.mandrakesoft.com/~gc/html/stage1.html - - -[ Purpose ] - - This code will take the control of the computer after that Linux - kernel booted properly, and will try to run the main installer - (also known as "stage 2") from a series of different media - including harddrive, cdrom, and network. - - Use the source, Luke. - - - - - -=-=-- Okay, now, more details --=-=- - - - [ Installing Linux-Mandrake ] - -Per default, just insert your Linux-Mandrake Installation CD into your -CDROM tray, be sure your system BIOS is configured to boot on your CDROM, -and that's all. - -If you have multiple CDROM drives and the installer can't autodetect in -which CDROM drive is the disc, it may ask you to choose the correct drive, -between your CDROM drives. - -Also, if you want to install from an SCSI CDROM, the installer should -detect your SCSI adapter; if it fails you may have to select the right -driver and/or supply additional parameters. - - - [ Position of the problem ] - -The need for alternate installation methods come with more specific -hardware configuration and/or need for frequent updates of the Installer -software. - -All of these methods will require to use a special boot disk. The method -is to download it and then to copy it "physically" to a floppy with the -command: - -# dd if= of=/dev/fd0 - -Our boot disks are called "cdrom.img", "network.img", etc. - - - [ Installation from CDROM ] - -The first situation you may encounter is an old BIOS which does not permit -you to boot from your CDROM drive. - -In that case, you'll need to use the "cdrom.img" image file. The steps are -the same as with CDROM boot, and everything should be automatic. - - - [ Installation from DISK ] - -If you like trying occasionnally our development version, the Cooker, one -of the easiest way is to grab a local copy of the Distribution on one of -your local hard drives, and to install from that location. - -At present time, you can install from IDE or SCSI drives, from Linux -(ext2), Windows (vfat) or Reiserfs partition. - -In that case, you'll need to use the "hd.img" image file. The dialogs will -ask you to choose the DISK drive to use to install from, then the -partition on which you copied the Distribution, then the location -(directory) in which you copied the Distribution. - - - [ Installation from NETWORK ] - -For convenience, you can also install from a NFS volume, from a FTP -server, or from a HTTP server. NFS installs are maybe the fastest -and most convenient possible, so if you need to do frequent and/or -multiple installs, you may like this option. - -In that case, you'll need to use the "network.img" image file. If you have -PCI network card(s), you'll probably have to only setup your network -options. If not, you'll have to choose the appropriate driver(s) and/or -optional parameters. Supported network configurations include static IP -allocation and DHCP automatic configuration. - - - [ Installation from PCMCIA ] - -If you want to perform an installation on your laptop that is not based on -local IDE CDROM or DISK, nor on built-in network card, but on PCMCIA -extension (probably a network adapter or CDROM drive), you'll need the -"pcmcia.img" image file. - -PCMCIA services should automatically start and be transparent to you. -Then, you'll follow the instructions according to your preferred -installation method. - - - [ Monitoring a stage1 session ] - -Linux supports virtual consoles. You can switch between them by issueing -Ctrl+Alt+Fx key, in which 'x' is the number of the console. Here's console -occupancy during stage1. - -(#1) The user-interface of the stage1 is on the first console. In case of -newt interaction, it's provided with a neat blue and black color scheme, -and nice widgets. In case of stdio interaction (cdrom and disk installs), -it's more basic but still usable :-). - -(#2) A shell is provided on second console in some cases (you need to -compile it with -DSPAWN_SHELL and you need to provide a valid shell in the -initrd) and of course it's not in, in image files of Linux-Mandrake -releases because it's too much diskspace. - -(#3) The log is printed out on the third console. This is the location -where you can find most valuable information, prefixed by a '*'. See -"log.h" for calls that print things out to the log. - -(#4) The kernel messages are printed on the fourth console. There is a -process forked very early in the init (the program before the stage1) -which monitors /proc/kmsg for new kernel messages. Also, syslog stuff (the -logs commited by the programs) should appear on the /dev/log Unix socket, -this is also printed on this console. - -(#5) Former place for the stderr of insmod calls. It's not used anymore. - -(#6) Place where a trivial interactive communication with the stage1 is -set up if the parameter -DSPAWN_INTERACTIVE is compiled in. Basically, you -can set switches such as "expert" and "rescue" on the fly with this -feature. It's implemented with a fork and a Unix pipe. - - - [ Rescueing a system ] - -Since Linux-Mandrake 7.1, we provide a rescue system through each of the -previously described methods. You don't need a special "rescue.img" file. -Just hit "F1" at boot time, type in "rescue", and follow the first steps -of the installation according to the method you chose (choose -disks/partitions for disk method, network parameters for network method, -etc). Then, you'll end up with a workable system, very useful to rescue a -damaged system, or do other basic actions. diff --git a/mdk-stage1/doc/TECH-INFOS b/mdk-stage1/doc/TECH-INFOS deleted file mode 100644 index 563b97ee1..000000000 --- a/mdk-stage1/doc/TECH-INFOS +++ /dev/null @@ -1,45 +0,0 @@ - -| (*) Automatic install -\---------------------- - -This feature is used to replace redhat kickstart. I use the kernel -parameter "automatic" with the following keywords: - -from list: - method nfs, ftp, http, cdrom, disk - network static, dhcp - interface eth0, eth1, .. - -giving (string) values: - (static IP infos) - ip - dns - gateway - netmask - - (2nd step network config) - hostname - domain - - (3rd step nfs, ftp, http installs) - server - directory - - (3rd step ftp only) - user - pass - - (2nd step disk install) - disk - - (3rd step disk install) - partition - - (4th step disk install) - directory - - -Keywords must be passed with commas and colons, that is for example: - - automatic=method:nfs,network:static,ip:192.168.1.24,server:192.168.1.7,directory:/stable/i586 - diff --git a/mdk-stage1/doc/WHY-DIETLIBC b/mdk-stage1/doc/WHY-DIETLIBC deleted file mode 100644 index e7c526b49..000000000 --- a/mdk-stage1/doc/WHY-DIETLIBC +++ /dev/null @@ -1,50 +0,0 @@ -(the dietlibc is a replacement for the glibc, which aim is to produce -smaller statically linked binaries) - - -The use for dietlibc in the stage1 was clear because currently used -install process on x86 is from a 1.44 Mbytes floppy. On this floppy we -need to fit the kernel, modules (scsi and network access), and the code to -do the basic things to load the stage2. The only part on which we could -progress was the code. - -As always, figures demonstrate evidences. Here are the size of the -binaries used for the cdrom, disk, network and full floppy installs, using -newt as the UI library: - - - with glibc - --rwxr-xr-x 1 gc gc 569448 May 15 15:29 stage1-cdrom --rwxr-xr-x 1 gc gc 572264 May 15 15:29 stage1-disk --rwxr-xr-x 1 gc gc 624712 May 15 15:30 stage1-network --rwxr-xr-x 1 gc gc 720360 May 15 15:29 stage1-full - - - with dietlibc - --rwxr-xr-x 1 gc gc 169332 May 15 14:26 stage1-cdrom --rwxr-xr-x 1 gc gc 172180 May 15 14:26 stage1-disk --rwxr-xr-x 1 gc gc 198612 May 15 14:26 stage1-network --rwxr-xr-x 1 gc gc 251764 May 15 14:26 stage1-full - - -The `stage1-full' binary has code for many things, most notably: data -decrunching (bzlib), archive extraction (in-house format), module loading -(insmod from busybox), PCI detection, ide and scsi handling, -cdrom/disk/loopback mounting, DHCP client negociation (redhat+grub), NFS -mounting (util-linux), FTP and HTTP transmission (redhat), pcmcia -initializing (pcmcia-cs), UI interaction (slang/newt); with use of the -dietlibc, the binary is only 250 kbytes! - - -Due to the modular coding, it is also possible to choose to not use -slang/newt as the UI, but a stdio-only UI. In that case, the binaries get -even smaller: - --rwxr-xr-x 1 gc gc 104500 May 15 15:46 stage1-cdrom* --rwxr-xr-x 1 gc gc 107348 May 15 15:46 stage1-disk* --rwxr-xr-x 1 gc gc 133972 May 15 15:47 stage1-network* --rwxr-xr-x 1 gc gc 187348 May 15 15:46 stage1-full* - - - -gc [Tue May 15 15:58:34 2001] \ No newline at end of file diff --git a/mdk-stage1/doc/documented..frontend.h b/mdk-stage1/doc/documented..frontend.h deleted file mode 100644 index 10417ef3b..000000000 --- a/mdk-stage1/doc/documented..frontend.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Using high-level UI. - * - * These functions are frontend-independant: your program won't know each - * `frontend' (e.g. each way to grab user input) will be used. - * - * Then you may link your binary against any `frontend' that implement all - * these functions (and possibly necessary libraries). - */ - - -#ifndef _FRONTEND_H_ -#define _FRONTEND_H_ - -/* this must be called before anything else */ -void init_frontend(void); - -/* this must be called before exit of program */ -void finish_frontend(void); - - -void info_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* (blocks program) */ - -void error_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* (blocks program) */ - -/* (doesn't block program) - * (this is not necessarily stackable, e.g. only one wait_message at a time) */ -void wait_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); - -/* call this to finish the wait on wait_message */ -void remove_wait_message(void); - -/* monitor progression of something (downloading a file, etc) - * if size of progression is unknown, use `0' */ -void init_progression(char *msg, int size); -void update_progression(int current_size); -void end_progression(void); - -enum frontend_return { RETURN_OK, RETURN_BACK, RETURN_ERROR }; - -/* Yes == RETURN_OK No == RETURN_ERROR Back == RETURN_BACK */ -enum frontend_return ask_yes_no(char *msg); - -/* [elems] NULL terminated array of char* - * [choice] address of a (unitialized) char* */ -enum frontend_return ask_from_list(char *msg, char ** elems, char ** choice); - -enum frontend_return ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice); - -/* [questions] NULL terminated array of char* - * [answers] address of a (unitialized) char**, will contain a non-NULL terminated array of char* - * [callback_func] function called at most when the answers change; it can examine the array of char* and assign some new char* */ -enum frontend_return ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings)); - -#endif diff --git a/mdk-stage1/frontend-common.c b/mdk-stage1/frontend-common.c deleted file mode 100644 index caddeb7d4..000000000 --- a/mdk-stage1/frontend-common.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include -#include - -#include "frontend.h" - - -void info_message(char *msg, ...) -{ - va_list args; - va_start(args, msg); - vinfo_message(msg, args); - va_end(args); -} - -void wait_message(char *msg, ...) -{ - va_list args; - va_start(args, msg); - vwait_message(msg, args); - va_end(args); -} - -void error_message(char *msg, ...) -{ - va_list args; - va_start(args, msg); - verror_message(msg, args); - va_end(args); -} diff --git a/mdk-stage1/frontend.h b/mdk-stage1/frontend.h deleted file mode 100644 index 167291798..000000000 --- a/mdk-stage1/frontend.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * For doc please read doc/documented..frontend.h - */ - -#ifndef _FRONTEND_H_ -#define _FRONTEND_H_ - -#include - - -enum return_type { RETURN_OK, RETURN_BACK, RETURN_ERROR }; - -void init_frontend(char * welcome_msg); -void finish_frontend(void); - -void error_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* blocking */ -void info_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* blocking */ -void wait_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); /* non-blocking */ -void remove_wait_message(void); - -void init_progression(char *msg, int size); -void update_progression(int current_size); -void end_progression(void); - -enum return_type ask_yes_no(char *msg); -enum return_type ask_from_list(char *msg, char ** elems, char ** choice); -enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice); -enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings)); - - -void verror_message(char *msg, va_list ap); -void vinfo_message(char *msg, va_list ap); -void vwait_message(char *msg, va_list ap); - - -#endif diff --git a/mdk-stage1/init-data/emptyboot.img.bz2 b/mdk-stage1/init-data/emptyboot.img.bz2 deleted file mode 100644 index 6ae939c1b..000000000 Binary files a/mdk-stage1/init-data/emptyboot.img.bz2 and /dev/null differ diff --git a/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 b/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 deleted file mode 100644 index 9d5d276fb..000000000 Binary files a/mdk-stage1/init-data/msgboot-graphicallogo-2880.img.bz2 and /dev/null differ diff --git a/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 b/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 deleted file mode 100644 index b7febd63e..000000000 Binary files a/mdk-stage1/init-data/msgboot-graphicallogo.img.bz2 and /dev/null differ diff --git a/mdk-stage1/init-data/msgboot.img.bz2 b/mdk-stage1/init-data/msgboot.img.bz2 deleted file mode 100644 index c5f3a7ed7..000000000 Binary files a/mdk-stage1/init-data/msgboot.img.bz2 and /dev/null differ diff --git a/mdk-stage1/init-libc-headers.h b/mdk-stage1/init-libc-headers.h deleted file mode 100644 index 01761e869..000000000 --- a/mdk-stage1/init-libc-headers.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef SOCK_STREAM -#define SOCK_STREAM 1 -#endif - -static inline _syscall3(int, syslog, int, type, char *, bufp, int, len); -static inline _syscall3(int, reboot, int, magic, int, magic2, int, flag); diff --git a/mdk-stage1/init.c b/mdk-stage1/init.c deleted file mode 100644 index eb84c5e06..000000000 --- a/mdk-stage1/init.c +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#ifndef INIT_HEADERS -#include "init-libc-headers.h" -#else -#include INIT_HEADERS -#endif - -#include "config-stage1.h" - - -char * env[] = { - "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin", - "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib:/usr/X11R6/lib:/mnt/usr/X11R6/lib", - "HOME=/", - "TERM=linux", - "TERMINFO=/etc/terminfo", - NULL -}; - - -/* - * this needs to handle the following cases: - * - * 1) run from a CD root filesystem - * 2) run from a read only nfs rooted filesystem - * 3) run from a floppy - * 4) run from a floppy that's been loaded into a ramdisk - * - */ - -int testing; -int klog_pid; - - -void fatal_error(char *msg) -{ - printf("FATAL ERROR IN INIT: %s\n\nI can't recover from this, please reboot manually and send bugreport.\n", msg); - while (1); -} - -void print_error(char *msg) -{ - printf("E: %s\n", msg); -} - -void print_warning(char *msg) -{ - printf("W: %s\n", msg); -} - -void print_int_init(int fd, int i) -{ - char buf[10]; - char * chptr = buf + 9; - int j = 0; - - if (i < 0) - { - write(1, "-", 1); - i = -1 * i; - } - - while (i) - { - *chptr-- = '0' + (i % 10); - j++; - i = i / 10; - } - - write(fd, chptr + 1, j); -} - -void print_str_init(int fd, char * string) -{ - write(fd, string, strlen(string)); -} - - -/* fork to: - * (1) watch /proc/kmsg and copy the stuff to /dev/tty4 - * (2) listens to /dev/log and copy also this stuff (log from programs) - */ -void doklog() -{ - fd_set readset, unixs; - int in, out, i; - int log; - int s; - int sock = -1; - struct sockaddr_un sockaddr; - char buf[1024]; - int readfd; - - /* open kernel message logger */ - in = open("/proc/kmsg", O_RDONLY,0); - if (in < 0) { - print_error("could not open /proc/kmsg"); - return; - } - - if ((log = open("/tmp/syslog", O_WRONLY | O_CREAT, 0644)) < 0) { - print_error("error opening /tmp/syslog"); - sleep(5); - return; - } - - if ((klog_pid = fork())) { - close(in); - close(log); - return; - } else { - close(0); - close(1); - close(2); - } - - out = open("/dev/tty4", O_WRONLY, 0); - if (out < 0) - print_warning("couldn't open tty for syslog -- still using /tmp/syslog\n"); - - /* now open the syslog socket */ -// ############# LINUX 2.4 /dev/log IS BUGGED! --> apparently the syslogs can't reach me, and it's full up after a while -// sockaddr.sun_family = AF_UNIX; -// strncpy(sockaddr.sun_path, "/dev/log", UNIX_PATH_MAX); -// sock = socket(AF_UNIX, SOCK_STREAM, 0); -// if (sock < 0) { -// printf("error creating socket: %d\n", errno); -// sleep(5); -// } -// -// print_str_init(log, "] got socket\n"); -// if (bind(sock, (struct sockaddr *) &sockaddr, sizeof(sockaddr.sun_family) + strlen(sockaddr.sun_path))) { -// print_str_init(log, "] bind error: "); -// print_int_init(log, errno); -// print_str_init(log, "\n"); -// sleep(5); -// } -// -// print_str_init(log, "] bound socket\n"); -// chmod("/dev/log", 0666); -// if (listen(sock, 5)) { -// print_str_init(log, "] listen error: "); -// print_int_init(log, errno); -// print_str_init(log, "\n"); -// sleep(5); -// } - - /* disable on-console syslog output */ - syslog(8, NULL, 1); - - print_str_init(log, "] kernel/system logger ok\n"); - FD_ZERO(&unixs); - while (1) { - memcpy(&readset, &unixs, sizeof(unixs)); - - if (sock >= 0) - FD_SET(sock, &readset); - FD_SET(in, &readset); - - i = select(20, &readset, NULL, NULL, NULL); - if (i <= 0) - continue; - - /* has /proc/kmsg things to tell us? */ - if (FD_ISSET(in, &readset)) { - i = read(in, buf, sizeof(buf)); - if (i > 0) { - if (out >= 0) - write(out, buf, i); - write(log, buf, i); - } - } - - /* examine some fd's in the hope to find some syslog outputs from programs */ - for (readfd = 0; readfd < 20; ++readfd) { - if (FD_ISSET(readfd, &readset) && FD_ISSET(readfd, &unixs)) { - i = read(readfd, buf, sizeof(buf)); - if (i > 0) { - /* grep out the output of RPM telling that it installed/removed some packages */ - if (!strstr(buf, "mdk installed") && !strstr(buf, "mdk removed")) { - if (out >= 0) - write(out, buf, i); - write(log, buf, i); - } - } else if (i == 0) { - /* socket closed */ - close(readfd); - FD_CLR(readfd, &unixs); - } - } - } - - /* the socket has moved, new stuff to do */ - if (sock >= 0 && FD_ISSET(sock, &readset)) { - s = sizeof(sockaddr); - readfd = accept(sock, (struct sockaddr *) &sockaddr, &s); - if (readfd < 0) { - char * msg_error = "] error in accept\n"; - if (out >= 0) - write(out, msg_error, strlen(msg_error)); - write(log, msg_error, strlen(msg_error)); - close(sock); - sock = -1; - } - else - FD_SET(readfd, &unixs); - } - } -} - - -#define LOOP_CLR_FD 0x4C01 - -void del_loop(char *device) -{ - int fd; - if ((fd = open(device, O_RDONLY, 0)) < 0) { - printf("del_loop open failed\n"); - return; - } - - if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { - printf("del_loop ioctl failed"); - return; - } - - close(fd); -} - -struct filesystem -{ - char * dev; - char * name; - char * fs; - int mounted; -}; - -/* attempt to unmount all filesystems in /proc/mounts */ -void unmount_filesystems(void) -{ - int fd, size; - char buf[65535]; /* this should be big enough */ - char *p; - struct filesystem fs[500]; - int numfs = 0; - int i, nb; - - printf("unmounting filesystems...\n"); - - fd = open("/proc/mounts", O_RDONLY, 0); - if (fd < 1) { - print_error("failed to open /proc/mounts"); - sleep(2); - return; - } - - size = read(fd, buf, sizeof(buf) - 1); - buf[size] = '\0'; - - close(fd); - - p = buf; - while (*p) { - fs[numfs].mounted = 1; - fs[numfs].dev = p; - while (*p != ' ') p++; - *p++ = '\0'; - fs[numfs].name = p; - while (*p != ' ') p++; - *p++ = '\0'; - fs[numfs].fs = p; - while (*p != ' ') p++; - *p++ = '\0'; - while (*p != '\n') p++; - p++; - if (strcmp(fs[numfs].name, "/") != 0) numfs++; /* skip if root, no need to take initrd root in account */ - } - - /* Pixel's ultra-optimized sorting algorithm: - multiple passes trying to umount everything until nothing moves - anymore (a.k.a holy shotgun method) */ - do { - nb = 0; - for (i = 0; i < numfs; i++) { - /*printf("trying with %s\n", fs[i].name);*/ - if (fs[i].mounted && umount(fs[i].name) == 0) { - if (strncmp(fs[i].dev + sizeof("/dev/") - 1, "loop", - sizeof("loop") - 1) == 0) - del_loop(fs[i].dev); - - printf("\t%s\n", fs[i].name); - fs[i].mounted = 0; - nb++; - } - } - } while (nb); - - for (i = nb = 0; i < numfs; i++) - if (fs[i].mounted) { - printf("\t%s umount failed\n", fs[i].name); - if (strcmp(fs[i].fs, "ext2") == 0) nb++; /* don't count not-ext2 umount failed */ - } - - if (nb) { - printf("failed to umount some filesystems\n"); - while (1); - } -} - -int exit_value_rescue = 66; - -int main(int argc, char **argv) -{ - pid_t installpid, childpid; - int wait_status; - int fd; - int abnormal_termination = 0; - int end_stage2 = 0; - - /* getpid() != 1 should work, by linuxrc tends to get a larger pid */ - testing = (getpid() > 50); - - if (!testing) { - /* turn off screen blanking */ - printf("\033[9;0]"); - printf("\033[8]"); - } - else - printf("*** TESTING MODE ***\n"); - - - printf("\n\t\t\t\033[1;40mWelcome to Linux-\033[1;36mMandrake\033[0;39m\n\n"); - - if (!testing) { - if (mount("/proc", "/proc", "proc", 0, NULL)) - fatal_error("Unable to mount proc filesystem"); - } - - - /* ignore Control-C and keyboard stop signals */ - signal(SIGINT, SIG_IGN); - signal(SIGTSTP, SIG_IGN); - - - if (!testing) { - fd = open("/dev/tty1", O_RDWR, 0); - if (fd < 0) - /* try with devfs */ - fd = open("/dev/vc/1", O_RDWR, 0); - - if (fd < 0) - fatal_error("failed to open /dev/tty1 and /dev/vc/1"); - - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - close(fd); - } - - - /* I set me up as session leader (probably not necessary?) */ - setsid(); - if (ioctl(0, TIOCSCTTY, NULL)) - print_error("could not set new controlling tty"); - - if (!testing) { - char * my_hostname = "localhost.localdomain"; - sethostname(my_hostname, strlen(my_hostname)); - /* the default domainname (as of 2.0.35) is "(none)", which confuses - glibc */ - setdomainname("", 0); - } - - if (!testing) - doklog(); - - /* Go into normal init mode - keep going, and then do a orderly shutdown - when: - - 1) install exits - 2) we receive a SIGHUP - */ - - printf("Cooker says: chopping a bunch of trees each morning builds a man! (c) Warly\n"); - printf("Running install...\n"); - - if (!(installpid = fork())) { - /* child */ - char * child_argv[2]; - child_argv[0] = "/sbin/stage1"; - child_argv[1] = NULL; - - execve(child_argv[0], child_argv, env); - printf("error in exec of stage1 :-(\n"); - return 0; - } - - while (!end_stage2) { - childpid = wait4(-1, &wait_status, 0, NULL); - if (childpid == installpid) - end_stage2 = 1; - } - - if (!WIFEXITED(wait_status) || (WEXITSTATUS(wait_status) != 0 && WEXITSTATUS(wait_status) != exit_value_rescue)) { - printf("install exited abnormally :-( "); - if (WIFSIGNALED(wait_status)) - printf("-- received signal %d", WTERMSIG(wait_status)); - printf("\n"); - abnormal_termination = 1; - } else if (WIFEXITED(wait_status) && WEXITSTATUS(wait_status) == exit_value_rescue) { - kill(klog_pid, 9); - printf("exiting init -- giving hand to rescue\n"); - return 0; - } else - printf("install succeeded\n"); - - if (testing) - return 0; - - sync(); sync(); - - printf("sending termination signals..."); - kill(-1, 15); - sleep(2); - printf("done\n"); - - printf("sending kill signals..."); - kill(-1, 9); - sleep(2); - printf("done\n"); - - unmount_filesystems(); - - if (!abnormal_termination) { - printf("rebooting system\n"); - sleep(2); - reboot(0xfee1dead, 672274793, 0x01234567); - } else { - printf("you may safely reboot your system\n"); - while (1); - } - - return 0; -} diff --git a/mdk-stage1/insmod-busybox/.cvsignore b/mdk-stage1/insmod-busybox/.cvsignore deleted file mode 100644 index 26a2c08c9..000000000 --- a/mdk-stage1/insmod-busybox/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -insmod -insmod-DIET diff --git a/mdk-stage1/insmod-busybox/Config.h b/mdk-stage1/insmod-busybox/Config.h deleted file mode 100644 index 8388416b7..000000000 --- a/mdk-stage1/insmod-busybox/Config.h +++ /dev/null @@ -1,132 +0,0 @@ -/* vi: set sw=4 ts=4: */ -// This file defines the feature set to be compiled into busybox. -// When you turn things off here, they won't be compiled in at all. -// -//// This file is parsed by sed. You MUST use single line comments. -// i.e. //#define BB_BLAH -// -// -// BusyBox Applications -#define BB_INSMOD -// End of Applications List -// -// -// -// --------------------------------------------------------- -// This is where feature definitions go. Generally speaking, -// turning this stuff off makes things a bit smaller (and less -// pretty/useful). -// -// -// -// Turn this on to use Erik's very cool devps, and devmtab kernel drivers, -// thereby eliminating the need for the /proc filesystem and thereby saving -// lots and lots memory for more important things. You can not use this and -// USE_PROCFS at the same time... NOTE: If you enable this feature, you -// _must_ have patched the kernel to include the devps patch that is included -// in the busybox/kernel-patches directory. You will also need to create some -// device special files in /dev on your embedded system: -// mknod /dev/mtab c 10 22 -// mknod /dev/ps c 10 21 -// I emailed Linus and this patch will not be going into the stock kernel. -//#define BB_FEATURE_USE_DEVPS_PATCH -// -// enable features that use the /proc filesystem (apps that -// break without this will tell you on compile)... -// You can't use this and BB_FEATURE_USE_DEVPS_PATCH -// at the same time... -#define BB_FEATURE_USE_PROCFS - -// -// Enable tab completion in the shell (not yet -// working very well -- so don't turn this on) -//#define BB_FEATURE_SH_TAB_COMPLETION -// -//Turn on extra fbset options -//#define BB_FEATURE_FBSET_FANCY -// -//Turn on fbset readmode support -//#define BB_FEATURE_FBSET_READMODE -// -// You must enable one or both of these features -// Support installing modules from pre 2.1 kernels -//#define BB_FEATURE_INSMOD_OLD_KERNEL -// Support installing modules from kernel versions after 2.1.18 -#define BB_FEATURE_INSMOD_NEW_KERNEL -// -// Support module version checking -//#define BB_FEATURE_INSMOD_VERSION_CHECKING -// -// Support for Minix filesystem, version 2 -//#define BB_FEATURE_MINIX2 -// -// -// Enable busybox --install [-s] -// to create links (or symlinks) for all the commands that are -// compiled into the binary. (needs /proc filesystem) -// #define BB_FEATURE_INSTALLER -// -// Clean up all memory before exiting -- usually not needed -// as the OS can clean up... Don't enable this unless you -// have a really good reason for cleaning things up manually. -//#define BB_FEATURE_CLEAN_UP -// -// End of Features List -// -// -// -// -// -// -//--------------------------------------------------- -// Nothing beyond this point should ever be touched by -// mere mortals so leave this stuff alone. -// -#ifdef BB_FEATURE_MOUNT_MTAB_SUPPORT -#define BB_MTAB -#endif -// -#if defined BB_FEATURE_SH_COMMAND_EDITING && defined BB_SH -#define BB_CMDEDIT -#endif -// -#ifdef BB_KILLALL -#ifndef BB_KILL -#define BB_KILL -#endif -#endif -// -#ifdef BB_FEATURE_LINUXRC -#ifndef BB_INIT -#define BB_INIT -#endif -#define BB_LINUXRC -#endif -// -#ifdef BB_GZIP -#ifndef BB_GUNZIP -#define BB_GUNZIP -#endif -#endif -// -#if defined BB_MOUNT && defined BB_FEATURE_NFSMOUNT -#define BB_NFSMOUNT -#endif -// -#if defined BB_FEATURE_SH_COMMAND_EDITING -#ifndef BB_FEATURE_USE_TERMIOS -#define BB_FEATURE_USE_TERMIOS -#endif -#endif -// -#if defined BB_FEATURE_AUTOWIDTH -#ifndef BB_FEATURE_USE_TERMIOS -#define BB_FEATURE_USE_TERMIOS -#endif -#endif -// -#if defined BB_INSMOD -#ifndef BB_FEATURE_INSMOD_OLD_KERNEL -#define BB_FEATURE_INSMOD_NEW_KERNEL -#endif -#endif diff --git a/mdk-stage1/insmod-busybox/Makefile b/mdk-stage1/insmod-busybox/Makefile deleted file mode 100644 index 9c0a60b79..000000000 --- a/mdk-stage1/insmod-busybox/Makefile +++ /dev/null @@ -1,65 +0,0 @@ - #****************************************************************************** - # - # insmod from busybox (i386 only) - # - # $Id$ - # - # Copyright (C) 1999,2000 by Lineo, inc. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -all: insmod insmod-DIET libinsmod.a libinsmod-DIET.a - -clean: - rm -f *.o insmod libinsmod.a libinsmod-DIET.a - - -FLAGS = -c -Wall -Os -fomit-frame-pointer -D_GNU_SOURCE -DBB_VER='"0.47"' -DBB_BT='"2000.12.06-14:02+0000"' - - -insmod: insmod-frontend.o insmod.o utility-standalone.o - gcc -o $@ $^ - $(STRIPCMD) $@ - -insmod-DIET: insmod-frontend-DIET.o insmod-DIET.o utility-standalone-DIET.o - gcc $(DIETLIBC_LDFLAGS_STAGE1) -o $@ $^ $(DIETLIBC_LIBC) - $(STRIPCMD) $@ - - -libinsmod.a: insmod.o utility.o - ar cru $@ $^ - ranlib $@ - -libinsmod-DIET.a: insmod-DIET.o utility-DIET.o - ar cru $@ $^ - ranlib $@ - -insmod-frontend.o: insmod-frontend.c busybox.h - gcc $(FLAGS) $(GLIBC_INCLUDES) insmod-frontend.c - -insmod-frontend-DIET.o: insmod-frontend.c busybox.h - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ insmod-frontend.c - -utility.o: utility.c busybox.h - gcc $(FLAGS) $(GLIBC_INCLUDES) utility.c - -utility-DIET.o: utility.c busybox.h - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ utility.c - -utility-standalone.o: utility.c busybox.h - gcc $(FLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ utility.c - -utility-standalone-DIET.o: utility.c busybox.h - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ -D_STANDALONE_ utility.c - -insmod.o: insmod.c busybox.h - gcc $(FLAGS) $(GLIBC_INCLUDES) insmod.c - -insmod-DIET.o: insmod.c busybox.h - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -o $@ insmod.c - diff --git a/mdk-stage1/insmod-busybox/README b/mdk-stage1/insmod-busybox/README deleted file mode 100644 index 06695074a..000000000 --- a/mdk-stage1/insmod-busybox/README +++ /dev/null @@ -1,8 +0,0 @@ -This insmod code comes from busybox-0.47 - -ftp://ftp.lineo.com/pub/busybox - -It is cool but works only for ix86 architecture. - - -gc diff --git a/mdk-stage1/insmod-busybox/busybox.h b/mdk-stage1/insmod-busybox/busybox.h deleted file mode 100644 index a2d620c8b..000000000 --- a/mdk-stage1/insmod-busybox/busybox.h +++ /dev/null @@ -1,467 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Busybox main internal header file - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. - * - */ -#ifndef _BB_INTERNAL_H_ -#define _BB_INTERNAL_H_ 1 - -#include "Config.h" - -#ifdef DMALLOC -#include "dmalloc.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -/* for the _syscall() macros */ -#include -#include -#include - -/* Some useful definitions */ -#define FALSE ((int) 1) -#define TRUE ((int) 0) - -/* for mtab.c */ -#define MTAB_GETMOUNTPT '1' -#define MTAB_GETDEVICE '2' - -#define BUF_SIZE 8192 -#define EXPAND_ALLOC 1024 - - -#define isBlank(ch) (((ch) == ' ') || ((ch) == '\t')) -#define isDecimal(ch) (((ch) >= '0') && ((ch) <= '9')) -#define isOctal(ch) (((ch) >= '0') && ((ch) <= '7')) -#define isWildCard(ch) (((ch) == '*') || ((ch) == '?') || ((ch) == '[')) - -/* Macros for min/max. */ -#ifndef MIN -#define MIN(a,b) (((a)<(b))?(a):(b)) -#endif - -#ifndef MAX -#define MAX(a,b) (((a)>(b))?(a):(b)) -#endif - - -/* I don't like nested includes, but the string and io functions are used - * too often - */ -#include -#if !defined(NO_STRING_H) || defined(STDC_HEADERS) -# include -# if !defined(STDC_HEADERS) && !defined(NO_MEMORY_H) && !defined(__GNUC__) -# include -# endif -# define memzero(s, n) memset ((void *)(s), 0, (n)) -#else -# include -# define strchr index -# define strrchr rindex -# define memcpy(d, s, n) bcopy((s), (d), (n)) -# define memcmp(s1, s2, n) bcmp((s1), (s2), (n)) -# define memzero(s, n) bzero((s), (n)) -#endif - - -enum Location { - _BB_DIR_ROOT = 0, - _BB_DIR_BIN, - _BB_DIR_SBIN, - _BB_DIR_USR_BIN, - _BB_DIR_USR_SBIN -}; - -struct BB_applet { - const char* name; - int (*main)(int argc, char** argv); - enum Location location; - const char* usage; -}; -/* From busybox.c */ -extern const struct BB_applet applets[]; - -extern int ar_main(int argc, char **argv); -extern int basename_main(int argc, char **argv); -extern int bogomips_main(int argc, char **argv); -extern int busybox_main(int argc, char** argv); -extern int cat_main(int argc, char** argv); -extern int chmod_chown_chgrp_main(int argc, char** argv); -extern int chroot_main(int argc, char** argv); -extern int chvt_main(int argc, char** argv); -extern int clear_main(int argc, char** argv); -extern int cp_mv_main(int argc, char** argv); -extern int cut_main(int argc, char** argv); -extern int date_main(int argc, char** argv); -extern int dc_main(int argc, char** argv); -extern int dd_main(int argc, char** argv); -extern int dirname_main(int argc, char** argv); -extern int deallocvt_main(int argc, char** argv); -extern int df_main(int argc, char** argv); -extern int dmesg_main(int argc, char** argv); -extern int dos2unix_main(int argc, char** argv); -extern int du_main(int argc, char** argv); -extern int dumpkmap_main(int argc, char** argv); -extern int dutmp_main(int argc, char** argv); -extern int echo_main(int argc, char** argv); -extern int expr_main(int argc, char** argv); -extern int false_main(int argc, char** argv); -extern int fbset_main(int argc, char** argv); -extern int fdisk_main(int argc, char** argv); -extern int fdflush_main(int argc, char **argv); -extern int fsck_minix_main(int argc, char **argv); -extern int find_main(int argc, char** argv); -extern int free_main(int argc, char** argv); -extern int freeramdisk_main(int argc, char** argv); -extern int getopt_main(int argc, char** argv); -extern int grep_main(int argc, char** argv); -extern int gunzip_main (int argc, char** argv); -extern int gzip_main(int argc, char** argv); -extern int halt_main(int argc, char** argv); -extern int head_main(int argc, char** argv); -extern int hostid_main(int argc, char** argv); -extern int hostname_main(int argc, char** argv); -extern int id_main(int argc, char** argv); -extern int init_main(int argc, char** argv); -extern int insmod_main(int argc, char** argv); -extern int kill_main(int argc, char** argv); -extern int length_main(int argc, char** argv); -extern int ln_main(int argc, char** argv); -extern int loadacm_main(int argc, char** argv); -extern int loadfont_main(int argc, char** argv); -extern int loadkmap_main(int argc, char** argv); -extern int losetup_main(int argc, char** argv); -extern int logger_main(int argc, char **argv); -extern int logname_main(int argc, char **argv); -extern int ls_main(int argc, char** argv); -extern int lsmod_main(int argc, char** argv); -extern int makedevs_main(int argc, char** argv); -extern int md5sum_main(int argc, char** argv); -extern int mkdir_main(int argc, char** argv); -extern int mkfifo_main(int argc, char **argv); -extern int mkfs_minix_main(int argc, char **argv); -extern int mknod_main(int argc, char** argv); -extern int mkswap_main(int argc, char** argv); -extern int mktemp_main(int argc, char **argv); -extern int nc_main(int argc, char** argv); -extern int more_main(int argc, char** argv); -extern int mount_main(int argc, char** argv); -extern int mt_main(int argc, char** argv); -extern int nslookup_main(int argc, char **argv); -extern int ping_main(int argc, char **argv); -extern int poweroff_main(int argc, char **argv); -extern int printf_main(int argc, char** argv); -extern int ps_main(int argc, char** argv); -extern int pwd_main(int argc, char** argv); -extern int rdate_main(int argc, char** argv); -extern int reboot_main(int argc, char** argv); -extern int renice_main(int argc, char** argv); -extern int reset_main(int argc, char** argv); -extern int rm_main(int argc, char** argv); -extern int rmdir_main(int argc, char **argv); -extern int rmmod_main(int argc, char** argv); -extern int sed_main(int argc, char** argv); -extern int sfdisk_main(int argc, char** argv); -extern int setkeycodes_main(int argc, char** argv); -extern int shell_main(int argc, char** argv); -extern int sleep_main(int argc, char** argv); -extern int sort_main(int argc, char** argv); -extern int swap_on_off_main(int argc, char** argv); -extern int sync_main(int argc, char** argv); -extern int syslogd_main(int argc, char **argv); -extern int tail_main(int argc, char** argv); -extern int tar_main(int argc, char** argv); -extern int tee_main(int argc, char** argv); -extern int test_main(int argc, char** argv); -extern int telnet_main(int argc, char** argv); -extern int touch_main(int argc, char** argv); -extern int tr_main(int argc, char** argv); -extern int true_main(int argc, char** argv); -extern int tput_main(int argc, char** argv); -extern int tryopen_main(int argc, char** argv); -extern int tty_main(int argc, char** argv); -extern int umount_main(int argc, char** argv); -extern int uname_main(int argc, char** argv); -extern int uniq_main(int argc, char** argv); -extern int unix2dos_main(int argc, char** argv); -extern int unrpm_main(int argc, char** argv); -extern int update_main(int argc, char** argv); -extern int uptime_main(int argc, char** argv); -extern int usleep_main(int argc, char** argv); -extern int uuencode_main(int argc, char** argv); -extern int uudecode_main(int argc, char** argv); -extern int wc_main(int argc, char** argv); -extern int wget_main(int argc, char** argv); -extern int which_main(int argc, char** argv); -extern int whoami_main(int argc, char** argv); -extern int xargs_main(int argc, char** argv); -extern int yes_main(int argc, char** argv); - -extern const char ar_usage[]; -extern const char basename_usage[]; -extern const char cat_usage[]; -extern const char chgrp_usage[]; -extern const char chmod_usage[]; -extern const char chown_usage[]; -extern const char chroot_usage[]; -extern const char chvt_usage[]; -extern const char clear_usage[]; -extern const char cp_usage[]; -extern const char cut_usage[]; -extern const char date_usage[]; -extern const char dc_usage[]; -extern const char dd_usage[]; -extern const char deallocvt_usage[]; -extern const char df_usage[]; -extern const char dirname_usage[]; -extern const char dmesg_usage[]; -extern const char dos2unix_usage[]; -extern const char du_usage[]; -extern const char dumpkmap_usage[]; -extern const char dutmp_usage[]; -extern const char echo_usage[]; -extern const char expr_usage[]; -extern const char false_usage[]; -extern const char fdflush_usage[]; -extern const char find_usage[]; -extern const char free_usage[]; -extern const char freeramdisk_usage[]; -extern const char fsck_minix_usage[]; -extern const char grep_usage[]; -extern const char gunzip_usage[]; -extern const char gzip_usage[]; -extern const char halt_usage[]; -extern const char head_usage[]; -extern const char hostid_usage[]; -extern const char hostname_usage[]; -extern const char id_usage[]; -extern const char insmod_usage[]; -extern const char kill_usage[]; -extern const char killall_usage[]; -extern const char length_usage[]; -extern const char ln_usage[]; -extern const char loadacm_usage[]; -extern const char loadfont_usage[]; -extern const char loadkmap_usage[]; -extern const char logger_usage[]; -extern const char logname_usage[]; -extern const char ls_usage[]; -extern const char lsmod_usage[]; -extern const char makedevs_usage[]; -extern const char md5sum_usage[]; -extern const char mkdir_usage[]; -extern const char mkfifo_usage[]; -extern const char mkfs_minix_usage[]; -extern const char mknod_usage[]; -extern const char mkswap_usage[]; -extern const char mktemp_usage[]; -extern const char more_usage[]; -extern const char mount_usage[]; -extern const char mt_usage[]; -extern const char mv_usage[]; -extern const char nc_usage[]; -extern const char nslookup_usage[]; -extern const char ping_usage[]; -extern const char poweroff_usage[]; -extern const char printf_usage[]; -extern const char ps_usage[]; -extern const char pwd_usage[]; -extern const char rdate_usage[]; -extern const char reboot_usage[]; -extern const char renice_usage[]; -extern const char reset_usage[]; -extern const char rm_usage[]; -extern const char rmdir_usage[]; -extern const char rmmod_usage[]; -extern const char sed_usage[]; -extern const char setkeycodes_usage[]; -extern const char shell_usage[]; -extern const char sleep_usage[]; -extern const char sort_usage[]; -extern const char swapoff_usage[]; -extern const char swapon_usage[]; -extern const char sync_usage[]; -extern const char syslogd_usage[]; -extern const char tail_usage[]; -extern const char tar_usage[]; -extern const char tee_usage[]; -extern const char telnet_usage[]; -extern const char test_usage[]; -extern const char touch_usage[]; -extern const char tr_usage[]; -extern const char true_usage[]; -extern const char tty_usage[]; -extern const char umount_usage[]; -extern const char uname_usage[]; -extern const char uniq_usage[]; -extern const char unix2dos_usage[]; -extern const char unrpm_usage[]; -extern const char update_usage[]; -extern const char uptime_usage[]; -extern const char usleep_usage[]; -extern const char uudecode_usage[]; -extern const char uuencode_usage[]; -extern const char wc_usage[]; -extern const char wget_usage[]; -extern const char which_usage[]; -extern const char whoami_usage[]; -extern const char xargs_usage[]; -extern const char yes_usage[]; - -extern const char *applet_name; - -extern void usage(const char *usage) __attribute__ ((noreturn)); -extern void errorMsg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); -extern void logperror(char *s); -extern void fatalError(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))); - -const char *modeString(int mode); -const char *timeString(time_t timeVal); -int isDirectory(const char *name, const int followLinks, struct stat *statBuf); -int isDevice(const char *name); - -typedef struct ino_dev_hash_bucket_struct { - struct ino_dev_hash_bucket_struct *next; - ino_t ino; - dev_t dev; - char name[1]; -} ino_dev_hashtable_bucket_t; -int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name); -void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name); -void reset_ino_dev_hashtable(void); - -int copyFile(const char *srcName, const char *destName, - int setModes, int followLinks, int forceFlag); -int copySubFile(int srcFd, int dstFd, size_t remaining); -char *buildName(const char *dirName, const char *fileName); -int makeString(int argc, const char **argv, char *buf, int bufLen); -char *getChunk(int size); -char *chunkstrdup(const char *str); -void freeChunks(void); -int fullWrite(int fd, const char *buf, int len); -int fullRead(int fd, char *buf, int len); -int recursiveAction(const char *fileName, int recurse, int followLinks, int depthFirst, - int (*fileAction) (const char *fileName, struct stat* statbuf, void* userData), - int (*dirAction) (const char *fileName, struct stat* statbuf, void* userData), - void* userData); - -extern int createPath (const char *name, int mode); -extern int parse_mode( const char* s, mode_t* theMode); - -extern int get_kernel_revision(void); - -extern int get_console_fd(char* tty_name); -extern struct mntent *findMountPoint(const char *name, const char *table); -extern void write_mtab(char* blockDevice, char* directory, - char* filesystemType, long flags, char* string_flags); -extern void erase_mtab(const char * name); -extern void mtab_read(void); -extern char *mtab_first(void **iter); -extern char *mtab_next(void **iter); -extern char *mtab_getinfo(const char *match, const char which); -extern int check_wildcard_match(const char* text, const char* pattern); -extern long getNum (const char *cp); -extern pid_t* findPidByName( char* pidName); -extern int find_real_root_device_name(char* name); -extern char *get_line_from_file(FILE *file); -extern void print_file(FILE *file); -extern int print_file_by_name(char *filename); -extern char process_escape_sequence(char **ptr); -extern char *get_last_path_component(char *path); -// extern void xregcomp(regex_t *preg, const char *regex, int cflags); - -#ifndef DMALLOC -extern void *xmalloc (size_t size); -extern void *xrealloc(void *old, size_t size); -extern void *xcalloc(size_t nmemb, size_t size); -extern char *xstrdup (const char *s); -#endif -extern char *xstrndup (const char *s, int n); - - -/* These parse entries in /etc/passwd and /etc/group. This is desirable - * for BusyBox since we want to avoid using the glibc NSS stuff, which - * increases target size and is often not needed embedded systems. */ -extern long my_getpwnam(char *name); -extern long my_getgrnam(char *name); -extern void my_getpwuid(char *name, long uid); -extern void my_getgrgid(char *group, long gid); -extern long my_getpwnamegid(char *name); - -extern int device_open(char *device, int mode); - -#if defined BB_FEATURE_MOUNT_LOOP -extern int del_loop(const char *device); -extern int set_loop(const char *device, const char *file, int offset, int *loopro); -extern char *find_unused_loop_device (void); -#endif - - -#if (__GLIBC__ < 2) && (defined BB_SYSLOGD || defined BB_INIT) -extern int vdprintf(int d, const char *format, va_list ap); -#endif - -#if defined BB_NFSMOUNT -int nfsmount(const char *spec, const char *node, int *flags, - char **extra_opts, char **mount_opts, int running_bg); -#endif - -#ifndef RB_POWER_OFF -/* Stop system and switch power off if possible. */ -#define RB_POWER_OFF 0x4321fedc -#endif - -/* Include our own copy of struct sysinfo to avoid binary compatability - * problems with Linux 2.4, which changed things. Grumble, grumble. */ -//struct sysinfo { -// long uptime; /* Seconds since boot */ -// unsigned long loads[3]; /* 1, 5, and 15 minute load averages */ -// unsigned long totalram; /* Total usable main memory size */ -// unsigned long freeram; /* Available memory size */ -// unsigned long sharedram; /* Amount of shared memory */ -// unsigned long bufferram; /* Memory used by buffers */ -// unsigned long totalswap; /* Total swap space size */ -// unsigned long freeswap; /* swap space still available */ -// unsigned short procs; /* Number of current processes */ -// unsigned long totalhigh; /* Total high memory size */ -// unsigned long freehigh; /* Available high memory size */ -// unsigned int mem_unit; /* Memory unit size in bytes */ -// char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */ -//}; -extern int sysinfo (struct sysinfo* info); - -/* Bit map related macros -- libc5 doens't provide these... sigh. */ -#ifndef setbit -#define NBBY CHAR_BIT -#define setbit(a,i) ((a)[(i)/NBBY] |= 1<<((i)%NBBY)) -#define clrbit(a,i) ((a)[(i)/NBBY] &= ~(1<<((i)%NBBY))) -#define isset(a,i) ((a)[(i)/NBBY] & (1<<((i)%NBBY))) -#define isclr(a,i) (((a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0) -#endif - -#endif /* _BB_INTERNAL_H_ */ diff --git a/mdk-stage1/insmod-busybox/insmod-frontend.c b/mdk-stage1/insmod-busybox/insmod-frontend.c deleted file mode 100644 index 3e5d6b3d7..000000000 --- a/mdk-stage1/insmod-busybox/insmod-frontend.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include - - -int insmod_main( int argc, char **argv); - -int main( int argc, char **argv) -{ - printf("Using insmod provided by busybox.\n"); - return insmod_main(argc, argv); -} diff --git a/mdk-stage1/insmod-busybox/insmod.c b/mdk-stage1/insmod-busybox/insmod.c deleted file mode 100644 index bdf7ba5f7..000000000 --- a/mdk-stage1/insmod-busybox/insmod.c +++ /dev/null @@ -1,2951 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Mini insmod implementation for busybox - * - * Copyright (C) 1999,2000 by Lineo, inc. - * Written by Erik Andersen - * and Ron Alder - * - * Modified by Bryan Rittmeyer to support SH4 - * and (theoretically) SH3. Note that there is still no true - * multiple architecture support. You just get SH3|SH4|i386, despite - * the mention of ARM and m68k--which may or may not work (but - * almost certainly do not, due to at least MATCH_MACHINE). I have - * only tested SH4 in little endian mode. - * - * Based almost entirely on the Linux modutils-2.3.11 implementation. - * Copyright 1996, 1997 Linux International. - * New implementation contributed by Richard Henderson - * Based on original work by Bjorn Ekwall - * Restructured (and partly rewritten) by: - * Björn Ekwall February 1999 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include "../insmod.h" -#include "busybox.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//---------------------------------------------------------------------------- -//--------modutils module.h, lines 45-242 -//---------------------------------------------------------------------------- - -/* Definitions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_MODULE_H -#define MODUTILS_MODULE_H 1 - -#ident "$Id$" - -/* This file contains the structures used by the 2.0 and 2.1 kernels. - We do not use the kernel headers directly because we do not wish - to be dependant on a particular kernel version to compile insmod. */ - - -/*======================================================================*/ -/* The structures used by Linux 2.0. */ - -/* The symbol format used by get_kernel_syms(2). */ -struct old_kernel_sym -{ - unsigned long value; - char name[60]; -}; - -struct old_module_ref -{ - unsigned long module; /* kernel addresses */ - unsigned long next; -}; - -struct old_module_symbol -{ - unsigned long addr; - unsigned long name; -}; - -struct old_symbol_table -{ - int size; /* total, including string table!!! */ - int n_symbols; - int n_refs; - struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */ - struct old_module_ref ref[0]; /* actual size defined by n_refs */ -}; - -struct old_mod_routines -{ - unsigned long init; - unsigned long cleanup; -}; - -struct old_module -{ - unsigned long next; - unsigned long ref; /* the list of modules that refer to me */ - unsigned long symtab; - unsigned long name; - int size; /* size of module in pages */ - unsigned long addr; /* address of module */ - int state; - unsigned long cleanup; /* cleanup routine */ -}; - -/* Sent to init_module(2) or'ed into the code size parameter. */ -#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */ - -int get_kernel_syms(struct old_kernel_sym *); -int old_sys_init_module(const char *name, char *code, unsigned codesize, - struct old_mod_routines *, struct old_symbol_table *); - -/*======================================================================*/ -/* For sizeof() which are related to the module platform and not to the - environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */ - -#define tgt_sizeof_char sizeof(char) -#define tgt_sizeof_short sizeof(short) -#define tgt_sizeof_int sizeof(int) -#define tgt_sizeof_long sizeof(long) -#define tgt_sizeof_char_p sizeof(char *) -#define tgt_sizeof_void_p sizeof(void *) -#define tgt_long long - -#if defined(__sparc__) && !defined(__sparc_v9__) && defined(ARCH_sparc64) -#undef tgt_sizeof_long -#undef tgt_sizeof_char_p -#undef tgt_sizeof_void_p -#undef tgt_long -#define tgt_sizeof_long 8 -#define tgt_sizeof_char_p 8 -#define tgt_sizeof_void_p 8 -#define tgt_long long long -#endif - -/*======================================================================*/ -/* The structures used in Linux 2.1. */ - -/* Note: new_module_symbol does not use tgt_long intentionally */ -struct new_module_symbol -{ - unsigned long value; - unsigned long name; -}; - -struct new_module_persist; - -struct new_module_ref -{ - unsigned tgt_long dep; /* kernel addresses */ - unsigned tgt_long ref; - unsigned tgt_long next_ref; -}; - -struct new_module -{ - unsigned tgt_long size_of_struct; /* == sizeof(module) */ - unsigned tgt_long next; - unsigned tgt_long name; - unsigned tgt_long size; - - tgt_long usecount; - unsigned tgt_long flags; /* AUTOCLEAN et al */ - - unsigned nsyms; - unsigned ndeps; - - unsigned tgt_long syms; - unsigned tgt_long deps; - unsigned tgt_long refs; - unsigned tgt_long init; - unsigned tgt_long cleanup; - unsigned tgt_long ex_table_start; - unsigned tgt_long ex_table_end; -#ifdef __alpha__ - unsigned tgt_long gp; -#endif - /* Everything after here is extension. */ - unsigned tgt_long persist_start; - unsigned tgt_long persist_end; - unsigned tgt_long can_unload; - unsigned tgt_long runsize; -}; - -struct new_module_info -{ - unsigned long addr; - unsigned long size; - unsigned long flags; - long usecount; -}; - -/* Bits of module.flags. */ -#define NEW_MOD_RUNNING 1 -#define NEW_MOD_DELETED 2 -#define NEW_MOD_AUTOCLEAN 4 -#define NEW_MOD_VISITED 8 -#define NEW_MOD_USED_ONCE 16 - -int new_sys_init_module(const char *name, const struct new_module *); -int query_module(const char *name, int which, void *buf, size_t bufsize, - size_t *ret); - -/* Values for query_module's which. */ - -#define QM_MODULES 1 -#define QM_DEPS 2 -#define QM_REFS 3 -#define QM_SYMBOLS 4 -#define QM_INFO 5 - -/*======================================================================*/ -/* The system calls unchanged between 2.0 and 2.1. */ - -unsigned long create_module(const char *, size_t); -int delete_module(const char *); - - -#endif /* module.h */ - -//---------------------------------------------------------------------------- -//--------end of modutils module.h -//---------------------------------------------------------------------------- - - - -//---------------------------------------------------------------------------- -//--------modutils obj.h, lines 253-462 -//---------------------------------------------------------------------------- - -/* Elf object file loading and relocation routines. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_OBJ_H -#define MODUTILS_OBJ_H 1 - -#ident "$Id$" - -/* The relocatable object is manipulated using elfin types. */ - -#include -#include - - -/* Machine-specific elf macros for i386 et al. */ - -/* the SH changes have only been tested on the SH4 in =little endian= mode */ -/* I'm not sure about big endian, so let's warn: */ - -#if (defined(__SH4__) || defined(__SH3__)) && defined(__BIG_ENDIAN__) -#error insmod.c may require changes for use on big endian SH4/SH3 -#endif - -/* it may or may not work on the SH1/SH2... So let's error on those - also */ -#if (defined(__sh__) && (!(defined(__SH3__) || defined(__SH4__)))) -#error insmod.c may require changes for non-SH3/SH4 use -#endif - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2LSB - - - -#if defined(__sh__) - -#define MATCH_MACHINE(x) (x == EM_SH) -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela - -#else - -/* presumably we can use these for anything but the SH */ -/* this is the previous behavior, but it does result in - insmod.c being broken on anything except i386 */ - -#define MATCH_MACHINE(x) (x == EM_386) -#define SHT_RELM SHT_REL -#define Elf32_RelM Elf32_Rel - -#endif - -#ifndef ElfW -# if ELFCLASSM == ELFCLASS32 -# define ElfW(x) Elf32_ ## x -# define ELFW(x) ELF32_ ## x -# else -# define ElfW(x) Elf64_ ## x -# define ELFW(x) ELF64_ ## x -# endif -#endif - -/* For some reason this is missing from libc5. */ -#ifndef ELF32_ST_INFO -# define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) -#endif - -#ifndef ELF64_ST_INFO -# define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) -#endif - -struct obj_string_patch; -struct obj_symbol_patch; - -struct obj_section -{ - ElfW(Shdr) header; - const char *name; - char *contents; - struct obj_section *load_next; - int idx; -}; - -struct obj_symbol -{ - struct obj_symbol *next; /* hash table link */ - const char *name; - unsigned long value; - unsigned long size; - int secidx; /* the defining section index/module */ - int info; - int ksymidx; /* for export to the kernel symtab */ - int referenced; /* actually used in the link */ -}; - -/* Hardcode the hash table size. We shouldn't be needing so many - symbols that we begin to degrade performance, and we get a big win - by giving the compiler a constant divisor. */ - -#define HASH_BUCKETS 521 - -struct obj_file -{ - ElfW(Ehdr) header; - ElfW(Addr) baseaddr; - struct obj_section **sections; - struct obj_section *load_order; - struct obj_section **load_order_search_start; - struct obj_string_patch *string_patches; - struct obj_symbol_patch *symbol_patches; - int (*symbol_cmp)(const char *, const char *); - unsigned long (*symbol_hash)(const char *); - unsigned long local_symtab_size; - struct obj_symbol **local_symtab; - struct obj_symbol *symtab[HASH_BUCKETS]; -}; - -enum obj_reloc -{ - obj_reloc_ok, - obj_reloc_overflow, - obj_reloc_dangerous, - obj_reloc_unhandled -}; - -struct obj_string_patch -{ - struct obj_string_patch *next; - int reloc_secidx; - ElfW(Addr) reloc_offset; - ElfW(Addr) string_offset; -}; - -struct obj_symbol_patch -{ - struct obj_symbol_patch *next; - int reloc_secidx; - ElfW(Addr) reloc_offset; - struct obj_symbol *sym; -}; - - -/* Generic object manipulation routines. */ - -unsigned long obj_elf_hash(const char *); - -unsigned long obj_elf_hash_n(const char *, unsigned long len); - -struct obj_symbol *obj_add_symbol (struct obj_file *f, const char *name, - unsigned long symidx, int info, int secidx, - ElfW(Addr) value, unsigned long size); - -struct obj_symbol *obj_find_symbol (struct obj_file *f, - const char *name); - -ElfW(Addr) obj_symbol_final_value(struct obj_file *f, - struct obj_symbol *sym); - -void obj_set_symbol_compare(struct obj_file *f, - int (*cmp)(const char *, const char *), - unsigned long (*hash)(const char *)); - -struct obj_section *obj_find_section (struct obj_file *f, - const char *name); - -void obj_insert_section_load_order (struct obj_file *f, - struct obj_section *sec); - -struct obj_section *obj_create_alloced_section (struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size); - -struct obj_section *obj_create_alloced_section_first (struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size); - -void *obj_extend_section (struct obj_section *sec, unsigned long more); - -int obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - const char *string); - -int obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - struct obj_symbol *sym); - -int obj_check_undefineds(struct obj_file *f); - -void obj_allocate_commons(struct obj_file *f); - -unsigned long obj_load_size (struct obj_file *f); - -int obj_relocate (struct obj_file *f, ElfW(Addr) base); - -struct obj_file *obj_load(FILE *f); - -int obj_create_image (struct obj_file *f, char *image); - -/* Architecture specific manipulation routines. */ - -struct obj_file *arch_new_file (void); - -struct obj_section *arch_new_section (void); - -struct obj_symbol *arch_new_symbol (void); - -enum obj_reloc arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - ElfW(RelM) *rel, ElfW(Addr) value); - -int arch_create_got (struct obj_file *f); - -struct new_module; -int arch_init_module (struct obj_file *f, struct new_module *); - -#endif /* obj.h */ -//---------------------------------------------------------------------------- -//--------end of modutils obj.h -//---------------------------------------------------------------------------- - - - - - -#define _PATH_MODULES "/lib/modules" -#define STRVERSIONLEN 32 - -#if !defined(BB_FEATURE_INSMOD_NEW_KERNEL) && !defined(BB_FEATURE_INSMOD_OLD_KERNEL) -#error "Must have ether BB_FEATURE_INSMOD_NEW_KERNEL or BB_FEATURE_INSMOD_OLD_KERNEL defined" -#endif - -/*======================================================================*/ - -int flag_force_load = 1; -int flag_autoclean = 0; -int flag_export = 1; - - -/*======================================================================*/ - -/* previously, these were named i386_* but since we could be - compiling for the sh, I've renamed them to the more general - arch_* These structures are the same between the x86 and SH, - and we can't support anything else right now anyway. In the - future maybe they should be #if defined'd */ - -struct arch_got_entry { - int offset; - unsigned offset_done:1; - unsigned reloc_done:1; -}; - -struct arch_file { - struct obj_file root; - struct obj_section *got; -}; - -struct arch_symbol { - struct obj_symbol root; - struct arch_got_entry gotent; -}; - - -struct external_module { - const char *name; - ElfW(Addr) addr; - int used; - size_t nsyms; - struct new_module_symbol *syms; -}; - -struct new_module_symbol *ksyms; -size_t nksyms; - -struct external_module *ext_modules; -int n_ext_modules; -int n_ext_modules_used; - - - -/* Some firendly syscalls to cheer everyone's day... */ -#define __NR_new_sys_init_module __NR_init_module -_syscall2(int, new_sys_init_module, const char *, name, - const struct new_module *, info) -#define __NR_old_sys_init_module __NR_init_module -_syscall5(int, old_sys_init_module, const char *, name, char *, code, - unsigned, codesize, struct old_mod_routines *, routines, - struct old_symbol_table *, symtab) -#ifndef BB_RMMOD -_syscall1(int, delete_module, const char *, name) -#else -extern int delete_module(const char *); -#endif - -/* This is kind of troublesome. See, we don't actually support - the m68k or the arm the same way we support i386 and (now) - sh. In doing my SH patch, I just assumed that whatever works - for i386 also works for m68k and arm since currently insmod.c - does nothing special for them. If this isn't true, the below - line is rather misleading IMHO, and someone should either - change it or add more proper architecture-dependent support - for these boys. - - -- Bryan Rittmeyer */ - -#if defined(__i386__) || defined(__m68k__) || defined(__arm__) -/* Jump through hoops to fixup error return codes */ -#define __NR__create_module __NR_create_module -static inline _syscall2(long, _create_module, const char *, name, size_t, - size) -unsigned long create_module(const char *name, size_t size) -{ - long ret = _create_module(name, size); - - if (ret == -1 && errno > 125) { - ret = -errno; - errno = 0; - } - return ret; -} -#else -_syscall2(unsigned long, create_module, const char *, name, size_t, size) -#endif -static char m_filename[BUFSIZ + 1] = "\0"; -static char m_fullName[BUFSIZ + 1] = "\0"; - -/*======================================================================*/ - - -/*======================================================================*/ - -struct obj_file *arch_new_file(void) -{ - struct arch_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section *arch_new_section(void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol *arch_new_symbol(void) -{ - struct arch_symbol *sym; - sym = xmalloc(sizeof(*sym)); - memset(&sym->gotent, 0, sizeof(sym->gotent)); - return &sym->root; -} - -enum obj_reloc -arch_apply_relocation(struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, -#if defined(__sh__) - Elf32_Rela * rel, Elf32_Addr v) -#else - Elf32_Rel * rel, Elf32_Addr v) -#endif -{ - struct arch_file *ifile = (struct arch_file *) f; - struct arch_symbol *isym = (struct arch_symbol *) sym; - - Elf32_Addr *loc = (Elf32_Addr *) (targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) { - -/* even though these constants seem to be the same for - the i386 and the sh, we "#if define" them for clarity - and in case that ever changes */ -#if defined(__sh__) - case R_SH_NONE: -#else - case R_386_NONE: -#endif - break; - -#if defined(__sh__) - case R_SH_DIR32: -#else - case R_386_32: -#endif - *loc += v; - break; - -#if defined(__sh__) - case R_SH_REL32: -#else - case R_386_PLT32: - case R_386_PC32: -#endif - *loc += v - dot; - break; - -#if defined(__sh__) - case R_SH_PLT32: - *loc = v - dot; - break; -#endif - - -#if defined(__sh__) - case R_SH_GLOB_DAT: - case R_SH_JMP_SLOT: - *loc = v; - break; -#else - case R_386_GLOB_DAT: - case R_386_JMP_SLOT: - *loc = v; - break; -#endif - -#if defined(__sh__) - case R_SH_RELATIVE: - *loc += f->baseaddr + rel->r_addend; - break; -#else - case R_386_RELATIVE: - *loc += f->baseaddr; - break; -#endif - -#if defined(__sh__) - case R_SH_GOTPC: - assert(got != 0); - *loc += got - dot + rel->r_addend;; - break; -#else - case R_386_GOTPC: - assert(got != 0); - *loc += got - dot; - break; -#endif - -#if defined(__sh__) - case R_SH_GOT32: - assert(isym != NULL); - if (!isym->gotent.reloc_done) { - isym->gotent.reloc_done = 1; - *(Elf32_Addr *) (ifile->got->contents + isym->gotent.offset) = - v; - } - *loc += isym->gotent.offset + rel->r_addend; - break; -#else - case R_386_GOT32: - assert(isym != NULL); - if (!isym->gotent.reloc_done) { - isym->gotent.reloc_done = 1; - *(Elf32_Addr *) (ifile->got->contents + isym->gotent.offset) = - v; - } - *loc += isym->gotent.offset; - break; -#endif - -#if defined(__sh__) - case R_SH_GOTOFF: -#else - case R_386_GOTOFF: -#endif - assert(got != 0); - *loc += v - got; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int arch_create_got(struct obj_file *f) -{ - struct arch_file *ifile = (struct arch_file *) f; - int i, n, offset = 0, gotneeded = 0; - - n = ifile->root.header.e_shnum; - for (i = 0; i < n; ++i) { - struct obj_section *relsec, *symsec, *strsec; -#if defined(__sh__) - Elf32_Rela *rel, *relend; -#else - Elf32_Rel *rel, *relend; -#endif - Elf32_Sym *symtab; - const char *strtab; - - relsec = ifile->root.sections[i]; - if (relsec->header.sh_type != SHT_REL) - continue; - - symsec = ifile->root.sections[relsec->header.sh_link]; - strsec = ifile->root.sections[symsec->header.sh_link]; - - -#if defined(__sh__) - rel = (Elf32_Rela *) relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rela)); -#else - rel = (Elf32_Rel *) relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel)); -#endif - symtab = (Elf32_Sym *) symsec->contents; - strtab = (const char *) strsec->contents; - - for (; rel < relend; ++rel) { - Elf32_Sym *extsym; - struct arch_symbol *intsym; - const char *name; - - switch (ELF32_R_TYPE(rel->r_info)) { -#if defined(__sh__) - case R_SH_GOTPC: - case R_SH_GOTOFF: -#else - case R_386_GOTPC: - case R_386_GOTOFF: -#endif - gotneeded = 1; - default: - continue; - -#if defined(__sh__) - case R_SH_GOT32: -#else - case R_386_GOT32: -#endif - break; - } - - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = - (struct arch_symbol *) obj_find_symbol(&ifile->root, name); - - if (!intsym->gotent.offset_done) { - intsym->gotent.offset_done = 1; - intsym->gotent.offset = offset; - offset += 4; - } - } - } - - if (offset > 0 || gotneeded) - ifile->got = - obj_create_alloced_section(&ifile->root, ".got", 4, offset); - - return 1; -} - -int arch_init_module(struct obj_file *f, struct new_module *mod) -{ - return 1; -} - - -/*======================================================================*/ - -/* Standard ELF hash function. */ -inline unsigned long obj_elf_hash_n(const char *name, unsigned long n) -{ - unsigned long h = 0; - unsigned long g; - unsigned char ch; - - while (n > 0) { - ch = *name++; - h = (h << 4) + ch; - if ((g = (h & 0xf0000000)) != 0) { - h ^= g >> 24; - h &= ~g; - } - n--; - } - return h; -} - -unsigned long obj_elf_hash(const char *name) -{ - return obj_elf_hash_n(name, strlen(name)); -} - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING -/* Get the kernel version in the canonical integer form. */ - -static int get_kernel_version(char str[STRVERSIONLEN]) -{ - struct utsname uts_info; - char *p, *q; - int a, b, c; - - if (uname(&uts_info) < 0) - return -1; - strncpy(str, uts_info.release, STRVERSIONLEN); - p = uts_info.release; - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -/* String comparison for non-co-versioned kernel and module. */ - -static int ncv_strcmp(const char *a, const char *b) -{ - size_t alen = strlen(a), blen = strlen(b); - - if (blen == alen + 10 && b[alen] == '_' && b[alen + 1] == 'R') - return strncmp(a, b, alen); - else if (alen == blen + 10 && a[blen] == '_' && a[blen + 1] == 'R') - return strncmp(a, b, blen); - else - return strcmp(a, b); -} - -/* String hashing for non-co-versioned kernel and module. Here - we are simply forced to drop the crc from the hash. */ - -static unsigned long ncv_symbol_hash(const char *str) -{ - size_t len = strlen(str); - if (len > 10 && str[len - 10] == '_' && str[len - 9] == 'R') - len -= 10; - return obj_elf_hash_n(str, len); -} - -void -obj_set_symbol_compare(struct obj_file *f, - int (*cmp) (const char *, const char *), - unsigned long (*hash) (const char *)) -{ - if (cmp) - f->symbol_cmp = cmp; - if (hash) { - struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next; - int i; - - f->symbol_hash = hash; - - memcpy(tmptab, f->symtab, sizeof(tmptab)); - memset(f->symtab, 0, sizeof(f->symtab)); - - for (i = 0; i < HASH_BUCKETS; ++i) - for (sym = tmptab[i]; sym; sym = next) { - unsigned long h = hash(sym->name) % HASH_BUCKETS; - next = sym->next; - sym->next = f->symtab[h]; - f->symtab[h] = sym; - } - } -} - -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - - -struct obj_symbol *obj_add_symbol(struct obj_file *f, const char *name, - unsigned long symidx, int info, - int secidx, ElfW(Addr) value, - unsigned long size) -{ - struct obj_symbol *sym; - unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS; - int n_type = ELFW(ST_TYPE) (info); - int n_binding = ELFW(ST_BIND) (info); - - for (sym = f->symtab[hash]; sym; sym = sym->next) - if (f->symbol_cmp(sym->name, name) == 0) { - int o_secidx = sym->secidx; - int o_info = sym->info; - int o_type = ELFW(ST_TYPE) (o_info); - int o_binding = ELFW(ST_BIND) (o_info); - - /* A redefinition! Is it legal? */ - - if (secidx == SHN_UNDEF) - return sym; - else if (o_secidx == SHN_UNDEF) - goto found; - else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) { - /* Cope with local and global symbols of the same name - in the same object file, as might have been created - by ld -r. The only reason locals are now seen at this - level at all is so that we can do semi-sensible things - with parameters. */ - - struct obj_symbol *nsym, **p; - - nsym = arch_new_symbol(); - nsym->next = sym->next; - nsym->ksymidx = -1; - - /* Excise the old (local) symbol from the hash chain. */ - for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next) - continue; - *p = sym = nsym; - goto found; - } else if (n_binding == STB_LOCAL) { - /* Another symbol of the same name has already been defined. - Just add this to the local table. */ - sym = arch_new_symbol(); - sym->next = NULL; - sym->ksymidx = -1; - f->local_symtab[symidx] = sym; - goto found; - } else if (n_binding == STB_WEAK) - return sym; - else if (o_binding == STB_WEAK) - goto found; - /* Don't unify COMMON symbols with object types the programmer - doesn't expect. */ - else if (secidx == SHN_COMMON - && (o_type == STT_NOTYPE || o_type == STT_OBJECT)) - return sym; - else if (o_secidx == SHN_COMMON - && (n_type == STT_NOTYPE || n_type == STT_OBJECT)) - goto found; - else { - /* Don't report an error if the symbol is coming from - the kernel or some external module. */ - if (secidx <= SHN_HIRESERVE) - errorMsg("%s multiply defined", name); - return sym; - } - } - - /* Completely new symbol. */ - sym = arch_new_symbol(); - sym->next = f->symtab[hash]; - f->symtab[hash] = sym; - sym->ksymidx = -1; - - if (ELFW(ST_BIND) (info) == STB_LOCAL) - f->local_symtab[symidx] = sym; - - found: - sym->name = name; - sym->value = value; - sym->size = size; - sym->secidx = secidx; - sym->info = info; - - return sym; -} - -struct obj_symbol *obj_find_symbol(struct obj_file *f, const char *name) -{ - struct obj_symbol *sym; - unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS; - - for (sym = f->symtab[hash]; sym; sym = sym->next) - if (f->symbol_cmp(sym->name, name) == 0) - return sym; - - return NULL; -} - -ElfW(Addr) - obj_symbol_final_value(struct obj_file * f, struct obj_symbol * sym) -{ - if (sym) { - if (sym->secidx >= SHN_LORESERVE) - return sym->value; - - return sym->value + f->sections[sym->secidx]->header.sh_addr; - } else { - /* As a special case, a NULL sym has value zero. */ - return 0; - } -} - -struct obj_section *obj_find_section(struct obj_file *f, const char *name) -{ - int i, n = f->header.e_shnum; - - for (i = 0; i < n; ++i) - if (strcmp(f->sections[i]->name, name) == 0) - return f->sections[i]; - - return NULL; -} - -static int obj_load_order_prio(struct obj_section *a) -{ - unsigned long af, ac; - - af = a->header.sh_flags; - - ac = 0; - if (a->name[0] != '.' || strlen(a->name) != 10 || - strcmp(a->name + 5, ".init")) - ac |= 32; - if (af & SHF_ALLOC) - ac |= 16; - if (!(af & SHF_WRITE)) - ac |= 8; - if (af & SHF_EXECINSTR) - ac |= 4; - if (a->header.sh_type != SHT_NOBITS) - ac |= 2; - - return ac; -} - -void -obj_insert_section_load_order(struct obj_file *f, struct obj_section *sec) -{ - struct obj_section **p; - int prio = obj_load_order_prio(sec); - for (p = f->load_order_search_start; *p; p = &(*p)->load_next) - if (obj_load_order_prio(*p) < prio) - break; - sec->load_next = *p; - *p = sec; -} - -struct obj_section *obj_create_alloced_section(struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE | SHF_ALLOC; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -struct obj_section *obj_create_alloced_section_first(struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx + 1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE | SHF_ALLOC; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - sec->load_next = f->load_order; - f->load_order = sec; - if (f->load_order_search_start == &f->load_order) - f->load_order_search_start = &sec->load_next; - - return sec; -} - -void *obj_extend_section(struct obj_section *sec, unsigned long more) -{ - unsigned long oldsize = sec->header.sh_size; - sec->contents = xrealloc(sec->contents, sec->header.sh_size += more); - return sec->contents + oldsize; -} - - - -/* Conditionally add the symbols from the given symbol set to the - new module. */ - -static int -add_symbols_from( - struct obj_file *f, - int idx, struct new_module_symbol *syms, size_t nsyms) -{ - struct new_module_symbol *s; - size_t i; - int used = 0; - - for (i = 0, s = syms; i < nsyms; ++i, ++s) { - - /* Only add symbols that are already marked external. If we - override locals we may cause problems for argument initialization. - We will also create a false dependency on the module. */ - struct obj_symbol *sym; - - sym = obj_find_symbol(f, (char *) s->name); - if (sym && !ELFW(ST_BIND) (sym->info) == STB_LOCAL) { - sym = obj_add_symbol(f, (char *) s->name, -1, - ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - idx, s->value, 0); - /* Did our symbol just get installed? If so, mark the - module as "used". */ - if (sym->secidx == idx) - used = 1; - } - } - - return used; -} - -static void add_kernel_symbols(struct obj_file *f) -{ - struct external_module *m; - int i, nused = 0; - - /* Add module symbols first. */ - - for (i = 0, m = ext_modules; i < n_ext_modules; ++i, ++m) - if (m->nsyms - && add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms, - m->nsyms)) m->used = 1, ++nused; - - n_ext_modules_used = nused; - - /* And finally the symbols from the kernel proper. */ - - if (nksyms) - add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms); -} - -static char *get_modinfo_value(struct obj_file *f, const char *key) -{ - struct obj_section *sec; - char *p, *v, *n, *ep; - size_t klen = strlen(key); - - sec = obj_find_section(f, ".modinfo"); - if (sec == NULL) - return NULL; - p = sec->contents; - ep = p + sec->header.sh_size; - while (p < ep) { - v = strchr(p, '='); - n = strchr(p, '\0'); - if (v) { - if (p + klen == v && strncmp(p, key, klen) == 0) - return v + 1; - } else { - if (p + klen == n && strcmp(p, key) == 0) - return n; - } - p = n + 1; - } - - return NULL; -} - - -/*======================================================================*/ -/* Functions relating to module loading in pre 2.1 kernels. */ - -static int -old_process_module_arguments(struct obj_file *f, int argc, char **argv) -{ - while (argc > 0) { - char *p, *q; - struct obj_symbol *sym; - int *loc; - - p = *argv; - if ((q = strchr(p, '=')) == NULL) { - argc--; - continue; - } - *q++ = '\0'; - - sym = obj_find_symbol(f, p); - - /* Also check that the parameter was not resolved from the kernel. */ - if (sym == NULL || sym->secidx > SHN_HIRESERVE) { - errorMsg("symbol for parameter %s not found", p); - return 0; - } - - loc = (int *) (f->sections[sym->secidx]->contents + sym->value); - - /* Do C quoting if we begin with a ". */ - if (*q == '"') { - char *r, *str; - - str = alloca(strlen(q)); - for (r = str, q++; *q != '"'; ++q, ++r) { - if (*q == '\0') { - errorMsg("improperly terminated string argument for %s", p); - return 0; - } else if (*q == '\\') - switch (*++q) { - case 'a': - *r = '\a'; - break; - case 'b': - *r = '\b'; - break; - case 'e': - *r = '\033'; - break; - case 'f': - *r = '\f'; - break; - case 'n': - *r = '\n'; - break; - case 'r': - *r = '\r'; - break; - case 't': - *r = '\t'; - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { - int c = *q - '0'; - if (q[1] >= '0' && q[1] <= '7') { - c = (c * 8) + *++q - '0'; - if (q[1] >= '0' && q[1] <= '7') - c = (c * 8) + *++q - '0'; - } - *r = c; - } - break; - - default: - *r = *q; - break; - } else - *r = *q; - } - *r = '\0'; - obj_string_patch(f, sym->secidx, sym->value, str); - } else if (*q >= '0' && *q <= '9') { - do - *loc++ = strtoul(q, &q, 0); - while (*q++ == ','); - } else { - char *contents = f->sections[sym->secidx]->contents; - char *loc = contents + sym->value; - char *r; /* To search for commas */ - - /* Break the string with comas */ - while ((r = strchr(q, ',')) != (char *) NULL) { - *r++ = '\0'; - obj_string_patch(f, sym->secidx, loc - contents, q); - loc += sizeof(char *); - q = r; - } - - /* last part */ - obj_string_patch(f, sym->secidx, loc - contents, q); - } - - argc--, argv++; - } - - return 1; -} - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING -static int old_is_module_checksummed(struct obj_file *f) -{ - return obj_find_symbol(f, "Using_Versions") != NULL; -} -/* Get the module's kernel version in the canonical integer form. */ - -static int -old_get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) -{ - struct obj_symbol *sym; - char *p, *q; - int a, b, c; - - sym = obj_find_symbol(f, "kernel_version"); - if (sym == NULL) - return -1; - - p = f->sections[sym->secidx]->contents + sym->value; - strncpy(str, p, STRVERSIONLEN); - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - -#ifdef BB_FEATURE_INSMOD_OLD_KERNEL - -/* Fetch all the symbols and divvy them up as appropriate for the modules. */ - -static int old_get_kernel_symbols(const char *m_name) -{ - struct old_kernel_sym *ks, *k; - struct new_module_symbol *s; - struct external_module *mod; - int nks, nms, nmod, i; - - nks = get_kernel_syms(NULL); - if (nks < 0) { - errorMsg("get_kernel_syms: %s: %s", m_name, strerror(errno)); - return 0; - } - - ks = k = xmalloc(nks * sizeof(*ks)); - - if (get_kernel_syms(ks) != nks) { - logperror("inconsistency with get_kernel_syms -- is someone else " - "playing with modules?"); - free(ks); - return 0; - } - - /* Collect the module information. */ - - mod = NULL; - nmod = -1; - - while (k->name[0] == '#' && k->name[1]) { - struct old_kernel_sym *k2; - struct new_module_symbol *s; - - /* Find out how many symbols this module has. */ - for (k2 = k + 1; k2->name[0] != '#'; ++k2) - continue; - nms = k2 - k - 1; - - mod = xrealloc(mod, (++nmod + 1) * sizeof(*mod)); - mod[nmod].name = k->name + 1; - mod[nmod].addr = k->value; - mod[nmod].used = 0; - mod[nmod].nsyms = nms; - mod[nmod].syms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL); - - for (i = 0, ++k; i < nms; ++i, ++s, ++k) { - s->name = (unsigned long) k->name; - s->value = k->value; - } - - k = k2; - } - - ext_modules = mod; - n_ext_modules = nmod + 1; - - /* Now collect the symbols for the kernel proper. */ - - if (k->name[0] == '#') - ++k; - - nksyms = nms = nks - (k - ks); - ksyms = s = (nms ? xmalloc(nms * sizeof(*s)) : NULL); - - for (i = 0; i < nms; ++i, ++s, ++k) { - s->name = (unsigned long) k->name; - s->value = k->value; - } - - return 1; -} - -/* Return the kernel symbol checksum version, or zero if not used. */ - -static int old_is_kernel_checksummed(void) -{ - /* Using_Versions is the first symbol. */ - if (nksyms > 0 - && strcmp((char *) ksyms[0].name, - "Using_Versions") == 0) return ksyms[0].value; - else - return 0; -} - - -static int old_create_mod_use_count(struct obj_file *f) -{ - struct obj_section *sec; - - sec = obj_create_alloced_section_first(f, ".moduse", sizeof(long), - sizeof(long)); - - obj_add_symbol(f, "mod_use_count_", -1, - ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0, - sizeof(long)); - - return 1; -} - -static int -old_init_module(const char *m_name, struct obj_file *f, - unsigned long m_size) -{ - char *image; - struct old_mod_routines routines; - struct old_symbol_table *symtab; - int ret; - - /* Create the symbol table */ - { - int nsyms = 0, strsize = 0, total; - - /* Size things first... */ - if (flag_export) { - int i; - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (ELFW(ST_BIND) (sym->info) != STB_LOCAL - && sym->secidx <= SHN_HIRESERVE) - { - sym->ksymidx = nsyms++; - strsize += strlen(sym->name) + 1; - } - } - } - - total = (sizeof(struct old_symbol_table) - + nsyms * sizeof(struct old_module_symbol) - + n_ext_modules_used * sizeof(struct old_module_ref) - + strsize); - symtab = xmalloc(total); - symtab->size = total; - symtab->n_symbols = nsyms; - symtab->n_refs = n_ext_modules_used; - - if (flag_export && nsyms) { - struct old_module_symbol *ksym; - char *str; - int i; - - ksym = symtab->symbol; - str = ((char *) ksym + nsyms * sizeof(struct old_module_symbol) - + n_ext_modules_used * sizeof(struct old_module_ref)); - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->ksymidx >= 0) { - ksym->addr = obj_symbol_final_value(f, sym); - ksym->name = - (unsigned long) str - (unsigned long) symtab; - - str = stpcpy(str, sym->name) + 1; - ksym++; - } - } - } - - if (n_ext_modules_used) { - struct old_module_ref *ref; - int i; - - ref = (struct old_module_ref *) - ((char *) symtab->symbol + nsyms * sizeof(struct old_module_symbol)); - - for (i = 0; i < n_ext_modules; ++i) - if (ext_modules[i].used) - ref++->module = ext_modules[i].addr; - } - } - - /* Fill in routines. */ - - routines.init = - obj_symbol_final_value(f, obj_find_symbol(f, "init_module")); - routines.cleanup = - obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module")); - - /* Whew! All of the initialization is complete. Collect the final - module image and give it to the kernel. */ - - image = xmalloc(m_size); - obj_create_image(f, image); - - /* image holds the complete relocated module, accounting correctly for - mod_use_count. However the old module kernel support assume that - it is receiving something which does not contain mod_use_count. */ - ret = old_sys_init_module(m_name, image + sizeof(long), - m_size | (flag_autoclean ? OLD_MOD_AUTOCLEAN - : 0), &routines, symtab); - if (ret) - errorMsg("init_module: %s: %s", m_name, strerror(errno)); - - free(image); - free(symtab); - - return ret == 0; -} - -#else - -#define old_create_mod_use_count(x) TRUE -#define old_init_module(x, y, z) TRUE - -#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */ - - - -/*======================================================================*/ -/* Functions relating to module loading after 2.1.18. */ - -static int -new_process_module_arguments(struct obj_file *f, int argc, char **argv) -{ - while (argc > 0) { - char *p, *q, *key; - struct obj_symbol *sym; - char *contents, *loc; - int min, max, n; - - p = *argv; - if ((q = strchr(p, '=')) == NULL) { - argc--; - continue; - } - - key = alloca(q - p + 6); - memcpy(key, "parm_", 5); - memcpy(key + 5, p, q - p); - key[q - p + 5] = 0; - - p = get_modinfo_value(f, key); - key += 5; - if (p == NULL) { - errorMsg("invalid parameter %s", key); - return 0; - } - - sym = obj_find_symbol(f, key); - - /* Also check that the parameter was not resolved from the kernel. */ - if (sym == NULL || sym->secidx > SHN_HIRESERVE) { - errorMsg("symbol for parameter %s not found", key); - return 0; - } - - if (isdigit(*p)) { - min = strtoul(p, &p, 10); - if (*p == '-') - max = strtoul(p + 1, &p, 10); - else - max = min; - } else - min = max = 1; - - contents = f->sections[sym->secidx]->contents; - loc = contents + sym->value; - n = (*++q != '\0'); - - while (1) { - if ((*p == 's') || (*p == 'c')) { - char *str; - - /* Do C quoting if we begin with a ", else slurp the lot. */ - if (*q == '"') { - char *r; - - str = alloca(strlen(q)); - for (r = str, q++; *q != '"'; ++q, ++r) { - if (*q == '\0') { - errorMsg("improperly terminated string argument for %s", - key); - return 0; - } else if (*q == '\\') - switch (*++q) { - case 'a': - *r = '\a'; - break; - case 'b': - *r = '\b'; - break; - case 'e': - *r = '\033'; - break; - case 'f': - *r = '\f'; - break; - case 'n': - *r = '\n'; - break; - case 'r': - *r = '\r'; - break; - case 't': - *r = '\t'; - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { - int c = *q - '0'; - if (q[1] >= '0' && q[1] <= '7') { - c = (c * 8) + *++q - '0'; - if (q[1] >= '0' && q[1] <= '7') - c = (c * 8) + *++q - '0'; - } - *r = c; - } - break; - - default: - *r = *q; - break; - } else - *r = *q; - } - *r = '\0'; - ++q; - } else { - char *r; - - /* In this case, the string is not quoted. We will break - it using the coma (like for ints). If the user wants to - include comas in a string, he just has to quote it */ - - /* Search the next coma */ - r = strchr(q, ','); - - /* Found ? */ - if (r != (char *) NULL) { - /* Recopy the current field */ - str = alloca(r - q + 1); - memcpy(str, q, r - q); - - /* I don't know if it is usefull, as the previous case - doesn't null terminate the string ??? */ - str[r - q] = '\0'; - - /* Keep next fields */ - q = r; - } else { - /* last string */ - str = q; - q = ""; - } - } - - if (*p == 's') { - /* Normal string */ - obj_string_patch(f, sym->secidx, loc - contents, str); - loc += tgt_sizeof_char_p; - } else { - /* Array of chars (in fact, matrix !) */ - unsigned long charssize; /* size of each member */ - - /* Get the size of each member */ - /* Probably we should do that outside the loop ? */ - if (!isdigit(*(p + 1))) { - errorMsg("parameter type 'c' for %s must be followed by" - " the maximum size", key); - return 0; - } - charssize = strtoul(p + 1, (char **) NULL, 10); - - /* Check length */ - if (strlen(str) >= charssize) { - errorMsg("string too long for %s (max %ld)", key, - charssize - 1); - return 0; - } - - /* Copy to location */ - strcpy((char *) loc, str); - loc += charssize; - } - } else { - long v = strtoul(q, &q, 0); - switch (*p) { - case 'b': - *loc++ = v; - break; - case 'h': - *(short *) loc = v; - loc += tgt_sizeof_short; - break; - case 'i': - *(int *) loc = v; - loc += tgt_sizeof_int; - break; - case 'l': - *(long *) loc = v; - loc += tgt_sizeof_long; - break; - - default: - errorMsg("unknown parameter type '%c' for %s", *p, key); - return 0; - } - } - - retry_end_of_value: - switch (*q) { - case '\0': - goto end_of_arg; - - case ' ': - case '\t': - case '\n': - case '\r': - ++q; - goto retry_end_of_value; - - case ',': - if (++n > max) { - errorMsg("too many values for %s (max %d)", key, max); - return 0; - } - ++q; - break; - - default: - errorMsg("invalid argument syntax for %s", key); - return 0; - } - } - - end_of_arg: - if (n < min) { - errorMsg("too few values for %s (min %d)", key, min); - return 0; - } - - argc--, argv++; - } - - return 1; -} - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING -static int new_is_module_checksummed(struct obj_file *f) -{ - const char *p = get_modinfo_value(f, "using_checksums"); - if (p) - return atoi(p); - else - return 0; -} - -/* Get the module's kernel version in the canonical integer form. */ - -static int -new_get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) -{ - char *p, *q; - int a, b, c; - - p = get_modinfo_value(f, "kernel_version"); - if (p == NULL) - return -1; - strncpy(str, p, STRVERSIONLEN); - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - - -#ifdef BB_FEATURE_INSMOD_NEW_KERNEL - -/* Fetch the loaded modules, and all currently exported symbols. */ - -static int new_get_kernel_symbols(void) -{ - char *module_names, *mn; - struct external_module *modules, *m; - struct new_module_symbol *syms, *s; - size_t ret, bufsize, nmod, nsyms, i, j; - - /* Collect the loaded modules. */ - - module_names = xmalloc(bufsize = 256); - retry_modules_load: - if (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) { - if (errno == ENOSPC) { - module_names = xrealloc(module_names, bufsize = ret); - goto retry_modules_load; - } - errorMsg("QM_MODULES: %s", strerror(errno)); - return 0; - } - - n_ext_modules = nmod = ret; - ext_modules = modules = xmalloc(nmod * sizeof(*modules)); - memset(modules, 0, nmod * sizeof(*modules)); - - /* Collect the modules' symbols. */ - - for (i = 0, mn = module_names, m = modules; - i < nmod; ++i, ++m, mn += strlen(mn) + 1) { - struct new_module_info info; - - if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) { - if (errno == ENOENT) { - /* The module was removed out from underneath us. */ - continue; - } - errorMsg("query_module: QM_INFO: %s: %s", mn, strerror(errno)); - return 0; - } - - syms = xmalloc(bufsize = 1024); - retry_mod_sym_load: - if (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) { - switch (errno) { - case ENOSPC: - syms = xrealloc(syms, bufsize = ret); - goto retry_mod_sym_load; - case ENOENT: - /* The module was removed out from underneath us. */ - continue; - default: - errorMsg("query_module: QM_SYMBOLS: %s: %s", mn, strerror(errno)); - return 0; - } - } - nsyms = ret; - - m->name = mn; - m->addr = info.addr; - m->nsyms = nsyms; - m->syms = syms; - - for (j = 0, s = syms; j < nsyms; ++j, ++s) { - s->name += (unsigned long) syms; - } - } - - /* Collect the kernel's symbols. */ - - syms = xmalloc(bufsize = 16 * 1024); - retry_kern_sym_load: - if (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) { - if (errno == ENOSPC) { - syms = xrealloc(syms, bufsize = ret); - goto retry_kern_sym_load; - } - errorMsg("kernel: QM_SYMBOLS: %s", strerror(errno)); - return 0; - } - nksyms = nsyms = ret; - ksyms = syms; - - for (j = 0, s = syms; j < nsyms; ++j, ++s) { - s->name += (unsigned long) syms; - } - return 1; -} - - -/* Return the kernel symbol checksum version, or zero if not used. */ - -static int new_is_kernel_checksummed(void) -{ - struct new_module_symbol *s; - size_t i; - - /* Using_Versions is not the first symbol, but it should be in there. */ - - for (i = 0, s = ksyms; i < nksyms; ++i, ++s) - if (strcmp((char *) s->name, "Using_Versions") == 0) - return s->value; - - return 0; -} - - -static int new_create_this_module(struct obj_file *f, const char *m_name) -{ - struct obj_section *sec; - - sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long, - sizeof(struct new_module)); - memset(sec->contents, 0, sizeof(struct new_module)); - - obj_add_symbol(f, "__this_module", -1, - ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), sec->idx, 0, - sizeof(struct new_module)); - - obj_string_patch(f, sec->idx, offsetof(struct new_module, name), - m_name); - - return 1; -} - - -static int new_create_module_ksymtab(struct obj_file *f) -{ - struct obj_section *sec; - int i; - - /* We must always add the module references. */ - - if (n_ext_modules_used) { - struct new_module_ref *dep; - struct obj_symbol *tm; - - sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p, - (sizeof(struct new_module_ref) - * n_ext_modules_used)); - if (!sec) - return 0; - - tm = obj_find_symbol(f, "__this_module"); - dep = (struct new_module_ref *) sec->contents; - for (i = 0; i < n_ext_modules; ++i) - if (ext_modules[i].used) { - dep->dep = ext_modules[i].addr; - obj_symbol_patch(f, sec->idx, - (char *) &dep->ref - sec->contents, tm); - dep->next_ref = 0; - ++dep; - } - } - - if (flag_export && !obj_find_section(f, "__ksymtab")) { - size_t nsyms; - int *loaded; - - sec = - obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, - 0); - - /* We don't want to export symbols residing in sections that - aren't loaded. There are a number of these created so that - we make sure certain module options don't appear twice. */ - - loaded = alloca(sizeof(int) * (i = f->header.e_shnum)); - while (--i >= 0) - loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0; - - for (nsyms = i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (ELFW(ST_BIND) (sym->info) != STB_LOCAL - && sym->secidx <= SHN_HIRESERVE - && (sym->secidx >= SHN_LORESERVE - || loaded[sym->secidx])) { - ElfW(Addr) ofs = nsyms * 2 * tgt_sizeof_void_p; - - obj_symbol_patch(f, sec->idx, ofs, sym); - obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, - sym->name); - - nsyms++; - } - } - - obj_extend_section(sec, nsyms * 2 * tgt_sizeof_char_p); - } - - return 1; -} - - -static int -new_init_module(const char *m_name, struct obj_file *f, - unsigned long m_size) -{ - struct new_module *module; - struct obj_section *sec; - void *image; - int ret; - tgt_long m_addr; - - sec = obj_find_section(f, ".this"); - module = (struct new_module *) sec->contents; - m_addr = sec->header.sh_addr; - - module->size_of_struct = sizeof(*module); - module->size = m_size; - module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0; - - sec = obj_find_section(f, "__ksymtab"); - if (sec && sec->header.sh_size) { - module->syms = sec->header.sh_addr; - module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p); - } - - if (n_ext_modules_used) { - sec = obj_find_section(f, ".kmodtab"); - module->deps = sec->header.sh_addr; - module->ndeps = n_ext_modules_used; - } - - module->init = - obj_symbol_final_value(f, obj_find_symbol(f, "init_module")); - module->cleanup = - obj_symbol_final_value(f, obj_find_symbol(f, "cleanup_module")); - - sec = obj_find_section(f, "__ex_table"); - if (sec) { - module->ex_table_start = sec->header.sh_addr; - module->ex_table_end = sec->header.sh_addr + sec->header.sh_size; - } - - sec = obj_find_section(f, ".text.init"); - if (sec) { - module->runsize = sec->header.sh_addr - m_addr; - } - sec = obj_find_section(f, ".data.init"); - if (sec) { - if (!module->runsize || - module->runsize > sec->header.sh_addr - m_addr) - module->runsize = sec->header.sh_addr - m_addr; - } - - if (!arch_init_module(f, module)) - return 0; - - /* Whew! All of the initialization is complete. Collect the final - module image and give it to the kernel. */ - - image = xmalloc(m_size); - obj_create_image(f, image); - - ret = new_sys_init_module(m_name, (struct new_module *) image); - if (ret) - errorMsg("init_module: %s: %s", m_name, strerror(errno)); - - free(image); - - return ret == 0; -} - -#else - -#define new_init_module(x, y, z) TRUE -#define new_create_this_module(x, y) 0 -#define new_create_module_ksymtab(x) - -#endif /* BB_FEATURE_INSMOD_OLD_KERNEL */ - - -/*======================================================================*/ - -int -obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - const char *string) -{ - struct obj_string_patch *p; - struct obj_section *strsec; - size_t len = strlen(string) + 1; - char *loc; - - p = xmalloc(sizeof(*p)); - p->next = f->string_patches; - p->reloc_secidx = secidx; - p->reloc_offset = offset; - f->string_patches = p; - - strsec = obj_find_section(f, ".kstrtab"); - if (strsec == NULL) { - strsec = obj_create_alloced_section(f, ".kstrtab", 1, len); - p->string_offset = 0; - loc = strsec->contents; - } else { - p->string_offset = strsec->header.sh_size; - loc = obj_extend_section(strsec, len); - } - memcpy(loc, string, len); - - return 1; -} - -int -obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - struct obj_symbol *sym) -{ - struct obj_symbol_patch *p; - - p = xmalloc(sizeof(*p)); - p->next = f->symbol_patches; - p->reloc_secidx = secidx; - p->reloc_offset = offset; - p->sym = sym; - f->symbol_patches = p; - - return 1; -} - -int obj_check_undefineds(struct obj_file *f) -{ - unsigned long i; - int ret = 1; - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->secidx == SHN_UNDEF) { - if (ELFW(ST_BIND) (sym->info) == STB_WEAK) { - sym->secidx = SHN_ABS; - sym->value = 0; - } else { - errorMsg("unresolved symbol %s", sym->name); - ret = 0; - } - } - } - - return ret; -} - -void obj_allocate_commons(struct obj_file *f) -{ - struct common_entry { - struct common_entry *next; - struct obj_symbol *sym; - } *common_head = NULL; - - unsigned long i; - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->secidx == SHN_COMMON) { - /* Collect all COMMON symbols and sort them by size so as to - minimize space wasted by alignment requirements. */ - { - struct common_entry **p, *n; - for (p = &common_head; *p; p = &(*p)->next) - if (sym->size <= (*p)->sym->size) - break; - - n = alloca(sizeof(*n)); - n->next = *p; - n->sym = sym; - *p = n; - } - } - } - - for (i = 1; i < f->local_symtab_size; ++i) { - struct obj_symbol *sym = f->local_symtab[i]; - if (sym && sym->secidx == SHN_COMMON) { - struct common_entry **p, *n; - for (p = &common_head; *p; p = &(*p)->next) - if (sym == (*p)->sym) - break; - else if (sym->size < (*p)->sym->size) { - n = alloca(sizeof(*n)); - n->next = *p; - n->sym = sym; - *p = n; - break; - } - } - } - - if (common_head) { - /* Find the bss section. */ - for (i = 0; i < f->header.e_shnum; ++i) - if (f->sections[i]->header.sh_type == SHT_NOBITS) - break; - - /* If for some reason there hadn't been one, create one. */ - if (i == f->header.e_shnum) { - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (i + 1) * sizeof(sec)); - f->sections[i] = sec = arch_new_section(); - f->header.e_shnum = i + 1; - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE | SHF_ALLOC; - sec->name = ".bss"; - sec->idx = i; - } - - /* Allocate the COMMONS. */ - { - ElfW(Addr) bss_size = f->sections[i]->header.sh_size; - ElfW(Addr) max_align = f->sections[i]->header.sh_addralign; - struct common_entry *c; - - for (c = common_head; c; c = c->next) { - ElfW(Addr) align = c->sym->value; - - if (align > max_align) - max_align = align; - if (bss_size & (align - 1)) - bss_size = (bss_size | (align - 1)) + 1; - - c->sym->secidx = i; - c->sym->value = bss_size; - - bss_size += c->sym->size; - } - - f->sections[i]->header.sh_size = bss_size; - f->sections[i]->header.sh_addralign = max_align; - } - } - - /* For the sake of patch relocation and parameter initialization, - allocate zeroed data for NOBITS sections now. Note that after - this we cannot assume NOBITS are really empty. */ - for (i = 0; i < f->header.e_shnum; ++i) { - struct obj_section *s = f->sections[i]; - if (s->header.sh_type == SHT_NOBITS) { - s->contents = memset(xmalloc(s->header.sh_size), - 0, s->header.sh_size); - s->header.sh_type = SHT_PROGBITS; - } - } -} - -unsigned long obj_load_size(struct obj_file *f) -{ - unsigned long dot = 0; - struct obj_section *sec; - - /* Finalize the positions of the sections relative to one another. */ - - for (sec = f->load_order; sec; sec = sec->load_next) { - ElfW(Addr) align; - - align = sec->header.sh_addralign; - if (align && (dot & (align - 1))) - dot = (dot | (align - 1)) + 1; - - sec->header.sh_addr = dot; - dot += sec->header.sh_size; - } - - return dot; -} - -int obj_relocate(struct obj_file *f, ElfW(Addr) base) -{ - int i, n = f->header.e_shnum; - int ret = 1; - - /* Finalize the addresses of the sections. */ - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - - /* And iterate over all of the relocations. */ - - for (i = 0; i < n; ++i) { - struct obj_section *relsec, *symsec, *targsec, *strsec; - ElfW(RelM) * rel, *relend; - ElfW(Sym) * symtab; - const char *strtab; - - relsec = f->sections[i]; - if (relsec->header.sh_type != SHT_RELM) - continue; - - symsec = f->sections[relsec->header.sh_link]; - targsec = f->sections[relsec->header.sh_info]; - strsec = f->sections[symsec->header.sh_link]; - - rel = (ElfW(RelM) *) relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM))); - symtab = (ElfW(Sym) *) symsec->contents; - strtab = (const char *) strsec->contents; - - for (; rel < relend; ++rel) { - ElfW(Addr) value = 0; - struct obj_symbol *intsym = NULL; - unsigned long symndx; - ElfW(Sym) * extsym = 0; - const char *errmsg; - - /* Attempt to find a value to use for this relocation. */ - - symndx = ELFW(R_SYM) (rel->r_info); - if (symndx) { - /* Note we've already checked for undefined symbols. */ - - extsym = &symtab[symndx]; - if (ELFW(ST_BIND) (extsym->st_info) == STB_LOCAL) { - /* Local symbols we look up in the local table to be sure - we get the one that is really intended. */ - intsym = f->local_symtab[symndx]; - } else { - /* Others we look up in the hash table. */ - const char *name; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = obj_find_symbol(f, name); - } - - value = obj_symbol_final_value(f, intsym); - intsym->referenced = 1; - } -#if SHT_RELM == SHT_RELA -#if defined(__alpha__) && defined(AXP_BROKEN_GAS) - /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */ - if (!extsym || !extsym->st_name || - ELFW(ST_BIND) (extsym->st_info) != STB_LOCAL) -#endif - value += rel->r_addend; -#endif - - /* Do it! */ - switch (arch_apply_relocation - (f, targsec, symsec, intsym, rel, value)) { - case obj_reloc_ok: - break; - - case obj_reloc_overflow: - errmsg = "Relocation overflow"; - goto bad_reloc; - case obj_reloc_dangerous: - errmsg = "Dangerous relocation"; - goto bad_reloc; - case obj_reloc_unhandled: - errmsg = "Unhandled relocation"; - bad_reloc: - if (extsym) { - errorMsg("%s of type %ld for %s", errmsg, - (long) ELFW(R_TYPE) (rel->r_info), - strtab + extsym->st_name); - } else { - errorMsg("%s of type %ld", errmsg, - (long) ELFW(R_TYPE) (rel->r_info)); - } - ret = 0; - break; - } - } - } - - /* Finally, take care of the patches. */ - - if (f->string_patches) { - struct obj_string_patch *p; - struct obj_section *strsec; - ElfW(Addr) strsec_base; - strsec = obj_find_section(f, ".kstrtab"); - strsec_base = strsec->header.sh_addr; - - for (p = f->string_patches; p; p = p->next) { - struct obj_section *targsec = f->sections[p->reloc_secidx]; - *(ElfW(Addr) *) (targsec->contents + p->reloc_offset) - = strsec_base + p->string_offset; - } - } - - if (f->symbol_patches) { - struct obj_symbol_patch *p; - - for (p = f->symbol_patches; p; p = p->next) { - struct obj_section *targsec = f->sections[p->reloc_secidx]; - *(ElfW(Addr) *) (targsec->contents + p->reloc_offset) - = obj_symbol_final_value(f, p->sym); - } - } - - return ret; -} - -int obj_create_image(struct obj_file *f, char *image) -{ - struct obj_section *sec; - ElfW(Addr) base = f->baseaddr; - - for (sec = f->load_order; sec; sec = sec->load_next) { - char *secimg; - - if (sec->header.sh_size == 0) - continue; - - secimg = image + (sec->header.sh_addr - base); - - /* Note that we allocated data for NOBITS sections earlier. */ - memcpy(secimg, sec->contents, sec->header.sh_size); - } - - return 1; -} - -/*======================================================================*/ - -struct obj_file *obj_load(FILE * fp) -{ - struct obj_file *f; - ElfW(Shdr) * section_headers; - int shnum, i; - char *shstrtab; - - /* Read the file header. */ - - f = arch_new_file(); - memset(f, 0, sizeof(*f)); - f->symbol_cmp = strcmp; - f->symbol_hash = obj_elf_hash; - f->load_order_search_start = &f->load_order; - - fseek(fp, 0, SEEK_SET); - if (fread(&f->header, sizeof(f->header), 1, fp) != 1) { - errorMsg("error reading ELF header: %s", strerror(errno)); - return NULL; - } - - if (f->header.e_ident[EI_MAG0] != ELFMAG0 - || f->header.e_ident[EI_MAG1] != ELFMAG1 - || f->header.e_ident[EI_MAG2] != ELFMAG2 - || f->header.e_ident[EI_MAG3] != ELFMAG3) { - errorMsg("not an ELF file"); - return NULL; - } - if (f->header.e_ident[EI_CLASS] != ELFCLASSM - || f->header.e_ident[EI_DATA] != ELFDATAM - || f->header.e_ident[EI_VERSION] != EV_CURRENT - || !MATCH_MACHINE(f->header.e_machine)) { - errorMsg("ELF file not for this architecture"); - return NULL; - } - if (f->header.e_type != ET_REL) { - errorMsg("ELF file not a relocatable object"); - return NULL; - } - - /* Read the section headers. */ - - if (f->header.e_shentsize != sizeof(ElfW(Shdr))) { - errorMsg("section header size mismatch: %lu != %lu", - (unsigned long) f->header.e_shentsize, - (unsigned long) sizeof(ElfW(Shdr))); - return NULL; - } - - shnum = f->header.e_shnum; - f->sections = xmalloc(sizeof(struct obj_section *) * shnum); - memset(f->sections, 0, sizeof(struct obj_section *) * shnum); - - section_headers = alloca(sizeof(ElfW(Shdr)) * shnum); - fseek(fp, f->header.e_shoff, SEEK_SET); - if (fread(section_headers, sizeof(ElfW(Shdr)), shnum, fp) != shnum) { - errorMsg("error reading ELF section headers: %s", strerror(errno)); - return NULL; - } - - /* Read the section data. */ - - for (i = 0; i < shnum; ++i) { - struct obj_section *sec; - - f->sections[i] = sec = arch_new_section(); - memset(sec, 0, sizeof(*sec)); - - sec->header = section_headers[i]; - sec->idx = i; - - switch (sec->header.sh_type) { - case SHT_NULL: - case SHT_NOTE: - case SHT_NOBITS: - /* ignore */ - break; - - case SHT_PROGBITS: - case SHT_SYMTAB: - case SHT_STRTAB: - case SHT_RELM: - if (sec->header.sh_size > 0) { - sec->contents = xmalloc(sec->header.sh_size); - fseek(fp, sec->header.sh_offset, SEEK_SET); - if (fread(sec->contents, sec->header.sh_size, 1, fp) != 1) { - errorMsg("error reading ELF section data: %s", strerror(errno)); - return NULL; - } - } else { - sec->contents = NULL; - } - break; - -#if SHT_RELM == SHT_REL - case SHT_RELA: - errorMsg("RELA relocations not supported on this architecture"); - return NULL; -#else - case SHT_REL: - errorMsg("REL relocations not supported on this architecture"); - return NULL; -#endif - - default: - if (sec->header.sh_type >= SHT_LOPROC) { - /* Assume processor specific section types are debug - info and can safely be ignored. If this is ever not - the case (Hello MIPS?), don't put ifdefs here but - create an arch_load_proc_section(). */ - break; - } - - errorMsg("can't handle sections of type %ld", - (long) sec->header.sh_type); - return NULL; - } - } - - /* Do what sort of interpretation as needed by each section. */ - - shstrtab = f->sections[f->header.e_shstrndx]->contents; - - for (i = 0; i < shnum; ++i) { - struct obj_section *sec = f->sections[i]; - sec->name = shstrtab + sec->header.sh_name; - } - - for (i = 0; i < shnum; ++i) { - struct obj_section *sec = f->sections[i]; - - if (sec->header.sh_flags & SHF_ALLOC) - obj_insert_section_load_order(f, sec); - - switch (sec->header.sh_type) { - case SHT_SYMTAB: - { - unsigned long nsym, j; - char *strtab; - ElfW(Sym) * sym; - - if (sec->header.sh_entsize != sizeof(ElfW(Sym))) { - errorMsg("symbol size mismatch: %lu != %lu", - (unsigned long) sec->header.sh_entsize, - (unsigned long) sizeof(ElfW(Sym))); - return NULL; - } - - nsym = sec->header.sh_size / sizeof(ElfW(Sym)); - strtab = f->sections[sec->header.sh_link]->contents; - sym = (ElfW(Sym) *) sec->contents; - - /* Allocate space for a table of local symbols. */ - j = f->local_symtab_size = sec->header.sh_info; - f->local_symtab = xmalloc(j *= - sizeof(struct obj_symbol *)); - memset(f->local_symtab, 0, j); - - /* Insert all symbols into the hash table. */ - for (j = 1, ++sym; j < nsym; ++j, ++sym) { - const char *name; - if (sym->st_name) - name = strtab + sym->st_name; - else - name = f->sections[sym->st_shndx]->name; - - obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx, - sym->st_value, sym->st_size); - } - } - break; - - case SHT_RELM: - if (sec->header.sh_entsize != sizeof(ElfW(RelM))) { - errorMsg("relocation entry size mismatch: %lu != %lu", - (unsigned long) sec->header.sh_entsize, - (unsigned long) sizeof(ElfW(RelM))); - return NULL; - } - break; - } - } - - return f; -} - -static void hide_special_symbols(struct obj_file *f) -{ - static const char *const specials[] = { - "cleanup_module", - "init_module", - "kernel_version", - NULL - }; - - struct obj_symbol *sym; - const char *const *p; - - for (p = specials; *p; ++p) - if ((sym = obj_find_symbol(f, *p)) != NULL) - sym->info = - ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info)); -} - - -void my_usage(void) -{ - printf("Usage."); - exit(0); -} - -extern int insmod_main( int argc, char **argv) -{ - int k_crcs; - int k_new_syscalls; - int len; - char *tmp; - unsigned long m_size; - ElfW(Addr) m_addr; - FILE *fp; - struct obj_file *f; - char m_name[BUFSIZ + 1] = "\0"; - int exit_status = FALSE; - int m_has_modinfo; -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING - int k_version; - char k_strversion[STRVERSIONLEN]; - char m_strversion[STRVERSIONLEN]; - int m_version; - int m_crcs; -#endif - - - if (argc <= 1) - my_usage(); - - argv++; argc--; - - /* Grab the module name */ - if ((tmp = strrchr(*argv, '/')) != NULL) { - tmp++; - } else { - tmp = *argv; - } - len = strlen(tmp); - - if (len > 2 && tmp[len - 2] == '.' && tmp[len - 1] == 'o') - len -= 2; - memcpy(m_name, tmp, len); - strcpy(m_fullName, m_name); - strcat(m_fullName, ".o"); - - /* Get a filedesc for the module */ - if ((fp = fopen(*argv, "r")) == NULL) { - errorMsg("Module %s not found", *argv); - return -1; - } else - memcpy(m_filename, *argv, strlen(*argv)); - - - if ((f = obj_load(fp)) == NULL) { - logperror("Could not load the module"); - goto out; - } - - if (get_modinfo_value(f, "kernel_version") == NULL) - m_has_modinfo = 0; - else - m_has_modinfo = 1; - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING - /* Version correspondence? */ - - k_version = get_kernel_version(k_strversion); - if (m_has_modinfo) { - m_version = new_get_module_version(f, m_strversion); - } else { - m_version = old_get_module_version(f, m_strversion); - if (m_version == -1) { - errorMsg("couldn't find the kernel version the module was " - "compiled for"); - goto out; - } - } - - if (strncmp(k_strversion, m_strversion, STRVERSIONLEN) != 0) { - if (flag_force_load) { - errorMsg("Warning: kernel-module version mismatch\n" - "\t%s was compiled for kernel version %s\n" - "\twhile this kernel is version %s", - m_filename, m_strversion, k_strversion); - } else { - errorMsg("kernel-module version mismatch\n" - "\t%s was compiled for kernel version %s\n" - "\twhile this kernel is version %s.", - m_filename, m_strversion, k_strversion); - goto out; - } - } - k_crcs = 0; -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - - k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL); - - if (k_new_syscalls) { -#ifdef BB_FEATURE_INSMOD_NEW_KERNEL - if (!new_get_kernel_symbols()) - goto out; - k_crcs = new_is_kernel_checksummed(); -#else - errorMsg("Not configured to support new kernels"); - goto out; -#endif - } else { -#ifdef BB_FEATURE_INSMOD_OLD_KERNEL - if (!old_get_kernel_symbols(m_name)) - goto out; - k_crcs = old_is_kernel_checksummed(); -#else - errorMsg("Not configured to support old kernels"); - goto out; -#endif - } - -#ifdef BB_FEATURE_INSMOD_VERSION_CHECKING - if (m_has_modinfo) - m_crcs = new_is_module_checksummed(f); - else - m_crcs = old_is_module_checksummed(f); - - if (m_crcs != k_crcs) - obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash); -#endif /* BB_FEATURE_INSMOD_VERSION_CHECKING */ - - /* Let the module know about the kernel symbols. */ - add_kernel_symbols(f); - - /* Allocate common symbols, symbol tables, and string tables. */ - - if (k_new_syscalls - ? !new_create_this_module(f, m_name) - : !old_create_mod_use_count(f)) - { - goto out; - } - - if (!obj_check_undefineds(f)) { - goto out; - } - obj_allocate_commons(f); - - if (m_has_modinfo - ? !new_process_module_arguments(f, argc-1, argv+1) - : !old_process_module_arguments(f, argc-1, argv+1)) - { - goto out; - } - - arch_create_got(f); - hide_special_symbols(f); - - if (k_new_syscalls) - new_create_module_ksymtab(f); - - /* Find current size of the module */ - m_size = obj_load_size(f); - - - errno = 0; - m_addr = create_module(m_name, m_size); - switch (errno) { - case 0: - break; - case EEXIST: - errorMsg("A module named %s already exists", m_name); - /* Considered as a success in stage1 */ - fclose(fp); - return(TRUE); - case ENOMEM: - errorMsg("Can't allocate kernel memory for module; needed %lu bytes", - m_size); - goto out; - default: - errorMsg("create_module: %s: %s", m_name, strerror(errno)); - goto out; - } - - if (!obj_relocate(f, m_addr)) { - delete_module(m_name); - goto out; - } - - if (k_new_syscalls - ? !new_init_module(m_name, f, m_size) - : !old_init_module(m_name, f, m_size)) - { - delete_module(m_name); - goto out; - } - - exit_status = TRUE; - -out: - fclose(fp); - return(exit_status); -} - - -int insmod_call(char * full_filename, char * params) -{ - int argc = 2; - char *argv[50]; - char * ptr = params; - argv[0] = "stage1"; - argv[1] = full_filename; - - while (ptr != NULL) { - argv[argc] = ptr; - argc++; - ptr = strchr(ptr, ' '); - if (ptr) { - ptr[0] = '\0'; - ptr++; - } - } - - return insmod_main(argc, argv); -} diff --git a/mdk-stage1/insmod-busybox/loop.h b/mdk-stage1/insmod-busybox/loop.h deleted file mode 100644 index cba8c6b2b..000000000 --- a/mdk-stage1/insmod-busybox/loop.h +++ /dev/null @@ -1,5 +0,0 @@ -#include -#undef dev_t -#define dev_t __kernel_dev_t -#include -#undef dev_t diff --git a/mdk-stage1/insmod-busybox/messages.c b/mdk-stage1/insmod-busybox/messages.c deleted file mode 100644 index 81fd9c75c..000000000 --- a/mdk-stage1/insmod-busybox/messages.c +++ /dev/null @@ -1,90 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Copyright (C) 2000 by BitterSweet Enterprises, LLC. - * Written by Karl M. Hegbloom - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -/* - * Let's put all of these messages in one place, and link this in as - * a separate object module, so that there are not going to be - * multiple non-unique but very similar strings in the binary. - * Perhaps this will make it simpler to internationalize also, and - * may make the binary slightly smaller. - */ - -// To use this header file, include something like this: -// -//#define BB_DECLARE_EXTERN -//#define bb_need_memory_exhausted -//#include "messages.c" -// -//Then just use the string memory_exhausted when it is needed. -// - -#include "busybox.h" -#ifndef _BB_MESSAGES_C -#define _BB_MESSAGES_C - -#ifdef BB_DECLARE_EXTERN -# define BB_DEF_MESSAGE(symbol, string_const) extern const char *symbol; -#else -# define BB_DEF_MESSAGE(symbol, string_const) const char *symbol = string_const; -#endif - - -#if defined bb_need_full_version || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(full_version, - "BusyBox v" BB_VER " (" BB_BT ") multi-call binary -- GPL2") -#endif -#if defined bb_need_name_too_long || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(name_too_long, "file name too long\n") -#endif -#if defined bb_need_omitting_directory || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(omitting_directory, "%s: omitting directory\n") -#endif -#if defined bb_need_not_a_directory || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(not_a_directory, "%s: not a directory\n") -#endif -#if defined bb_need_memory_exhausted || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(memory_exhausted, "memory exhausted\n") -#endif -#if defined bb_need_invalid_date || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(invalid_date, "invalid date `%s'\n") -#endif -#if defined bb_need_invalid_option || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(invalid_option, "invalid option -- %c\n") -#endif -#if defined bb_need_io_error || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(io_error, "%s: input/output error -- %s\n") -#endif -#if defined bb_need_help || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(dash_dash_help, "--help") -#endif -#if defined bb_need_write_error || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(write_error, "Write Error\n") -#endif -#if defined bb_need_too_few_args || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(too_few_args, "too few arguments\n") -#endif -#if defined bb_need_name_longer_then_foo || ! defined BB_DECLARE_EXTERN - BB_DEF_MESSAGE(name_longer_then_foo, "Names longer then %d chars not supported.\n") -#endif - - -#endif /* _BB_MESSAGES_C */ - diff --git a/mdk-stage1/insmod-busybox/utility.c b/mdk-stage1/insmod-busybox/utility.c deleted file mode 100644 index ffd323347..000000000 --- a/mdk-stage1/insmod-busybox/utility.c +++ /dev/null @@ -1,1759 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Utility routines. - * - * Copyright (C) tons of folks. Tracking down who wrote what - * isn't something I'm going to worry about... If you wrote something - * here, please feel free to acknowledge your work. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. - * - */ - -#include "busybox.h" -#if defined (BB_CHMOD_CHOWN_CHGRP) \ - || defined (BB_CP_MV) \ - || defined (BB_FIND) \ - || defined (BB_INSMOD) \ - || defined (BB_LS) \ - || defined (BB_RM) \ - || defined (BB_TAR) -/* same conditions as recursiveAction */ -#define bb_need_name_too_long -#endif -#define bb_need_memory_exhausted -#define bb_need_full_version -#define BB_DECLARE_EXTERN -#include "messages.c" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include /* for uname(2) */ - -/* Busybox mount uses either /proc/filesystems or /dev/mtab to get the - * list of available filesystems used for the -t auto option */ -#if defined BB_FEATURE_USE_PROCFS && defined BB_FEATURE_USE_DEVPS_PATCH -//#error Sorry, but busybox can't use both /proc and /dev/ps at the same time -- Pick one and try again. -#error "Sorry, but busybox can't use both /proc and /dev/ps at the same time -- Pick one and try again." -#endif - - -#if defined BB_MOUNT || defined BB_UMOUNT || defined BB_DF -# if defined BB_MTAB -const char mtab_file[] = "/etc/mtab"; -# else -# if defined BB_FEATURE_USE_PROCFS -const char mtab_file[] = "/proc/mounts"; -# else -# if defined BB_FEATURE_USE_DEVPS_PATCH -const char mtab_file[] = "/dev/mtab"; -# else -# error With (BB_MOUNT||BB_UMOUNT||BB_DF) defined, you must define either BB_MTAB or ( BB_FEATURE_USE_PROCFS | BB_FEATURE_USE_DEVPS_PATCH) -# endif -# endif -# endif -#endif - -#ifdef _STANDALONE_ -void errorMsg(const char *s, ...) -{ - va_list p; - - fflush(stdout); - printf("busybox: "); - va_start(p, s); - vprintf(s, p); - va_end(p); - printf("\n"); - fflush(stdout); -} - -extern void logperror(char *s) -{ - perror(s); -} - -void fatalError(const char *s, ...) -{ - va_list p; - - fflush(stdout); - fprintf(stdout, "busybox: "); - va_start(p, s); - vfprintf(stdout, s, p); - va_end(p); - fprintf(stdout, "\n"); - fflush(stdout); - exit(FALSE); -} -#else /* _STANDALONE_ */ -#include "../log.h" -extern void errorMsg(const char *s, ...) -{ - va_list p; - - va_start(p, s); - vlog_message(s, p); - va_end(p); -} - -extern void logperror(char *s) -{ - log_perror(s); -} - -extern void fatalError(const char *s, ...) -{ - va_list p; - - va_start(p, s); - vlog_message(s, p); - va_end(p); - while (1); -} -#endif /* _STANDALONE_ */ - - -#if defined BB_INIT -/* Returns kernel version encoded as major*65536 + minor*256 + patch, - * so, for example, to check if the kernel is greater than 2.2.11: - * if (get_kernel_revision() <= 2*65536+2*256+11) { } - */ -extern int get_kernel_revision(void) -{ - struct utsname name; - int major = 0, minor = 0, patch = 0; - - if (uname(&name) == -1) { - perror("cannot get system information"); - return (0); - } - sscanf(name.version, "%d.%d.%d", &major, &minor, &patch); - return major * 65536 + minor * 256 + patch; -} -#endif /* BB_INIT */ - - - -#if defined BB_FREE || defined BB_INIT || defined BB_UNAME || defined BB_UPTIME -_syscall1(int, sysinfo, struct sysinfo *, info); -#endif /* BB_INIT */ - -#if defined BB_MOUNT || defined BB_UMOUNT - -#ifndef __NR_umount2 -#define __NR_umount2 52 -#endif - -/* Include our own version of , since libc5 doesn't - * know about umount2 */ -extern _syscall1(int, umount, const char *, special_file); -extern _syscall2(int, umount2, const char *, special_file, int, flags); -extern _syscall5(int, mount, const char *, special_file, const char *, dir, - const char *, fstype, unsigned long int, rwflag, const void *, data); -#endif - -#if defined BB_INSMOD || defined BB_LSMOD -#ifndef __NR_query_module -#define __NR_query_module 167 -#endif -_syscall5(int, query_module, const char *, name, int, which, - void *, buf, size_t, bufsize, size_t*, ret); -#endif - - -#if defined (BB_CP_MV) || defined (BB_DU) - -#define HASH_SIZE 311 /* Should be prime */ -#define hash_inode(i) ((i) % HASH_SIZE) - -static ino_dev_hashtable_bucket_t *ino_dev_hashtable[HASH_SIZE]; - -/* - * Return 1 if statbuf->st_ino && statbuf->st_dev are recorded in - * `ino_dev_hashtable', else return 0 - * - * If NAME is a non-NULL pointer to a character pointer, and there is - * a match, then set *NAME to the value of the name slot in that - * bucket. - */ -int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name) -{ - ino_dev_hashtable_bucket_t *bucket; - - bucket = ino_dev_hashtable[hash_inode(statbuf->st_ino)]; - while (bucket != NULL) { - if ((bucket->ino == statbuf->st_ino) && - (bucket->dev == statbuf->st_dev)) - { - if (name) *name = bucket->name; - return 1; - } - bucket = bucket->next; - } - return 0; -} - -/* Add statbuf to statbuf hash table */ -void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name) -{ - int i; - size_t s; - ino_dev_hashtable_bucket_t *bucket; - - i = hash_inode(statbuf->st_ino); - s = name ? strlen(name) : 0; - bucket = xmalloc(sizeof(ino_dev_hashtable_bucket_t) + s); - bucket->ino = statbuf->st_ino; - bucket->dev = statbuf->st_dev; - if (name) - strcpy(bucket->name, name); - else - bucket->name[0] = '\0'; - bucket->next = ino_dev_hashtable[i]; - ino_dev_hashtable[i] = bucket; -} - -/* Clear statbuf hash table */ -void reset_ino_dev_hashtable(void) -{ - int i; - ino_dev_hashtable_bucket_t *bucket; - - for (i = 0; i < HASH_SIZE; i++) { - while (ino_dev_hashtable[i] != NULL) { - bucket = ino_dev_hashtable[i]->next; - free(ino_dev_hashtable[i]); - ino_dev_hashtable[i] = bucket; - } - } -} - -#endif /* BB_CP_MV || BB_DU */ - -#if defined (BB_CP_MV) || defined (BB_DU) || defined (BB_LN) || defined (BB_AR) -/* - * Return TRUE if a fileName is a directory. - * Nonexistant files return FALSE. - */ -int isDirectory(const char *fileName, const int followLinks, struct stat *statBuf) -{ - int status; - int didMalloc = 0; - - if (statBuf == NULL) { - statBuf = (struct stat *)xmalloc(sizeof(struct stat)); - ++didMalloc; - } - - if (followLinks == TRUE) - status = stat(fileName, statBuf); - else - status = lstat(fileName, statBuf); - - if (status < 0 || !(S_ISDIR(statBuf->st_mode))) { - status = FALSE; - } - else status = TRUE; - - if (didMalloc) { - free(statBuf); - statBuf = NULL; - } - return status; -} -#endif - -#if defined (BB_AR) || defined BB_CP_MV -/* - * Copy readSize bytes between two file descriptors - */ -int copySubFile(int srcFd, int dstFd, size_t remaining) -{ - size_t size; - char buffer[BUFSIZ]; - - while (remaining > 0) { - if (remaining > BUFSIZ) - size = BUFSIZ; - else - size = remaining; - if (fullWrite(dstFd, buffer, fullRead(srcFd, buffer, size)) < size) - return(FALSE); - remaining -= size; - } - return (TRUE); -} -#endif - - -#if defined (BB_CP_MV) -/* - * Copy one file to another, while possibly preserving its modes, times, and - * modes. Returns TRUE if successful, or FALSE on a failure with an error - * message output. (Failure is not indicated if attributes cannot be set.) - * -Erik Andersen - */ -int -copyFile(const char *srcName, const char *destName, - int setModes, int followLinks, int forceFlag) -{ - int rfd; - int wfd; - int status; - struct stat srcStatBuf; - struct stat dstStatBuf; - struct utimbuf times; - - if (followLinks == TRUE) - status = stat(srcName, &srcStatBuf); - else - status = lstat(srcName, &srcStatBuf); - - if (status < 0) { - perror(srcName); - return FALSE; - } - - if (followLinks == TRUE) - status = stat(destName, &dstStatBuf); - else - status = lstat(destName, &dstStatBuf); - - if (status < 0 || forceFlag==TRUE) { - unlink(destName); - dstStatBuf.st_ino = -1; - dstStatBuf.st_dev = -1; - } - - if ((srcStatBuf.st_dev == dstStatBuf.st_dev) && - (srcStatBuf.st_ino == dstStatBuf.st_ino)) { - errorMsg("Copying file \"%s\" to itself\n", srcName); - return FALSE; - } - - if (S_ISDIR(srcStatBuf.st_mode)) { - //fprintf(stderr, "copying directory %s to %s\n", srcName, destName); - /* Make sure the directory is writable */ - status = mkdir(destName, 0777777 ^ umask(0)); - if (status < 0 && errno != EEXIST) { - perror(destName); - return FALSE; - } - } else if (S_ISLNK(srcStatBuf.st_mode)) { - char link_val[BUFSIZ + 1]; - int link_size; - - //fprintf(stderr, "copying link %s to %s\n", srcName, destName); - /* Warning: This could possibly truncate silently, to BUFSIZ chars */ - link_size = readlink(srcName, &link_val[0], BUFSIZ); - if (link_size < 0) { - perror(srcName); - return FALSE; - } - link_val[link_size] = '\0'; - status = symlink(link_val, destName); - if (status < 0) { - perror(destName); - return FALSE; - } -#if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1) - if (setModes == TRUE) { - /* Try to set owner, but fail silently like GNU cp */ - lchown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid); - } -#endif - return TRUE; - } else if (S_ISFIFO(srcStatBuf.st_mode)) { - //fprintf(stderr, "copying fifo %s to %s\n", srcName, destName); - if (mkfifo(destName, 0644) < 0) { - perror(destName); - return FALSE; - } - } else if (S_ISBLK(srcStatBuf.st_mode) || S_ISCHR(srcStatBuf.st_mode) - || S_ISSOCK(srcStatBuf.st_mode)) { - //fprintf(stderr, "copying soc, blk, or chr %s to %s\n", srcName, destName); - if (mknod(destName, srcStatBuf.st_mode, srcStatBuf.st_rdev) < 0) { - perror(destName); - return FALSE; - } - } else if (S_ISREG(srcStatBuf.st_mode)) { - //fprintf(stderr, "copying regular file %s to %s\n", srcName, destName); - rfd = open(srcName, O_RDONLY); - if (rfd < 0) { - perror(srcName); - return FALSE; - } - - wfd = open(destName, O_WRONLY | O_CREAT | O_TRUNC, - srcStatBuf.st_mode); - if (wfd < 0) { - perror(destName); - close(rfd); - return FALSE; - } - - if (copySubFile(rfd, wfd, srcStatBuf.st_size)==FALSE) - goto error_exit; - - close(rfd); - if (close(wfd) < 0) { - return FALSE; - } - } - - if (setModes == TRUE) { - /* This is fine, since symlinks never get here */ - if (chown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid) < 0) { - perror(destName); - exit FALSE; - } - if (chmod(destName, srcStatBuf.st_mode) < 0) { - perror(destName); - exit FALSE; - } - times.actime = srcStatBuf.st_atime; - times.modtime = srcStatBuf.st_mtime; - if (utime(destName, ×) < 0) { - perror(destName); - exit FALSE; - } - } - - return TRUE; - - error_exit: - perror(destName); - close(rfd); - close(wfd); - - return FALSE; -} -#endif /* BB_CP_MV */ - - - -#if defined BB_TAR || defined BB_LS ||defined BB_AR - -#define TYPEINDEX(mode) (((mode) >> 12) & 0x0f) -#define TYPECHAR(mode) ("0pcCd?bB-?l?s???" [TYPEINDEX(mode)]) - -/* The special bits. If set, display SMODE0/1 instead of MODE0/1 */ -static const mode_t SBIT[] = { - 0, 0, S_ISUID, - 0, 0, S_ISGID, - 0, 0, S_ISVTX -}; - -/* The 9 mode bits to test */ -static const mode_t MBIT[] = { - S_IRUSR, S_IWUSR, S_IXUSR, - S_IRGRP, S_IWGRP, S_IXGRP, - S_IROTH, S_IWOTH, S_IXOTH -}; - -#define MODE1 "rwxrwxrwx" -#define MODE0 "---------" -#define SMODE1 "..s..s..t" -#define SMODE0 "..S..S..T" - -/* - * Return the standard ls-like mode string from a file mode. - * This is static and so is overwritten on each call. - */ -const char *modeString(int mode) -{ - static char buf[12]; - - int i; - - buf[0] = TYPECHAR(mode); - for (i = 0; i < 9; i++) { - if (mode & SBIT[i]) - buf[i + 1] = (mode & MBIT[i]) ? SMODE1[i] : SMODE0[i]; - else - buf[i + 1] = (mode & MBIT[i]) ? MODE1[i] : MODE0[i]; - } - return buf; -} -#endif /* BB_TAR || BB_LS */ - - -#if defined BB_TAR || defined BB_AR -/* - * Return the standard ls-like time string from a time_t - * This is static and so is overwritten on each call. - */ -const char *timeString(time_t timeVal) -{ - time_t now; - char *str; - static char buf[26]; - - time(&now); - - str = ctime(&timeVal); - - strcpy(buf, &str[4]); - buf[12] = '\0'; - - if ((timeVal > now) || (timeVal < now - 365 * 24 * 60 * 60L)) { - strcpy(&buf[7], &str[20]); - buf[11] = '\0'; - } - - return buf; -} -#endif /* BB_TAR || BB_AR */ - -#if defined BB_TAR || defined BB_CP_MV || defined BB_AR -/* - * Write all of the supplied buffer out to a file. - * This does multiple writes as necessary. - * Returns the amount written, or -1 on an error. - */ -int fullWrite(int fd, const char *buf, int len) -{ - int cc; - int total; - - total = 0; - - while (len > 0) { - cc = write(fd, buf, len); - - if (cc < 0) - return -1; - - buf += cc; - total += cc; - len -= cc; - } - - return total; -} -#endif /* BB_TAR || BB_CP_MV || BB_AR */ - - -#if defined BB_TAR || defined BB_TAIL || defined BB_AR || defined BB_SH || defined BB_CP_MV -/* - * Read all of the supplied buffer from a file. - * This does multiple reads as necessary. - * Returns the amount read, or -1 on an error. - * A short read is returned on an end of file. - */ -int fullRead(int fd, char *buf, int len) -{ - int cc; - int total; - - total = 0; - - while (len > 0) { - cc = read(fd, buf, len); - - if (cc < 0) - return -1; - - if (cc == 0) - break; - - buf += cc; - total += cc; - len -= cc; - } - - return total; -} -#endif /* BB_TAR || BB_TAIL || BB_AR || BB_SH */ - - -#if defined (BB_CHMOD_CHOWN_CHGRP) \ - || defined (BB_CP_MV) \ - || defined (BB_FIND) \ - || defined (BB_INSMOD) \ - || defined (BB_LS) \ - || defined (BB_RM) \ - || defined (BB_TAR) - -/* - * Walk down all the directories under the specified - * location, and do something (something specified - * by the fileAction and dirAction function pointers). - * - * Unfortunatly, while nftw(3) could replace this and reduce - * code size a bit, nftw() wasn't supported before GNU libc 2.1, - * and so isn't sufficiently portable to take over since glibc2.1 - * is so stinking huge. - */ -int recursiveAction(const char *fileName, - int recurse, int followLinks, int depthFirst, - int (*fileAction) (const char *fileName, - struct stat * statbuf, - void* userData), - int (*dirAction) (const char *fileName, - struct stat * statbuf, - void* userData), - void* userData) -{ - int status; - struct stat statbuf; - struct dirent *next; - - if (followLinks == TRUE) - status = stat(fileName, &statbuf); - else - status = lstat(fileName, &statbuf); - - if (status < 0) { -#ifdef BB_DEBUG_PRINT_SCAFFOLD - fprintf(stderr, - "status=%d followLinks=%d TRUE=%d\n", - status, followLinks, TRUE); -#endif - perror(fileName); - return FALSE; - } - - if ((followLinks == FALSE) && (S_ISLNK(statbuf.st_mode))) { - if (fileAction == NULL) - return TRUE; - else - return fileAction(fileName, &statbuf, userData); - } - - if (recurse == FALSE) { - if (S_ISDIR(statbuf.st_mode)) { - if (dirAction != NULL) - return (dirAction(fileName, &statbuf, userData)); - else - return TRUE; - } - } - - if (S_ISDIR(statbuf.st_mode)) { - DIR *dir; - - dir = opendir(fileName); - if (!dir) { - perror(fileName); - return FALSE; - } - if (dirAction != NULL && depthFirst == FALSE) { - status = dirAction(fileName, &statbuf, userData); - if (status == FALSE) { - perror(fileName); - return FALSE; - } - } - while ((next = readdir(dir)) != NULL) { - char nextFile[BUFSIZ + 1]; - - if ((strcmp(next->d_name, "..") == 0) - || (strcmp(next->d_name, ".") == 0)) { - continue; - } - if (strlen(fileName) + strlen(next->d_name) + 1 > BUFSIZ) { - errorMsg("name_too_long"); - return FALSE; - } - memset(nextFile, 0, sizeof(nextFile)); - sprintf(nextFile, "%s/%s", fileName, next->d_name); - status = - recursiveAction(nextFile, TRUE, followLinks, depthFirst, - fileAction, dirAction, userData); - if (status == FALSE) { - closedir(dir); - return FALSE; - } - } - status = closedir(dir); - if (status < 0) { - perror(fileName); - return FALSE; - } - if (dirAction != NULL && depthFirst == TRUE) { - status = dirAction(fileName, &statbuf, userData); - if (status == FALSE) { - perror(fileName); - return FALSE; - } - } - } else { - if (fileAction == NULL) - return TRUE; - else - return fileAction(fileName, &statbuf, userData); - } - return TRUE; -} - -#endif /* BB_CHMOD_CHOWN_CHGRP || BB_CP_MV || BB_FIND || BB_LS || BB_INSMOD */ - - - -#if defined (BB_TAR) || defined (BB_MKDIR) || defined (BB_AR) -/* - * Attempt to create the directories along the specified path, except for - * the final component. The mode is given for the final directory only, - * while all previous ones get default protections. Errors are not reported - * here, as failures to restore files can be reported later. - */ -extern int createPath(const char *name, int mode) -{ - char *cp; - char *cpOld; - char buf[BUFSIZ + 1]; - int retVal = 0; - - strcpy(buf, name); - for (cp = buf; *cp == '/'; cp++); - cp = strchr(cp, '/'); - while (cp) { - cpOld = cp; - cp = strchr(cp + 1, '/'); - *cpOld = '\0'; - retVal = mkdir(buf, cp ? 0777 : mode); - if (retVal != 0 && errno != EEXIST) { - perror(buf); - return FALSE; - } - *cpOld = '/'; - } - return TRUE; -} -#endif /* BB_TAR || BB_MKDIR */ - - - -#if defined (BB_CHMOD_CHOWN_CHGRP) || defined (BB_MKDIR) \ - || defined (BB_MKFIFO) || defined (BB_MKNOD) || defined (BB_AR) -/* [ugoa]{+|-|=}[rwxst] */ - - - -extern int parse_mode(const char *s, mode_t * theMode) -{ - mode_t andMode = - - S_ISVTX | S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO; - mode_t orMode = 0; - mode_t mode = 0; - mode_t groups = 0; - char type; - char c; - - if (s==NULL) - return (FALSE); - - do { - for (;;) { - switch (c = *s++) { - case '\0': - return -1; - case 'u': - groups |= S_ISUID | S_IRWXU; - continue; - case 'g': - groups |= S_ISGID | S_IRWXG; - continue; - case 'o': - groups |= S_IRWXO; - continue; - case 'a': - groups |= S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO; - continue; - case '+': - case '=': - case '-': - type = c; - if (groups == 0) /* The default is "all" */ - groups |= - S_ISUID | S_ISGID | S_IRWXU | S_IRWXG | S_IRWXO; - break; - default: - if (isdigit(c) && c >= '0' && c <= '7' && - mode == 0 && groups == 0) { - *theMode = strtol(--s, NULL, 8); - return (TRUE); - } else - return (FALSE); - } - break; - } - - while ((c = *s++) != '\0') { - switch (c) { - case ',': - break; - case 'r': - mode |= S_IRUSR | S_IRGRP | S_IROTH; - continue; - case 'w': - mode |= S_IWUSR | S_IWGRP | S_IWOTH; - continue; - case 'x': - mode |= S_IXUSR | S_IXGRP | S_IXOTH; - continue; - case 's': - mode |= S_IXGRP | S_ISUID | S_ISGID; - continue; - case 't': - mode |= 0; - continue; - default: - *theMode &= andMode; - *theMode |= orMode; - return (TRUE); - } - break; - } - switch (type) { - case '=': - andMode &= ~(groups); - /* fall through */ - case '+': - orMode |= mode & groups; - break; - case '-': - andMode &= ~(mode & groups); - orMode &= andMode; - break; - } - } while (c == ','); - *theMode &= andMode; - *theMode |= orMode; - return (TRUE); -} - - -#endif -/* BB_CHMOD_CHOWN_CHGRP || BB_MKDIR || BB_MKFIFO || BB_MKNOD */ - - - - - -#if defined BB_CHMOD_CHOWN_CHGRP || defined BB_PS || defined BB_LS \ - || defined BB_TAR || defined BB_ID || defined BB_LOGGER \ - || defined BB_LOGNAME || defined BB_WHOAMI - -/* This parses entries in /etc/passwd and /etc/group. This is desirable - * for BusyBox, since we want to avoid using the glibc NSS stuff, which - * increases target size and is often not needed or wanted for embedded - * systems. - * - * /etc/passwd entries look like this: - * root:x:0:0:root:/root:/bin/bash - * and /etc/group entries look like this: - * root:x:0: - * - * This uses buf as storage to hold things. - * - */ -unsigned long my_getid(const char *filename, char *name, long id, long *gid) -{ - FILE *file; - char *rname, *start, *end, buf[128]; - long rid; - long rgid = 0; - - file = fopen(filename, "r"); - if (file == NULL) { - /* Do not complain. It is ok for /etc/passwd and - * friends to be missing... */ - return (-1); - } - - while (fgets(buf, 128, file) != NULL) { - if (buf[0] == '#') - continue; - - /* username/group name */ - start = buf; - end = strchr(start, ':'); - if (end == NULL) - continue; - *end = '\0'; - rname = start; - - /* password */ - start = end + 1; - end = strchr(start, ':'); - if (end == NULL) - continue; - - /* uid in passwd, gid in group */ - start = end + 1; - rid = (unsigned long) strtol(start, &end, 10); - if (end == start) - continue; - - /* gid in passwd */ - start = end + 1; - rgid = (unsigned long) strtol(start, &end, 10); - - if (name) { - if (0 == strcmp(rname, name)) { - if (gid) *gid = rgid; - fclose(file); - return (rid); - } - } - if (id != -1 && id == rid) { - strncpy(name, rname, 8); - if (gid) *gid = rgid; - fclose(file); - return (TRUE); - } - } - fclose(file); - return (-1); -} - -/* returns a uid given a username */ -long my_getpwnam(char *name) -{ - return my_getid("/etc/passwd", name, -1, NULL); -} - -/* returns a gid given a group name */ -long my_getgrnam(char *name) -{ - return my_getid("/etc/group", name, -1, NULL); -} - -/* gets a username given a uid */ -void my_getpwuid(char *name, long uid) -{ - my_getid("/etc/passwd", name, uid, NULL); -} - -/* gets a groupname given a gid */ -void my_getgrgid(char *group, long gid) -{ - my_getid("/etc/group", group, gid, NULL); -} - -/* gets a gid given a user name */ -long my_getpwnamegid(char *name) -{ - long gid; - my_getid("/etc/passwd", name, -1, &gid); - return gid; -} - -#endif - /* BB_CHMOD_CHOWN_CHGRP || BB_PS || BB_LS || BB_TAR \ - || BB_ID || BB_LOGGER || BB_LOGNAME || BB_WHOAMI */ - - -#if (defined BB_CHVT) || (defined BB_DEALLOCVT) || (defined BB_SETKEYCODES) - -/* From */ -#define KDGKBTYPE 0x4B33 /* get keyboard type */ -#define KB_84 0x01 -#define KB_101 0x02 /* this is what we always answer */ - -int is_a_console(int fd) -{ - char arg; - - arg = 0; - return (ioctl(fd, KDGKBTYPE, &arg) == 0 - && ((arg == KB_101) || (arg == KB_84))); -} - -static int open_a_console(char *fnam) -{ - int fd; - - /* try read-only */ - fd = open(fnam, O_RDWR); - - /* if failed, try read-only */ - if (fd < 0 && errno == EACCES) - fd = open(fnam, O_RDONLY); - - /* if failed, try write-only */ - if (fd < 0 && errno == EACCES) - fd = open(fnam, O_WRONLY); - - /* if failed, fail */ - if (fd < 0) - return -1; - - /* if not a console, fail */ - if (!is_a_console(fd)) { - close(fd); - return -1; - } - - /* success */ - return fd; -} - -/* - * Get an fd for use with kbd/console ioctls. - * We try several things because opening /dev/console will fail - * if someone else used X (which does a chown on /dev/console). - * - * if tty_name is non-NULL, try this one instead. - */ - -int get_console_fd(char *tty_name) -{ - int fd; - - if (tty_name) { - if (-1 == (fd = open_a_console(tty_name))) - return -1; - else - return fd; - } - - fd = open_a_console("/dev/tty"); - if (fd >= 0) - return fd; - - fd = open_a_console("/dev/tty0"); - if (fd >= 0) - return fd; - - fd = open_a_console("/dev/console"); - if (fd >= 0) - return fd; - - for (fd = 0; fd < 3; fd++) - if (is_a_console(fd)) - return fd; - - errorMsg("Couldnt get a file descriptor referring to the console\n"); - return -1; /* total failure */ -} - - -#endif /* BB_CHVT || BB_DEALLOCVT || BB_SETKEYCODES */ - - -#if defined BB_FIND || defined BB_INSMOD -/* - * Routine to see if a text string is matched by a wildcard pattern. - * Returns TRUE if the text is matched, or FALSE if it is not matched - * or if the pattern is invalid. - * * matches zero or more characters - * ? matches a single character - * [abc] matches 'a', 'b' or 'c' - * \c quotes character c - * Adapted from code written by Ingo Wilken, and - * then taken from sash, Copyright (c) 1999 by David I. Bell - * Permission is granted to use, distribute, or modify this source, - * provided that this copyright notice remains intact. - * Permission to distribute this code under the GPL has been granted. - */ -extern int check_wildcard_match(const char *text, const char *pattern) -{ - const char *retryPat; - const char *retryText; - int ch; - int found; - int len; - - retryPat = NULL; - retryText = NULL; - - while (*text || *pattern) { - ch = *pattern++; - - switch (ch) { - case '*': - retryPat = pattern; - retryText = text; - break; - - case '[': - found = FALSE; - - while ((ch = *pattern++) != ']') { - if (ch == '\\') - ch = *pattern++; - - if (ch == '\0') - return FALSE; - - if (*text == ch) - found = TRUE; - } - len=strlen(text); - if (found == FALSE && len!=0) { - return FALSE; - } - if (found == TRUE) { - if (strlen(pattern)==0 && len==1) { - return TRUE; - } - if (len!=0) { - text++; - continue; - } - } - - /* fall into next case */ - - case '?': - if (*text++ == '\0') - return FALSE; - - break; - - case '\\': - ch = *pattern++; - - if (ch == '\0') - return FALSE; - - /* fall into next case */ - - default: - if (*text == ch) { - if (*text) - text++; - break; - } - - if (*text) { - pattern = retryPat; - text = ++retryText; - break; - } - - return FALSE; - } - - if (pattern == NULL) - return FALSE; - } - - return TRUE; -} -#endif /* BB_FIND || BB_INSMOD */ - - - - -#if defined BB_DF || defined BB_MTAB -/* - * Given a block device, find the mount table entry if that block device - * is mounted. - * - * Given any other file (or directory), find the mount table entry for its - * filesystem. - */ -extern struct mntent *findMountPoint(const char *name, const char *table) -{ - struct stat s; - dev_t mountDevice; - FILE *mountTable; - struct mntent *mountEntry; - - if (stat(name, &s) != 0) - return 0; - - if ((s.st_mode & S_IFMT) == S_IFBLK) - mountDevice = s.st_rdev; - else - mountDevice = s.st_dev; - - - if ((mountTable = setmntent(table, "r")) == 0) - return 0; - - while ((mountEntry = getmntent(mountTable)) != 0) { - if (strcmp(name, mountEntry->mnt_dir) == 0 - || strcmp(name, mountEntry->mnt_fsname) == 0) /* String match. */ - break; - if (stat(mountEntry->mnt_fsname, &s) == 0 && s.st_rdev == mountDevice) /* Match the device. */ - break; - if (stat(mountEntry->mnt_dir, &s) == 0 && s.st_dev == mountDevice) /* Match the directory's mount point. */ - break; - } - endmntent(mountTable); - return mountEntry; -} -#endif /* BB_DF || BB_MTAB */ - - - -#if defined BB_DD || defined BB_TAIL -/* - * Read a number with a possible multiplier. - * Returns -1 if the number format is illegal. - */ -extern long getNum(const char *cp) -{ - long value; - - if (!isDecimal(*cp)) - return -1; - - value = 0; - - while (isDecimal(*cp)) - value = value * 10 + *cp++ - '0'; - - switch (*cp++) { - case 'M': - case 'm': /* `tail' uses it traditionally */ - value *= 1048576; - break; - - case 'k': - value *= 1024; - break; - - case 'b': - value *= 512; - break; - - case 'w': - value *= 2; - break; - - case '\0': - return value; - - default: - return -1; - } - - if (*cp) - return -1; - - return value; -} -#endif /* BB_DD || BB_TAIL */ - - -#if defined BB_INIT || defined BB_SYSLOGD -/* try to open up the specified device */ -extern int device_open(char *device, int mode) -{ - int m, f, fd = -1; - - m = mode | O_NONBLOCK; - - /* Retry up to 5 times */ - for (f = 0; f < 5; f++) - if ((fd = open(device, m, 0600)) >= 0) - break; - if (fd < 0) - return fd; - /* Reset original flags. */ - if (m != mode) - fcntl(fd, F_SETFL, mode); - return fd; -} -#endif /* BB_INIT BB_SYSLOGD */ - - -#if defined BB_KILLALL || ( defined BB_FEATURE_LINUXRC && ( defined BB_HALT || defined BB_REBOOT || defined BB_POWEROFF )) -#ifdef BB_FEATURE_USE_DEVPS_PATCH -#include /* For Erik's nifty devps device driver */ -#endif - -#if defined BB_FEATURE_USE_DEVPS_PATCH -/* findPidByName() - * - * This finds the pid of the specified process, - * by using the /dev/ps device driver. - * - * Returns a list of all matching PIDs - */ -extern pid_t* findPidByName( char* pidName) -{ - int fd, i, j; - char device[] = "/dev/ps"; - pid_t num_pids; - pid_t* pid_array = NULL; - pid_t* pidList=NULL; - - /* open device */ - fd = open(device, O_RDONLY); - if (fd < 0) - fatalError( "open failed for `%s': %s\n", device, strerror (errno)); - - /* Find out how many processes there are */ - if (ioctl (fd, DEVPS_GET_NUM_PIDS, &num_pids)<0) - fatalError( "\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); - - /* Allocate some memory -- grab a few extras just in case - * some new processes start up while we wait. The kernel will - * just ignore any extras if we give it too many, and will trunc. - * the list if we give it too few. */ - pid_array = (pid_t*) xcalloc( num_pids+10, sizeof(pid_t)); - pid_array[0] = num_pids+10; - - /* Now grab the pid list */ - if (ioctl (fd, DEVPS_GET_PID_LIST, pid_array)<0) - fatalError( "\nDEVPS_GET_PID_LIST: %s\n", strerror (errno)); - - /* Now search for a match */ - for (i=1, j=0; id_name)) - continue; - - sprintf(filename, "/proc/%s/cmdline", next->d_name); - status = fopen(filename, "r"); - if (!status) { - continue; - } - fgets(buffer, 256, status); - fclose(status); - - if (strstr(get_last_path_component(buffer), pidName) != NULL) { - pidList=xrealloc( pidList, sizeof(pid_t) * (i+2)); - pidList[i++]=strtol(next->d_name, NULL, 0); - } - } - - if (pidList) - pidList[i]=0; - return pidList; -} -#endif /* BB_FEATURE_USE_DEVPS_PATCH */ -#endif /* BB_KILLALL || ( BB_FEATURE_LINUXRC && ( BB_HALT || BB_REBOOT || BB_POWEROFF )) */ - -#ifndef DMALLOC -/* this should really be farmed out to libbusybox.a */ -extern void *xmalloc(size_t size) -{ - void *ptr = malloc(size); - - if (!ptr) - fatalError("memory_exhausted"); - return ptr; -} - -extern void *xrealloc(void *old, size_t size) -{ - void *ptr; - if (!size) - size = 1; - ptr = realloc(old, size); - if (!ptr) - fatalError("memory_exhausted"); - return ptr; -} - -extern void *xcalloc(size_t nmemb, size_t size) -{ - void *ptr = calloc(nmemb, size); - if (!ptr) - fatalError("memory_exhausted"); - return ptr; -} -#endif - -#if defined BB_FEATURE_NFSMOUNT || defined BB_SH || defined BB_LS -# ifndef DMALLOC -extern char * xstrdup (const char *s) { - char *t; - - if (s == NULL) - return NULL; - - t = strdup (s); - - if (t == NULL) - fatalError("memory_exhausted"); - - return t; -} -# endif -#endif - -#if defined BB_FEATURE_NFSMOUNT -extern char * xstrndup (const char *s, int n) { - char *t; - - if (s == NULL) - fatalError("xstrndup bug"); - - t = xmalloc(n+1); - strncpy(t,s,n); - t[n] = 0; - - return t; -} -#endif - - -#if (__GLIBC__ < 2) && (defined BB_SYSLOGD || defined BB_INIT) -extern int vdprintf(int d, const char *format, va_list ap) -{ - char buf[BUF_SIZE]; - int len; - - len = vsprintf(buf, format, ap); - return write(d, buf, len); -} -#endif /* BB_SYSLOGD */ - - -#if defined BB_FEATURE_MOUNT_LOOP -#include -#include "loop.h" /* Pull in loop device support */ - -extern int del_loop(const char *device) -{ - int fd; - - if ((fd = open(device, O_RDONLY)) < 0) { - perror(device); - return (FALSE); - } - if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { - perror("ioctl: LOOP_CLR_FD"); - return (FALSE); - } - close(fd); - return (TRUE); -} - -extern int set_loop(const char *device, const char *file, int offset, - int *loopro) -{ - struct loop_info loopinfo; - int fd, ffd, mode; - - mode = *loopro ? O_RDONLY : O_RDWR; - if ((ffd = open(file, mode)) < 0 && !*loopro - && (errno != EROFS || (ffd = open(file, mode = O_RDONLY)) < 0)) { - perror(file); - return 1; - } - if ((fd = open(device, mode)) < 0) { - close(ffd); - perror(device); - return 1; - } - *loopro = (mode == O_RDONLY); - - memset(&loopinfo, 0, sizeof(loopinfo)); - strncpy(loopinfo.lo_name, file, LO_NAME_SIZE); - loopinfo.lo_name[LO_NAME_SIZE - 1] = 0; - - loopinfo.lo_offset = offset; - - loopinfo.lo_encrypt_key_size = 0; - if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { - perror("ioctl: LOOP_SET_FD"); - close(fd); - close(ffd); - return 1; - } - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - (void) ioctl(fd, LOOP_CLR_FD, 0); - perror("ioctl: LOOP_SET_STATUS"); - close(fd); - close(ffd); - return 1; - } - close(fd); - close(ffd); - return 0; -} - -extern char *find_unused_loop_device(void) -{ - char dev[20]; - int i, fd; - struct stat statbuf; - struct loop_info loopinfo; - - for (i = 0; i <= 7; i++) { - sprintf(dev, "/dev/loop%d", i); - if (stat(dev, &statbuf) == 0 && S_ISBLK(statbuf.st_mode)) { - if ((fd = open(dev, O_RDONLY)) >= 0) { - if (ioctl(fd, LOOP_GET_STATUS, &loopinfo) == -1) { - if (errno == ENXIO) { /* probably free */ - close(fd); - return strdup(dev); - } - } - close(fd); - } - } - } - return NULL; -} -#endif /* BB_FEATURE_MOUNT_LOOP */ - -#if defined BB_MOUNT || defined BB_DF || ( defined BB_UMOUNT && ! defined BB_MTAB) -extern int find_real_root_device_name(char* name) -{ - DIR *dir; - struct dirent *entry; - struct stat statBuf, rootStat; - char fileName[BUFSIZ]; - - if (stat("/", &rootStat) != 0) { - errorMsg("could not stat '/'\n"); - return( FALSE); - } - - dir = opendir("/dev"); - if (!dir) { - errorMsg("could not open '/dev'\n"); - return( FALSE); - } - - while((entry = readdir(dir)) != NULL) { - - /* Must skip ".." since that is "/", and so we - * would get a false positive on ".." */ - if (strcmp(entry->d_name, "..") == 0) - continue; - - snprintf( fileName, strlen(name)+1, "/dev/%s", entry->d_name); - - if (stat(fileName, &statBuf) != 0) - continue; - /* Some char devices have the same dev_t as block - * devices, so make sure this is a block device */ - if (! S_ISBLK(statBuf.st_mode)) - continue; - if (statBuf.st_rdev == rootStat.st_rdev) { - strcpy(name, fileName); - return ( TRUE); - } - } - - return( FALSE); -} -#endif - - -/* get_line_from_file() - This function reads an entire line from a text file - * up to a newline. It returns a malloc'ed char * which must be stored and - * free'ed by the caller. */ -extern char *get_line_from_file(FILE *file) -{ - static const int GROWBY = 80; /* how large we will grow strings by */ - - int ch; - int idx = 0; - char *linebuf = NULL; - int linebufsz = 0; - - while (1) { - ch = fgetc(file); - if (ch == EOF) - break; - /* grow the line buffer as necessary */ - while (idx > linebufsz-2) - linebuf = xrealloc(linebuf, linebufsz += GROWBY); - linebuf[idx++] = (char)ch; - if ((char)ch == '\n') - break; - } - - if (idx == 0) - return NULL; - - linebuf[idx] = 0; - return linebuf; -} - -#if defined BB_CAT -extern void print_file(FILE *file) -{ - int c; - - while ((c = getc(file)) != EOF) - putc(c, stdout); - fclose(file); - fflush(stdout); -} - -extern int print_file_by_name(char *filename) -{ - FILE *file; - file = fopen(filename, "r"); - if (file == NULL) { - return FALSE; - } - print_file(file); - return TRUE; -} -#endif /* BB_CAT || BB_LSMOD */ - -#if defined BB_ECHO || defined BB_TR -char process_escape_sequence(char **ptr) -{ - char c; - - switch (c = *(*ptr)++) { - case 'a': - c = '\a'; - break; - case 'b': - c = '\b'; - break; - case 'f': - c = '\f'; - break; - case 'n': - c = '\n'; - break; - case 't': - c = '\t'; - break; - case 'v': - c = '\v'; - break; - case '\\': - c = '\\'; - break; - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - c -= '0'; - if ('0' <= **ptr && **ptr <= '7') { - c = c * 8 + (*(*ptr)++ - '0'); - if ('0' <= **ptr && **ptr <= '7') - c = c * 8 + (*(*ptr)++ - '0'); - } - break; - default: - (*ptr)--; - c = '\\'; - break; - } - return c; -} -#endif - -#if defined BB_BASENAME || defined BB_LN || defined BB_SH -char *get_last_path_component(char *path) -{ - char *s=path+strlen(path)-1; - - /* strip trailing slashes */ - while (s && *s == '/') { - *s-- = '\0'; - } - - /* find last component */ - s = strrchr(path, '/'); - if (s==NULL) return path; - else return s+1; -} -#endif - -#if defined BB_GREP || defined BB_SED -void xregcomp(regex_t *preg, const char *regex, int cflags) -{ - int ret; - if ((ret = regcomp(preg, regex, cflags)) != 0) { - int errmsgsz = regerror(ret, preg, NULL, 0); - char *errmsg = xmalloc(errmsgsz); - regerror(ret, preg, errmsg, errmsgsz); - fatalError("bb_regcomp: %s\n", errmsg); - } -} -#endif - -/* END CODE */ -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/ diff --git a/mdk-stage1/insmod-modutils/Makefile b/mdk-stage1/insmod-modutils/Makefile deleted file mode 100644 index e8f78d2d0..000000000 --- a/mdk-stage1/insmod-modutils/Makefile +++ /dev/null @@ -1,63 +0,0 @@ - #****************************************************************************** - # - # insmod from modutils (generic) - # - # $Id$ - # - # Copyright 1996, 1997 Linux International. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -INCS = -I./include - -DEFS = -Wno-error -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) - - -DIRS = util obj - -all: dirs insmod libinsmod.a #libinsmod-DIET.a - -dirs: - @for n in . $(DIRS); do \ - [ "$$n" = "." ] || make -C $$n ;\ - done - -clean: - @for n in $(DIRS); do \ - (cd $$n; make clean) \ - done - rm -rf t *.o insmod libinsmod.a libinsmod-DIET.a - - -insmod: insmod-frontend.o insmod.o ./util/libutil-STANDALONE.a ./obj/libobj.a - gcc -o $@ $^ - $(STRIPCMD) $@ - -t/.create_stuff: util/libutil.a obj/libobj.a - rm -rf t - mkdir t - cd t && for e in $^; do ar -x ../$$e; done - touch t/.create_stuff - -libinsmod.a: insmod.o t/.create_stuff - ar cru $@ insmod.o t/* - ranlib $@ - -libinsmod-DIET.a: insmod-DIET.o ./util/libutil-DIET.a ./obj/libobj-DIET.a - ar cru $@ $^ - ranlib $@ - -insmod-frontend.o: insmod-frontend.c insmod.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c insmod-frontend.c - -insmod.o: insmod.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c insmod.c - -insmod-DIET.o: insmod.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(DIETLIBC_INCLUDES) -o $@ -c insmod.c - diff --git a/mdk-stage1/insmod-modutils/include/config.h b/mdk-stage1/insmod-modutils/include/config.h deleted file mode 100644 index 11da6a523..000000000 --- a/mdk-stage1/insmod-modutils/include/config.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Configuration file management - * - * Copyright 1994, 1995, 1996, 1997: - * Jacques Gelinas - * Björn Ekwall February, March 1999 - * - * This file is part of the Linux modutils. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef _CONFIG_H -#define _CONFIG_H - -#include -#include - -#define ETC_MODULES_CONF "/etc/modules.conf" - -#define EXEC_PRE_INSTALL 0 -#define EXEC_POST_INSTALL 1 -#define EXEC_PRE_REMOVE 2 -#define EXEC_POST_REMOVE 3 -#define EXEC_INSTALL 4 -#define EXEC_REMOVE 5 - -struct PATH_TYPE { - char *type; - char *path; -}; - -struct EXEC_TYPE { - int when; - char *module; - char *cmd; -}; - -typedef struct { - char *name; - GLOB_LIST *opts; - int autoclean; -} OPT_LIST; - -/* config.c */ -extern int flag_autoclean; -extern struct utsname uts_info; -extern char *aliaslist[]; -extern struct PATH_TYPE *modpath; -extern int nmodpath; -extern struct EXEC_TYPE *execs; -extern int nexecs; -extern char *insmod_opt; -extern char *config_file; -extern char *optlist[]; -extern char *prune[]; -extern OPT_LIST *opt_list; -extern OPT_LIST *abovelist; -extern OPT_LIST *belowlist; -extern OPT_LIST *prunelist; -extern OPT_LIST *probe_list; -extern OPT_LIST *probeall_list; -extern OPT_LIST *aliases; -extern time_t config_mtime; -extern int root_check_off; /* Check modules are owned by root? */ - -/* Information about generated files */ -struct gen_files { - char *base; /* xxx in /lib/modules/`uname -r`/modules.xxx */ - char *name; /* name actually used */ - time_t mtime; -}; - -extern struct gen_files gen_file[]; -extern const int gen_file_count; -/* The enum order must match the gen_file initialization order in config.c */ -enum gen_file_enum { - GEN_GENERIC_STRINGFILE, - GEN_PCIMAPFILE, - GEN_ISAPNPMAPFILE, - GEN_USBMAPFILE, - GEN_PARPORTMAPFILE, - GEN_DEPFILE, -}; - -extern char *persistdir; - -char *fgets_strip(char *buf, int sizebuf, FILE * fin, int *lineno); -int config_read(int all, char *force_ver, char *base_dir, char *conf_file); -GLOB_LIST *config_lstmod(const char *match, const char *type, int first_only); -char *search_module_path(const char *base); - -#endif /* _CONFIG_H */ diff --git a/mdk-stage1/insmod-modutils/include/elf_alpha.h b/mdk-stage1/insmod-modutils/include/elf_alpha.h deleted file mode 100644 index f1ec66f1c..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_alpha.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for the Alpha. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS64 -#define ELFDATAM ELFDATA2LSB - -#define MATCH_MACHINE(x) (x == EM_ALPHA) - -#define SHT_RELM SHT_RELA -#define Elf64_RelM Elf64_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_arm.h b/mdk-stage1/insmod-modutils/include/elf_arm.h deleted file mode 100644 index f6b531e88..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_arm.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for ARM. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2LSB - -#define MATCH_MACHINE(x) (x == EM_ARM) - -#define SHT_RELM SHT_REL -#define Elf32_RelM Elf32_Rel diff --git a/mdk-stage1/insmod-modutils/include/elf_hppa.h b/mdk-stage1/insmod-modutils/include/elf_hppa.h deleted file mode 100644 index 9a1bd34ce..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_hppa.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Machine-specific elf macros for HP-PA. */ - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_PARISC) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_hppa64.h b/mdk-stage1/insmod-modutils/include/elf_hppa64.h deleted file mode 100644 index 05b201aef..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_hppa64.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Machine-specific elf macros for HP-PA64. */ - -#define ELFCLASSM ELFCLASS64 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_PARISC) - -#define SHT_RELM SHT_RELA -#define Elf64_RelM Elf64_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_i386.h b/mdk-stage1/insmod-modutils/include/elf_i386.h deleted file mode 100644 index c6c2d326e..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_i386.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for i386 et al. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2LSB - -#define MATCH_MACHINE(x) (x == EM_386) - -#define SHT_RELM SHT_REL -#define Elf32_RelM Elf32_Rel diff --git a/mdk-stage1/insmod-modutils/include/elf_ia64.h b/mdk-stage1/insmod-modutils/include/elf_ia64.h deleted file mode 100644 index b4d902956..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_ia64.h +++ /dev/null @@ -1,9 +0,0 @@ -/* Machine-specific elf macros for ia64. */ - -#define ELFCLASSM ELFCLASS64 -#define ELFDATAM ELFDATA2LSB - -#define MATCH_MACHINE(x) (x == EM_IA_64) - -#define SHT_RELM SHT_RELA -#define Elf64_RelM Elf64_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_m68k.h b/mdk-stage1/insmod-modutils/include/elf_m68k.h deleted file mode 100644 index 817fc8f2c..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_m68k.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for m68k. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_68K) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_mips.h b/mdk-stage1/insmod-modutils/include/elf_mips.h deleted file mode 100644 index 8a0430216..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_mips.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Machine-specific elf macros for MIPS. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#ifdef __MIPSEB__ -#define ELFDATAM ELFDATA2MSB -#endif -#ifdef __MIPSEL__ -#define ELFDATAM ELFDATA2LSB -#endif - -/* Account for ELF spec changes. */ -#ifndef EM_MIPS_RS3_LE -#ifdef EM_MIPS_RS4_BE -#define EM_MIPS_RS3_LE EM_MIPS_RS4_BE -#else -#define EM_MIPS_RS3_LE 10 -#endif -#endif /* !EM_MIPS_RS3_LE */ - -#define MATCH_MACHINE(x) (x == EM_MIPS || x == EM_MIPS_RS3_LE) - -#define SHT_RELM SHT_REL -#define Elf32_RelM Elf32_Rel diff --git a/mdk-stage1/insmod-modutils/include/elf_ppc.h b/mdk-stage1/insmod-modutils/include/elf_ppc.h deleted file mode 100644 index 71596de8c..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_ppc.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for the PowerPC. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_PPC) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_s390.h b/mdk-stage1/insmod-modutils/include/elf_s390.h deleted file mode 100644 index 547d66b83..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_s390.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for i386 et al. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_S390) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_sparc.h b/mdk-stage1/insmod-modutils/include/elf_sparc.h deleted file mode 100644 index 9b5c348d9..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_sparc.h +++ /dev/null @@ -1,10 +0,0 @@ -/* Machine-specific elf macros for the Sparc. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS32 -#define ELFDATAM ELFDATA2MSB - -#define MATCH_MACHINE(x) (x == EM_SPARC) - -#define SHT_RELM SHT_RELA -#define Elf32_RelM Elf32_Rela diff --git a/mdk-stage1/insmod-modutils/include/elf_sparc64.h b/mdk-stage1/insmod-modutils/include/elf_sparc64.h deleted file mode 100644 index 158edd7e1..000000000 --- a/mdk-stage1/insmod-modutils/include/elf_sparc64.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Machine-specific elf macros for the Sparc. */ -#ident "$Id$" - -#define ELFCLASSM ELFCLASS64 -#define ELFDATAM ELFDATA2MSB - -#ifndef EM_SPARCV9 -#define EM_SPARCV9 43 -#endif -#ifndef EM_SPARC64 -#define EM_SPARC64 11 -#endif -#define MATCH_MACHINE(x) ((x) == EM_SPARCV9 || (x) == EM_SPARC64) - -#define SHT_RELM SHT_RELA -#define Elf64_RelM Elf64_Rela - -#ifndef ELF64_R_SYM -#define ELF64_R_SYM(x) ((x) >> 32) -#define ELF64_R_TYPE(x) ((unsigned)(x)) -#endif - -#ifndef ELF64_ST_BIND -#define ELF64_ST_BIND(x) ((x) >> 4) -#define ELF64_ST_TYPE(x) ((x) & 0xf) -#endif - diff --git a/mdk-stage1/insmod-modutils/include/kallsyms.h b/mdk-stage1/insmod-modutils/include/kallsyms.h deleted file mode 100644 index 9748873cf..000000000 --- a/mdk-stage1/insmod-modutils/include/kallsyms.h +++ /dev/null @@ -1,131 +0,0 @@ -/* kallsyms headers - Copyright 2000 Keith Owens - - This file is part of the Linux modutils. It is exported to kernel - space so debuggers can access the kallsyms data. - - The kallsyms data contains all the non-stack symbols from a kernel - or a module. The kernel symbols are held between __start___kallsyms - and __stop___kallsyms. The symbols for a module are accessed via - the struct module chain which is based at module_list. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ident "$Id$" - -#ifndef MODUTILS_KALLSYMS_H -#define MODUTILS_KALLSYMS_H 1 - -/* Have to (re)define these ElfW entries here because external kallsyms - * code does not have access to modutils/include/obj.h. This code is - * included from user spaces tools (modutils) and kernel, they need - * different includes. - */ - -#ifndef ELFCLASS32 -#ifdef __KERNEL__ -#include -#else /* __KERNEL__ */ -#include -#endif /* __KERNEL__ */ -#endif /* ELFCLASS32 */ - -#ifndef ELFCLASSM -#define ELFCLASSM ELF_CLASS -#endif - -#ifndef ElfW -# if ELFCLASSM == ELFCLASS32 -# define ElfW(x) Elf32_ ## x -# define ELFW(x) ELF32_ ## x -# else -# define ElfW(x) Elf64_ ## x -# define ELFW(x) ELF64_ ## x -# endif -#endif - -/* Format of data in the kallsyms section. - * Most of the fields are small numbers but the total size and all - * offsets can be large so use the 32/64 bit types for these fields. - * - * Do not use sizeof() on these structures, modutils may be using extra - * fields. Instead use the size fields in the header to access the - * other bits of data. - */ - -struct kallsyms_header { - int size; /* Size of this header */ - ElfW(Word) total_size; /* Total size of kallsyms data */ - int sections; /* Number of section entries */ - ElfW(Off) section_off; /* Offset to first section entry */ - int section_size; /* Size of one section entry */ - int symbols; /* Number of symbol entries */ - ElfW(Off) symbol_off; /* Offset to first symbol entry */ - int symbol_size; /* Size of one symbol entry */ - ElfW(Off) string_off; /* Offset to first string */ - ElfW(Addr) start; /* Start address of first section */ - ElfW(Addr) end; /* End address of last section */ -}; - -struct kallsyms_section { - ElfW(Addr) start; /* Start address of section */ - ElfW(Word) size; /* Size of this section */ - ElfW(Off) name_off; /* Offset to section name */ - ElfW(Word) flags; /* Flags from section */ -}; - -struct kallsyms_symbol { - ElfW(Off) section_off; /* Offset to section that owns this symbol */ - ElfW(Addr) symbol_addr; /* Address of symbol */ - ElfW(Off) name_off; /* Offset to symbol name */ -}; - -#define KALLSYMS_SEC_NAME "__kallsyms" -#define KALLSYMS_IDX 2 /* obj_kallsyms creates kallsyms as section 2 */ - -#define kallsyms_next_sec(h,s) \ - ((s) = (struct kallsyms_section *)((char *)(s) + (h)->section_size)) -#define kallsyms_next_sym(h,s) \ - ((s) = (struct kallsyms_symbol *)((char *)(s) + (h)->symbol_size)) - -int kallsyms_symbol_to_address( - const char *name, /* Name to lookup */ - unsigned long *token, /* Which module to start with */ - const char **mod_name, /* Set to module name or "kernel" */ - unsigned long *mod_start, /* Set to start address of module */ - unsigned long *mod_end, /* Set to end address of module */ - const char **sec_name, /* Set to section name */ - unsigned long *sec_start, /* Set to start address of section */ - unsigned long *sec_end, /* Set to end address of section */ - const char **sym_name, /* Set to full symbol name */ - unsigned long *sym_start, /* Set to start address of symbol */ - unsigned long *sym_end /* Set to end address of symbol */ - ); - -int kallsyms_address_to_symbol( - unsigned long address, /* Address to lookup */ - const char **mod_name, /* Set to module name */ - unsigned long *mod_start, /* Set to start address of module */ - unsigned long *mod_end, /* Set to end address of module */ - const char **sec_name, /* Set to section name */ - unsigned long *sec_start, /* Set to start address of section */ - unsigned long *sec_end, /* Set to end address of section */ - const char **sym_name, /* Set to full symbol name */ - unsigned long *sym_start, /* Set to start address of symbol */ - unsigned long *sym_end /* Set to end address of symbol */ - ); - -#endif /* kallsyms.h */ diff --git a/mdk-stage1/insmod-modutils/include/kerneld.h b/mdk-stage1/insmod-modutils/include/kerneld.h deleted file mode 100644 index 3bc2c9d42..000000000 --- a/mdk-stage1/insmod-modutils/include/kerneld.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Definitions for the Linux kerneld SYSV IPC interface. - This file was part of the Linux kernel, and so is covered by the GPL. */ - -#ifndef MODUTILS_KERNELD_H -#define MODUTILS_KERNELD_H - -#ident "$Id$" - -#define KERNELD_SYSTEM 1 -#define KERNELD_REQUEST_MODULE 2 /* "insmod" */ -#define KERNELD_RELEASE_MODULE 3 /* "rmmod" */ -#define KERNELD_DELAYED_RELEASE_MODULE 4 /* "rmmod" */ -#define KERNELD_CANCEL_RELEASE_MODULE 5 /* "rmmod" */ -#define KERNELD_REQUEST_ROUTE 6 /* net/ipv4/route.c */ -#define KERNELD_BLANKER 7 /* drivers/char/console.c */ -#define KERNELD_PNP 8 /* drivers/pnp/kerneld.c */ -#define KERNELD_ARP 256 /* net/ipv4/arp.c */ - -#ifdef NEW_KERNELD_PROTOCOL -# define OLDIPC_KERNELD 00040000 /* old kerneld message channel */ -# define IPC_KERNELD 00140000 /* new kerneld message channel */ -# define KDHDR (sizeof(long) + sizeof(short) + sizeof(short)) -# define NULL_KDHDR 0, 2, 0 -#else /* NEW_KERNELD_PROTOCOL */ -# define IPC_KERNELD 00040000 -# define KDHDR (sizeof(long)) -# define NULL_KDHDR 0 -#endif /* NEW_KERNELD_PROTOCOL */ - -#define KERNELD_MAXCMD 0x7ffeffff -#define KERNELD_MINSEQ 0x7fff0000 /* "commands" legal up to 0x7ffeffff */ -#define KERNELD_WAIT 0x80000000 -#define KERNELD_NOWAIT 0 - -struct kerneld_msg - { - long mtype; - long id; -#ifdef NEW_KERNELD_PROTOCOL - short version; - short pid; -#endif /* NEW_KERNELD_PROTOCOL */ - char text[1]; - }; - -#endif /* kerneld.h */ diff --git a/mdk-stage1/insmod-modutils/include/modstat.h b/mdk-stage1/insmod-modutils/include/modstat.h deleted file mode 100644 index b8a58eeae..000000000 --- a/mdk-stage1/insmod-modutils/include/modstat.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * For kernel module status and information - * - * Add module_name_list and l_module_name_list. - * Keith Owens November 1999. - * Björn Ekwall February 1999. - * - * This file is part of the Linux modutils. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -#ifndef _KERNEL_H -#define _KERNEL_H - -#define K_SYMBOLS 1 /* Want info about symbols */ -#define K_INFO 2 /* Want extended module info */ -#define K_REFS 4 /* Want info about references */ - -struct module_stat { - char *name; - unsigned long addr; - unsigned long modstruct; /* COMPAT_2_0! *//* depends on architecture? */ - unsigned long size; - unsigned long flags; - long usecount; - size_t nsyms; - struct module_symbol *syms; - size_t nrefs; - struct module_stat **refs; - unsigned long status; -}; - -extern struct module_stat *module_stat; -extern size_t n_module_stat; -extern char *module_name_list; -extern size_t l_module_name_list; -extern struct module_symbol *ksyms; -extern size_t nksyms; -extern int k_new_syscalls; - -int get_kernel_info(int type); - -#endif /* _KERNEL_H */ diff --git a/mdk-stage1/insmod-modutils/include/module.h b/mdk-stage1/insmod-modutils/include/module.h deleted file mode 100644 index db49ab2b2..000000000 --- a/mdk-stage1/insmod-modutils/include/module.h +++ /dev/null @@ -1,210 +0,0 @@ -/* Definitions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_MODULE_H -#define MODUTILS_MODULE_H 1 - -#ident "$Id$" - -/* This file contains the structures used by the 2.0 and 2.1 kernels. - We do not use the kernel headers directly because we do not wish - to be dependant on a particular kernel version to compile insmod. */ - - -/*======================================================================*/ -/* The structures used by Linux 2.0. */ - -/* The symbol format used by get_kernel_syms(2). */ -struct old_kernel_sym -{ - unsigned long value; - char name[60]; -}; - -struct old_module_ref -{ - unsigned long module; /* kernel addresses */ - unsigned long next; -}; - -struct old_module_symbol -{ - unsigned long addr; - unsigned long name; -}; - -struct old_symbol_table -{ - int size; /* total, including string table!!! */ - int n_symbols; - int n_refs; - struct old_module_symbol symbol[0]; /* actual size defined by n_symbols */ - struct old_module_ref ref[0]; /* actual size defined by n_refs */ -}; - -struct old_mod_routines -{ - unsigned long init; - unsigned long cleanup; -}; - -struct old_module -{ - unsigned long next; - unsigned long ref; /* the list of modules that refer to me */ - unsigned long symtab; - unsigned long name; - int size; /* size of module in pages */ - unsigned long addr; /* address of module */ - int state; - unsigned long cleanup; /* cleanup routine */ -}; - -/* Sent to init_module(2) or'ed into the code size parameter. */ -#define OLD_MOD_AUTOCLEAN 0x40000000 /* big enough, but no sign problems... */ - -int get_kernel_syms(struct old_kernel_sym *); -int old_sys_init_module(const char *name, char *code, unsigned codesize, - struct old_mod_routines *, struct old_symbol_table *); - -/*======================================================================*/ -/* For sizeof() which are related to the module platform and not to the - environment isnmod is running in, use sizeof_xx instead of sizeof(xx). */ - -#define tgt_sizeof_char sizeof(char) -#define tgt_sizeof_short sizeof(short) -#define tgt_sizeof_int sizeof(int) -#define tgt_sizeof_long sizeof(long) -#define tgt_sizeof_char_p sizeof(char *) -#define tgt_sizeof_void_p sizeof(void *) -#define tgt_long long -#define tgt_long_fmt "l" - -/* This assumes that long long on a 32 bit system is equivalent to long on the - * equivalent 64 bit system. Also that void and char pointers are 8 bytes on - * all 64 bit systems. Add per system tweaks if it ever becomes necessary. - */ -#if defined(COMMON_3264) && defined(ONLY_64) -#undef tgt_long -#undef tgt_long_fmt -#undef tgt_sizeof_long -#undef tgt_sizeof_char_p -#undef tgt_sizeof_void_p -#define tgt_long long long -#define tgt_long_fmt "ll" -#define tgt_sizeof_long 8 -#define tgt_sizeof_char_p 8 -#define tgt_sizeof_void_p 8 -#endif - -/*======================================================================*/ -/* The structures used in Linux 2.1 onwards. */ - -/* Note: module_symbol does not use tgt_long intentionally */ -struct module_symbol -{ - unsigned long value; - unsigned long name; -}; - -struct module_ref -{ - unsigned tgt_long dep; /* kernel addresses */ - unsigned tgt_long ref; - unsigned tgt_long next_ref; -}; - -struct module -{ - unsigned tgt_long size_of_struct; /* == sizeof(module) */ - unsigned tgt_long next; - unsigned tgt_long name; - unsigned tgt_long size; - - tgt_long usecount; - unsigned tgt_long flags; /* AUTOCLEAN et al */ - - unsigned nsyms; - unsigned ndeps; - - unsigned tgt_long syms; - unsigned tgt_long deps; - unsigned tgt_long refs; - unsigned tgt_long init; - unsigned tgt_long cleanup; - unsigned tgt_long ex_table_start; - unsigned tgt_long ex_table_end; -#ifdef __alpha__ - unsigned tgt_long gp; -#endif - /* Everything after here is extension. */ - unsigned tgt_long read_start; /* Read data from existing module */ - unsigned tgt_long read_end; - unsigned tgt_long can_unload; - unsigned tgt_long runsize; - unsigned tgt_long kallsyms_start; - unsigned tgt_long kallsyms_end; - unsigned tgt_long archdata_start; - unsigned tgt_long archdata_end; - unsigned tgt_long kernel_data; -}; - -struct module_info -{ - unsigned long addr; - unsigned long size; - unsigned long flags; - long usecount; -}; - -/* Bits of module.flags. */ -#define NEW_MOD_RUNNING 1 -#define NEW_MOD_DELETED 2 -#define NEW_MOD_AUTOCLEAN 4 -#define NEW_MOD_VISITED 8 -#define NEW_MOD_USED_ONCE 16 -#define NEW_MOD_INITIALIZING 64 - -int sys_init_module(const char *name, const struct module *); -int query_module(const char *name, int which, void *buf, size_t bufsize, - size_t *ret); - -/* Values for query_module's which. */ - -#define QM_MODULES 1 -#define QM_DEPS 2 -#define QM_REFS 3 -#define QM_SYMBOLS 4 -#define QM_INFO 5 - -/*======================================================================*/ -/* The system calls unchanged between 2.0 and 2.1. */ - -unsigned long create_module(const char *, size_t); -int delete_module(const char *); - -/* In safe mode the last parameter is forced to be a module name and meta - * expansion is not allowed on that name. - */ -extern unsigned int safemode; - -#endif /* module.h */ diff --git a/mdk-stage1/insmod-modutils/include/obj.h b/mdk-stage1/insmod-modutils/include/obj.h deleted file mode 100644 index b140c65c3..000000000 --- a/mdk-stage1/insmod-modutils/include/obj.h +++ /dev/null @@ -1,275 +0,0 @@ -/* Elf object file loading and relocation routines. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - obj_free() added by Björn Ekwall March 1999 - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_OBJ_H -#define MODUTILS_OBJ_H 1 - -#ident "$Id$" - -/* The relocatable object is manipulated using elfin types. */ - -#include -#include -#include ELF_MACHINE_H - -#ifndef ElfW -# if ELFCLASSM == ELFCLASS32 -# define ElfW(x) Elf32_ ## x -# define ELFW(x) ELF32_ ## x -# else -# define ElfW(x) Elf64_ ## x -# define ELFW(x) ELF64_ ## x -# endif -#endif - -#if defined(COMMON_3264) && defined(ONLY_32) -# define ObjW(x) obj32_ ## x -#else -# if defined(COMMON_3264) && defined(ONLY_64) -# define ObjW(x) obj64_ ## x -# else -# define ObjW(x) obj_ ## x -# endif -#endif - -/* For some reason this is missing from lib5. */ -#ifndef ELF32_ST_INFO -# define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) -#endif - -#ifndef ELF64_ST_INFO -# define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) -#endif - -struct obj_string_patch_struct; -struct obj_symbol_patch_struct; - -struct obj_section -{ - ElfW(Shdr) header; - const char *name; - char *contents; - struct obj_section *load_next; - int idx; -}; - -struct obj_symbol -{ - struct obj_symbol *next; /* hash table link */ - const char *name; - unsigned long value; - unsigned long size; - int secidx; /* the defining section index/module */ - int info; - int ksymidx; /* for export to the kernel symtab */ - int r_type; /* relocation type */ -}; - -/* Hardcode the hash table size. We shouldn't be needing so many - symbols that we begin to degrade performance, and we get a big win - by giving the compiler a constant divisor. */ - -#define HASH_BUCKETS 521 - -struct obj_file -{ - ElfW(Ehdr) header; - ElfW(Addr) baseaddr; - struct obj_section **sections; - struct obj_section *load_order; - struct obj_section **load_order_search_start; - struct obj_string_patch_struct *string_patches; - struct obj_symbol_patch_struct *symbol_patches; - int (*symbol_cmp)(const char *, const char *); - unsigned long (*symbol_hash)(const char *); - unsigned long local_symtab_size; - struct obj_symbol **local_symtab; - struct obj_symbol *symtab[HASH_BUCKETS]; - const char *filename; - char *persist; -}; - -enum obj_reloc -{ - obj_reloc_ok, - obj_reloc_overflow, - obj_reloc_dangerous, - obj_reloc_unhandled, - obj_reloc_constant_gp -}; - -struct obj_string_patch_struct -{ - struct obj_string_patch_struct *next; - int reloc_secidx; - ElfW(Addr) reloc_offset; - ElfW(Addr) string_offset; -}; - -struct obj_symbol_patch_struct -{ - struct obj_symbol_patch_struct *next; - int reloc_secidx; - ElfW(Addr) reloc_offset; - struct obj_symbol *sym; -}; - - -/* Generic object manipulation routines. */ - -#define obj_elf_hash ObjW(elf_hash) -#define obj_elf_hash_n ObjW(elf_hash_n) -#define obj_add_symbol ObjW(add_symbol) -#define obj_find_symbol ObjW(find_symbol) -#define obj_symbol_final_value ObjW(symbol_final_value) -#define obj_set_symbol_compare ObjW(set_symbol_compare) -#define obj_find_section ObjW(find_section) -#define obj_insert_section_load_order ObjW(insert_section_load_order) -#define obj_create_alloced_section ObjW(create_alloced_section) -#define obj_create_alloced_section_first \ - ObjW(create_alloced_section_first) -#define obj_extend_section ObjW(extend_section) -#define obj_string_patch ObjW(string_patch) -#define obj_symbol_patch ObjW(symbol_patch) -#define obj_check_undefineds ObjW(check_undefineds) -#define obj_clear_undefineds ObjW(clear_undefineds) -#define obj_allocate_commons ObjW(allocate_commons) -#define obj_load_size ObjW(load_size) -#define obj_relocate ObjW(relocate) -#define obj_load ObjW(load) -#define obj_free ObjW(free) -#define obj_create_image ObjW(create_image) -#define obj_addr_to_native_ptr ObjW(addr_to_native_ptr) -#define obj_native_ptr_to_addr ObjW(native_ptr_to_addr) -#define arch_new_file ObjW(arch_new_file) -#define arch_new_section ObjW(arch_new_section) -#define arch_new_symbol ObjW(arch_new_symbol) -#define arch_apply_relocation ObjW(arch_apply_relocation) -#define arch_create_got ObjW(arch_create_got) -#define arch_init_module ObjW(arch_init_module) -#define arch_load_proc_section ObjW(arch_load_proc_section) -#define arch_finalize_section_address ObjW(arch_finalize_section_address) -#define arch_archdata ObjW(arch_archdata) - -unsigned long obj_elf_hash (const char *); - -unsigned long obj_elf_hash_n (const char *, unsigned long len); - -struct obj_symbol *obj_add_symbol (struct obj_file *f, const char *name, - unsigned long symidx, int info, int secidx, - ElfW(Addr) value, unsigned long size); - -struct obj_symbol *obj_find_symbol (struct obj_file *f, - const char *name); - -ElfW(Addr) obj_symbol_final_value (struct obj_file *f, - struct obj_symbol *sym); - -void obj_set_symbol_compare (struct obj_file *f, - int (*cmp)(const char *, const char *), - unsigned long (*hash)(const char *)); - -struct obj_section *obj_find_section (struct obj_file *f, - const char *name); - -void obj_insert_section_load_order (struct obj_file *f, - struct obj_section *sec); - -struct obj_section *obj_create_alloced_section (struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size); - -struct obj_section *obj_create_alloced_section_first (struct obj_file *f, - const char *name, - unsigned long align, - unsigned long size); - -void *obj_extend_section (struct obj_section *sec, unsigned long more); - -int obj_string_patch (struct obj_file *f, int secidx, ElfW(Addr) offset, - const char *string); - -int obj_symbol_patch (struct obj_file *f, int secidx, ElfW(Addr) offset, - struct obj_symbol *sym); - -int obj_check_undefineds (struct obj_file *f, int quiet); - -void obj_clear_undefineds (struct obj_file *f); - -void obj_allocate_commons (struct obj_file *f); - -unsigned long obj_load_size (struct obj_file *f); - -int obj_relocate (struct obj_file *f, ElfW(Addr) base); - -struct obj_file *obj_load (int f, Elf32_Half e_type, const char *filename); - -void obj_free (struct obj_file *f); - -int obj_create_image (struct obj_file *f, char *image); - -int obj_kallsyms (struct obj_file *fin, struct obj_file **fout); - -/* Architecture specific manipulation routines. */ - -struct obj_file *arch_new_file (void); - -struct obj_section *arch_new_section (void); - -struct obj_symbol *arch_new_symbol (void); - -enum obj_reloc arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - ElfW(RelM) *rel, ElfW(Addr) value); - -int arch_create_got (struct obj_file *f); - -struct module; -int arch_init_module (struct obj_file *f, struct module *); - -int arch_load_proc_section (struct obj_section *sec, int fp); - -int arch_finalize_section_address (struct obj_file *f, ElfW(Addr) base); - -int arch_archdata (struct obj_file *fin, struct obj_section *sec); - -#define ARCHDATA_SEC_NAME "__archdata" - -/* Pointers in objects can be 32 or 64 bit */ -union obj_ptr_4 { - Elf32_Word addr; - void *ptr; -}; -union obj_ptr_8 { - Elf64_Xword addr; - void *ptr; -}; - -void *obj_addr_to_native_ptr(ElfW(Addr)); - -ElfW(Addr) obj_native_ptr_to_addr(void *); - -#endif /* obj.h */ diff --git a/mdk-stage1/insmod-modutils/include/util.h b/mdk-stage1/insmod-modutils/include/util.h deleted file mode 100644 index b2e4a67c3..000000000 --- a/mdk-stage1/insmod-modutils/include/util.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Miscelaneous utility functions. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - - -#ifndef MODUTILS_UTIL_H -#define MODUTILS_UTIL_H 1 - -#ident "$Id$" - -#include -#include - -#define SHELL_META "&();|<>$`\"'\\!{}[]~=+:?*" /* Sum of bj0rn and Debian */ - -void *xmalloc(size_t); -void *xrealloc(void *, size_t); -char *xstrdup(const char *); -char *xstrcat(char *, const char *, size_t); -int xsystem(const char *, char *const[]); -int arch64(void); - -typedef int (*xftw_func_t)(const char *, const struct stat *); -extern int xftw(const char *directory, xftw_func_t); - -/* Error logging */ -extern int log; -extern int errors; -extern const char *error_file; - -extern int flag_verbose; -extern void verbose(const char *ctl,...); - -void error(const char *fmt, ...) -#ifdef __GNUC__ - __attribute__((format(printf, 1, 2))) -#endif - ; - -void lprintf(const char *fmt, ...) -#ifdef __GNUC__ - __attribute__((format(printf, 1, 2))) -#endif - ; - -void setsyslog(const char *program); - -/* - * Generic globlist - */ -typedef struct { - int pathc; /* Count of paths matched so far */ - char **pathv; /* List of matched pathnames. */ -} GLOB_LIST; -int meta_expand(char *pt, GLOB_LIST *g, char *base_dir, char *version, int type); -#define ME_BUILTIN_COMMAND 1 -#define ME_SHELL_COMMAND 2 -#define ME_GLOB 4 -#define ME_ALL (ME_GLOB|ME_SHELL_COMMAND|ME_BUILTIN_COMMAND) - -extern void snap_shot(const char *module_name, int number); -extern void snap_shot_log(const char *fmt,...); - -#ifdef CONFIG_USE_ZLIB -int gzf_open(const char *name, int mode); -int gzf_read(int fd, void *buf, size_t count); -off_t gzf_lseek(int fd, off_t offset, int whence); -void gzf_close(int fd); - -#else /* ! CONFIG_USE_ZLIB */ - -#include - -#define gzf_open open -#define gzf_read read -#define gzf_lseek lseek -#define gzf_close close - -#endif /* CONFIG_USE_ZLIB */ - -#define SYMPREFIX "__insmod_"; -extern const char symprefix[10]; /* Must be sizeof(SYMPREFIX), including nul */ - -#endif /* util.h */ diff --git a/mdk-stage1/insmod-modutils/include/version.h b/mdk-stage1/insmod-modutils/include/version.h deleted file mode 100644 index 51ca0eb29..000000000 --- a/mdk-stage1/insmod-modutils/include/version.h +++ /dev/null @@ -1 +0,0 @@ -#define MODUTILS_VERSION "2.4.2" diff --git a/mdk-stage1/insmod-modutils/insmod-frontend.c b/mdk-stage1/insmod-modutils/insmod-frontend.c deleted file mode 100644 index 2b3aa1acb..000000000 --- a/mdk-stage1/insmod-modutils/insmod-frontend.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include - - -int insmod_main( int argc, char **argv); - -int main( int argc, char **argv) -{ - printf("Using insmod provided by modutils.\n"); - return insmod_main(argc, argv); -} diff --git a/mdk-stage1/insmod-modutils/insmod.c b/mdk-stage1/insmod-modutils/insmod.c deleted file mode 100644 index 359b28837..000000000 --- a/mdk-stage1/insmod-modutils/insmod.c +++ /dev/null @@ -1,1964 +0,0 @@ -/* Insert a module into a running kernel. - Copyright 1996, 1997 Linux International. - - New implementation contributed by Richard Henderson - Based on original work by Bjorn Ekwall - Restructured (and partly rewritten) by: - Björn Ekwall February 1999 - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - - /* - Fixes: - - Adjust module size for mod_use_count in old_init_module: - B. James Phillippe - - Merged modprobe + many fixes: Björn Ekwall February 1999 - SMP "friendliness" (and -P): Bill Zumach - - Ksymoops support: Keith Owens August 1999. - - Add -r flag: Keith Owens October 1999. - - More flexible recognition of the way the utility was called. - Suggested by Stepan Kasal, implemented in a different way by Keith - Owens December 1999. - - Rationalize common code for 32/64 bit architectures. - Keith Owens December 1999. - Add arch64(). - Keith Owens December 1999. - kallsyms support - Keith Owens April 2000. - archdata support - Keith Owens August 2000. - Add insmod -O, move print map before sys_init_module. - Keith Owens October 2000. - Add insmod -S. - Keith Owens November 2000. - Add persistent data support. - Keith Owens November 2000. - */ - -#ident "$Id$" - -#include "../insmod.h" -#include -#include -#include -#include -//#include provided by stdlib -#include -#include -#include -#include -#include -#include -#include - -#include "module.h" -#include "obj.h" -#include "kallsyms.h" -#include "util.h" -#include "version.h" - -#include "modstat.h" -#include "config.h" - -#define STRVERSIONLEN 32 - -/*======================================================================*/ - -static int flag_force_load = 0; -static int flag_silent_probe = 0; -static int flag_export = 1; -static int flag_load_map = 0; -static int flag_ksymoops = 1; - -static int n_ext_modules_used; -static int m_has_modinfo; - -extern int insmod_main(int argc, char **argv); -extern int insmod_main_32(int argc, char **argv); -extern int insmod_main_64(int argc, char **argv); -extern int modprobe_main(int argc, char **argv); -extern int rmmod_main(int argc, char **argv); -extern int ksyms_main(int argc, char **argv); -extern int lsmod_main(int argc, char **argv); -extern int kallsyms_main(int argc, char **argv); - -/*======================================================================*/ - -/* Get the kernel version in the canonical integer form. */ - -static int get_kernel_version(char str[STRVERSIONLEN]) -{ - char *p, *q; - int a, b, c; - - strncpy(str, uts_info.release, STRVERSIONLEN); - p = uts_info.release; - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -/* String comparison for non-co-versioned kernel and module. - * prefix should be the same as used by genksyms for this kernel. - */ -static char *ncv_prefix = NULL; /* Overridden by --prefix option */ -static int ncv_plen = 0; - -/* Only set prefix once. If set by the user, use it. If not set by the - * user, look for a well known kernel symbol and derive the prefix from - * there. Otherwise set the prefix depending on whether uts_info - * includes SMP or not for backwards compatibility. - */ -static void set_ncv_prefix(char *prefix) -{ - static char derived_prefix[256]; - static const char *well_known_symbol[] = { "get_module_symbol_R", - "inter_module_get_R", - }; - struct module_symbol *s; - int i, j, l, m, pl; - const char *name; - char *p; - - if (ncv_prefix) - return; - - if (prefix) - ncv_prefix = prefix; - else { - /* Extract the prefix (if any) from well known symbols */ - for (i = 0, s = ksyms; i < nksyms; ++i, ++s) { - name = (char *) s->name; - l = strlen(name); - for (j = 0; j < sizeof(well_known_symbol)/sizeof(well_known_symbol[0]); ++j) { - m = strlen(well_known_symbol[j]); - if (m + 8 > l || - strncmp(name, well_known_symbol[j], m)) - continue; - pl = l - m - 8; - if (pl > sizeof(derived_prefix)-1) - continue; /* Prefix is wrong length */ - /* Must end with 8 hex digits */ - (void) strtoul(name+l-8, &p, 16); - if (*p == 0) { - strncpy(derived_prefix, name+m, pl); - *(derived_prefix+pl) = '\0'; - ncv_prefix = derived_prefix; - break; - } - } - } - } - if (!ncv_prefix) { - p = strchr(uts_info.version, ' '); - if (p && *(++p) && !strncmp(p, "SMP ", 4)) - ncv_prefix = "smp_"; - else - ncv_prefix = ""; - } - ncv_plen = strlen(ncv_prefix); - if (flag_verbose) - lprintf("Symbol version prefix '%s'", ncv_prefix); -} - -static int ncv_strcmp(const char *a, const char *b) -{ - size_t alen = strlen(a), blen = strlen(b); - - if (blen == alen + 10 + ncv_plen && - b[alen] == '_' && - b[alen + 1] == 'R' && - !(ncv_plen && strncmp(b + alen + 2, ncv_prefix, ncv_plen))) { - return strncmp(a, b, alen); - } else if (alen == blen + 10 + ncv_plen && - a[blen] == '_' && a[blen + 1] == 'R' && - !(ncv_plen && strncmp(a + blen + 2, ncv_prefix, ncv_plen))) { - return strncmp(a, b, blen); - } else - return strcmp(a, b); -} - -/* - * String hashing for non-co-versioned kernel and module. - * Here we are simply forced to drop the crc from the hash. - */ -static unsigned long ncv_symbol_hash(const char *str) -{ - size_t len = strlen(str); - - if (len > 10 + ncv_plen && - str[len - 10 - ncv_plen] == '_' && - str[len - 9 - ncv_plen] == 'R' && - !( - ncv_plen && - strncmp(str + len - (8 + ncv_plen), ncv_prefix, ncv_plen) - )) - len -= 10 + ncv_plen; - return obj_elf_hash_n(str, len); -} - -/* - * Conditionally add the symbols from the given symbol set - * to the new module. - */ -static int add_symbols_from(struct obj_file *f, int idx, - struct module_symbol *syms, size_t nsyms) -{ - struct module_symbol *s; - size_t i; - int used = 0; - - for (i = 0, s = syms; i < nsyms; ++i, ++s) { - /* - * Only add symbols that are already marked external. - * If we override locals we may cause problems for - * argument initialization. - * We will also create a false dependency on the module. - */ - struct obj_symbol *sym; - - sym = obj_find_symbol(f, (char *) s->name); - if (sym && !ELFW(ST_BIND) (sym->info) == STB_LOCAL) { - sym = obj_add_symbol(f, (char *) s->name, -1, - ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - idx, s->value, 0); - /* - * Did our symbol just get installed? - * If so, mark the module as "used". - */ - if (sym->secidx == idx) - used = 1; - } - } - - return used; -} - -static void add_kernel_symbols(struct obj_file *f) -{ - struct module_stat *m; - size_t i, nused = 0; - - /* Add module symbols first. */ - for (i = 0, m = module_stat; i < n_module_stat; ++i, ++m) - if (m->nsyms && - add_symbols_from(f, SHN_HIRESERVE + 2 + i, m->syms, m->nsyms)) - m->status = 1 /* used */, ++nused; - n_ext_modules_used = nused; - - /* And finally the symbols from the kernel proper. */ - if (nksyms) - add_symbols_from(f, SHN_HIRESERVE + 1, ksyms, nksyms); -} - -static void hide_special_symbols(struct obj_file *f) -{ - struct obj_symbol *sym; - const char *const *p; - static const char *const specials[] = - { - "cleanup_module", - "init_module", - "kernel_version", - NULL - }; - - for (p = specials; *p; ++p) - if ((sym = obj_find_symbol(f, *p)) != NULL) - sym->info = ELFW(ST_INFO) (STB_LOCAL, ELFW(ST_TYPE) (sym->info)); -} - -static void print_load_map(struct obj_file *f) -{ - struct obj_symbol *sym; - struct obj_symbol **all, **p; - struct obj_section *sec; - int load_map_cmp(const void *a, const void *b) { - struct obj_symbol **as = (struct obj_symbol **) a; - struct obj_symbol **bs = (struct obj_symbol **) b; - unsigned long aa = obj_symbol_final_value(f, *as); - unsigned long ba = obj_symbol_final_value(f, *bs); - return aa < ba ? -1 : aa > ba ? 1 : 0; - } - int i, nsyms, *loaded; - - /* Report on the section layout. */ - - lprintf("Sections: Size %-*s Align", - (int) (2 * sizeof(void *)), "Address"); - - for (sec = f->load_order; sec; sec = sec->load_next) { - int a; - unsigned long tmp; - - for (a = -1, tmp = sec->header.sh_addralign; tmp; ++a) - tmp >>= 1; - if (a == -1) - a = 0; - - lprintf("%-16s%08lx %0*lx 2**%d", - sec->name, - (long)sec->header.sh_size, - (int) (2 * sizeof(void *)), - (long)sec->header.sh_addr, - a); - } - - /* Quick reference which section indicies are loaded. */ - - loaded = alloca(sizeof(int) * (i = f->header.e_shnum)); - while (--i >= 0) - loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0; - - /* Collect the symbols we'll be listing. */ - - for (nsyms = i = 0; i < HASH_BUCKETS; ++i) - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->secidx <= SHN_HIRESERVE - && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx])) - ++nsyms; - - all = alloca(nsyms * sizeof(struct obj_symbol *)); - - for (i = 0, p = all; i < HASH_BUCKETS; ++i) - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->secidx <= SHN_HIRESERVE - && (sym->secidx >= SHN_LORESERVE || loaded[sym->secidx])) - *p++ = sym; - - /* Sort them by final value. */ - qsort(all, nsyms, sizeof(struct obj_file *), load_map_cmp); - - /* And list them. */ - lprintf("\nSymbols:"); - for (p = all; p < all + nsyms; ++p) { - char type = '?'; - unsigned long value; - - sym = *p; - if (sym->secidx == SHN_ABS) { - type = 'A'; - value = sym->value; - } else if (sym->secidx == SHN_UNDEF) { - type = 'U'; - value = 0; - } else { - struct obj_section *sec = f->sections[sym->secidx]; - - if (sec->header.sh_type == SHT_NOBITS) - type = 'B'; - else if (sec->header.sh_flags & SHF_ALLOC) { - if (sec->header.sh_flags & SHF_EXECINSTR) - type = 'T'; - else if (sec->header.sh_flags & SHF_WRITE) - type = 'D'; - else - type = 'R'; - } - value = sym->value + sec->header.sh_addr; - } - - if (ELFW(ST_BIND) (sym->info) == STB_LOCAL) - type = tolower(type); - - lprintf("%0*lx %c %s", (int) (2 * sizeof(void *)), value, - type, sym->name); - } -} - -/************************************************************************/ -/* begin compat */ - -static char * get_modinfo_value(struct obj_file *f, const char *key) -{ - struct obj_section *sec; - char *p, *v, *n, *ep; - size_t klen = strlen(key); - - sec = obj_find_section(f, ".modinfo"); - if (sec == NULL) - return NULL; - - p = sec->contents; - ep = p + sec->header.sh_size; - while (p < ep) { - v = strchr(p, '='); - n = strchr(p, '\0'); - if (v) { - if (v - p == klen && strncmp(p, key, klen) == 0) - return v + 1; - } else { - if (n - p == klen && strcmp(p, key) == 0) - return n; - } - p = n + 1; - } - - return NULL; -} - -static int create_this_module(struct obj_file *f, const char *m_name) -{ - struct obj_section *sec; - - sec = obj_create_alloced_section_first(f, ".this", tgt_sizeof_long, - sizeof(struct module)); - memset(sec->contents, 0, sizeof(struct module)); - - obj_add_symbol(f, "__this_module", -1, ELFW(ST_INFO) (STB_LOCAL, STT_OBJECT), - sec->idx, 0, sizeof(struct module)); - - obj_string_patch(f, sec->idx, offsetof(struct module, name), m_name); - - return 1; -} - -#ifdef COMPAT_2_0 -static int old_create_mod_use_count(struct obj_file *f) -{ - struct obj_section *sec; - struct obj_symbol *got; - - sec = obj_create_alloced_section_first(f, ".moduse", - sizeof(long), sizeof(long)); - - obj_add_symbol(f, "mod_use_count_", - -1, ELFW(ST_INFO)(STB_LOCAL, STT_OBJECT), - sec->idx, 0, sizeof(long)); - - /* - * patb: if there is a _GLOBAL_OFFSET_TABLE_, - * add .got section for PIC type modules; - * we have to do this here, because obj_* calls are not made until - * after obj_check_undefined - * is there a better place for this exception? - */ - got = obj_find_symbol(f, "_GLOBAL_OFFSET_TABLE_"); - if (got) -{ - sec = obj_create_alloced_section(f, ".got", - sizeof(long), sizeof(long)); - got->secidx = sec->idx; /* mark the symbol as defined */ - } - return 1; -} -#endif - -/* add an entry to the __ksymtab section, creating it if necessary */ -static void add_ksymtab(struct obj_file *f, struct obj_symbol *sym) -{ - struct obj_section *sec; - ElfW(Addr) ofs; - - /* ensure __ksymtab is allocated, EXPORT_NOSYMBOLS creates a non-alloc section. - * If __ksymtab is defined but not marked alloc, x out the first character - * (no obj_delete routine) and create a new __ksymtab with the correct - * characteristics. - */ - sec = obj_find_section(f, "__ksymtab"); - if (sec && !(sec->header.sh_flags & SHF_ALLOC)) { - *((char *)(sec->name)) = 'x'; /* override const */ - sec = NULL; - } - if (!sec) - sec = obj_create_alloced_section(f, "__ksymtab", tgt_sizeof_void_p, 0); - if (!sec) - return; - sec->header.sh_flags |= SHF_ALLOC; - - ofs = sec->header.sh_size; - obj_symbol_patch(f, sec->idx, ofs, sym); - obj_string_patch(f, sec->idx, ofs + tgt_sizeof_void_p, sym->name); - obj_extend_section(sec, 2 * tgt_sizeof_char_p); -} - -static int create_module_ksymtab(struct obj_file *f) -{ - struct obj_section *sec; - int i; - - /* We must always add the module references. */ - - if (n_ext_modules_used) { - struct module_ref *dep; - struct obj_symbol *tm; - - sec = obj_create_alloced_section(f, ".kmodtab", tgt_sizeof_void_p, - (sizeof(struct module_ref) - * n_ext_modules_used)); - if (!sec) - return 0; - - tm = obj_find_symbol(f, "__this_module"); - dep = (struct module_ref *) sec->contents; - for (i = 0; i < n_module_stat; ++i) - if (module_stat[i].status /* used */) { - dep->dep = module_stat[i].addr; - obj_symbol_patch(f, sec->idx, (char *) &dep->ref - sec->contents, tm); - dep->next_ref = 0; - ++dep; - } - } - if (flag_export && !obj_find_section(f, "__ksymtab")) { - int *loaded; - - /* We don't want to export symbols residing in sections that - aren't loaded. There are a number of these created so that - we make sure certain module options don't appear twice. */ - - loaded = alloca(sizeof(int) * (i = f->header.e_shnum)); - while (--i >= 0) - loaded[i] = (f->sections[i]->header.sh_flags & SHF_ALLOC) != 0; - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) { - if (ELFW(ST_BIND) (sym->info) != STB_LOCAL - && sym->secidx <= SHN_HIRESERVE - && (sym->secidx >= SHN_LORESERVE - || loaded[sym->secidx])) { - add_ksymtab(f, sym); - } - } - } - } - return 1; -} - -/* Get the module's kernel version in the canonical integer form. */ -static int get_module_version(struct obj_file *f, char str[STRVERSIONLEN]) -{ - int a, b, c; - char *p, *q; - - if ((p = get_modinfo_value(f, "kernel_version")) == NULL) { - struct obj_symbol *sym; - - m_has_modinfo = 0; - if ((sym = obj_find_symbol(f, "kernel_version")) == NULL) - sym = obj_find_symbol(f, "__module_kernel_version"); - if (sym == NULL) - return -1; - p = f->sections[sym->secidx]->contents + sym->value; - } else - m_has_modinfo = 1; - - strncpy(str, p, STRVERSIONLEN); - - a = strtoul(p, &p, 10); - if (*p != '.') - return -1; - b = strtoul(p + 1, &p, 10); - if (*p != '.') - return -1; - c = strtoul(p + 1, &q, 10); - if (p + 1 == q) - return -1; - - return a << 16 | b << 8 | c; -} - -/* Return the kernel symbol checksum version, or zero if not used. */ -static int is_kernel_checksummed(void) -{ - struct module_symbol *s; - size_t i; - - /* - * Using_Versions might not be the first symbol, - * but it should be in there. - */ - for (i = 0, s = ksyms; i < nksyms; ++i, ++s) - if (strcmp((char *) s->name, "Using_Versions") == 0) - return s->value; - - return 0; -} - -static int is_module_checksummed(struct obj_file *f) -{ - if (m_has_modinfo) { - const char *p = get_modinfo_value(f, "using_checksums"); - if (p) - return atoi(p); - else - return 0; - } else - return obj_find_symbol(f, "Using_Versions") != NULL; -} - -/* add module source, timestamp, kernel version and a symbol for the - * start of some sections. this info is used by ksymoops to do better - * debugging. - */ -static void add_ksymoops_symbols(struct obj_file *f, const char *filename, - const char *m_name) -{ - struct obj_section *sec; - struct obj_symbol *sym; - char *name, *absolute_filename; - char str[STRVERSIONLEN], real[PATH_MAX]; - int i, l, lm_name, lfilename, use_ksymtab, version; - struct stat statbuf; - - static const char *section_names[] = { - ".text", - ".rodata", - ".data", - ".bss" - }; - - if (realpath(filename, real)) { - absolute_filename = xstrdup(real); - } - else { - int save_errno = errno; - error("cannot get realpath for %s", filename); - errno = save_errno; - absolute_filename = xstrdup(filename); - } - - lm_name = strlen(m_name); - lfilename = strlen(absolute_filename); - - /* add to ksymtab if it already exists or there is no ksymtab and other symbols - * are not to be exported. otherwise leave ksymtab alone for now, the - * "export all symbols" compatibility code will export these symbols later. - */ - - use_ksymtab = obj_find_section(f, "__ksymtab") || !flag_export; - - if ((sec = obj_find_section(f, ".this"))) { - /* tag the module header with the object name, last modified - * timestamp and module version. worst case for module version - * is 0xffffff, decimal 16777215. putting all three fields in - * one symbol is less readable but saves kernel space. - */ - l = sizeof(symprefix)+ /* "__insmod_" */ - lm_name+ /* module name */ - 2+ /* "_O" */ - lfilename+ /* object filename */ - 2+ /* "_M" */ - 2*sizeof(statbuf.st_mtime)+ /* mtime in hex */ - 2+ /* "_V" */ - 8+ /* version in dec */ - 1; /* nul */ - name = xmalloc(l); - if (stat(absolute_filename, &statbuf) != 0) - statbuf.st_mtime = 0; - version = get_module_version(f, str); /* -1 if not found */ - snprintf(name, l, "%s%s_O%s_M%0*lX_V%d", - symprefix, m_name, absolute_filename, - 2*sizeof(statbuf.st_mtime), statbuf.st_mtime, - version); - sym = obj_add_symbol(f, name, -1, - ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - sec->idx, sec->header.sh_addr, 0); - if (use_ksymtab) - add_ksymtab(f, sym); - } - free(absolute_filename); - - /* record where the persistent data is going, same address as previous symbol */ - - if (f->persist) { - l = sizeof(symprefix)+ /* "__insmod_" */ - lm_name+ /* module name */ - 2+ /* "_P" */ - strlen(f->persist)+ /* data store */ - 1; /* nul */ - name = xmalloc(l); - snprintf(name, l, "%s%s_P%s", - symprefix, m_name, f->persist); - sym = obj_add_symbol(f, name, -1, ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - sec->idx, sec->header.sh_addr, 0); - if (use_ksymtab) - add_ksymtab(f, sym); - } - - /* tag the desired sections if size is non-zero */ - - for (i = 0; i < sizeof(section_names)/sizeof(section_names[0]); ++i) { - if ((sec = obj_find_section(f, section_names[i])) && - sec->header.sh_size) { - l = sizeof(symprefix)+ /* "__insmod_" */ - lm_name+ /* module name */ - 2+ /* "_S" */ - strlen(sec->name)+ /* section name */ - 2+ /* "_L" */ - 8+ /* length in dec */ - 1; /* nul */ - name = xmalloc(l); - snprintf(name, l, "%s%s_S%s_L%ld", - symprefix, m_name, sec->name, - (long)sec->header.sh_size); - sym = obj_add_symbol(f, name, -1, ELFW(ST_INFO) (STB_GLOBAL, STT_NOTYPE), - sec->idx, sec->header.sh_addr, 0); - if (use_ksymtab) - add_ksymtab(f, sym); - } - } -} - -static int process_module_arguments(struct obj_file *f, int argc, char **argv, int required) -{ - for (; argc > 0; ++argv, --argc) { - struct obj_symbol *sym; - int c; - int min, max; - int n; - char *contents; - char *input; - char *fmt; - char *key; - char *loc; - - if ((input = strchr(*argv, '=')) == NULL) - continue; - - n = input - *argv; - input += 1; /* skip '=' */ - - key = alloca(n + 6); - - if (m_has_modinfo) { - memcpy(key, "parm_", 5); - memcpy(key + 5, *argv, n); - key[n + 5] = '\0'; - if ((fmt = get_modinfo_value(f, key)) == NULL) { - if (required) { - error("invalid parameter %s", key); - return 0; - } - else { - if (flag_verbose) - lprintf("ignoring %s", *argv); - continue; /* silently ignore optional parameters */ - } - } - key += 5; - - if (isdigit(*fmt)) { - min = strtoul(fmt, &fmt, 10); - if (*fmt == '-') - max = strtoul(fmt + 1, &fmt, 10); - else - max = min; - } else - min = max = 1; - } else { /* not m_has_modinfo */ - memcpy(key, *argv, n); - key[n] = '\0'; - - if (isdigit(*input)) - fmt = "i"; - else - fmt = "s"; - min = max = 0; - } - - sym = obj_find_symbol(f, key); - - /* - * Also check that the parameter was not - * resolved from the kernel. - */ - if (sym == NULL || sym->secidx > SHN_HIRESERVE) { - error("symbol for parameter %s not found", key); - return 0; - } - - contents = f->sections[sym->secidx]->contents; - loc = contents + sym->value; - n = 1; - - while (*input) { - char *str; - - switch (*fmt) { - case 's': - case 'c': - /* - * Do C quoting if we begin with a ", - * else slurp the lot. - */ - if (*input == '"') { - char *r; - - str = alloca(strlen(input)); - for (r = str, input++; *input != '"'; ++input, ++r) { - if (*input == '\0') { - error("improperly terminated string argument for %s", key); - return 0; - } - /* else */ - if (*input != '\\') { - *r = *input; - continue; - } - /* else handle \ */ - switch (*++input) { - case 'a': *r = '\a'; break; - case 'b': *r = '\b'; break; - case 'e': *r = '\033'; break; - case 'f': *r = '\f'; break; - case 'n': *r = '\n'; break; - case 'r': *r = '\r'; break; - case 't': *r = '\t'; break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - c = *input - '0'; - if ('0' <= input[1] && input[1] <= '7') { - c = (c * 8) + *++input - '0'; - if ('0' <= input[1] && input[1] <= '7') - c = (c * 8) + *++input - '0'; - } - *r = c; - break; - - default: *r = *input; break; - } - } - *r = '\0'; - ++input; - } else { - /* - * The string is not quoted. - * We will break it using the comma - * (like for ints). - * If the user wants to include commas - * in a string, he just has to quote it - */ - char *r; - - /* Search the next comma */ - if ((r = strchr(input, ',')) != NULL) { - /* - * Found a comma - * Recopy the current field - */ - str = alloca(r - input + 1); - memcpy(str, input, r - input); - str[r - input] = '\0'; - /* Keep next fields */ - input = r; - } else { - /* last string */ - str = input; - input = ""; - } - } - - if (*fmt == 's') { - /* Normal string */ - obj_string_patch(f, sym->secidx, loc - contents, str); - loc += tgt_sizeof_char_p; - } else { - /* Array of chars (in fact, matrix !) */ - long charssize; /* size of each member */ - - /* Get the size of each member */ - /* Probably we should do that outside the loop ? */ - if (!isdigit(*(fmt + 1))) { - error("parameter type 'c' for %s must be followed by" - " the maximum size", key); - return 0; - } - charssize = strtoul(fmt + 1, (char **) NULL, 10); - - /* Check length */ - if (strlen(str) >= charssize-1) { - error("string too long for %s (max %ld)", - key, charssize - 1); - return 0; - } - /* Copy to location */ - strcpy((char *) loc, str); /* safe, see check above */ - loc += charssize; - } - /* - * End of 's' and 'c' - */ - break; - - case 'b': - *loc++ = strtoul(input, &input, 0); - break; - - case 'h': - *(short *) loc = strtoul(input, &input, 0); - loc += tgt_sizeof_short; - break; - - case 'i': - *(int *) loc = strtoul(input, &input, 0); - loc += tgt_sizeof_int; - break; - - case 'l': - *(long *) loc = strtoul(input, &input, 0); - loc += tgt_sizeof_long; - break; - - default: - error("unknown parameter type '%c' for %s", - *fmt, key); - return 0; - } - /* - * end of switch (*fmt) - */ - - while (*input && isspace(*input)) - ++input; - if (*input == '\0') - break; /* while (*input) */ - /* else */ - - if (*input == ',') { - if (max && (++n > max)) { - error("too many values for %s (max %d)", key, max); - return 0; - } - ++input; - /* continue with while (*input) */ - } else { - error("invalid argument syntax for %s: '%c'", - key, *input); - return 0; - } - } /* end of while (*input) */ - - if (min && (n < min)) { - error("too few values for %s (min %d)", key, min); - return 0; - } - } /* end of for (;argc > 0;) */ - - return 1; -} - - -/* Add a kallsyms section if the kernel supports all symbols. */ -static int add_kallsyms(struct obj_file *f, - struct obj_section **module_kallsyms, int force_kallsyms) -{ - struct module_symbol *s; - struct obj_file *f_kallsyms; - struct obj_section *sec_kallsyms; - size_t i; - int l; - const char *p, *pt_R; - unsigned long start = 0, stop = 0; - - for (i = 0, s = ksyms; i < nksyms; ++i, ++s) { - p = (char *)s->name; - pt_R = strstr(p, "_R"); - if (pt_R) - l = pt_R - p; - else - l = strlen(p); - if (strncmp(p, "__start_" KALLSYMS_SEC_NAME, l) == 0) - start = s->value; - else if (strncmp(p, "__stop_" KALLSYMS_SEC_NAME, l) == 0) - stop = s->value; - } - - if (start >= stop && !force_kallsyms) - return(0); - - /* The kernel contains all symbols, do the same for this module. */ - - /* Add an empty kallsyms section to the module if necessary */ - for (i = 0; i < f->header.e_shnum; ++i) { - if (strcmp(f->sections[i]->name, KALLSYMS_SEC_NAME) == 0) { - *module_kallsyms = f->sections[i]; - break; - } - } - if (!*module_kallsyms) - *module_kallsyms = obj_create_alloced_section(f, KALLSYMS_SEC_NAME, 0, 0); - - /* Size and populate kallsyms */ - if (obj_kallsyms(f, &f_kallsyms)) - return(1); - sec_kallsyms = f_kallsyms->sections[KALLSYMS_IDX]; - (*module_kallsyms)->header.sh_addralign = sec_kallsyms->header.sh_addralign; - (*module_kallsyms)->header.sh_size = sec_kallsyms->header.sh_size; - free((*module_kallsyms)->contents); - (*module_kallsyms)->contents = sec_kallsyms->contents; - sec_kallsyms->contents = NULL; - obj_free(f_kallsyms); - - return 0; -} - - -/* Add an arch data section if the arch wants it. */ -static int add_archdata(struct obj_file *f, - struct obj_section **sec) -{ - size_t i; - - *sec = NULL; - /* Add an empty archdata section to the module if necessary */ - for (i = 0; i < f->header.e_shnum; ++i) { - if (strcmp(f->sections[i]->name, ARCHDATA_SEC_NAME) == 0) { - *sec = f->sections[i]; - break; - } - } - if (!*sec) - *sec = obj_create_alloced_section(f, ARCHDATA_SEC_NAME, 16, 0); - - /* Size and populate archdata */ - if (arch_archdata(f, *sec)) - return(1); - return 0; -} - - -static int init_module(const char *m_name, struct obj_file *f, - unsigned long m_size, const char *blob_name, - unsigned int noload, unsigned int flag_load_map) -{ - struct module *module; - struct obj_section *sec; - void *image; - int ret = 0; - tgt_long m_addr; - - sec = obj_find_section(f, ".this"); - module = (struct module *) sec->contents; - m_addr = sec->header.sh_addr; - - module->size_of_struct = sizeof(*module); - module->size = m_size; - module->flags = flag_autoclean ? NEW_MOD_AUTOCLEAN : 0; - - sec = obj_find_section(f, "__ksymtab"); - if (sec && sec->header.sh_size) { - module->syms = sec->header.sh_addr; - module->nsyms = sec->header.sh_size / (2 * tgt_sizeof_char_p); - } - if (n_ext_modules_used) { - sec = obj_find_section(f, ".kmodtab"); - module->deps = sec->header.sh_addr; - module->ndeps = n_ext_modules_used; - } - module->init = obj_symbol_final_value(f, obj_find_symbol(f, "init_module")); - module->cleanup = obj_symbol_final_value(f, - obj_find_symbol(f, "cleanup_module")); - - sec = obj_find_section(f, "__ex_table"); - if (sec) { - module->ex_table_start = sec->header.sh_addr; - module->ex_table_end = sec->header.sh_addr + sec->header.sh_size; - } - sec = obj_find_section(f, ".text.init"); - if (sec) { - module->runsize = sec->header.sh_addr - m_addr; - } - sec = obj_find_section(f, ".data.init"); - if (sec) { - if (!module->runsize || - module->runsize > sec->header.sh_addr - m_addr) - module->runsize = sec->header.sh_addr - m_addr; - } - sec = obj_find_section(f, ARCHDATA_SEC_NAME); - if (sec && sec->header.sh_size) { - module->archdata_start = sec->header.sh_addr; - module->archdata_end = module->archdata_start + sec->header.sh_size; - } - sec = obj_find_section(f, KALLSYMS_SEC_NAME); - if (sec && sec->header.sh_size) { - module->kallsyms_start = sec->header.sh_addr; - module->kallsyms_end = module->kallsyms_start + sec->header.sh_size; - } - if (!arch_init_module(f, module)) - return 0; - - /* - * Whew! All of the initialization is complete. - * Collect the final module image and give it to the kernel. - */ - image = xmalloc(m_size); - obj_create_image(f, image); - - if (flag_load_map) - print_load_map(f); - - if (blob_name) { - int fd, l; - fd = open(blob_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); - if (fd < 0) { - error("open %s failed %m", blob_name); - ret = -1; - } - else { - if ((l = write(fd, image, m_size)) != m_size) { - error("write %s failed %m", blob_name); - ret = -1; - } - close(fd); - } - } - - if (ret == 0 && !noload) { - fflush(stdout); /* Flush any debugging output */ - ret = sys_init_module(m_name, (struct module *) image); - if (ret) { - error("init_module: %m"); - lprintf("Hint: insmod errors can be caused by incorrect module parameters, " - "including invalid IO or IRQ parameters"); - } - } - - free(image); - - return ret == 0; -} - -#ifdef COMPAT_2_0 -static int old_init_module(const char *m_name, struct obj_file *f, - unsigned long m_size) -{ - char *image; - struct old_mod_routines routines; - struct old_symbol_table *symtab; - int ret; - int nsyms = 0, strsize = 0, total; - - /* Create the symbol table */ - /* Size things first... */ - if (flag_export) { - int i; - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - - for (sym = f->symtab[i]; sym; sym = sym->next) - if (ELFW(ST_BIND) (sym->info) != STB_LOCAL && - sym->secidx <= SHN_HIRESERVE) { - sym->ksymidx = nsyms++; - strsize += strlen(sym->name) + 1; - } - } - } - total = (sizeof(struct old_symbol_table) + - nsyms * sizeof(struct old_module_symbol) + - n_ext_modules_used * sizeof(struct old_module_ref) + - strsize); - symtab = xmalloc(total); - symtab->size = total; - symtab->n_symbols = nsyms; - symtab->n_refs = n_ext_modules_used; - - if (flag_export && nsyms) { - struct old_module_symbol *ksym; - char *str; - int i; - - ksym = symtab->symbol; - str = ((char *) ksym + - nsyms * sizeof(struct old_module_symbol) + - n_ext_modules_used * sizeof(struct old_module_ref)); - - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym; sym = sym->next) - if (sym->ksymidx >= 0) { - ksym->addr = obj_symbol_final_value(f, sym); - ksym->name = (unsigned long) str - (unsigned long) symtab; - - str = stpcpy(str, sym->name) + 1; - ksym++; - } - } - } - - if (n_ext_modules_used) { - struct old_module_ref *ref; - int i; - - ref = (struct old_module_ref *) - ((char *) symtab->symbol + nsyms * sizeof(struct old_module_symbol)); - - for (i = 0; i < n_module_stat; ++i) { - if (module_stat[i].status /* used */) { - ref++->module = module_stat[i].modstruct; - } - } - } - - /* Fill in routines. */ - - routines.init = obj_symbol_final_value(f, obj_find_symbol(f, "init_module")); - routines.cleanup = obj_symbol_final_value(f, - obj_find_symbol(f, "cleanup_module")); - - /* - * Whew! All of the initialization is complete. - * Collect the final module image and give it to the kernel. - */ - image = xmalloc(m_size); - obj_create_image(f, image); - - /* - * image holds the complete relocated module, - * accounting correctly for mod_use_count. - * However the old module kernel support assume that it - * is receiving something which does not contain mod_use_count. - */ - ret = old_sys_init_module(m_name, image + sizeof(long), - (m_size - sizeof(long)) | - (flag_autoclean ? OLD_MOD_AUTOCLEAN : 0), - &routines, - symtab); - if (ret) - error("init_module: %m"); - - free(image); - free(symtab); - - return ret == 0; -} -#endif -/* end compat */ -/************************************************************************/ - -/* Check that a module parameter has a reasonable definition */ -static int check_module_parameter(struct obj_file *f, char *key, char *value, int *persist_flag) -{ - struct obj_symbol *sym; - int min, max; - char *p = value; - - sym = obj_find_symbol(f, key); - if (sym == NULL) { - /* FIXME: For 2.2 kernel compatibility, only issue warnings for - * most error conditions. Make these all errors in 2.5. - */ - lprintf("Warning: %s symbol for parameter %s not found", error_file, key); - return(1); - } - - if (isdigit(*p)) { - min = strtoul(p, &p, 10); - if (*p == '-') - max = strtoul(p + 1, &p, 10); - else - max = min; - } else - min = max = 1; - - if (max < min) { - lprintf("Warning: %s parameter %s has max < min!", error_file, key); - return(1); - } - - switch (*p) { - case 'c': - if (!isdigit(p[1])) { - lprintf("%s parameter %s has no size after 'c'!", error_file, key); - return(1); - } - while (isdigit(p[1])) - ++p; /* swallow c array size */ - break; - case 'b': /* drop through */ - case 'h': /* drop through */ - case 'i': /* drop through */ - case 'l': /* drop through */ - case 's': - break; - case '\0': - lprintf("%s parameter %s has no format character!", error_file, key); - return(1); - default: - lprintf("%s parameter %s has unknown format character '%c'", error_file, key, *p); - return(1); - } - switch (*++p) { - case 'p': - if (*(p-1) == 's') { - error("parameter %s is invalid persistent string", key); - return(1); - } - *persist_flag = 1; - break; - case '\0': - break; - default: - lprintf("%s parameter %s has unknown format modifier '%c'", error_file, key, *p); - return(1); - } - return(0); -} - -/* Check that all module parameters have reasonable definitions */ -static void check_module_parameters(struct obj_file *f, int *persist_flag) -{ - struct obj_section *sec; - char *ptr, *value, *n, *endptr; - int namelen, err = 0; - - sec = obj_find_section(f, ".modinfo"); - if (sec == NULL) { - /* module does not support typed parameters */ - return; - } - - ptr = sec->contents; - endptr = ptr + sec->header.sh_size; - while (ptr < endptr && !err) { - value = strchr(ptr, '='); - n = strchr(ptr, '\0'); - if (value) { - namelen = value - ptr; - if (namelen >= 5 && strncmp(ptr, "parm_", 5) == 0 - && !(namelen > 10 && strncmp(ptr, "parm_desc_", 10) == 0)) { - char *pname = xmalloc(namelen + 1); - strncpy(pname, ptr + 5, namelen - 5); - pname[namelen - 5] = '\0'; - err = check_module_parameter(f, pname, value+1, persist_flag); - free(pname); - } - } else { - if (n - ptr >= 5 && strncmp(ptr, "parm_", 5) == 0) { - error("parameter %s found with no value", ptr); - err = 1; - } - } - ptr = n + 1; - } - - if (err) - *persist_flag = 0; - return; -} - - -/* For common 3264 code, only compile the usage message once, in the 64 bit version */ -#if defined(COMMON_3264) && defined(ONLY_32) -extern void insmod_usage(void); /* Use the copy in the 64 bit version */ -#else /* Common 64 bit version or any non common code - compile usage routine */ -void insmod_usage(void) -{ - fputs("Usage:\n" - "insmod [-fhkLmnpqrsSvVxXyY] [-e persist_name] [-o module_name] [-O blob_name] [-P prefix] module [ symbol=value ... ]\n" - "\n" - " module Name of a loadable kernel module ('.o' can be omitted)\n" - " -f, --force Force loading under wrong kernel version\n" - " -h, --help Print this message\n" - " -k, --autoclean Make module autoclean-able\n" - " -L, --lock Prevent simultaneous loads of the same module\n" - " -m, --map Generate load map (so crashes can be traced)\n" - " -n, --noload Don't load, just show\n" - " -p, --probe Probe mode; check if the module matches the kernel\n" - " -q, --quiet Don't print unresolved symbols\n" - " -r, --root Allow root to load modules not owned by root\n" - " -s, --syslog Report errors via syslog\n" - " -S, --kallsyms Force kallsyms on module\n" - " -v, --verbose Verbose output\n" - " -V, --version Show version\n" - " -x, --noexport Do not export externs\n" - " -X, --export Do export externs (default)\n" - " -y, --noksymoops Do not add ksymoops symbols\n" - " -Y, --ksymoops Do add ksymoops symbols (default)\n" - " -e persist_name\n" - " --persist=persist_name Filename to hold any persistent data from the module\n" - " -o NAME, --name=NAME Set internal module name to NAME\n" - " -O NAME, --blob=NAME Save the object as a binary blob in NAME\n" - " -P PREFIX\n" - " --prefix=PREFIX Prefix for kernel or module symbols\n" - ,stderr); - exit(1); -} -#endif /* defined(COMMON_3264) && defined(ONLY_32) */ - -#if defined(COMMON_3264) && defined(ONLY_32) -#define INSMOD_MAIN insmod_main_32 /* 32 bit version */ -#elif defined(COMMON_3264) && defined(ONLY_64) -#define INSMOD_MAIN insmod_main_64 /* 64 bit version */ -#else -#define INSMOD_MAIN insmod_main /* Not common code */ -#endif - -int INSMOD_MAIN(int argc, char **argv) -{ - int k_version; - int k_crcs; - char k_strversion[STRVERSIONLEN]; - struct option long_opts[] = { - {"force", 0, 0, 'f'}, - {"help", 0, 0, 'h'}, - {"autoclean", 0, 0, 'k'}, - {"lock", 0, 0, 'L'}, - {"map", 0, 0, 'm'}, - {"noload", 0, 0, 'n'}, - {"probe", 0, 0, 'p'}, - {"poll", 0, 0, 'p'}, /* poll is deprecated, remove in 2.5 */ - {"quiet", 0, 0, 'q'}, - {"root", 0, 0, 'r'}, - {"syslog", 0, 0, 's'}, - {"kallsyms", 0, 0, 'S'}, - {"verbose", 0, 0, 'v'}, - {"version", 0, 0, 'V'}, - {"noexport", 0, 0, 'x'}, - {"export", 0, 0, 'X'}, - {"noksymoops", 0, 0, 'y'}, - {"ksymoops", 0, 0, 'Y'}, - - {"persist", 1, 0, 'e'}, - {"name", 1, 0, 'o'}, - {"blob", 1, 0, 'O'}, - {"prefix", 1, 0, 'P'}, - {0, 0, 0, 0} - }; - char *m_name = NULL; - char *blob_name = NULL; /* Save object as binary blob */ - int m_version; - ElfW(Addr) m_addr; - unsigned long m_size; - int m_crcs; - char m_strversion[STRVERSIONLEN]; - char *filename; - char *persist_name = NULL; /* filename to hold any persistent data */ - int fp; - struct obj_file *f; - struct obj_section *kallsyms = NULL, *archdata = NULL; - int o; - int noload = 0; - int dolock = 1; /*Note: was: 0; */ - int quiet = 0; - int exit_status = 1; - int force_kallsyms = 0; - int persist_parms = 0; /* does module have persistent parms? */ - int i; - - error_file = "insmod"; - - /* To handle repeated calls from combined modprobe */ - errors = optind = 0; - - /* Process the command line. */ - while ((o = getopt_long(argc, argv, "fhkLmnpqrsSvVxXyYe:o:O:P:R:", - &long_opts[0], NULL)) != EOF) - switch (o) { - case 'f': /* force loading */ - flag_force_load = 1; - break; - case 'h': /* Print the usage message. */ - insmod_usage(); - break; - case 'k': /* module loaded by kerneld, auto-cleanable */ - flag_autoclean = 1; - break; - case 'L': /* protect against recursion. */ - dolock = 1; - break; - case 'm': /* generate load map */ - flag_load_map = 1; - break; - case 'n': /* don't load, just check */ - noload = 1; - break; - case 'p': /* silent probe mode */ - flag_silent_probe = 1; - break; - case 'q': /* Don't print unresolved symbols */ - quiet = 1; - break; - case 'r': /* allow root to load non-root modules */ - root_check_off = !root_check_off; - break; - case 's': /* start syslog */ - setsyslog("insmod"); - break; - case 'S': /* Force kallsyms */ - force_kallsyms = 1; - break; - case 'v': /* verbose output */ - flag_verbose = 1; - break; - case 'V': - fputs("insmod version " MODUTILS_VERSION "\n", stderr); - break; - case 'x': /* do not export externs */ - flag_export = 0; - break; - case 'X': /* do export externs */ - flag_export = 1; - break; - case 'y': /* do not define ksymoops symbols */ - flag_ksymoops = 0; - break; - case 'Y': /* do define ksymoops symbols */ - flag_ksymoops = 1; - break; - - case 'e': /* persistent data filename */ - free(persist_name); - persist_name = xstrdup(optarg); - break; - case 'o': /* name the output module */ - m_name = optarg; - break; - case 'O': /* save the output module object */ - blob_name = optarg; - break; - case 'P': /* use prefix on crc */ - set_ncv_prefix(optarg); - break; - - default: - insmod_usage(); - break; - } - - if (optind >= argc) { - insmod_usage(); - } - filename = argv[optind++]; - - if (config_read(0, NULL, "", NULL) < 0) { - error("Failed handle configuration"); - } - - if (persist_name && !*persist_name && - (!persistdir || !*persistdir)) { - free(persist_name); - persist_name = NULL; - if (flag_verbose) - lprintf("insmod: -e \"\" ignored, no persistdir"); - } - - if (m_name == NULL) { - size_t len; - char *p; - - if ((p = strrchr(filename, '/')) != NULL) - p++; - else - p = filename; - len = strlen(p); - if (len > 2 && p[len - 2] == '.' && p[len - 1] == 'o') - len -= 2; - else if (len > 4 && p[len - 4] == '.' && p[len - 3] == 'm' - && p[len - 2] == 'o' && p[len - 1] == 'd') - len -= 4; -#ifdef CONFIG_USE_ZLIB - else if (len > 5 && !strcmp(p + len - 5, ".o.gz")) - len -= 5; -#endif - - m_name = xmalloc(len + 1); - memcpy(m_name, p, len); - m_name[len] = '\0'; - } - - /* Locate the file to be loaded. */ - if (!strchr(filename, '/') && !strchr(filename, '.')) { - char *tmp = search_module_path(filename); - if (tmp == NULL) { - error("%s: no module by that name found", filename); - return 1; - } - filename = tmp; - lprintf("Using %s", filename); - } else if (flag_verbose) - lprintf("Using %s", filename); - - /* And open it. */ - if ((fp = gzf_open(filename, O_RDONLY)) == -1) { - error("%s: %m", filename); - return 1; - } - /* Try to prevent multiple simultaneous loads. */ - if (dolock) - flock(fp, LOCK_EX); - - if (!get_kernel_info(K_SYMBOLS)) - goto out; - - /* - * Set the genksyms prefix if this is a versioned kernel - * and it's not already set. - */ - set_ncv_prefix(NULL); - - for (i = 0; i < n_module_stat; ++i) { - if (strcmp(module_stat[i].name, m_name) == 0) { - error("a module named %s already exists", m_name); - goto out; - } - } - - error_file = filename; - if ((f = obj_load(fp, ET_REL, filename)) == NULL) - goto out; - - /* Version correspondence? */ - k_version = get_kernel_version(k_strversion); - m_version = get_module_version(f, m_strversion); - if (m_version == -1) { - error("couldn't find the kernel version the module was compiled for"); - goto out; - } - - k_crcs = is_kernel_checksummed(); - m_crcs = is_module_checksummed(f); - if ((m_crcs == 0 || k_crcs == 0) && - strncmp(k_strversion, m_strversion, STRVERSIONLEN) != 0) { - if (flag_force_load) { - lprintf("Warning: kernel-module version mismatch\n" - "\t%s was compiled for kernel version %s\n" - "\twhile this kernel is version %s", - filename, m_strversion, k_strversion); - } else { - if (!quiet) - error("kernel-module version mismatch\n" - "\t%s was compiled for kernel version %s\n" - "\twhile this kernel is version %s.", - filename, m_strversion, k_strversion); - goto out; - } - } - if (m_crcs != k_crcs) - obj_set_symbol_compare(f, ncv_strcmp, ncv_symbol_hash); - - /* Let the module know about the kernel symbols. */ - add_kernel_symbols(f); - - /* Allocate common symbols, symbol tables, and string tables. - * - * The calls marked DEPMOD indicate the bits of code that depmod - * uses to do a pseudo relocation, ignoring undefined symbols. - * Any changes made to the relocation sequence here should be - * checked against depmod. - */ -#ifdef COMPAT_2_0 - if (k_new_syscalls - ? !create_this_module(f, m_name) - : !old_create_mod_use_count(f)) - goto out; -#else - if (!create_this_module(f, m_name)) - goto out; -#endif - - if (!obj_check_undefineds(f, quiet)) /* DEPMOD, obj_clear_undefineds */ - goto out; - obj_allocate_commons(f); /* DEPMOD */ - - check_module_parameters(f, &persist_parms); - - if (optind < argc) { - if (!process_module_arguments(f, argc - optind, argv + optind, 1)) - goto out; - } - arch_create_got(f); /* DEPMOD */ - hide_special_symbols(f); - - if (persist_parms && persist_name && *persist_name) { - f->persist = persist_name; - persist_name = NULL; - } - - if (persist_parms && - persist_name && !*persist_name) { - /* -e "". This is ugly. Take the filename, compare it against - * each of the module paths until we find a match on the start - * of the filename, assume the rest is the relative path. Have - * to do it this way because modprobe uses absolute filenames - * for module names in modules.dep and the format of modules.dep - * does not allow for any backwards compatible changes, so there - * is nowhere to store the relative filename. The only way this - * should fail to calculate a relative path is "insmod ./xxx", for - * that case the user has to specify -e filename. - */ - int j, l = strlen(filename); - char *relative = NULL; - char *p; - for (i = 0; i < nmodpath; ++i) { - p = modpath[i].path; - j = strlen(p); - while (j && p[j] == '/') - --j; - if (j < l && strncmp(filename, p, j) == 0 && filename[j] == '/') { - while (filename[j] == '/') - ++j; - relative = xstrdup(filename+j); - break; - } - } - if (relative) { - i = strlen(relative); - if (i > 3 && strcmp(relative+i-3, ".gz") == 0) - relative[i -= 3] = '\0'; - if (i > 2 && strcmp(relative+i-2, ".o") == 0) - relative[i -= 2] = '\0'; - else if (i > 4 && strcmp(relative+i-4, ".mod") == 0) - relative[i -= 4] = '\0'; - f->persist = xmalloc(strlen(persistdir) + 1 + i + 1); - strcpy(f->persist, persistdir); /* safe, xmalloc */ - strcat(f->persist, "/"); /* safe, xmalloc */ - strcat(f->persist, relative); /* safe, xmalloc */ - free(relative); - } - else - error("Cannot calculate persistent filename"); - } - - if (f->persist && *(f->persist) != '/') { - error("Persistent filenames must be absolute, ignoring '%s'", - f->persist); - free(f->persist); - f->persist = NULL; - } - - if (f->persist && !flag_ksymoops) { - error("has persistent data but ksymoops symbols are not available"); - free(f->persist); - f->persist = NULL; - } - - if (f->persist && !k_new_syscalls) { - error("has persistent data but the kernel is too old to support it"); - free(f->persist); - f->persist = NULL; - } - - if (persist_parms && flag_verbose) { - if (f->persist) - lprintf("Persist filename '%s'", f->persist); - else - lprintf("No persistent filename available"); - } - - if (f->persist) { - FILE *fp = fopen(f->persist, "r"); - if (!fp) { - if (flag_verbose) - lprintf("Cannot open persist file '%s' %m", f->persist); - } - else { - int pargc = 0; - char *pargv[1000]; /* hard coded but big enough */ - char line[3000]; /* hard coded but big enough */ - char *p; - while (fgets(line, sizeof(line), fp)) { - p = strchr(line, '\n'); - if (!p) { - error("Persistent data line is too long\n%s", line); - break; - } - *p = '\0'; - p = line; - while (isspace(*p)) - ++p; - if (!*p || *p == '#') - continue; - if (pargc == sizeof(pargv)/sizeof(pargv[0])) { - error("More than %d persistent parameters", pargc); - break; - } - pargv[pargc++] = xstrdup(p); - } - fclose(fp); - if (!process_module_arguments(f, pargc, pargv, 0)) - goto out; - while (pargc--) - free(pargv[pargc]); - } - } - - if (flag_ksymoops) - add_ksymoops_symbols(f, filename, m_name); - - if (k_new_syscalls) - create_module_ksymtab(f); - - /* archdata based on relocatable addresses */ - if (add_archdata(f, &archdata)) - goto out; - - /* kallsyms based on relocatable addresses */ - if (add_kallsyms(f, &kallsyms, force_kallsyms)) - goto out; - /**** No symbols or sections to be changed after kallsyms above ***/ - - if (errors) - goto out; - - /* If we were just checking, we made it. */ - if (flag_silent_probe) { - exit_status = 0; - goto out; - } - /* Module has now finished growing; find its size and install it. */ - m_size = obj_load_size(f); /* DEPMOD */ - - if (noload) { - /* Don't bother actually touching the kernel. */ - m_addr = 0x12340000; - } else { - errno = 0; - m_addr = create_module(m_name, m_size); - switch (errno) { - case 0: - break; - case EEXIST: - if (dolock) { - /* - * Assume that we were just invoked - * simultaneous with another insmod - * and return success. - */ - exit_status = 0; - goto out; - } - error("a module named %s already exists", m_name); - goto out; - case ENOMEM: - error("can't allocate kernel memory for module; needed %lu bytes", - m_size); - goto out; - default: - error("create_module: %m"); - goto out; - } - } - - /* module is already built, complete with ksymoops symbols for the - * persistent filename. If the kernel does not support persistent data - * then give an error but continue. It is too difficult to clean up at - * this stage and this error will only occur on backported modules. - * rmmod will also get an error so warn the user now. - */ - if (f->persist && !noload) { - struct { - struct module m; - int data; - } test_read; - memset(&test_read, 0, sizeof(test_read)); - test_read.m.size_of_struct = -sizeof(test_read.m); /* -ve size => read, not write */ - test_read.m.read_start = m_addr + sizeof(struct module); - test_read.m.read_end = test_read.m.read_start + sizeof(test_read.data); - if (sys_init_module(m_name, (struct module *) &test_read)) { - int old_errors = errors; - error("has persistent data but the kernel is too old to support it." - " Expect errors during rmmod as well"); - errors = old_errors; - } - } - - if (!obj_relocate(f, m_addr)) { /* DEPMOD */ - if (!noload) - delete_module(m_name); - goto out; - } - - /* Do archdata again, this time we have the final addresses */ - if (add_archdata(f, &archdata)) - goto out; - - /* Do kallsyms again, this time we have the final addresses */ - if (add_kallsyms(f, &kallsyms, force_kallsyms)) - goto out; - -#ifdef COMPAT_2_0 - if (k_new_syscalls) - init_module(m_name, f, m_size, blob_name, noload, flag_load_map); - else if (!noload) - old_init_module(m_name, f, m_size); -#else - init_module(m_name, f, m_size, blob_name, noload, flag_load_map); -#endif - if (errors) { - if (!noload) - delete_module(m_name); - goto out; - } - exit_status = 0; - - out: - if (dolock) - flock(fp, LOCK_UN); - close(fp); - if (!noload) - snap_shot(NULL, 0); - - return exit_status; -} - -/* For common 3264 code, add an overall insmod_main, in the 64 bit version. */ -#if defined(COMMON_3264) && defined(ONLY_64) -int insmod_main(int argc, char **argv) -{ - if (arch64()) - return insmod_main_64(argc, argv); - else - return insmod_main_32(argc, argv); -} -#endif /* defined(COMMON_3264) && defined(ONLY_64) */ - - - -int insmod_call(char * full_filename, char * params) -{ - int argc = 2; - char *argv[50]; - char * ptr = params; - argv[0] = "stage1"; - argv[1] = full_filename; - - while (ptr != NULL) { - argv[argc] = ptr; - argc++; - ptr = strchr(ptr, ' '); - if (ptr) { - ptr[0] = '\0'; - ptr++; - } - } - - return insmod_main(argc, argv); -} diff --git a/mdk-stage1/insmod-modutils/obj/Makefile b/mdk-stage1/insmod-modutils/obj/Makefile deleted file mode 100644 index 34b5df2d9..000000000 --- a/mdk-stage1/insmod-modutils/obj/Makefile +++ /dev/null @@ -1,33 +0,0 @@ - #****************************************************************************** - # - # insmod from modutils (generic) - # - # $Id$ - # - # Copyright 1996, 1997 Linux International. - # - #***************************************************************************** - -top_dir = ../.. - -include $(top_dir)/Makefile.common - - -all: libobj.a - -clean: - rm -f *.o *.a - - -INCS = -I./../include - -DEFS = -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) -DCONFIG_ROOT_CHECK_OFF=0 - -OBJS = obj_kallsyms.o obj_common.o obj_load.o obj_reloc.o obj_$(ARCH).o - -libobj.a: $(OBJS) - ar cru $@ $^ - ranlib $@ - -.c.o: - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< diff --git a/mdk-stage1/insmod-modutils/obj/obj_alpha.c b/mdk-stage1/insmod-modutils/obj/obj_alpha.c deleted file mode 100644 index 4006b3442..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_alpha.c +++ /dev/null @@ -1,305 +0,0 @@ -/* Alpha specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include -#include -#include - -/*======================================================================*/ - -struct alpha_got_entry -{ - struct alpha_got_entry *next; - ElfW(Addr) addend; - int offset; - int reloc_done; -}; - -struct alpha_file -{ - struct obj_file root; - struct obj_section *got; -}; - -struct alpha_symbol -{ - struct obj_symbol root; - struct alpha_got_entry *got_entries; -}; - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct alpha_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct alpha_symbol *sym; - sym = xmalloc(sizeof(*sym)); - sym->got_entries = NULL; - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf64_Rela *rel, - Elf64_Addr v) -{ - struct alpha_file *af = (struct alpha_file *)f; - struct alpha_symbol *asym = (struct alpha_symbol *)sym; - - unsigned long *lloc = (unsigned long *)(targsec->contents + rel->r_offset); - unsigned int *iloc = (unsigned int *)lloc; - Elf64_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf64_Addr gp = af->got->header.sh_addr + 0x8000; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF64_R_TYPE(rel->r_info)) - { - case R_ALPHA_NONE: - case R_ALPHA_LITUSE: - break; - - case R_ALPHA_REFQUAD: - *lloc += v; - break; - - case R_ALPHA_GPREL32: - v -= gp; - if ((Elf64_Sxword)v > 0x7fffffff - || (Elf64_Sxword)v < -(Elf64_Sxword)0x80000000) - ret = obj_reloc_overflow; - *iloc = v; - break; - - case R_ALPHA_LITERAL: - { - struct alpha_got_entry *gotent; - - assert(asym != NULL); - gotent = asym->got_entries; - while (gotent->addend != rel->r_addend) - gotent = gotent->next; - - if (!gotent->reloc_done) - { - *(unsigned long *)(af->got->contents + gotent->offset) = v; - gotent->reloc_done = 1; - } - - *iloc = (*iloc & ~0xffff) | ((gotent->offset - 0x8000) & 0xffff); - } - break; - - case R_ALPHA_GPDISP: - { - unsigned int *p_ldah, *p_lda; - unsigned int i_ldah, i_lda, hi, lo; - - p_ldah = iloc; - p_lda = (unsigned int *)((char *)iloc + rel->r_addend); - i_ldah = *p_ldah; - i_lda = *p_lda; - - /* Make sure the instructions are righteous. */ - if ((i_ldah >> 26) != 9 || (i_lda >> 26) != 8) - ret = obj_reloc_dangerous; - - /* Extract the existing addend. */ - v = (i_ldah & 0xffff) << 16 | (i_lda & 0xffff); - v = (v ^ 0x80008000) - 0x80008000; - - v += gp - dot; - - if ((Elf64_Sxword)v >= 0x7fff8000 - || (Elf64_Sxword)v < -(Elf64_Sxword)0x80000000) - ret = obj_reloc_overflow; - - /* Modify the instructions and finish up. */ - lo = v & 0xffff; - hi = ((v >> 16) + ((v >> 15) & 1)) & 0xffff; - - *p_ldah = (i_ldah & 0xffff0000) | hi; - *p_lda = (i_lda & 0xffff0000) | lo; - } - break; - - case R_ALPHA_BRADDR: - v -= dot + 4; - if (v % 4) - ret = obj_reloc_dangerous; - else if ((Elf64_Sxword)v > 0x3fffff - || (Elf64_Sxword)v < -(Elf64_Sxword)0x400000) - ret = obj_reloc_overflow; - v /= 4; - - *iloc = (*iloc & ~0x1fffff) | (v & 0x1fffff); - break; - - case R_ALPHA_HINT: - v -= dot + 4; - if (v % 4) - ret = obj_reloc_dangerous; - v /= 4; - - *iloc = (*iloc & ~0x3fff) | (v & 0x3fff); - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct alpha_file *af = (struct alpha_file *)f; - int i, n, offset = 0; - - n = af->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf64_Rela *rel, *relend; - Elf64_Sym *symtab; - const char *strtab; - - relsec = af->root.sections[i]; - if (relsec->header.sh_type != SHT_RELA) - continue; - - symsec = af->root.sections[relsec->header.sh_link]; - strsec = af->root.sections[symsec->header.sh_link]; - - rel = (Elf64_Rela *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf64_Rela)); - symtab = (Elf64_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - struct alpha_got_entry *ent; - Elf64_Sym *extsym; - struct alpha_symbol *intsym; - const char *name; - - if (ELF64_R_TYPE(rel->r_info) != R_ALPHA_LITERAL) - continue; - - extsym = &symtab[ELF64_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct alpha_symbol *)obj_find_symbol(&af->root, name); - - for (ent = intsym->got_entries; ent ; ent = ent->next) - if (ent->addend == rel->r_addend) - goto found; - - ent = xmalloc(sizeof(*ent)); - ent->addend = rel->r_addend; - ent->offset = offset; - ent->reloc_done = 0; - ent->next = intsym->got_entries; - intsym->got_entries = ent; - offset += 8; - - found:; - } - } - - if (offset > 0x10000) - { - error(".got section overflow: %#x > 0x10000", offset); - return 0; - } - - /* We always want a .got section so that we always have a GP for - use with GPDISP and GPREL32 relocs. Besides, if the section - is empty we don't use up space anyway. */ - af->got = obj_create_alloced_section(&af->root, ".got", 8, offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - struct alpha_file *af = (struct alpha_file *)f; - - mod->gp = af->got->header.sh_addr + 0x8000; - - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf64_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_arm.c b/mdk-stage1/insmod-modutils/obj/obj_arm.c deleted file mode 100644 index 7a843f947..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_arm.c +++ /dev/null @@ -1,318 +0,0 @@ -/* ARM specific support for Elf loading and relocation. - Copyright 1996, 1997, 1998 Linux International. - - Contributed by Phil Blundell - and wms - based on the i386 code by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include -#include -#include - - -/*======================================================================*/ - -struct arm_plt_entry -{ - int offset; - int allocated:1; - int inited:1; // has been set up -}; - -struct arm_got_entry -{ - int offset; - int allocated : 1; - unsigned reloc_done : 1; -}; - -struct arm_file -{ - struct obj_file root; - struct obj_section *plt; - struct obj_section *got; -}; - -struct arm_symbol -{ - struct obj_symbol root; - struct arm_plt_entry pltent; - struct arm_got_entry gotent; -}; - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct arm_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct arm_symbol *sym; - sym = xmalloc(sizeof(*sym)); - memset(&sym->gotent, 0, sizeof(sym->gotent)); - memset(&sym->pltent, 0, sizeof(sym->pltent)); - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rel *rel, - Elf32_Addr v) -{ - struct arm_file *afile = (struct arm_file *)f; - struct arm_symbol *asym = (struct arm_symbol *)sym; - - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf32_Addr got = afile->got ? afile->got->header.sh_addr : 0; - Elf32_Addr plt = afile->plt ? afile->plt->header.sh_addr : 0; - - struct arm_plt_entry *pe; - unsigned long *ip; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_ARM_NONE: - break; - - case R_ARM_ABS32: - *loc += v; - break; - - case R_ARM_GOT32: - /* needs an entry in the .got: set it, once */ - if (! asym->gotent.reloc_done) - { - asym->gotent.reloc_done = 1; - *(Elf32_Addr *)(afile->got->contents + asym->gotent.offset) = v; - } - /* make the reloc with_respect_to_.got */ - *loc += asym->gotent.offset; - break; - - /* relative reloc, always to _GLOBAL_OFFSET_TABLE_ (which is .got) - similar to branch, but is full 32 bits relative */ - case R_ARM_GOTPC: - assert(got); - *loc += got - dot; - break; - - case R_ARM_PC24: - case R_ARM_PLT32: - /* find the plt entry and initialize it if necessary */ - assert(asym != NULL); - pe = (struct arm_plt_entry*) &asym->pltent; - if (! pe->inited) - { - ip = (unsigned long *) (afile->plt->contents + pe->offset); - ip[0] = 0xe51ff004; /* ldr pc,[pc,#-4] */ - ip[1] = v; /* sym@ */ - pe->inited = 1; - } - - /* relative distance to target */ - v -= dot; - /* if the target is too far away.... */ - if ((int)v < -0x02000000 || (int)v >= 0x02000000) - { - /* go via the plt */ - v = plt + pe->offset - dot; - } - if (v & 3) - ret = obj_reloc_dangerous; - - /* Convert to words. */ - v >>= 2; - - /* merge the offset into the instruction. */ - *loc = (*loc & ~0x00ffffff) | ((v + *loc) & 0x00ffffff); - break; - - /* address relative to the got */ - case R_ARM_GOTOFF: - assert(got); - *loc += v - got; - break; - - default: - printf("Warning: unhandled reloc %d\n",ELF32_R_TYPE(rel->r_info)); - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct arm_file *afile = (struct arm_file *) f; - int i; - struct obj_section *sec, *syms, *strs; - ElfW(Rel) *rel, *relend; - ElfW(Sym) *symtab, *extsym; - const char *strtab, *name; - struct arm_symbol *intsym; - struct arm_plt_entry *pe; - struct arm_got_entry *ge; - int got_offset = 0, plt_offset = 0; - - for (i = 0; i < f->header.e_shnum; ++i) - { - sec = f->sections[i]; - if (sec->header.sh_type != SHT_RELM) - continue; - syms = f->sections[sec->header.sh_link]; - strs = f->sections[syms->header.sh_link]; - - rel = (ElfW(RelM) *) sec->contents; - relend = rel + (sec->header.sh_size / sizeof(ElfW(RelM))); - symtab = (ElfW(Sym) *) syms->contents; - strtab = (const char *) strs->contents; - - for (; rel < relend; ++rel) - { - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - - switch(ELF32_R_TYPE(rel->r_info)) { - case R_ARM_PC24: - case R_ARM_PLT32: - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct arm_symbol *) obj_find_symbol(f, name); - - pe = &intsym->pltent; - - if (! pe->allocated) - { - pe->allocated = 1; - pe->offset = plt_offset; - plt_offset += 8; - pe->inited = 0; - } - break; - - /* these two don_t need got entries, but they need - the .got to exist */ - case R_ARM_GOTOFF: - case R_ARM_GOTPC: - if (got_offset==0) got_offset = 4; - break; - - case R_ARM_GOT32: - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct arm_symbol *) obj_find_symbol(f, name); - - ge = (struct arm_got_entry *) &intsym->gotent; - if (! ge->allocated) - { - ge->allocated = 1; - ge->offset = got_offset; - got_offset += sizeof(void*); - } - break; - - default: - continue; - } - } - } - - /* if there was a _GLOBAL_OFFSET_TABLE_, then the .got section - exists already; find it and use it */ - if (got_offset) - { - struct obj_section* sec = obj_find_section(f, ".got"); - if (sec) - obj_extend_section(sec, got_offset); - else - { - sec = obj_create_alloced_section(f, ".got", 8, got_offset); - assert(sec); - } - afile->got = sec; - } - - if (plt_offset) - afile->plt = obj_create_alloced_section(f, ".plt", 8, plt_offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_common.c b/mdk-stage1/insmod-modutils/obj/obj_common.c deleted file mode 100644 index 2a6606c94..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_common.c +++ /dev/null @@ -1,399 +0,0 @@ -/* Elf file, section, and symbol manipulation routines. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include - -#include -#include -#include - -/*======================================================================*/ - -/* Standard ELF hash function. */ -inline unsigned long -obj_elf_hash_n(const char *name, unsigned long n) -{ - unsigned long h = 0; - unsigned long g; - unsigned char ch; - - while (n > 0) - { - ch = *name++; - h = (h << 4) + ch; - if ((g = (h & 0xf0000000)) != 0) - { - h ^= g >> 24; - h &= ~g; - } - n--; - } - return h; -} - -unsigned long -obj_elf_hash (const char *name) -{ - return obj_elf_hash_n(name, strlen(name)); -} - -void -obj_set_symbol_compare (struct obj_file *f, - int (*cmp)(const char *, const char *), - unsigned long (*hash)(const char *)) -{ - if (cmp) - f->symbol_cmp = cmp; - if (hash) - { - struct obj_symbol *tmptab[HASH_BUCKETS], *sym, *next; - int i; - - f->symbol_hash = hash; - - memcpy(tmptab, f->symtab, sizeof(tmptab)); - memset(f->symtab, 0, sizeof(f->symtab)); - - for (i = 0; i < HASH_BUCKETS; ++i) - for (sym = tmptab[i]; sym ; sym = next) - { - unsigned long h = hash(sym->name) % HASH_BUCKETS; - next = sym->next; - sym->next = f->symtab[h]; - f->symtab[h] = sym; - } - } -} - -struct obj_symbol * -obj_add_symbol (struct obj_file *f, const char *name, unsigned long symidx, - int info, int secidx, ElfW(Addr) value, unsigned long size) -{ - struct obj_symbol *sym; - unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS; - int n_type = ELFW(ST_TYPE)(info); - int n_binding = ELFW(ST_BIND)(info); - - for (sym = f->symtab[hash]; sym; sym = sym->next) - if (f->symbol_cmp(sym->name, name) == 0) - { - int o_secidx = sym->secidx; - int o_info = sym->info; - int o_type = ELFW(ST_TYPE)(o_info); - int o_binding = ELFW(ST_BIND)(o_info); - - /* A redefinition! Is it legal? */ - - if (secidx == SHN_UNDEF) - return sym; - else if (o_secidx == SHN_UNDEF) - goto found; - else if (n_binding == STB_GLOBAL && o_binding == STB_LOCAL) - { - /* Cope with local and global symbols of the same name - in the same object file, as might have been created - by ld -r. The only reason locals are now seen at this - level at all is so that we can do semi-sensible things - with parameters. */ - - struct obj_symbol *nsym, **p; - - nsym = arch_new_symbol(); - nsym->next = sym->next; - nsym->ksymidx = -1; - - /* Excise the old (local) symbol from the hash chain. */ - for (p = &f->symtab[hash]; *p != sym; p = &(*p)->next) - continue; - *p = sym = nsym; - goto found; - } - else if (n_binding == STB_LOCAL) - { - /* Another symbol of the same name has already been defined. - Just add this to the local table. */ - sym = arch_new_symbol(); - sym->next = NULL; - sym->ksymidx = -1; - f->local_symtab[symidx] = sym; - goto found; - } - else if (n_binding == STB_WEAK) - return sym; - else if (o_binding == STB_WEAK) - goto found; - /* Don't unify COMMON symbols with object types the programmer - doesn't expect. */ - else if (secidx == SHN_COMMON - && (o_type == STT_NOTYPE || o_type == STT_OBJECT)) - return sym; - else if (o_secidx == SHN_COMMON - && (n_type == STT_NOTYPE || n_type == STT_OBJECT)) - goto found; - else - { - /* Don't report an error if the symbol is coming from - the kernel or some external module. */ - if (secidx <= SHN_HIRESERVE) - error("%s multiply defined", name); - return sym; - } - } - - /* Completely new symbol. */ - sym = arch_new_symbol(); - sym->next = f->symtab[hash]; - f->symtab[hash] = sym; - sym->ksymidx = -1; - - if (ELFW(ST_BIND)(info) == STB_LOCAL && symidx != -1) { - if (symidx >= f->local_symtab_size) - error("local symbol %s with index %ld exceeds local_symtab_size %ld", - name, (long) symidx, (long) f->local_symtab_size); - else - f->local_symtab[symidx] = sym; - } - -found: - sym->name = name; - sym->value = value; - sym->size = size; - sym->secidx = secidx; - sym->info = info; - sym->r_type = 0; /* should be R_arch_NONE for all arch */ - - return sym; -} - -struct obj_symbol * -obj_find_symbol (struct obj_file *f, const char *name) -{ - struct obj_symbol *sym; - unsigned long hash = f->symbol_hash(name) % HASH_BUCKETS; - - for (sym = f->symtab[hash]; sym; sym = sym->next) - if (f->symbol_cmp(sym->name, name) == 0) - return sym; - - return NULL; -} - -ElfW(Addr) -obj_symbol_final_value (struct obj_file *f, struct obj_symbol *sym) -{ - if (sym) - { - if (sym->secidx >= SHN_LORESERVE) - return sym->value; - - return sym->value + f->sections[sym->secidx]->header.sh_addr; - } - else - { - /* As a special case, a NULL sym has value zero. */ - return 0; - } -} - -struct obj_section * -obj_find_section (struct obj_file *f, const char *name) -{ - int i, n = f->header.e_shnum; - - for (i = 0; i < n; ++i) - if (strcmp(f->sections[i]->name, name) == 0) - return f->sections[i]; - - return NULL; -} - -static int -obj_load_order_prio(struct obj_section *a) -{ - unsigned long af, ac; - - af = a->header.sh_flags; - - ac = 0; - if (a->name[0] != '.' || strlen(a->name) != 10 || - strcmp(a->name + 5, ".init")) ac |= 32; - if (af & SHF_ALLOC) ac |= 16; - if (!(af & SHF_WRITE)) ac |= 8; - if (af & SHF_EXECINSTR) ac |= 4; - if (a->header.sh_type != SHT_NOBITS) ac |= 2; -#if defined(ARCH_ia64) - if (af & SHF_IA_64_SHORT) ac -= 1; -#endif - - return ac; -} - -void -obj_insert_section_load_order (struct obj_file *f, struct obj_section *sec) -{ - struct obj_section **p; - int prio = obj_load_order_prio(sec); - for (p = f->load_order_search_start; *p ; p = &(*p)->load_next) - if (obj_load_order_prio(*p) < prio) - break; - sec->load_next = *p; - *p = sec; -} - -struct obj_section * -obj_create_alloced_section (struct obj_file *f, const char *name, - unsigned long align, unsigned long size) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE|SHF_ALLOC; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -struct obj_section * -obj_create_alloced_section_first (struct obj_file *f, const char *name, - unsigned long align, unsigned long size) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE|SHF_ALLOC; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - sec->load_next = f->load_order; - f->load_order = sec; - if (f->load_order_search_start == &f->load_order) - f->load_order_search_start = &sec->load_next; - - return sec; -} - -void * -obj_extend_section (struct obj_section *sec, unsigned long more) -{ - unsigned long oldsize = sec->header.sh_size; - sec->contents = xrealloc(sec->contents, sec->header.sh_size += more); - return sec->contents + oldsize; -} - -/* Convert an object pointer (address) to a native pointer and vice versa. - * It gets interesting when the object has 64 bit pointers but modutils - * is running 32 bit. This is nasty code but it stops the compiler giving - * spurious warning messages. "I know what I am doing" ... - */ - -void * -obj_addr_to_native_ptr (ElfW(Addr) addr) -{ - unsigned int convert = (sizeof(void *) << 8) + sizeof(addr); /* to, from */ - union obj_ptr_4 p4; - union obj_ptr_8 p8; - switch (convert) { - case 0x0404: - p4.addr = addr; - return(p4.ptr); - break; - case 0x0408: - p4.addr = addr; - if (p4.addr != addr) { - error("obj_addr_to_native_ptr truncation %" tgt_long_fmt "x", - (tgt_long) addr); - exit(1); - } - return(p4.ptr); - break; - case 0x0804: - p8.addr = addr; - return(p8.ptr); - break; - case 0x0808: - p8.addr = addr; - return(p8.ptr); - break; - default: - error("obj_addr_to_native_ptr unknown conversion 0x%04x", convert); - exit(1); - } -} - -ElfW(Addr) -obj_native_ptr_to_addr (void *ptr) -{ - unsigned int convert = (sizeof(ElfW(Addr)) << 8) + sizeof(ptr); /* to, from */ - union obj_ptr_4 p4; - union obj_ptr_8 p8; - switch (convert) { - case 0x0404: - p4.ptr = ptr; - return(p4.addr); - break; - case 0x0408: - p8.ptr = ptr; - p4.addr = p8.addr; - if (p4.addr != p8.addr) { - error("obj_native_ptr_to_addr truncation %" tgt_long_fmt "x", - (tgt_long) p8.addr); - exit(1); - } - return(p4.addr); - break; - case 0x0804: - p4.ptr = ptr; - return(p4.addr); /* compiler expands to 8 */ - break; - case 0x0808: - p8.ptr = ptr; - return(p8.addr); - break; - default: - error("obj_native_ptr_to_addr unknown conversion 0x%04x", convert); - exit(1); - } -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_hppa.c b/mdk-stage1/insmod-modutils/obj/obj_hppa.c deleted file mode 100644 index 4207e692e..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_hppa.c +++ /dev/null @@ -1,668 +0,0 @@ -/* - * PA-RISC specific support for Elf loading and relocation. - * Copyright 2000 David Huggins-Daines , Linuxcare Inc. - * Copyright 2000 Richard Hirst , Linuxcare Inc. - * - * Based on the IA-64 support, which is: - * Copyright 2000 Mike Stephens - * - * This file is part of the Linux modutils. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include -#include -#include - -#include -#include -#include -#include /* For ksyms */ - - -typedef struct _hppa_stub_t -{ - struct _hppa_stub_t *next; - int offset; - int reloc_done; -} hppa_stub_t; - -typedef struct _hppa_symbol_t -{ - struct obj_symbol root; - hppa_stub_t *stub; -} hppa_symbol_t; - -typedef struct _hppa_file_t -{ - struct obj_file root; - struct obj_section *stub; - Elf32_Addr dp; -} hppa_file_t; - -/* The ABI defines various more esoteric types, but these are the only - ones we actually need. */ -enum hppa_fsel -{ - e_fsel, - e_lsel, - e_rsel, - e_lrsel, - e_rrsel -}; - -/* This could be a call to obj_create_alloced_section() followed - * by an overwrite of sec->header.sh_flags. - */ - -struct obj_section * -obj_hppa_create_alloced_section (struct obj_file *f, const char *name, - unsigned long align, unsigned long size, - unsigned long sh_flags) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = sh_flags; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -struct obj_file * -arch_new_file (void) -{ - hppa_file_t *f; - f = xmalloc(sizeof(*f)); - f->stub = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - hppa_symbol_t *sym; - sym = xmalloc(sizeof(*sym)); - sym->stub = NULL; - return &sym->root; -} - -/* This is called for architecture specific sections we might need to - do special things to. */ -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -/* ================================================================= - - These functions are from libhppa.h in the GNU BFD library. - (c) 1990, 91, 92, 93, 94, 95, 96, 98, 99, 2000 - Free Software Foundation, Inc. - - ================================================================= */ - -/* The *sign_extend functions are used to assemble various bitfields - taken from an instruction and return the resulting immediate - value. */ - -static inline int -sign_extend (x, len) - int x, len; -{ - int signbit = (1 << (len - 1)); - int mask = (signbit << 1) - 1; - return ((x & mask) ^ signbit) - signbit; -} - -static inline int -low_sign_extend (x, len) - int x, len; -{ - return (x >> 1) - ((x & 1) << (len - 1)); -} - - -/* The re_assemble_* functions prepare an immediate value for - insertion into an opcode. pa-risc uses all sorts of weird bitfields - in the instruction to hold the value. */ - -static inline int -sign_unext (x, len) - int x, len; -{ - int len_ones; - - len_ones = (1 << len) - 1; - - return x & len_ones; -} - -static inline int -low_sign_unext (x, len) - int x, len; -{ - int temp; - int sign; - - sign = (x >> (len-1)) & 1; - - temp = sign_unext (x, len-1); - - return (temp << 1) | sign; -} - -static inline int -re_assemble_3 (as3) - int as3; -{ - return (( (as3 & 4) << (13-2)) - | ((as3 & 3) << (13+1))); -} - -static inline int -re_assemble_12 (as12) - int as12; -{ - return (( (as12 & 0x800) >> 11) - | ((as12 & 0x400) >> (10 - 2)) - | ((as12 & 0x3ff) << (1 + 2))); -} - -static inline int -re_assemble_14 (as14) - int as14; -{ - return (( (as14 & 0x1fff) << 1) - | ((as14 & 0x2000) >> 13)); -} - -static inline int -re_assemble_16 (as16) - int as16; -{ - int s, t; - - /* Unusual 16-bit encoding, for wide mode only. */ - t = (as16 << 1) & 0xffff; - s = (as16 & 0x8000); - return (t ^ s ^ (s >> 1)) | (s >> 15); -} - -static inline int -re_assemble_17 (as17) - int as17; -{ - return (( (as17 & 0x10000) >> 16) - | ((as17 & 0x0f800) << (16 - 11)) - | ((as17 & 0x00400) >> (10 - 2)) - | ((as17 & 0x003ff) << (1 + 2))); -} - -static inline int -re_assemble_21 (as21) - int as21; -{ - return (( (as21 & 0x100000) >> 20) - | ((as21 & 0x0ffe00) >> 8) - | ((as21 & 0x000180) << 7) - | ((as21 & 0x00007c) << 14) - | ((as21 & 0x000003) << 12)); -} - -static inline int -re_assemble_22 (as22) - int as22; -{ - return (( (as22 & 0x200000) >> 21) - | ((as22 & 0x1f0000) << (21 - 16)) - | ((as22 & 0x00f800) << (16 - 11)) - | ((as22 & 0x000400) >> (10 - 2)) - | ((as22 & 0x0003ff) << (1 + 2))); -} - - -/* Handle field selectors for PA instructions. - The L and R (and LS, RS etc.) selectors are used in pairs to form a - full 32 bit address. eg. - - LDIL L'start,%r1 ; put left part into r1 - LDW R'start(%r1),%r2 ; add r1 and right part to form address - - This function returns sign extended values in all cases. -*/ - -static inline unsigned int -hppa_field_adjust (value, addend, r_field) - unsigned int value; - int addend; - enum hppa_fsel r_field; -{ - unsigned int sym_val; - - sym_val = value - addend; - switch (r_field) - { - case e_fsel: - /* F: No change. */ - break; - - case e_lsel: - /* L: Select top 21 bits. */ - value = value >> 11; - break; - - case e_rsel: - /* R: Select bottom 11 bits. */ - value = value & 0x7ff; - break; - - case e_lrsel: - /* LR: L with rounding of the addend to nearest 8k. */ - value = sym_val + ((addend + 0x1000) & -0x2000); - value = value >> 11; - break; - - case e_rrsel: - /* RR: R with rounding of the addend to nearest 8k. - We need to return a value such that 2048 * LR'x + RR'x == x - ie. RR'x = s+a - (s + (((a + 0x1000) & -0x2000) & -0x800)) - . = s+a - ((s & -0x800) + ((a + 0x1000) & -0x2000)) - . = (s & 0x7ff) + a - ((a + 0x1000) & -0x2000) */ - value = (sym_val & 0x7ff) + (((addend & 0x1fff) ^ 0x1000) - 0x1000); - break; - - default: - abort(); - } - return value; -} - -/* Insert VALUE into INSN using R_FORMAT to determine exactly what - bits to change. */ - -static inline int -hppa_rebuild_insn (insn, value, r_format) - int insn; - int value; - int r_format; -{ - switch (r_format) - { - case 11: - return (insn & ~ 0x7ff) | low_sign_unext (value, 11); - - case 12: - return (insn & ~ 0x1ffd) | re_assemble_12 (value); - - - case 10: - return (insn & ~ 0x3ff1) | re_assemble_14 (value & -8); - - case -11: - return (insn & ~ 0x3ff9) | re_assemble_14 (value & -4); - - case 14: - return (insn & ~ 0x3fff) | re_assemble_14 (value); - - - case -10: - return (insn & ~ 0xfff1) | re_assemble_16 (value & -8); - - case -16: - return (insn & ~ 0xfff9) | re_assemble_16 (value & -4); - - case 16: - return (insn & ~ 0xffff) | re_assemble_16 (value); - - - case 17: - return (insn & ~ 0x1f1ffd) | re_assemble_17 (value); - - case 21: - return (insn & ~ 0x1fffff) | re_assemble_21 (value); - - case 22: - return (insn & ~ 0x3ff1ffd) | re_assemble_22 (value); - - case 32: - return value; - - default: - abort (); - } - return insn; -} - -/* ==================================================================== - - End of functions from GNU BFD. - - ==================================================================== */ - -/* This is where we get the opportunity to create any extra dynamic - sections we might need. In our case we do not need a GOT because - our code is not PIC, but we do need to create a stub section. - - This is significantly less complex than what we do for shared - libraries because, obviously, modules are not shared. Also we have - no issues related to symbol visibility, lazy linking, etc. - The kernels dp is fixed (at symbol data_start), and we can fix up any - DPREL refs in the module to use that same dp value. - All PCREL17F refs result in a stub with the following format: - - ldil L'func_addr,%r1 - be,n R'func_addr(%sr4,%r1) - - Note, all PCREL17F get a stub, regardless of whether they are - local or external. With local ones, and external ones to other - modules, there is a good chance we could manage without the stub. - I'll leave that for a future optimisation. - */ - -#define LDIL_R1 0x20200000 /* ldil L'XXX,%r1 */ -#define BE_N_SR4_R1 0xe0202002 /* be,n R'XXX(%sr4,%r1) */ - -#define STUB_SIZE 8 - -int -arch_create_got(struct obj_file *f) -{ - hppa_file_t *hfile = (hppa_file_t *)f; - int i, n; - int stub_offset = 0; - - /* Create stub section. - * XXX set flags, see obj_ia64.c - */ - hfile->stub = obj_create_alloced_section(f, ".stub", STUB_SIZE, 0); - - /* Actually this is a lot like check_relocs() in a BFD backend. We - walk all sections and all their relocations and look for ones - that need special treatment. */ - n = hfile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf32_Rela *rel, *relend; - Elf32_Sym *symtab; - char const *strtab; - - relsec = hfile->root.sections[i]; - if (relsec->header.sh_type != SHT_RELA) - continue; - - symsec = hfile->root.sections[relsec->header.sh_link]; - strsec = hfile->root.sections[symsec->header.sh_link]; - - rel = (Elf32_Rela *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rela)); - symtab = (Elf32_Sym *)symsec->contents; - strtab = (char const *)strsec->contents; - - for (; rel < relend; rel++) - { - int need_stub = 0; - - switch (ELF32_R_TYPE(rel->r_info)) - { - default: - continue; - - case R_PARISC_PCREL17F: - need_stub = 1; - break; - } - - if (need_stub) - { - Elf32_Sym *extsym; - hppa_symbol_t *hsym; - char const *name; - int local; - unsigned long symndx; - - symndx = ELF32_R_SYM(rel->r_info); - extsym = symtab + symndx; - if (ELF32_ST_BIND(extsym->st_info) == STB_LOCAL) - hsym = (hppa_symbol_t *) f->local_symtab[symndx]; - else - { - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - hsym = (hppa_symbol_t *)obj_find_symbol(f, name); - } - local = hsym->root.secidx <= SHN_HIRESERVE; - - if (need_stub) - { - hppa_stub_t *stub; - - if (hsym->stub == NULL) - { - stub = (hppa_stub_t *) xmalloc(sizeof(hppa_stub_t)); - stub->offset = stub_offset; - stub->reloc_done = 0; - hsym->stub = stub; - stub_offset += STUB_SIZE; - need_stub = 0; - } - } - } - } - } - if (stub_offset) - { - hfile->stub->contents = xmalloc(stub_offset); - hfile->stub->header.sh_size = stub_offset; - } - return 1; -} - - -enum obj_reloc -arch_apply_relocation(struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - hppa_file_t *hfile = (hppa_file_t *) f; - hppa_symbol_t *hsym = (hppa_symbol_t *) sym; - - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = (targsec->header.sh_addr + rel->r_offset) & ~0x03; - Elf32_Addr dp = hfile->dp; - Elf32_Word r_info = ELF32_R_TYPE(rel->r_info); - - enum obj_reloc ret = obj_reloc_ok; - enum hppa_fsel fsel = e_fsel; /* Avoid compiler warning */ - unsigned int r_format; - - /* Fix up the value, and determine whether we can handle this - relocation. */ - switch (r_info) - { - case R_PARISC_PLABEL32: - case R_PARISC_DIR32: - case R_PARISC_DIR21L: - case R_PARISC_DIR14R: - /* Easy. */ - break; - - case R_PARISC_DPREL21L: - case R_PARISC_DPREL14R: - v -= dp; - break; - - case R_PARISC_PCREL17F: - /* Find an import stub. */ - assert(hsym->stub != NULL); - assert(hfile->stub != NULL); - /* XXX Optimise. We may not need a stub for short branches */ - if (!hsym->stub->reloc_done) { - /* Need to create the .stub entry */ - Elf32_Addr *pstub, stubv; - - pstub = (Elf32_Addr *)(hfile->stub->contents + hsym->stub->offset); - pstub[0] = LDIL_R1; - pstub[1] = BE_N_SR4_R1; - stubv = hppa_field_adjust(v, rel->r_addend, e_lrsel); - pstub[0] = hppa_rebuild_insn(pstub[0], stubv, 21); - stubv = hppa_field_adjust(v, rel->r_addend, e_rrsel); - stubv >>= 2; /* Branch; divide by 4 */ - pstub[1] = hppa_rebuild_insn(pstub[1], stubv, 17); - hsym->stub->reloc_done = 1; - } - v = hsym->stub->offset + hfile->stub->header.sh_addr; - break; - - default: - return obj_reloc_unhandled; - } - - /* Find the field selector. */ - switch (r_info) - { - case R_PARISC_DIR32: - case R_PARISC_PLABEL32: - case R_PARISC_PCREL17F: - fsel = e_fsel; - break; - - case R_PARISC_DPREL21L: - case R_PARISC_DIR21L: - fsel = e_lrsel; - break; - - case R_PARISC_DPREL14R: - case R_PARISC_DIR14R: - fsel = e_rrsel; - break; - } - - v = hppa_field_adjust(v, rel->r_addend, fsel); - - switch (r_info) - { - case R_PARISC_PCREL17F: - case R_PARISC_PCREL17R: - case R_PARISC_PCREL22F: - v = v - dot - 8; - case R_PARISC_DIR17F: - case R_PARISC_DIR17R: - /* This is a branch. Divide the offset by four. */ - v >>= 2; - break; - default: - break; - } - - /* Find the format. */ - switch (r_info) - { - case R_PARISC_DIR32: - case R_PARISC_PLABEL32: - r_format = 32; - break; - - case R_PARISC_DPREL21L: - case R_PARISC_DIR21L: - r_format = 21; - break; - - case R_PARISC_PCREL17F: - r_format = 17; - break; - - case R_PARISC_DPREL14R: - case R_PARISC_DIR14R: - r_format = 14; - break; - - default: - abort(); - } - - *loc = hppa_rebuild_insn(*loc, v, r_format); - - return ret; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *f, struct obj_section *sec) -{ - struct module_symbol *s; - int i; - hppa_file_t *hfile = (hppa_file_t *)f; - - /* Initialise dp to the kernels dp (symbol data_start) - */ - for (i = 0, s = ksyms; i < nksyms; i++, s++) - if (!strcmp((char *)s->name, "data_start")) - break; - if (i >= nksyms) { - error("Cannot initialise dp, 'data_start' not found\n"); - return 1; - } - hfile->dp = s->value; - - return 0; -} - diff --git a/mdk-stage1/insmod-modutils/obj/obj_hppa64.c b/mdk-stage1/insmod-modutils/obj/obj_hppa64.c deleted file mode 100644 index fe32911ff..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_hppa64.c +++ /dev/null @@ -1,686 +0,0 @@ -/* - * hppa parisc64 specific support for Elf loading and relocation. - * Copyright 2000 Richard Hirst , Linuxcare Inc. - * - * Based on ia64 specific support which was - * Copyright 2000 Mike Stephens - * - * This file is part of the Linux modutils. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ident "$Id$" - -#include -#include -#include - -#include -#include -#include - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE ~FALSE -#endif - -/*======================================================================*/ - -typedef struct _hppa64_opd_t -{ - int offset; - int reloc_done; -} hppa64_opd_t; - -typedef struct _hppa64_stub_t -{ - struct _hppa64_stub_t *next; - Elf64_Addr addend; - int offset; - int reloc_done; -} hppa64_stub_t; - -typedef struct _hppa64_got_t -{ - struct _hppa64_got_t *next; - Elf64_Addr addend; - int offset; - int reloc_done; -} hppa64_got_t; - -typedef struct _hppa64_symbol_t -{ - struct obj_symbol root; - hppa64_got_t *gotent; - hppa64_opd_t *opdent; - hppa64_stub_t *stubent; -} hppa64_symbol_t; - -typedef struct _hppa64_file_t -{ - struct obj_file root; - struct obj_section *got; - struct obj_section *opd; - struct obj_section *stub; - Elf64_Addr gp; - Elf64_Addr text; - Elf64_Addr data; - Elf64_Addr bss; -} hppa64_file_t; - -/* - * XXX This stub assumes it can reach the .got entry with a +/- 8K offset - * from dp. Perhaps we should use a .plt for these entries to give a - * greater chance of that being true. - * - * 53 7b 00 00 ldd 0(dp),dp - * R_PARISC_LTOFF14R <.got entry offset from dp> - * 53 61 00 20 ldd 10(dp),r1 - * e8 20 d0 00 bve (r1) - * 53 7b 00 30 ldd 18(dp),dp - * - * We need a different stub for millicode calls, which doesn't screw - * dp: - * - * 53 61 00 00 ldd 0(dp),r1 - * R_PARISC_LTOFF14R <.got entry offset from dp> - * 50 21 00 20 ldd 10(r1),r1 - * e8 20 d0 00 bve (r1) - * 08 00 02 40 nop - * - */ - -/* NOTE: to keep the code cleaner we make all stubs the same size. - */ - -#define SIZEOF_STUB 16 - -unsigned char hppa64_stub_extern[] = -{ - 0x53, 0x7b, 0x00, 0x00, - 0x53, 0x61, 0x00, 0x20, - 0xe8, 0x20, 0xd0, 0x00, - 0x53, 0x7b, 0x00, 0x30, -}; - -unsigned char hppa64_stub_millicode[] = -{ - 0x53, 0x61, 0x00, 0x00, - 0x50, 0x21, 0x00, 0x20, - 0xe8, 0x20, 0xd0, 0x00, - 0x08, 0x00, 0x02, 0x40, -}; - -/*======================================================================*/ - -enum obj_reloc -patch_14r(Elf64_Xword v64, Elf64_Word *p) -{ - Elf64_Word i = *p; - Elf64_Word v = (Elf64_Word)v64; - - if (v & 0x80000000) - v |= ~0x7ff; - else - v &= 0x7ff; - i &= ~ 0x3fff; - i |= (v & 0x1fff) << 1 | - (v & 0x2000) >> 13; - *p = i; - - return obj_reloc_ok; -} - -enum obj_reloc -patch_21l(Elf64_Xword v64, Elf64_Word *p) -{ - Elf64_Word i = *p; - Elf64_Word v = (Elf64_Word)v64; - - v &= 0xfffff800; - if (v & 0x80000000) - v += 0x800; - i &= ~ 0x1fffff; - i |= (v & 0x80000000) >> 31 | - (v & 0x7ff00000) >> 19 | - (v & 0x000c0000) >> 4 | - (v & 0x0003e000) << 3 | - (v & 0x00001800) << 1; - *p = i; - - return obj_reloc_ok; -} - - -/* All 14 bits this time... This is used to patch the .got offset in - * a stub for PCREL22F. - */ - -enum obj_reloc -patch_14r2(Elf64_Xword v64, Elf64_Word *p) -{ - Elf64_Word i = *p; - Elf64_Word v = (Elf64_Word)v64; - - if ((Elf64_Sxword)v64 > 0x1fffL || - (Elf64_Sxword)v64 < -0x2000L) - return obj_reloc_overflow; - i &= ~ 0x3fff; - i |= (v & 0x2000) >> 13 | - (v & 0x1fff) << 1; - *p = i; - - return obj_reloc_ok; -} - - -enum obj_reloc -patch_22f(Elf64_Xword v64, Elf64_Word *p) -{ - Elf64_Word i = *p; - Elf64_Word v = (Elf64_Word)v64; - - if ((Elf64_Sxword)v64 > 0x800000-1 || - (Elf64_Sxword)v64 < -0x800000) - return obj_reloc_overflow; - - i &= ~ 0x03ff1ffd; - i |= (v & 0x00800000) >> 23 | - (v & 0x007c0000) << 3 | - (v & 0x0003e000) << 3 | - (v & 0x00001000) >> 10 | - (v & 0x00000ffc) << 1; - *p = i; - - return obj_reloc_ok; -} - - -struct obj_section * -obj_hppa64_create_alloced_section (struct obj_file *f, const char *name, - unsigned long align, unsigned long size, unsigned long sh_flags) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = sh_flags; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - hppa64_file_t *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - f->opd = NULL; - f->stub = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - hppa64_symbol_t *sym; - sym = xmalloc(sizeof(*sym)); - sym->gotent = NULL; - sym->opdent = NULL; - sym->stubent = NULL; - return &sym->root; -} - -/* This may not be needed, but does no harm (copied from ia64). - */ - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - switch (sec->header.sh_type) - { - case SHT_PARISC_EXT : - sec->contents = NULL; - break; - - case SHT_PARISC_UNWIND : - if (sec->header.sh_size > 0) - { - sec->contents = xmalloc(sec->header.sh_size); - gzf_lseek(fp, sec->header.sh_offset, SEEK_SET); - if (gzf_read(fp, sec->contents, sec->header.sh_size) != sec->header.sh_size) - { - error("error reading ELF section data: %m"); - return -1; - } - } - else - sec->contents = NULL; - break; - default: - error("Unknown section header type: %08x", sec->header.sh_type); - return -1; - } - return 0; -} - -int -arch_create_got(struct obj_file *f) -{ - hppa64_file_t *hfile = (hppa64_file_t *)f; - int i; - int n; - int got_offset = 0; - int opd_offset = 64; - int stub_offset = 0; - - n = hfile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf64_Rela *rel, *relend; - Elf64_Sym *symtab; - const char *strtab; - - relsec = hfile->root.sections[i]; - if (relsec->header.sh_type != SHT_RELA) - continue; - - symsec = hfile->root.sections[relsec->header.sh_link]; - strsec = hfile->root.sections[symsec->header.sh_link]; - - rel = (Elf64_Rela *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf64_Rela)); - symtab = (Elf64_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - int need_got = FALSE; - int need_opd = FALSE; - int need_stub = FALSE; - - switch (ELF64_R_TYPE(rel->r_info)) - { - default: - { - unsigned r_info = ELF64_R_TYPE(rel->r_info); - printf("r_info 0x%x not handled\n", r_info); - } - continue; - case R_PARISC_LTOFF14R: - case R_PARISC_LTOFF21L: - /* These are simple indirect references to symbols through the - * DLT. We need to create a DLT entry for any symbols which - * appears in a DLTIND relocation. - */ - need_got = TRUE; - break; - case R_PARISC_PCREL22F: - /* These are function calls. Depending on their precise - * target we may need to make a stub for them. The stub - * uses the dlt, so we need to create dlt entries for - * these symbols too. - */ - need_got = TRUE; - need_stub = TRUE; - break; - case R_PARISC_DIR64: - break; - case R_PARISC_FPTR64: - /* This is a simple OPD entry (only created for local symbols, - * see below). - */ - need_opd = TRUE; - break; - } - - if (need_got || need_opd || need_stub) - { - Elf64_Sym *extsym; - hppa64_symbol_t *isym; - const char *name; - int local; - unsigned long symndx; - - symndx = ELF64_R_SYM(rel->r_info); - extsym = &symtab[symndx]; - if (ELF64_ST_BIND(extsym->st_info) == STB_LOCAL) - { - isym = (hppa64_symbol_t *) f->local_symtab[symndx]; - } - else - { - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - isym = (hppa64_symbol_t *)obj_find_symbol(f, name); - } - local = isym->root.secidx <= SHN_HIRESERVE; - - if (need_stub) - { - hppa64_stub_t *stub; - - for (stub = isym->stubent; stub != NULL; stub = stub->next) - if (stub->addend == rel->r_addend) - break; - if (stub == NULL) - { - stub = (hppa64_stub_t *) xmalloc(sizeof(hppa64_stub_t)); - stub->next = isym->stubent; - stub->addend = rel->r_addend; - stub->offset = stub_offset; - stub->reloc_done = FALSE; - isym->stubent = stub; - { - stub_offset += SIZEOF_STUB; - } - need_stub = FALSE; - } - } - if (need_got) - { - hppa64_got_t *got; - - for (got = isym->gotent; got != NULL; got = got->next) - if (got->addend == rel->r_addend) - break; - if (got == NULL) - { - got = (hppa64_got_t *) xmalloc(sizeof(hppa64_got_t)); - got->next = isym->gotent; - got->addend = rel->r_addend; - got->offset = got_offset; - got->reloc_done = FALSE; - isym->gotent = got; - got_offset += 8; - need_got = FALSE; - } - } - if (need_opd && local) - { - hppa64_opd_t *opd; - - if (isym->opdent == NULL) - { - opd = (hppa64_opd_t *) xmalloc(sizeof(hppa64_opd_t)); - opd->offset = opd_offset; - opd->reloc_done = FALSE; - isym->opdent = opd; - opd_offset += 32; - need_opd = FALSE; - } - } - } - } - } - - hfile->got = obj_hppa64_create_alloced_section(f, ".got", 8, got_offset, - (SHF_ALLOC | SHF_WRITE | SHF_PARISC_SHORT)); - assert(hfile->got != NULL); - - hfile->opd = obj_hppa64_create_alloced_section(f, ".opd", 16, opd_offset, - (SHF_ALLOC | SHF_WRITE | SHF_PARISC_SHORT)); - assert(hfile->opd != NULL); - - if (stub_offset > 0) - { - hfile->stub = obj_hppa64_create_alloced_section(f, ".stub", 16, - stub_offset, (SHF_ALLOC | SHF_EXECINSTR | SHF_PARISC_SHORT)); - assert(hfile->stub != NULL); - } - - return 1; -} - - -/* This is a small simple version which seems to work fine. ia64 has - * a much more complex algorithm. We point dp at the end of the .got, - * which is the start of the .opd. - */ - -int -arch_finalize_section_address(struct obj_file *f, Elf64_Addr base) -{ - hppa64_file_t *hfile = (hppa64_file_t *)f; - int n = f->header.e_shnum; - int i; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - - /* Pick a sensible value for gp */ - hfile->gp = hfile->got->header.sh_addr + hfile->got->header.sh_size; - - return 1; -} - - -enum obj_reloc -arch_apply_relocation(struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf64_Rela *rel, - Elf64_Addr v) -{ - hppa64_file_t *hfile = (hppa64_file_t *) f; - hppa64_symbol_t *isym = (hppa64_symbol_t *) sym; - - Elf64_Word *loc = (Elf64_Word *)(targsec->contents + rel->r_offset); - Elf64_Addr dot = (targsec->header.sh_addr + rel->r_offset) & ~0x03; - - Elf64_Addr got = hfile->got->header.sh_addr; - Elf64_Addr gp = hfile->gp; - - Elf64_Xword r_info = ELF64_R_TYPE(rel->r_info); - - enum obj_reloc ret = obj_reloc_ok; - - switch (r_info) - { - default: - ret = obj_reloc_unhandled; - break; - case R_PARISC_LTOFF14R: - case R_PARISC_LTOFF21L: - { - hppa64_got_t *ge; - - assert(isym != NULL); - for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; ) - ge = ge->next; - assert(ge != NULL); - if (!ge->reloc_done) - { - ge->reloc_done = TRUE; - *(Elf64_Addr *)(hfile->got->contents + ge->offset) = v; - } - v = got + ge->offset - gp; - if (r_info == R_PARISC_LTOFF14R) - ret = patch_14r(v, loc); - else - ret = patch_21l(v, loc); - } - break; - case R_PARISC_PCREL22F: - { - hppa64_got_t *ge; - - assert(isym != NULL); - for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; ) - ge = ge->next; - assert(ge != NULL); - if (!ge->reloc_done) - { - ge->reloc_done = TRUE; - *(Elf64_Addr *)(hfile->got->contents + ge->offset) = v; - } - if ((isym->root.secidx > SHN_HIRESERVE) || - ((Elf64_Sxword) (v - dot - 8) > 0x800000-1) || - ((Elf64_Sxword) (v - dot - 8) < -0x800000)) - { - hppa64_stub_t *se; - - for (se = isym->stubent; se != NULL && se->addend != rel->r_addend; ) - se = se->next; - assert(se != NULL); - if (!se->reloc_done) - { - /* This requires that we can get from dp to the entry in +/- 8K, - * or +/- 1000 entries. patch_14r2() will check that. - * Only need these dlt entries for calls to external/far - * functions, so should probably put them in a seperate section - * before dlt and point dp at the section. Change to that - * scheme if we hit problems with big modules. - */ - unsigned char *stub; - - if (!strncmp(isym->root.name, "$$", 2)) - stub = hppa64_stub_millicode; - else - stub = hppa64_stub_extern; - se->reloc_done = TRUE; - memcpy((Elf64_Addr *)(hfile->stub->contents + se->offset), - stub, SIZEOF_STUB); - v = (Elf64_Addr)(hfile->got->header.sh_addr + ge->offset) - gp; - ret = patch_14r2(v, (Elf64_Word *)(hfile->stub->contents + se->offset)); - } - v = hfile->stub->header.sh_addr + se->offset; - } - v = v - dot - 8; - if (ret == obj_reloc_ok) - ret = patch_22f(v, loc); - } - break; - case R_PARISC_DIR64: - { - loc[0] = v >> 32; - loc[1] = v; - } - break; - case R_PARISC_FPTR64: - { - assert(isym != NULL); - if (isym->root.secidx <= SHN_HIRESERVE) /* local */ - { - assert(isym->opdent != NULL); - if (!isym->opdent->reloc_done) - { - isym->opdent->reloc_done = TRUE; - *(Elf64_Addr *)(hfile->opd->contents + isym->opdent->offset + 16) = v; - *(Elf64_Addr *)(hfile->opd->contents + isym->opdent->offset + 24) = gp; - } - v = hfile->opd->header.sh_addr + isym->opdent->offset; - } - loc[0] = v >> 32; - loc[1] = v; - } - break; - } - return ret; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - hppa64_file_t *hfile = (hppa64_file_t *)f; - Elf64_Addr *opd = (Elf64_Addr *)(hfile->opd->contents); - - opd[0] = 0; - opd[1] = 0; - if ((opd[2] = mod->init) != 0) - { - opd[3] = hfile->gp; - mod->init = hfile->opd->header.sh_addr; - } - - opd[4] = 0; - opd[5] = 0; - if ((opd[6] = mod->cleanup) != 0) - { - opd[7] = hfile->gp; - mod->cleanup = hfile->opd->header.sh_addr + 32; - } - - return 1; -} - -/* XXX Is this relevant to parisc? */ - -int -arch_archdata (struct obj_file *f, struct obj_section *archdata_sec) -{ - hppa64_file_t *hfile = (hppa64_file_t *)f; - struct archdata { - unsigned tgt_long unw_table; - unsigned tgt_long segment_base; - unsigned tgt_long unw_start; - unsigned tgt_long unw_end; - unsigned tgt_long gp; - } *ad; - int i; - struct obj_section *sec; - - free(archdata_sec->contents); - archdata_sec->contents = xmalloc(sizeof(struct archdata)); - memset(archdata_sec->contents, 0, sizeof(struct archdata)); - archdata_sec->header.sh_size = sizeof(struct archdata); - - ad = (struct archdata *)(archdata_sec->contents); - ad->gp = hfile->gp; - ad->unw_start = 0; - ad->unw_end = 0; - ad->unw_table = 0; - ad->segment_base = f->sections[1]->header.sh_addr; - for (i = 0; i < f->header.e_shnum; ++i) - { - sec = f->sections[i]; - if (sec->header.sh_type == SHT_PARISC_UNWIND) - { - ad->unw_start = sec->header.sh_addr; - ad->unw_end = sec->header.sh_addr + sec->header.sh_size; - break; - } - } - - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_i386.c b/mdk-stage1/insmod-modutils/obj/obj_i386.c deleted file mode 100644 index 28df3448c..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_i386.c +++ /dev/null @@ -1,245 +0,0 @@ -/* i386 specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include -#include -#include - - -/*======================================================================*/ - -struct i386_got_entry -{ - int offset; - unsigned offset_done : 1; - unsigned reloc_done : 1; -}; - -struct i386_file -{ - struct obj_file root; - struct obj_section *got; -}; - -struct i386_symbol -{ - struct obj_symbol root; - struct i386_got_entry gotent; -}; - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct i386_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct i386_symbol *sym; - sym = xmalloc(sizeof(*sym)); - memset(&sym->gotent, 0, sizeof(sym->gotent)); - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rel *rel, - Elf32_Addr v) -{ - struct i386_file *ifile = (struct i386_file *)f; - struct i386_symbol *isym = (struct i386_symbol *)sym; - - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_386_NONE: - break; - - case R_386_32: - *loc += v; - break; - - case R_386_PLT32: - case R_386_PC32: - *loc += v - dot; - break; - - case R_386_GLOB_DAT: - case R_386_JMP_SLOT: - *loc = v; - break; - - case R_386_RELATIVE: - *loc += f->baseaddr; - break; - - case R_386_GOTPC: - assert(got != 0); - *loc += got - dot; - break; - - case R_386_GOT32: - assert(isym != NULL); - if (!isym->gotent.reloc_done) - { - isym->gotent.reloc_done = 1; - *(Elf32_Addr *)(ifile->got->contents + isym->gotent.offset) = v; - } - *loc += isym->gotent.offset; - break; - - case R_386_GOTOFF: - assert(got != 0); - *loc += v - got; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct i386_file *ifile = (struct i386_file *)f; - int i, n, offset = 0, gotneeded = 0; - - n = ifile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf32_Rel *rel, *relend; - Elf32_Sym *symtab; - const char *strtab; - - relsec = ifile->root.sections[i]; - if (relsec->header.sh_type != SHT_REL) - continue; - - symsec = ifile->root.sections[relsec->header.sh_link]; - strsec = ifile->root.sections[symsec->header.sh_link]; - - rel = (Elf32_Rel *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel)); - symtab = (Elf32_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - Elf32_Sym *extsym; - struct i386_symbol *intsym; - const char *name; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_386_GOTPC: - case R_386_GOTOFF: - gotneeded = 1; - default: - continue; - - case R_386_GOT32: - break; - } - - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct i386_symbol *)obj_find_symbol(&ifile->root, name); - - if (!intsym->gotent.offset_done) - { - intsym->gotent.offset_done = 1; - intsym->gotent.offset = offset; - offset += 4; - } - } - } - - if (offset > 0 || gotneeded) - ifile->got = obj_create_alloced_section(&ifile->root, ".got", 4, offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_ia64.c b/mdk-stage1/insmod-modutils/obj/obj_ia64.c deleted file mode 100644 index 4f92c5d27..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_ia64.c +++ /dev/null @@ -1,1065 +0,0 @@ -/* - * ia64 specific support for Elf loading and relocation. - * Copyright 2000 Mike Stephens - * - * This file is part of the Linux modutils. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ident "$Id$" - -#include -#include -#include - -#include -#include -#include - -#ifndef FALSE -#define FALSE 0 -#endif -#ifndef TRUE -#define TRUE ~FALSE -#endif - -/*======================================================================*/ - -typedef struct _ia64_opd_t -{ - int offset; - int reloc_done; -} ia64_opd_t; - -typedef struct _ia64_plt_t -{ - struct _ia64_plt_t *next; - Elf64_Addr addend; - int text_offset; - int data_offset; - int reloc_done; -} ia64_plt_t; - -typedef struct _ia64_got_t -{ - struct _ia64_got_t *next; - Elf64_Addr addend; - int offset; - int reloc_done; -} ia64_got_t; - -typedef struct _ia64_symbol_t -{ - struct obj_symbol root; - ia64_got_t *gotent; - ia64_opd_t *opdent; - ia64_plt_t *pltent; -} ia64_symbol_t; - -typedef struct _ia64_file_t -{ - struct obj_file root; - struct obj_section *got; - struct obj_section *opd; - struct obj_section *pltt; - struct obj_section *pltd; - Elf64_Addr gp; - Elf64_Addr text; - Elf64_Addr data; - Elf64_Addr bss; -} ia64_file_t; - -/* - * aa=gp rel address of the function descriptor in the .IA_64.pltoff section - */ -unsigned char ia64_plt_local[] = -{ - 0x0b, 0x78, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r15=aa,gp;; */ - 0x00, 0x41, 0x3c, 0x30, 0x28, 0xc0, /* ld8 r16=[r15],8 */ - 0x01, 0x08, 0x00, 0x84, /* mov r14=gp;; */ - 0x11, 0x08, 0x00, 0x1e, 0x18, 0x10, /* [MIB] ld8 gp=[r15] */ - 0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /* mov b6=r16 */ - 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */ -}; - -unsigned char ia64_plt_extern[] = -{ - 0x0b, 0x80, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r16=aa,gp;; */ - 0xf0, 0x00, 0x40, 0x30, 0x20, 0x00, /* ld8 r15=[r16] */ - 0x00, 0x00, 0x04, 0x00, /* nop.i 0x0;; */ - 0x0b, 0x80, 0x20, 0x1e, 0x18, 0x14, /* [MMI] ld8 r16=[r15],8;; */ - 0x10, 0x00, 0x3c, 0x30, 0x20, 0xc0, /* ld8 gp=[r15] */ - 0x00, 0x09, 0x00, 0x07, /* mov b6=r16;; */ - 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MIB] nop.m 0x0 */ - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, /* nop.i 0x0 */ - 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */ -}; - -/*======================================================================*/ - -/* - * return the instruction at slot in bundle - */ -Elf64_Xword -obj_ia64_ins_extract_from_bundle(Elf64_Addr *bundle, Elf64_Xword slot) -{ - switch (slot) - { - case 0 : - return (*bundle >> 5) & 0x1ffffffffff; - - case 1 : - return (((*bundle >> 46) & 0x3ffff) | - (*(bundle + 1) << 18)) & 0x1ffffffffff; - - case 2 : - return (*(bundle + 1) >> 23) & 0x1ffffffffff; - - default: - } - return (-1); -} - -/* - * insert a instruction at slot in bundle - */ -void -obj_ia64_ins_insert_in_bundle(Elf64_Addr *bundle, Elf64_Xword slot, Elf64_Xword ins) -{ - Elf64_Xword i; - Elf64_Xword in = ins & 0x1ffffffffff; - - switch (slot) - { - case 0 : - i = *bundle & 0xffffc0000000001f; - *bundle = i | (in << 5); - break; - - case 1 : - i = *bundle & 0x00003fffffffffff; - *bundle = i | (in << 46); - - ++bundle; - i = *bundle & 0xffffffffff800000; - *bundle = i | (in >> 18); - break; - - case 2 : - ++bundle; - i = *bundle & 0x00000000007fffff; - *bundle = i | (in << 23); - break; - } -} - -/* - * add a immediate 14 value to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_imm14(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffee07f01fff; - ins |= ((v & 0x2000) << 23) | ((v & 0x1f80) << 20) | ((v & 0x007f) << 13); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - if (((Elf64_Sxword) v > 8191) || ((Elf64_Sxword) v < -8192)) - return obj_reloc_overflow; - return obj_reloc_ok; -} - -/* - * add a immediate 22 value to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_imm22(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffe000301fff; - ins |= ((v & 0x200000) << 15) | ((v & 0x1f0000) << 6) | - ((v & 0x00ff80) << 20) | ((v & 0x00007f) << 13); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - if (((Elf64_Sxword) v > 2097151) || ((Elf64_Sxword) v < -2097152)) - return obj_reloc_overflow; - return obj_reloc_ok; -} - -/* - * add a immediate 21 value (form 1) to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_pcrel21b(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffee00001fff; - ins |= ((v & 0x1000000) << 12) | ((v & 0x0fffff0) << 9); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - return obj_reloc_ok; -} - -/* - * add a immediate 21 value (form 2) to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_pcrel21m(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffee000fe03f; - ins |= ((v & 0x1000000) << 12) | ((v & 0x0fff800) << 9) | - ((v & 0x00007f0) << 2); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - return obj_reloc_ok; -} - -/* - * add a immediate 21 value (form 3) to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_pcrel21f(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffeffc00003f; - ins |= ((v & 0x1000000) << 12) | ((v & 0x0fffff0) << 2); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - return obj_reloc_ok; -} - -/* - * add a immediate 64 value to the instruction at slot in bundle - */ -enum obj_reloc -obj_ia64_ins_imm64(Elf64_Xword v, Elf64_Addr *bundle, Elf64_Xword slot) -{ - Elf64_Xword ins; - - assert(slot == 1); - ins = obj_ia64_ins_extract_from_bundle(bundle, slot); - ins &= 0xffffffee000101ff; - ins |= ((v & 0x8000000000000000) >> 28) | ((v & 0x0000000000200000)) | - ((v & 0x00000000001f0000) << 6) | ((v & 0x000000000000ff80) << 20) | - ((v & 0x000000000000007f) << 13); - obj_ia64_ins_insert_in_bundle(bundle, slot, ins); - obj_ia64_ins_insert_in_bundle(bundle, ++slot, ((v & 0x7fffffffffc00000) >> 22)); - return obj_reloc_ok; -} - -/* - * create a plt entry - */ -enum obj_reloc -obj_ia64_generate_plt(Elf64_Addr v, - Elf64_Addr gp, - ia64_file_t *ifile, - ia64_symbol_t *isym, - ia64_plt_t *pltent) -{ - *(Elf64_Addr *)(ifile->pltd->contents + pltent->data_offset) = v; - if (isym->root.secidx <= SHN_HIRESERVE) - { - /* local entry */ - *(Elf64_Addr *)(ifile->pltd->contents + pltent->data_offset + 8) = gp; - memcpy((Elf64_Addr *)(ifile->pltt->contents + pltent->text_offset), - ia64_plt_local, sizeof(ia64_plt_local)); - } - else - { - /* external entry */ - memcpy((Elf64_Addr *)(ifile->pltt->contents + pltent->text_offset), - ia64_plt_extern, sizeof(ia64_plt_extern)); - } - return obj_ia64_ins_imm22( - (ifile->pltd->header.sh_addr + pltent->data_offset - gp), - (Elf64_Addr *)(ifile->pltt->contents + pltent->text_offset), 0); -} - -struct obj_section * -obj_ia64_create_alloced_section (struct obj_file *f, const char *name, - unsigned long align, unsigned long size, unsigned long sh_flags) -{ - int newidx = f->header.e_shnum++; - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (newidx+1) * sizeof(sec)); - f->sections[newidx] = sec = arch_new_section(); - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = sh_flags; - sec->header.sh_size = size; - sec->header.sh_addralign = align; - sec->name = name; - sec->idx = newidx; - if (size) - sec->contents = xmalloc(size); - - obj_insert_section_load_order(f, sec); - - return sec; -} - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - ia64_file_t *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - f->opd = NULL; - f->pltt = NULL; - f->pltd = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - ia64_symbol_t *sym; - sym = xmalloc(sizeof(*sym)); - sym->gotent = NULL; - sym->opdent = NULL; - sym->pltent = NULL; - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - switch (sec->header.sh_type) - { - case SHT_IA_64_EXT : - sec->contents = NULL; - break; - - case SHT_IA_64_UNWIND : - if (sec->header.sh_size > 0) - { - sec->contents = xmalloc(sec->header.sh_size); - gzf_lseek(fp, sec->header.sh_offset, SEEK_SET); - if (gzf_read(fp, sec->contents, sec->header.sh_size) != sec->header.sh_size) - { - error("error reading ELF section data: %m"); - return -1; - } - } - else - sec->contents = NULL; - break; - - default: - error("Unknown section header type: %08x", sec->header.sh_type); - return -1; - } - return 0; -} - -int -arch_create_got(struct obj_file *f) -{ - ia64_file_t *ifile = (ia64_file_t *)f; - int i; - int n; - int got_offset = 0; - int opd_offset = 32; - int plt_text_offset = 0; - int plt_data_offset = 0; - - n = ifile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf64_Rela *rel, *relend; - Elf64_Sym *symtab; - const char *strtab; - - relsec = ifile->root.sections[i]; - if (relsec->header.sh_type != SHT_RELA) - continue; - - symsec = ifile->root.sections[relsec->header.sh_link]; - strsec = ifile->root.sections[symsec->header.sh_link]; - - rel = (Elf64_Rela *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf64_Rela)); - symtab = (Elf64_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - int need_got = FALSE; - int need_opd = FALSE; - int need_plt = FALSE; - - switch (ELF64_R_TYPE(rel->r_info)) - { - default: - continue; - - case R_IA64_FPTR64I : /* @fptr(sym + add), mov imm64 */ - case R_IA64_FPTR32LSB : /* @fptr(sym + add), data4 LSB */ - case R_IA64_FPTR64LSB : /* @fptr(sym + add), data8 LSB */ - need_opd = TRUE; - break; - - case R_IA64_LTOFF22 : /* @ltoff(sym + add), add imm22 */ - case R_IA64_LTOFF22X : - case R_IA64_LTOFF64I : /* @ltoff(sym + add), mov imm64 */ - need_got = TRUE; - break; - - case R_IA64_LTOFF_FPTR22 : /* @ltoff(@fptr(s+a)), imm22 */ - case R_IA64_LTOFF_FPTR64I : /* @ltoff(@fptr(s+a)), imm64 */ - case R_IA64_LTOFF_FPTR32LSB : - case R_IA64_LTOFF_FPTR64LSB : - need_got = TRUE; - need_opd = TRUE; - break; - - case R_IA64_PLTOFF22 : /* @pltoff(sym + add), add imm22 */ - case R_IA64_PLTOFF64I : /* @pltoff(sym + add), mov imm64 */ - case R_IA64_PLTOFF64LSB : /* @pltoff(sym + add), data8 LSB */ - - case R_IA64_PCREL21B : /* @pcrel(sym + add), ptb, call */ - case R_IA64_PCREL21M : /* @pcrel(sym + add), chk.s */ - case R_IA64_PCREL21F : /* @pcrel(sym + add), fchkf */ - need_plt = TRUE; - break; - } - - if (need_got || need_opd || need_plt) - { - Elf64_Sym *extsym; - ia64_symbol_t *isym; - const char *name; - int local; - unsigned long symndx; - - symndx = ELF64_R_SYM(rel->r_info); - extsym = &symtab[symndx]; - if (ELF64_ST_BIND(extsym->st_info) == STB_LOCAL) - { - isym = (ia64_symbol_t *) f->local_symtab[symndx]; - } - else - { - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - isym = (ia64_symbol_t *)obj_find_symbol(f, name); - } - local = isym->root.secidx <= SHN_HIRESERVE; - - if (need_plt) - { - ia64_plt_t *plt; - - for (plt = isym->pltent; plt != NULL; plt = plt->next) - if (plt->addend == rel->r_addend) - break; - if (plt == NULL) - { - plt = (ia64_plt_t *) xmalloc(sizeof(ia64_plt_t)); - plt->next = isym->pltent; - plt->addend = rel->r_addend; - plt->text_offset = plt_text_offset; - plt->data_offset = plt_data_offset; - plt->reloc_done = FALSE; - isym->pltent = plt; - if (local) - { - plt_text_offset += sizeof(ia64_plt_local); - plt_data_offset += 16; - } - else - { - plt_text_offset += sizeof(ia64_plt_extern); - plt_data_offset += 8; - } - need_plt = FALSE; - } - } - if (need_got) - { - ia64_got_t *got; - - for (got = isym->gotent; got != NULL; got = got->next) - if (got->addend == rel->r_addend) - break; - if (got == NULL) - { - got = (ia64_got_t *) xmalloc(sizeof(ia64_got_t)); - got->next = isym->gotent; - got->addend = rel->r_addend; - got->offset = got_offset; - got->reloc_done = FALSE; - isym->gotent = got; - got_offset += 8; - need_got = FALSE; - } - } - if (need_opd && local) - { - ia64_opd_t *opd; - - if (isym->opdent == NULL) - { - opd = (ia64_opd_t *) xmalloc(sizeof(ia64_opd_t)); - opd->offset = opd_offset; - opd->reloc_done = FALSE; - isym->opdent = opd; - opd_offset += 16; - need_opd = FALSE; - } - } - } - } - } - - ifile->got = obj_ia64_create_alloced_section(f, ".got", 8, got_offset, - (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT)); - assert(ifile->got != NULL); - - ifile->opd = obj_ia64_create_alloced_section(f, ".opd", 16, opd_offset, - (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT)); - assert(ifile->opd != NULL); - - if (plt_text_offset > 0) - { - ifile->pltt = obj_ia64_create_alloced_section(f, ".plt", 16, - plt_text_offset, (SHF_ALLOC | SHF_EXECINSTR | SHF_IA_64_SHORT)); - ifile->pltd = obj_ia64_create_alloced_section(f, ".IA_64.pltoff", - 16, plt_data_offset, (SHF_ALLOC | SHF_WRITE | SHF_IA_64_SHORT)); - assert(ifile->pltt != NULL); - assert(ifile->pltd != NULL); - } - - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf64_Addr base) -{ - ia64_file_t *ifile = (ia64_file_t *)f; - Elf64_Addr min_addr = (Elf64_Addr) -1; - Elf64_Addr max_addr = 0; - Elf64_Addr min_short_addr = (Elf64_Addr) -1; - Elf64_Addr max_short_addr = 0; - Elf64_Addr gp; - Elf64_Addr text = (Elf64_Addr) -1; - Elf64_Addr data = (Elf64_Addr) -1; - Elf64_Addr bss = (Elf64_Addr) -1; - int n = f->header.e_shnum; - int i; - - /* - * Finalize the addresses of the sections, find the min and max - * address of all sections marked short, and collect min and max - * address of any type, for use in selecting a nice gp. - * - * The algorithm used for selecting set the GP value was taken from - * the ld/bfd code contributed by David Mosberger-Tang - */ - f->baseaddr = base; - for (i = 0; i < n; ++i) - { - Elf64_Shdr *header = &f->sections[i]->header; - Elf64_Addr lo; - Elf64_Addr hi; - - header->sh_addr += base; - if (header->sh_flags & SHF_ALLOC) - { - lo = header->sh_addr; - hi = header->sh_addr + header->sh_size; - if (hi < lo) - hi = (Elf64_Addr) -1; - - if (min_addr > lo) - min_addr = lo; - if (max_addr < hi) - max_addr = hi; - if (header->sh_flags & SHF_IA_64_SHORT) - { - if (min_short_addr > lo) - min_short_addr = lo; - if (max_short_addr < hi) - max_short_addr = hi; - } - if ((header->sh_type & SHT_NOBITS) && (lo < bss)) - bss = lo; - else if ((header->sh_flags & SHF_EXECINSTR) && (lo < text)) - text = lo; - else if (lo < data) - data = lo; - } - } - /* Pick a sensible value for gp */ - - /* Start with just the address of the .got */ - gp = ifile->got->header.sh_addr; - - /* - * If it is possible to address the entire image, but we - * don't with the choice above, adjust. - */ - if ((max_addr - min_addr < 0x400000) && (max_addr - gp <= 0x200000) && - (gp - min_addr > 0x200000)) - { - gp = min_addr + 0x200000; - } - else if (max_short_addr != 0) - { - /* If we don't cover all the short data, adjust */ - if (max_short_addr - gp >= 0x200000) - gp = min_short_addr + 0x200000; - - /* If we're addressing stuff past the end, adjust back */ - if (gp > max_addr) - gp = max_addr - 0x200000 + 8; - } - - /* - * Validate whether all SHF_IA_64_SHORT sections are within - * range of the chosen GP. - */ - if (max_short_addr != 0) - { - if (max_short_addr - min_short_addr >= 0x400000) - { - error("short data segment overflowed (0x%lx >= 0x400000)", - (unsigned long)(max_short_addr - min_short_addr)); - return 0; - } - else if (((gp > min_short_addr) && (gp - min_short_addr > 0x200000)) || - ((gp < max_short_addr) && (max_short_addr - gp >= 0x200000))) - { - error("GP does not cover short data segment"); - return 0; - } - } - ifile->gp = gp; - ifile->text = text; - ifile->data = data; - ifile->bss = bss; - return 1; -} - -/* Targets can be unaligned, use memcpy instead of assignment */ -#define COPY_64LSB(loc, v) \ - do { \ - Elf64_Xword reloc = (v); \ - memcpy((void *)(loc), &reloc, 8); \ - } while(0) -#define COPY_32LSB(loc, v) \ - do { \ - Elf32_Xword reloc = (v); \ - memcpy((void *)(loc), &reloc, 4); \ - if ((v) != reloc) \ - ret = obj_reloc_overflow; \ - } while(0) - -enum obj_reloc -arch_apply_relocation(struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf64_Rela *rel, - Elf64_Addr v) -{ - ia64_file_t *ifile = (ia64_file_t *) f; - ia64_symbol_t *isym = (ia64_symbol_t *) sym; - - Elf64_Addr loc = (Elf64_Addr)(targsec->contents + rel->r_offset); - Elf64_Addr dot = (targsec->header.sh_addr + rel->r_offset) & ~0x03; - - Elf64_Addr got = ifile->got->header.sh_addr; - Elf64_Addr gp = ifile->gp; - - Elf64_Addr *bundle = (Elf64_Addr *)(loc & ~0x03); - Elf64_Xword slot = loc & 0x03; - - Elf64_Xword r_info = ELF64_R_TYPE(rel->r_info); - - enum obj_reloc ret = obj_reloc_ok; - - /* We cannot load modules compiled with -mconstant-gp */ -#ifndef EF_IA_64_CONS_GP -#define EF_IA_64_CONS_GP 0x00000040 -#endif -#ifndef EF_IA_64_NOFUNCDESC_CONS_GP -#define EF_IA_64_NOFUNCDESC_CONS_GP 0x00000080 -#endif - if (f->header.e_flags & (EF_IA_64_CONS_GP | EF_IA_64_NOFUNCDESC_CONS_GP)) - return obj_reloc_constant_gp; - - switch (r_info) - { - case R_IA64_NONE : /* none */ - case R_IA64_LDXMOV : /* Use of LTOFF22X. */ - break; - - case R_IA64_IMM14 : /* symbol + addend, add imm14 */ - ret = obj_ia64_ins_imm14(v, bundle, slot); - break; - - case R_IA64_IMM22 : /* symbol + addend, add imm22 */ - ret = obj_ia64_ins_imm22(v, bundle, slot); - break; - - case R_IA64_IMM64 : /* symbol + addend, movl imm64 */ - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_DIR32LSB : /* symbol + addend, data4 LSB */ - COPY_32LSB(loc, v); - break; - - case R_IA64_DIR64LSB : /* symbol + addend, data8 LSB */ - COPY_64LSB(loc, v); - break; - - case R_IA64_GPREL22 : /* @gprel(sym + add), add imm22 */ - v -= gp; - ret = obj_ia64_ins_imm22(v, bundle, slot); - break; - - case R_IA64_GPREL64I : /* @gprel(sym + add), mov imm64 */ - v -= gp; - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_GPREL32LSB : /* @gprel(sym + add), data4 LSB */ - COPY_32LSB(loc, v-gp); - break; - - case R_IA64_GPREL64LSB : /* @gprel(sym + add), data8 LSB */ - COPY_64LSB(loc, v-gp); - break; - - case R_IA64_LTOFF22 : /* @ltoff(sym + add), add imm22 */ - case R_IA64_LTOFF22X : /* LTOFF22, relaxable. */ - case R_IA64_LTOFF64I : /* @ltoff(sym + add), mov imm64 */ - { - ia64_got_t *ge; - - assert(isym != NULL); - for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; ) - ge = ge->next; - assert(ge != NULL); - if (!ge->reloc_done) - { - ge->reloc_done = TRUE; - *(Elf64_Addr *)(ifile->got->contents + ge->offset) = v; - } - v = got + ge->offset - gp; - if (r_info == R_IA64_LTOFF64I) - ret = obj_ia64_ins_imm64(v, bundle, slot); - else - ret = obj_ia64_ins_imm22(v, bundle, slot); - } - break; - - case R_IA64_PLTOFF22 : /* @pltoff(sym + add), add imm22 */ - case R_IA64_PLTOFF64I : /* @pltoff(sym + add), mov imm64 */ - case R_IA64_PLTOFF64LSB : /* @pltoff(sym + add), data8 LSB */ - { - ia64_plt_t *pe; - - assert(isym != NULL); - for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend; ) - pe = pe->next; - assert(pe != NULL); - if (!pe->reloc_done) - { - pe->reloc_done = TRUE; - ret = obj_ia64_generate_plt(v, gp, ifile, isym, pe); - } - v = ifile->pltt->header.sh_addr + pe->text_offset - gp; - switch (r_info) - { - case R_IA64_PLTOFF22 : - ret = obj_ia64_ins_imm22(v, bundle, slot); - break; - - case R_IA64_PLTOFF64I : - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_PLTOFF64LSB : - COPY_64LSB(loc, v); - break; - } - } - break; - - case R_IA64_FPTR64I : /* @fptr(sym + add), mov imm64 */ - case R_IA64_FPTR32LSB : /* @fptr(sym + add), data4 LSB */ - case R_IA64_FPTR64LSB : /* @fptr(sym + add), data8 LSB */ - assert(isym != NULL); - if (isym->root.secidx <= SHN_HIRESERVE) - { - assert(isym->opdent != NULL); - if (!isym->opdent->reloc_done) - { - isym->opdent->reloc_done = TRUE; - *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset) = v; - *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset + 8) = gp; - } - v = ifile->opd->header.sh_addr + isym->opdent->offset; - } - switch (r_info) - { - case R_IA64_FPTR64I : - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_FPTR32LSB : - COPY_32LSB(loc, v); - break; - - case R_IA64_FPTR64LSB : /* @fptr(sym + add), data8 LSB */ - /* Target can be unaligned */ - COPY_64LSB(loc, v); - break; - } - break; - - case R_IA64_PCREL21B : /* @pcrel(sym + add), ptb, call */ - case R_IA64_PCREL21M : /* @pcrel(sym + add), chk.s */ - case R_IA64_PCREL21F : /* @pcrel(sym + add), fchkf */ - assert(isym != NULL); - if ((isym->root.secidx > SHN_HIRESERVE) || - ((Elf64_Sxword) (v - dot) > 16777215) || - ((Elf64_Sxword) (v - dot) < -16777216)) - { - ia64_plt_t *pe; - - for (pe = isym->pltent; pe != NULL && pe->addend != rel->r_addend; ) - pe = pe->next; - assert(pe != NULL); - if (!pe->reloc_done) - { - pe->reloc_done = TRUE; - ret = obj_ia64_generate_plt(v, gp, ifile, isym, pe); - } - v = ifile->pltt->header.sh_addr + pe->text_offset; - } - v -= dot; - switch (r_info) - { - case R_IA64_PCREL21B : - ret = obj_ia64_ins_pcrel21b(v, bundle, slot); - break; - - case R_IA64_PCREL21M : - ret = obj_ia64_ins_pcrel21m(v, bundle, slot); - break; - - case R_IA64_PCREL21F : - ret = obj_ia64_ins_pcrel21f(v, bundle, slot); - break; - } - break; - - case R_IA64_PCREL32LSB : /* @pcrel(sym + add), data4 LSB */ - COPY_32LSB(loc, v-dot); - break; - - case R_IA64_PCREL64LSB : /* @pcrel(sym + add), data8 LSB */ - COPY_64LSB(loc, v-dot); - break; - - case R_IA64_LTOFF_FPTR22 : /* @ltoff(@fptr(s+a)), imm22 */ - case R_IA64_LTOFF_FPTR64I : /* @ltoff(@fptr(s+a)), imm64 */ - case R_IA64_LTOFF_FPTR32LSB : /* @ltoff(@fptr(s+a)), data4 */ - case R_IA64_LTOFF_FPTR64LSB : /* @ltoff(@fptr(s+a)), data8 */ - { - ia64_got_t *ge; - - assert(isym != NULL); - if (isym->root.secidx <= SHN_HIRESERVE) - { - assert(isym->opdent != NULL); - if (!isym->opdent->reloc_done) - { - isym->opdent->reloc_done = TRUE; - *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset) = v; - *(Elf64_Addr *)(ifile->opd->contents + isym->opdent->offset + 8) = gp; - } - v = ifile->opd->header.sh_addr + isym->opdent->offset; - } - for (ge = isym->gotent; ge != NULL && ge->addend != rel->r_addend; ) - ge = ge->next; - assert(ge != NULL); - if (!ge->reloc_done) - { - ge->reloc_done = TRUE; - *(Elf64_Addr *)(ifile->got->contents + ge->offset) = v; - } - v = got + ge->offset - gp; - switch (r_info) - { - case R_IA64_LTOFF_FPTR22 : - ret = obj_ia64_ins_imm22(v, bundle, slot); - break; - - case R_IA64_LTOFF_FPTR64I : - ret = obj_ia64_ins_imm64(v, bundle, slot); - break; - - case R_IA64_LTOFF_FPTR32LSB : - COPY_32LSB(loc, v); - break; - - case R_IA64_LTOFF_FPTR64LSB : - COPY_64LSB(loc, v); - break; - } - } - break; - - case R_IA64_SEGREL32LSB : /* @segrel(sym + add), data4 LSB */ - case R_IA64_SEGREL64LSB : /* @segrel(sym + add), data8 LSB */ - if (targsec->header.sh_type & SHT_NOBITS) - v = ifile->bss - v; - else if (targsec->header.sh_flags & SHF_EXECINSTR) - v = ifile->text - v; - else - v = ifile->data - v; - if (r_info == R_IA64_SEGREL32LSB) - COPY_32LSB(loc, v); - else - COPY_64LSB(loc, v); - break; - - case R_IA64_SECREL32LSB : /* @secrel(sym + add), data4 LSB */ - COPY_32LSB(loc, targsec->header.sh_addr - v); - break; - - case R_IA64_SECREL64LSB : /* @secrel(sym + add), data8 LSB */ - COPY_64LSB(loc, targsec->header.sh_addr - v); - break; - - /* - * We don't handle the big-endian relocates - * - * R_IA64_DIR32MSB symbol + addend, data4 MSB - * R_IA64_DIR64MSB symbol + addend, data8 MSB - * R_IA64_GPREL32MSB @gprel(sym + add), data4 MSB - * R_IA64_GPREL64MSB @gprel(sym + add), data8 MSB - * R_IA64_PLTOFF64MSB @pltoff(sym + add), data8 MSB - * R_IA64_FPTR32MSB @fptr(sym + add), data4 MSB - * R_IA64_FPTR64MSB @fptr(sym + add), data8 MSB - * R_IA64_PCREL32MSB @pcrel(sym + add), data4 MSB - * R_IA64_PCREL64MSB @pcrel(sym + add), data8 MSB - * R_IA64_SEGREL32MSB @segrel(sym + add), data4 MSB - * R_IA64_SEGREL64MSB @segrel(sym + add), data8 MSB - * R_IA64_SECREL32MSB @secrel(sym + add), data4 MSB - * R_IA64_SECREL64MSB @secrel(sym + add), data8 MSB - * R_IA64_REL32MSB data 4 + REL - * R_IA64_REL64MSB data 8 + REL - * R_IA64_LTV32MSB symbol + addend, data4 MSB - * R_IA64_LTV64MSB symbol + addend, data8 MSB - * R_IA64_IPLTMSB dynamic reloc, imported PLT, MSB - */ - default: - case R_IA64_REL32LSB : /* data 4 + REL */ - case R_IA64_REL64LSB : /* data 8 + REL */ - case R_IA64_LTV32LSB : /* symbol + addend, data4 LSB */ - case R_IA64_LTV64LSB : /* symbol + addend, data8 LSB */ - case R_IA64_IPLTLSB : /* dynamic reloc, imported PLT, LSB */ - ret = obj_reloc_unhandled; - break; - } - return ret; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - ia64_file_t *ifile = (ia64_file_t *)f; - Elf64_Addr *opd = (Elf64_Addr *)(ifile->opd->contents); - - if ((opd[0] = mod->init) != 0) - { - opd[1] = ifile->gp; - mod->init = ifile->opd->header.sh_addr; - } - - if ((opd[2] = mod->cleanup) != 0) - { - opd[3] = ifile->gp; - mod->cleanup = ifile->opd->header.sh_addr + 16; - } - - return 1; -} - -int -arch_archdata (struct obj_file *f, struct obj_section *archdata_sec) -{ - ia64_file_t *ifile = (ia64_file_t *)f; - struct archdata { - unsigned tgt_long unw_table; - unsigned tgt_long segment_base; - unsigned tgt_long unw_start; - unsigned tgt_long unw_end; - unsigned tgt_long gp; - } *ad; - int i; - struct obj_section *sec; - - free(archdata_sec->contents); - archdata_sec->contents = xmalloc(sizeof(struct archdata)); - memset(archdata_sec->contents, 0, sizeof(struct archdata)); - archdata_sec->header.sh_size = sizeof(struct archdata); - - ad = (struct archdata *)(archdata_sec->contents); - ad->gp = ifile->gp; - ad->unw_start = 0; - ad->unw_end = 0; - ad->unw_table = 0; - ad->segment_base = f->sections[1]->header.sh_addr; - for (i = 0; i < f->header.e_shnum; ++i) - { - sec = f->sections[i]; - if (sec->header.sh_type == SHT_IA_64_UNWIND) - { - ad->unw_start = sec->header.sh_addr; - ad->unw_end = sec->header.sh_addr + sec->header.sh_size; - break; - } - } - - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c b/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c deleted file mode 100644 index 8385fb892..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_kallsyms.c +++ /dev/null @@ -1,292 +0,0 @@ -/* Build a section containing all non-stack symbols. - Copyright 2000 Keith Owens - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include - -#include "obj.h" -#include "kallsyms.h" -#include "util.h" - -/*======================================================================*/ - -#define EXPAND_BY 4096 /* Arbitrary */ - -/* Append a string to the big list of strings */ - -static void -append_string (const char *s, char **strings, - ElfW(Word) *strings_size, ElfW(Word) *strings_left) -{ - int l = strlen(s) + 1; - while (l > *strings_left) { - *strings = xrealloc(*strings, *strings_size += EXPAND_BY); - *strings_left += EXPAND_BY; - } - memcpy((char *)*strings+*strings_size-*strings_left, s, l); - *strings_left -= l; -} - - -/* Append a symbol to the big list of symbols */ - -static void -append_symbol (const struct kallsyms_symbol *s, - struct kallsyms_symbol **symbols, - ElfW(Word) *symbols_size, ElfW(Word) *symbols_left) -{ - int l = sizeof(*s); - while (l > *symbols_left) { - *symbols = xrealloc(*symbols, *symbols_size += EXPAND_BY); - *symbols_left += EXPAND_BY; - } - memcpy((char *)*symbols+*symbols_size-*symbols_left, s, l); - *symbols_left -= l; -} - -/* qsort compare routine to sort symbols */ - -static const char *sym_strings; - -static int -symbol_compare (const void *a, const void *b) -{ - struct kallsyms_symbol *c = (struct kallsyms_symbol *) a; - struct kallsyms_symbol *d = (struct kallsyms_symbol *) b; - - if (c->symbol_addr > d->symbol_addr) - return(1); - if (c->symbol_addr < d->symbol_addr) - return(-1); - return(strcmp(sym_strings+c->name_off, sym_strings+d->name_off)); -} - - -/* Extract all symbols from the input obj_file, ignore ones that are - * no use for debugging, build an output obj_file containing only the - * kallsyms section. - * - * The kallsyms section is a bit unusual. It deliberately has no - * relocatable data, all "pointers" are represented as byte offsets - * into the the section. This means it can be stored anywhere without - * relocation problems. In particular it can be stored within a kernel - * image, it can be stored separately from the kernel image, it can be - * appended to a module just before loading, it can be stored in a - * separate area etc. - * - * Format of the kallsyms section. - * - * Header: - * Size of header. - * Total size of kallsyms data, including strings. - * Number of loaded sections. - * Offset to first section entry from start of header. - * Size of each section entry, excluding the name string. - * Number of symbols. - * Offset to first symbol entry from start of header. - * Size of each symbol entry, excluding the name string. - * - * Section entry - one per loaded section. - * Start of section[1]. - * Size of section. - * Offset to name of section, from start of strings. - * Section flags. - * - * Symbol entry - one per symbol in the input file[2]. - * Offset of section that owns this symbol, from start of section data. - * Address of symbol within the real section[1]. - * Offset to name of symbol, from start of strings. - * - * Notes: [1] This is an exception to the "represent pointers as - * offsets" rule, it is a value, not an offset. The start - * address of a section or a symbol is extracted from the - * obj_file data which may contain absolute or relocatable - * addresses. If the addresses are relocatable then the - * caller must adjust the section and/or symbol entries in - * kallsyms after relocation. - * [2] Only symbols that fall within loaded sections are stored. - */ - -int -obj_kallsyms (struct obj_file *fin, struct obj_file **fout_result) -{ - struct obj_file *fout; - int i, loaded = 0, *fin_to_allsym_map; - struct obj_section *isec, *osec; - struct kallsyms_header *a_hdr; - struct kallsyms_section *a_sec; - ElfW(Off) sec_off; - struct kallsyms_symbol *symbols = NULL, a_sym; - ElfW(Word) symbols_size = 0, symbols_left = 0; - char *strings = NULL, *p; - ElfW(Word) strings_size = 0, strings_left = 0; - ElfW(Off) file_offset; - static char strtab[] = "\000" KALLSYMS_SEC_NAME; - - /* Create the kallsyms section. */ - fout = arch_new_file(); - memset(fout, 0, sizeof(*fout)); - fout->symbol_cmp = strcmp; - fout->symbol_hash = obj_elf_hash; - fout->load_order_search_start = &fout->load_order; - - /* Copy file characteristics from input file and modify to suit */ - memcpy(&fout->header, &fin->header, sizeof(fout->header)); - fout->header.e_type = ET_REL; /* Output is relocatable */ - fout->header.e_entry = 0; /* No entry point */ - fout->header.e_phoff = 0; /* No program header */ - file_offset = sizeof(fout->header); /* Step over Elf header */ - fout->header.e_shoff = file_offset; /* Section headers next */ - fout->header.e_phentsize = 0; /* No program header */ - fout->header.e_phnum = 0; /* No program header */ - fout->header.e_shnum = KALLSYMS_IDX+1; /* Initial, strtab, kallsyms */ - fout->header.e_shstrndx = KALLSYMS_IDX-1; /* strtab */ - file_offset += fout->header.e_shentsize * fout->header.e_shnum; - - /* Populate the section data for kallsyms itself */ - fout->sections = xmalloc(sizeof(*(fout->sections))*fout->header.e_shnum); - memset(fout->sections, 0, sizeof(*(fout->sections))*fout->header.e_shnum); - - fout->sections[0] = osec = arch_new_section(); - memset(osec, 0, sizeof(*osec)); - osec->header.sh_type = SHT_NULL; - osec->header.sh_link = SHN_UNDEF; - - fout->sections[KALLSYMS_IDX-1] = osec = arch_new_section(); - memset(osec, 0, sizeof(*osec)); - osec->name = ".strtab"; - osec->header.sh_type = SHT_STRTAB; - osec->header.sh_link = SHN_UNDEF; - osec->header.sh_offset = file_offset; - osec->header.sh_size = sizeof(strtab); - osec->contents = xmalloc(sizeof(strtab)); - memcpy(osec->contents, strtab, sizeof(strtab)); - file_offset += osec->header.sh_size; - - fout->sections[KALLSYMS_IDX] = osec = arch_new_section(); - memset(osec, 0, sizeof(*osec)); - osec->name = KALLSYMS_SEC_NAME; - osec->header.sh_name = 1; /* Offset in strtab */ - osec->header.sh_type = SHT_PROGBITS; /* Load it */ - osec->header.sh_flags = SHF_ALLOC; /* Read only data */ - osec->header.sh_link = SHN_UNDEF; - osec->header.sh_addralign = sizeof(ElfW(Word)); - file_offset = (file_offset + osec->header.sh_addralign - 1) - & -(osec->header.sh_addralign); - osec->header.sh_offset = file_offset; - - /* How many loaded sections are there? */ - for (i = 0; i < fin->header.e_shnum; ++i) { - if (fin->sections[i]->header.sh_flags & SHF_ALLOC) - ++loaded; - } - - /* Initial contents, header + one entry per input section. No strings. */ - osec->header.sh_size = sizeof(*a_hdr) + loaded*sizeof(*a_sec); - a_hdr = (struct kallsyms_header *) osec->contents = - xmalloc(osec->header.sh_size); - memset(osec->contents, 0, osec->header.sh_size); - a_hdr->size = sizeof(*a_hdr); - a_hdr->sections = loaded; - a_hdr->section_off = a_hdr->size; - a_hdr->section_size = sizeof(*a_sec); - a_hdr->symbol_off = osec->header.sh_size; - a_hdr->symbol_size = sizeof(a_sym); - a_hdr->start = (ElfW(Addr))(~0); - - /* Map input section numbers to kallsyms section offsets. */ - sec_off = 0; /* Offset to first kallsyms section entry */ - fin_to_allsym_map = xmalloc(sizeof(*fin_to_allsym_map)*fin->header.e_shnum); - for (i = 0; i < fin->header.e_shnum; ++i) { - isec = fin->sections[i]; - if (isec->header.sh_flags & SHF_ALLOC) { - fin_to_allsym_map[isec->idx] = sec_off; - sec_off += a_hdr->section_size; - } - else - fin_to_allsym_map[isec->idx] = -1; /* Ignore this section */ - } - - /* Copy the loaded section data. */ - a_sec = (struct kallsyms_section *) ((char *) a_hdr + a_hdr->section_off); - for (i = 0; i < fin->header.e_shnum; ++i) { - isec = fin->sections[i]; - if (!(isec->header.sh_flags & SHF_ALLOC)) - continue; - a_sec->start = isec->header.sh_addr; - a_sec->size = isec->header.sh_size; - a_sec->flags = isec->header.sh_flags; - a_sec->name_off = strings_size - strings_left; - append_string(isec->name, &strings, &strings_size, &strings_left); - if (a_sec->start < a_hdr->start) - a_hdr->start = a_sec->start; - if (a_sec->start+a_sec->size > a_hdr->end) - a_hdr->end = a_sec->start+a_sec->size; - ++a_sec; - } - - /* Build the kallsyms symbol table from the symbol hashes. */ - for (i = 0; i < HASH_BUCKETS; ++i) { - struct obj_symbol *sym = fin->symtab[i]; - for (sym = fin->symtab[i]; sym ; sym = sym->next) { - if (!sym || sym->secidx >= fin->header.e_shnum) - continue; - if ((a_sym.section_off = fin_to_allsym_map[sym->secidx]) == -1) - continue; - if (strcmp(sym->name, "gcc2_compiled.") == 0 || - strncmp(sym->name, "__insmod_", 9) == 0) - continue; - a_sym.symbol_addr = sym->value; - if (fin->header.e_type == ET_REL) - a_sym.symbol_addr += fin->sections[sym->secidx]->header.sh_addr; - a_sym.name_off = strings_size - strings_left; - append_symbol(&a_sym, &symbols, &symbols_size, &symbols_left); - append_string(sym->name, &strings, &strings_size, &strings_left); - ++a_hdr->symbols; - } - } - free(fin_to_allsym_map); - - /* Sort the symbols into ascending order by address and name */ - sym_strings = strings; /* For symbol_compare */ - qsort((char *) symbols, (unsigned) a_hdr->symbols, - sizeof(* symbols), symbol_compare); - sym_strings = NULL; - - /* Put the lot together */ - osec->header.sh_size = a_hdr->total_size = - a_hdr->symbol_off + - a_hdr->symbols*a_hdr->symbol_size + - strings_size - strings_left; - a_hdr = (struct kallsyms_header *) osec->contents = - xrealloc(a_hdr, a_hdr->total_size); - p = (char *)a_hdr + a_hdr->symbol_off; - memcpy(p, symbols, a_hdr->symbols*a_hdr->symbol_size); - free(symbols); - p += a_hdr->symbols*a_hdr->symbol_size; - a_hdr->string_off = p - (char *)a_hdr; - memcpy(p, strings, strings_size - strings_left); - free(strings); - - *fout_result = fout; - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_load.c b/mdk-stage1/insmod-modutils/obj/obj_load.c deleted file mode 100644 index 4db20a998..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_load.c +++ /dev/null @@ -1,354 +0,0 @@ -/* Elf file reader. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - obj_free() added by Björn Ekwall March 1999 - Support for kallsyms Keith Owens April 2000 - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include -#include - -#include "obj.h" -#include "util.h" - -/*======================================================================*/ - -struct obj_file * -obj_load (int fp, Elf32_Half e_type, const char *filename) -{ - struct obj_file *f; - ElfW(Shdr) *section_headers; - int shnum, i; - char *shstrtab; - - /* Read the file header. */ - - f = arch_new_file(); - memset(f, 0, sizeof(*f)); - f->symbol_cmp = strcmp; - f->symbol_hash = obj_elf_hash; - f->load_order_search_start = &f->load_order; - - gzf_lseek(fp, 0, SEEK_SET); - if (gzf_read(fp, &f->header, sizeof(f->header)) != sizeof(f->header)) - { - error("error reading ELF header %s: %m", filename); - return NULL; - } - - if (f->header.e_ident[EI_MAG0] != ELFMAG0 - || f->header.e_ident[EI_MAG1] != ELFMAG1 - || f->header.e_ident[EI_MAG2] != ELFMAG2 - || f->header.e_ident[EI_MAG3] != ELFMAG3) - { - error("%s is not an ELF file", filename); - return NULL; - } - if (f->header.e_ident[EI_CLASS] != ELFCLASSM - || f->header.e_ident[EI_DATA] != ELFDATAM - || f->header.e_ident[EI_VERSION] != EV_CURRENT - || !MATCH_MACHINE(f->header.e_machine)) - { - error("ELF file %s not for this architecture", filename); - return NULL; - } - if (f->header.e_type != e_type && e_type != ET_NONE) - { - switch (e_type) { - case ET_REL: - error("ELF file %s not a relocatable object", filename); - break; - case ET_EXEC: - error("ELF file %s not an executable object", filename); - break; - default: - error("ELF file %s has wrong type, expecting %d got %d", - filename, e_type, f->header.e_type); - break; - } - return NULL; - } - - /* Read the section headers. */ - - if (f->header.e_shentsize != sizeof(ElfW(Shdr))) - { - error("section header size mismatch %s: %lu != %lu", - filename, - (unsigned long)f->header.e_shentsize, - (unsigned long)sizeof(ElfW(Shdr))); - return NULL; - } - - shnum = f->header.e_shnum; - f->sections = xmalloc(sizeof(struct obj_section *) * shnum); - memset(f->sections, 0, sizeof(struct obj_section *) * shnum); - - section_headers = alloca(sizeof(ElfW(Shdr)) * shnum); - gzf_lseek(fp, f->header.e_shoff, SEEK_SET); - if (gzf_read(fp, section_headers, sizeof(ElfW(Shdr))*shnum) != sizeof(ElfW(Shdr))*shnum) - { - error("error reading ELF section headers %s: %m", filename); - return NULL; - } - - /* Read the section data. */ - - for (i = 0; i < shnum; ++i) - { - struct obj_section *sec; - - f->sections[i] = sec = arch_new_section(); - memset(sec, 0, sizeof(*sec)); - - sec->header = section_headers[i]; - sec->idx = i; - - switch (sec->header.sh_type) - { - case SHT_NULL: - case SHT_NOTE: - case SHT_NOBITS: - /* ignore */ - break; - - case SHT_PROGBITS: - case SHT_SYMTAB: - case SHT_STRTAB: - case SHT_RELM: - if (sec->header.sh_size > 0) - { - sec->contents = xmalloc(sec->header.sh_size); - gzf_lseek(fp, sec->header.sh_offset, SEEK_SET); - if (gzf_read(fp, sec->contents, sec->header.sh_size) != sec->header.sh_size) - { - error("error reading ELF section data %s: %m", filename); - return NULL; - } - } - else - sec->contents = NULL; - break; - -#if SHT_RELM == SHT_REL - case SHT_RELA: - if (sec->header.sh_size) { - error("RELA relocations not supported on this architecture %s", filename); - return NULL; - } - break; -#else - case SHT_REL: - if (sec->header.sh_size) { - error("REL relocations not supported on this architecture %s", filename); - return NULL; - } - break; -#endif - - default: - if (sec->header.sh_type >= SHT_LOPROC) - { - if (arch_load_proc_section(sec, fp) < 0) - return NULL; - break; - } - - error("can't handle sections of type %ld %s", - (long)sec->header.sh_type, filename); - return NULL; - } - } - - /* Do what sort of interpretation as needed by each section. */ - - shstrtab = f->sections[f->header.e_shstrndx]->contents; - - for (i = 0; i < shnum; ++i) - { - struct obj_section *sec = f->sections[i]; - sec->name = shstrtab + sec->header.sh_name; - } - - for (i = 0; i < shnum; ++i) - { - struct obj_section *sec = f->sections[i]; - - /* .modinfo and .modstring should be contents only but gcc has no - * attribute for that. The kernel may have marked these sections as - * ALLOC, ignore the allocate bit. - */ - if (strcmp(sec->name, ".modinfo") == 0 || - strcmp(sec->name, ".modstring") == 0) - sec->header.sh_flags &= ~SHF_ALLOC; - - if (sec->header.sh_flags & SHF_ALLOC) - obj_insert_section_load_order(f, sec); - - switch (sec->header.sh_type) - { - case SHT_SYMTAB: - { - unsigned long nsym, j; - char *strtab; - ElfW(Sym) *sym; - - if (sec->header.sh_entsize != sizeof(ElfW(Sym))) - { - error("symbol size mismatch %s: %lu != %lu", - filename, - (unsigned long)sec->header.sh_entsize, - (unsigned long)sizeof(ElfW(Sym))); - return NULL; - } - - nsym = sec->header.sh_size / sizeof(ElfW(Sym)); - strtab = f->sections[sec->header.sh_link]->contents; - sym = (ElfW(Sym) *) sec->contents; - - /* Allocate space for a table of local symbols. */ - j = f->local_symtab_size = sec->header.sh_info; - f->local_symtab = xmalloc(j *= sizeof(struct obj_symbol *)); - memset(f->local_symtab, 0, j); - - /* Insert all symbols into the hash table. */ - for (j = 1, ++sym; j < nsym; ++j, ++sym) - { - const char *name; - if (sym->st_name) - name = strtab+sym->st_name; - else - name = f->sections[sym->st_shndx]->name; - - obj_add_symbol(f, name, j, sym->st_info, sym->st_shndx, - sym->st_value, sym->st_size); - - } - } - break; - } - } - - /* second pass to add relocation data to symbols */ - for (i = 0; i < shnum; ++i) - { - struct obj_section *sec = f->sections[i]; - switch (sec->header.sh_type) - { - case SHT_RELM: - { - unsigned long nrel, j; - ElfW(RelM) *rel; - struct obj_section *symtab; - char *strtab; - if (sec->header.sh_entsize != sizeof(ElfW(RelM))) - { - error("relocation entry size mismatch %s: %lu != %lu", - filename, - (unsigned long)sec->header.sh_entsize, - (unsigned long)sizeof(ElfW(RelM))); - return NULL; - } - - nrel = sec->header.sh_size / sizeof(ElfW(RelM)); - rel = (ElfW(RelM) *) sec->contents; - symtab = f->sections[sec->header.sh_link]; - strtab = f->sections[symtab->header.sh_link]->contents; - - /* Save the relocate type in each symbol entry. */ - for (j = 0; j < nrel; ++j, ++rel) - { - ElfW(Sym) *extsym; - struct obj_symbol *intsym; - unsigned long symndx; - symndx = ELFW(R_SYM)(rel->r_info); - if (symndx) - { - extsym = ((ElfW(Sym) *) symtab->contents) + symndx; - if (ELFW(ST_BIND)(extsym->st_info) == STB_LOCAL) - { - /* Local symbols we look up in the local table to be sure - we get the one that is really intended. */ - intsym = f->local_symtab[symndx]; - } - else - { - /* Others we look up in the hash table. */ - const char *name; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = obj_find_symbol(f, name); - } - intsym->r_type = ELFW(R_TYPE)(rel->r_info); - } - } - } - break; - } - } - - f->filename = xstrdup(filename); - - return f; -} - -void obj_free(struct obj_file *f) -{ - struct obj_section *sec; - struct obj_symbol *sym; - struct obj_symbol *next; - int i; - int n; - - if (f->sections) { - n = f->header.e_shnum; - for (i = 0; i < n; ++i) { - if ((sec = f->sections[i]) != NULL) { - if (sec->contents) - free(sec->contents); - free(sec); - } - } - free(f->sections); - } - - for (i = 0; i < HASH_BUCKETS; ++i) { - for (sym = f->symtab[i]; sym; sym = next) { - next = sym->next; - free(sym); - } - } - - if (f->local_symtab) - free(f->local_symtab); - - if (f->filename) - free((char *)(f->filename)); - - if (f->persist) - free((char *)(f->persist)); - - free(f); -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_m68k.c b/mdk-stage1/insmod-modutils/obj/obj_m68k.c deleted file mode 100644 index cb485aed7..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_m68k.c +++ /dev/null @@ -1,147 +0,0 @@ -/* m68k specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include -#include - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - return xmalloc(sizeof(struct obj_file)); -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - return xmalloc(sizeof(struct obj_symbol)); -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *ef, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - char *loc = targsec->contents + rel->r_offset; - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_68K_NONE: - break; - - case R_68K_8: - if (v > 0xff) - ret = obj_reloc_overflow; - *(char *)loc = v; - break; - case R_68K_16: - if (v > 0xffff) - ret = obj_reloc_overflow; - *(short *)loc = v; - break; - case R_68K_32: - *(int *)loc = v; - break; - - case R_68K_PC8: - v -= dot; - if ((Elf32_Sword)v > 0x7f || (Elf32_Sword)v < -(Elf32_Sword)0x80) - ret = obj_reloc_overflow; - *(char *)loc = v; - break; - case R_68K_PC16: - v -= dot; - if ((Elf32_Sword)v > 0x7fff || (Elf32_Sword)v < -(Elf32_Sword)0x8000) - ret = obj_reloc_overflow; - *(short *)loc = v; - break; - case R_68K_PC32: - *(int *)loc = v - dot; - break; - - case R_68K_RELATIVE: - *(int *)loc += ef->baseaddr; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *ef) -{ - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_mips.c b/mdk-stage1/insmod-modutils/obj/obj_mips.c deleted file mode 100644 index c2315b659..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_mips.c +++ /dev/null @@ -1,238 +0,0 @@ -/* MIPS specific support for Elf loading and relocation. - Copyright 1997, 1998 Linux International. - Contributed by Ralf Baechle - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include - -#include -#include -#include - - -/*======================================================================*/ - -struct mips_hi16 -{ - struct mips_hi16 *next; - Elf32_Addr *addr; - Elf32_Addr value; -}; - -struct mips_file -{ - struct obj_file root; - struct mips_hi16 *mips_hi16_list; -}; - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct mips_file *mf; - - mf = xmalloc(sizeof(*mf)); - mf->mips_hi16_list = NULL; - - return (struct obj_file *) mf; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - return xmalloc(sizeof(struct obj_symbol)); -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - switch (sec->header.sh_type) - { - case SHT_MIPS_DEBUG: - case SHT_MIPS_REGINFO: - /* Actually these two sections are as useless as something can be ... */ - sec->contents = NULL; - break; - - case SHT_MIPS_LIBLIST: - case SHT_MIPS_CONFLICT: - case SHT_MIPS_GPTAB: - case SHT_MIPS_UCODE: - case SHT_MIPS_OPTIONS: - case SHT_MIPS_DWARF: - case SHT_MIPS_EVENTS: - /* These shouldn't ever be in a module file. */ - error("Unhandled section header type: %08x", sec->header.sh_type); - - default: - /* We don't even know the type. This time it might as well be a - supernova. */ - error("Unknown section header type: %08x", sec->header.sh_type); - return -1; - } - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rel *rel, - Elf32_Addr v) -{ - struct mips_file *mf = (struct mips_file *)f; - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - enum obj_reloc ret = obj_reloc_ok; - - /* _gp_disp is a magic symbol for PIC which is not supported for - the kernel and loadable modules. */ - if (strcmp(sym->name, "_gp_disp") == 0) - ret = obj_reloc_unhandled; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_MIPS_NONE: - break; - - case R_MIPS_32: - *loc += v; - break; - - case R_MIPS_26: - if (v % 4) - ret = obj_reloc_dangerous; - if ((v & 0xf0000000) != ((dot + 4) & 0xf0000000)) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x03ffffff) | ((*loc + (v >> 2)) & 0x03ffffff); - break; - - case R_MIPS_HI16: - { - struct mips_hi16 *n; - - /* We cannot relocate this one now because we don't know the value - of the carry we need to add. Save the information, and let LO16 - do the actual relocation. */ - n = (struct mips_hi16 *) xmalloc (sizeof *n); - n->addr = loc; - n->value = v; - n->next = mf->mips_hi16_list; - mf->mips_hi16_list = n; - break; - } - - case R_MIPS_LO16: - { - unsigned long insnlo = *loc; - Elf32_Addr val, vallo; - - /* Sign extend the addend we extract from the lo insn. */ - vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000; - - if (mf->mips_hi16_list != NULL) - { - struct mips_hi16 *l; - - l = mf->mips_hi16_list; - while (l != NULL) - { - struct mips_hi16 *next; - unsigned long insn; - - /* The value for the HI16 had best be the same. */ - assert(v == l->value); - - /* Do the HI16 relocation. Note that we actually don't - need to know anything about the LO16 itself, except where - to find the low 16 bits of the addend needed by the LO16. */ - insn = *l->addr; - val = ((insn & 0xffff) << 16) + vallo; - val += v; - - /* Account for the sign extension that will happen in the - low bits. */ - val = ((val >> 16) + ((val & 0x8000) != 0)) & 0xffff; - - insn = (insn &~ 0xffff) | val; - *l->addr = insn; - - next = l->next; - free(l); - l = next; - } - - mf->mips_hi16_list = NULL; - } - - /* Ok, we're done with the HI16 relocs. Now deal with the LO16. */ - val = v + vallo; - insnlo = (insnlo & ~0xffff) | (val & 0xffff); - *loc = insnlo; - break; - } - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_ppc.c b/mdk-stage1/insmod-modutils/obj/obj_ppc.c deleted file mode 100644 index 89bb8e46b..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_ppc.c +++ /dev/null @@ -1,255 +0,0 @@ -/* PowerPC specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Adapted by Paul Mackerras from the - obj-sparc.c and obj-alpha.c files. - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include -#include -#include - - -/*======================================================================*/ - -/* - * Unfortunately, the bl (branch-and-link) instruction used for - * procedure calls on the PowerPC can only reach +/- 32MB from the - * current instruction. If the module is loaded far enough away from - * the main kernel text (or other modules) that this limit is - * exceeded, we have to redirect procedure calls via a procedure - * linkage table (PLT). Each entry in the PLT contains instructions - * to put the address of the procedure in a register and jump to it. - */ - -typedef unsigned int instruction; /* a powerpc instruction (4 bytes) */ - -struct ppc_plt_entry -{ - struct ppc_plt_entry *next; - ElfW(Addr) addend; - int offset; - int inited; -}; - -struct ppc_file -{ - struct obj_file file; - struct obj_section *plt; -}; - -struct ppc_symbol -{ - struct obj_symbol sym; - struct ppc_plt_entry *plt_entries; -}; - -struct obj_file * -arch_new_file (void) -{ - struct ppc_file *f; - - f = xmalloc(sizeof(struct ppc_file)); - f->plt = NULL; - return &f->file; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct ppc_symbol *p; - - p = xmalloc(sizeof(struct ppc_symbol)); - p->plt_entries = NULL; - return &p->sym; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *ef, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - struct ppc_file *pf = (struct ppc_file *) ef; - struct ppc_symbol *psym = (struct ppc_symbol *) sym; - struct ppc_plt_entry *pe; - instruction *ip; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_PPC_ADDR16_HA: - *(unsigned short *)loc = (v + 0x8000) >> 16; - break; - - case R_PPC_ADDR16_HI: - *(unsigned short *)loc = v >> 16; - break; - - case R_PPC_ADDR16_LO: - *(unsigned short *)loc = v; - break; - - case R_PPC_REL24: - /* find the plt entry and initialize it if necessary */ - assert(psym != NULL); - for (pe = psym->plt_entries; pe != NULL && pe->addend != rel->r_addend; ) - pe = pe->next; - assert(pe != NULL); - if (!pe->inited) - { - ip = (instruction *) (pf->plt->contents + pe->offset); - ip[0] = 0x3d600000 + ((v + 0x8000) >> 16); /* lis r11,sym@ha */ - ip[1] = 0x396b0000 + (v & 0xffff); /* addi r11,r11,sym@l */ - ip[2] = 0x7d6903a6; /* mtctr r11 */ - ip[3] = 0x4e800420; /* bctr */ - pe->inited = 1; - } - - v -= dot; - if ((int)v < -0x02000000 || (int)v >= 0x02000000) - { - /* go via the plt */ - v = pf->plt->header.sh_addr + pe->offset - dot; - } - if (v & 3) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x03fffffc) | (v & 0x03fffffc); - break; - - case R_PPC_REL32: - *loc = v - dot; - break; - - case R_PPC_ADDR32: - *loc = v; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct ppc_file *pf = (struct ppc_file *) f; - int i, offset; - struct obj_section *sec, *syms, *strs; - ElfW(Rela) *rel, *relend; - ElfW(Sym) *symtab, *extsym; - const char *strtab, *name; - struct ppc_symbol *intsym; - struct ppc_plt_entry *pe; - - offset = 0; - for (i = 0; i < f->header.e_shnum; ++i) - { - sec = f->sections[i]; - if (sec->header.sh_type != SHT_RELM) - continue; - syms = f->sections[sec->header.sh_link]; - strs = f->sections[syms->header.sh_link]; - - rel = (ElfW(RelM) *) sec->contents; - relend = rel + (sec->header.sh_size / sizeof(ElfW(RelM))); - symtab = (ElfW(Sym) *) syms->contents; - strtab = (const char *) strs->contents; - - for (; rel < relend; ++rel) - { - if (ELF32_R_TYPE(rel->r_info) != R_PPC_REL24) - continue; - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct ppc_symbol *) obj_find_symbol(f, name); - - for (pe = intsym->plt_entries; pe != NULL; pe = pe->next) - if (pe->addend == rel->r_addend) - break; - if (pe == NULL) - { - pe = xmalloc(sizeof(struct ppc_plt_entry)); - pe->next = intsym->plt_entries; - pe->addend = rel->r_addend; - pe->offset = offset; - pe->inited = 0; - intsym->plt_entries = pe; - offset += 16; - } - } - } - - pf->plt = obj_create_alloced_section(f, ".plt", 16, offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_reloc.c b/mdk-stage1/insmod-modutils/obj/obj_reloc.c deleted file mode 100644 index f5f2de90d..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_reloc.c +++ /dev/null @@ -1,435 +0,0 @@ -/* Elf relocation routines. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include - -#include -#include - -/*======================================================================*/ - -int -obj_string_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - const char *string) -{ - struct obj_string_patch_struct *p; - struct obj_section *strsec; - size_t len = strlen(string)+1; - char *loc; - - p = xmalloc(sizeof(*p)); - p->next = f->string_patches; - p->reloc_secidx = secidx; - p->reloc_offset = offset; - f->string_patches = p; - - strsec = obj_find_section(f, ".kstrtab"); - if (strsec == NULL) - { - strsec = obj_create_alloced_section(f, ".kstrtab", 1, len); - p->string_offset = 0; - loc = strsec->contents; - } - else - { - p->string_offset = strsec->header.sh_size; - loc = obj_extend_section(strsec, len); - } - memcpy(loc, string, len); - - return 1; -} - -int -obj_symbol_patch(struct obj_file *f, int secidx, ElfW(Addr) offset, - struct obj_symbol *sym) -{ - struct obj_symbol_patch_struct *p; - - p = xmalloc(sizeof(*p)); - p->next = f->symbol_patches; - p->reloc_secidx = secidx; - p->reloc_offset = offset; - p->sym = sym; - f->symbol_patches = p; - - return 1; -} - -int -obj_check_undefineds(struct obj_file *f, int quiet) -{ - unsigned long i; - int ret = 1; - - for (i = 0; i < HASH_BUCKETS; ++i) - { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym ; sym = sym->next) - if (sym->secidx == SHN_UNDEF) - { - if (ELFW(ST_BIND)(sym->info) == STB_WEAK) - { - sym->secidx = SHN_ABS; - sym->value = 0; - } - else if (sym->r_type) /* assumes R_arch_NONE is 0 on all arch */ - { - if (!quiet) - error("unresolved symbol %s", sym->name); - ret = 0; - } - } - } - - return ret; -} - -void -obj_clear_undefineds(struct obj_file *f) -{ - unsigned long i; - struct obj_symbol *sym; - for (i = 0; i < HASH_BUCKETS; ++i) - { - for (sym = f->symtab[i]; sym ; sym = sym->next) - if (sym->secidx == SHN_UNDEF) - { - sym->secidx = SHN_ABS; - sym->value = 0; - } - } -} - -void -obj_allocate_commons(struct obj_file *f) -{ - struct common_entry - { - struct common_entry *next; - struct obj_symbol *sym; - } *common_head = NULL; - - unsigned long i; - - for (i = 0; i < HASH_BUCKETS; ++i) - { - struct obj_symbol *sym; - for (sym = f->symtab[i]; sym ; sym = sym->next) - if (sym->secidx == SHN_COMMON) - { - /* Collect all COMMON symbols and sort them by size so as to - minimize space wasted by alignment requirements. */ - { - struct common_entry **p, *n; - for (p = &common_head; *p ; p = &(*p)->next) - if (sym->size <= (*p)->sym->size) - break; - - n = alloca(sizeof(*n)); - n->next = *p; - n->sym = sym; - *p = n; - } - } - } - - for (i = 1; i < f->local_symtab_size; ++i) - { - struct obj_symbol *sym = f->local_symtab[i]; - if (sym && sym->secidx == SHN_COMMON) - { - struct common_entry **p, *n; - for (p = &common_head; *p ; p = &(*p)->next) - if (sym == (*p)->sym) - break; - else if (sym->size < (*p)->sym->size) - { - n = alloca(sizeof(*n)); - n->next = *p; - n->sym = sym; - *p = n; - break; - } - } - } - - if (common_head) - { - /* Find the bss section. */ - for (i = 0; i < f->header.e_shnum; ++i) - if (f->sections[i]->header.sh_type == SHT_NOBITS) - break; - - /* If for some reason there hadn't been one, create one. */ - if (i == f->header.e_shnum) - { - struct obj_section *sec; - - f->sections = xrealloc(f->sections, (i+1) * sizeof(sec)); - f->sections[i] = sec = arch_new_section(); - f->header.e_shnum = i+1; - - memset(sec, 0, sizeof(*sec)); - sec->header.sh_type = SHT_PROGBITS; - sec->header.sh_flags = SHF_WRITE|SHF_ALLOC; - sec->name = ".bss"; - sec->idx = i; - } - - /* Allocate the COMMONS. */ - { - ElfW(Addr) bss_size = f->sections[i]->header.sh_size; - ElfW(Addr) max_align = f->sections[i]->header.sh_addralign; - struct common_entry *c; - - for (c = common_head; c ; c = c->next) - { - ElfW(Addr) align = c->sym->value; - - if (align > max_align) - max_align = align; - if (bss_size & (align - 1)) - bss_size = (bss_size | (align - 1)) + 1; - - c->sym->secidx = i; - c->sym->value = bss_size; - - bss_size += c->sym->size; - } - - f->sections[i]->header.sh_size = bss_size; - f->sections[i]->header.sh_addralign = max_align; - } - } - - /* For the sake of patch relocation and parameter initialization, - allocate zeroed data for NOBITS sections now. Note that after - this we cannot assume NOBITS are really empty. */ - for (i = 0; i < f->header.e_shnum; ++i) - { - struct obj_section *s = f->sections[i]; - if (s->header.sh_type == SHT_NOBITS) - { - if (s->header.sh_size) - s->contents = memset(xmalloc(s->header.sh_size), - 0, s->header.sh_size); - else - s->contents = NULL; - s->header.sh_type = SHT_PROGBITS; - } - } -} - -unsigned long -obj_load_size (struct obj_file *f) -{ - unsigned long dot = 0; - struct obj_section *sec; - - /* Finalize the positions of the sections relative to one another. */ - - for (sec = f->load_order; sec ; sec = sec->load_next) - { - ElfW(Addr) align; - - align = sec->header.sh_addralign; - if (align && (dot & (align - 1))) - dot = (dot | (align - 1)) + 1; - - sec->header.sh_addr = dot; - dot += sec->header.sh_size; - } - - return dot; -} - -int -obj_relocate (struct obj_file *f, ElfW(Addr) base) -{ - int i, n = f->header.e_shnum; - int ret = 1; - - /* Finalize the addresses of the sections. */ - - arch_finalize_section_address(f, base); - - /* And iterate over all of the relocations. */ - - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *targsec, *strsec; - ElfW(RelM) *rel, *relend; - ElfW(Sym) *symtab; - const char *strtab; - - relsec = f->sections[i]; - if (relsec->header.sh_type != SHT_RELM) - continue; - - symsec = f->sections[relsec->header.sh_link]; - targsec = f->sections[relsec->header.sh_info]; - strsec = f->sections[symsec->header.sh_link]; - - rel = (ElfW(RelM) *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(ElfW(RelM))); - symtab = (ElfW(Sym) *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - ElfW(Addr) value = 0; - struct obj_symbol *intsym = NULL; - unsigned long symndx; - ElfW(Sym) *extsym = 0; - const char *errmsg; - - /* Attempt to find a value to use for this relocation. */ - - symndx = ELFW(R_SYM)(rel->r_info); - if (symndx) - { - /* Note we've already checked for undefined symbols. */ - - extsym = &symtab[symndx]; - if (ELFW(ST_BIND)(extsym->st_info) == STB_LOCAL) - { - /* Local symbols we look up in the local table to be sure - we get the one that is really intended. */ - intsym = f->local_symtab[symndx]; - } - else - { - /* Others we look up in the hash table. */ - const char *name; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = obj_find_symbol(f, name); - } - - value = obj_symbol_final_value(f, intsym); - } - -#if SHT_RELM == SHT_RELA -#if defined(__alpha__) && defined(AXP_BROKEN_GAS) - /* Work around a nasty GAS bug, that is fixed as of 2.7.0.9. */ - if (!extsym || !extsym->st_name || - ELFW(ST_BIND)(extsym->st_info) != STB_LOCAL) -#endif - value += rel->r_addend; -#endif - - /* Do it! */ - switch (arch_apply_relocation(f,targsec,symsec,intsym,rel,value)) - { - case obj_reloc_ok: - break; - - case obj_reloc_overflow: - errmsg = "Relocation overflow"; - goto bad_reloc; - case obj_reloc_dangerous: - errmsg = "Dangerous relocation"; - goto bad_reloc; - case obj_reloc_unhandled: - errmsg = "Unhandled relocation"; - goto bad_reloc; - case obj_reloc_constant_gp: - errmsg = "Modules compiled with -mconstant-gp cannot be loaded"; - goto bad_reloc; - bad_reloc: - if (extsym) - { - error("%s of type %ld for %s", errmsg, - (long)ELFW(R_TYPE)(rel->r_info), - strtab + extsym->st_name); - } - else - { - error("%s of type %ld", errmsg, - (long)ELFW(R_TYPE)(rel->r_info)); - } - ret = 0; - break; - } - } - } - - /* Finally, take care of the patches. */ - - if (f->string_patches) - { - struct obj_string_patch_struct *p; - struct obj_section *strsec; - ElfW(Addr) strsec_base; - strsec = obj_find_section(f, ".kstrtab"); - strsec_base = strsec->header.sh_addr; - - for (p = f->string_patches; p ; p = p->next) - { - struct obj_section *targsec = f->sections[p->reloc_secidx]; - *(ElfW(Addr) *)(targsec->contents + p->reloc_offset) - = strsec_base + p->string_offset; - } - } - - if (f->symbol_patches) - { - struct obj_symbol_patch_struct *p; - - for (p = f->symbol_patches; p; p = p->next) - { - struct obj_section *targsec = f->sections[p->reloc_secidx]; - *(ElfW(Addr) *)(targsec->contents + p->reloc_offset) - = obj_symbol_final_value(f, p->sym); - } - } - - return ret; -} - -int -obj_create_image (struct obj_file *f, char *image) -{ - struct obj_section *sec; - ElfW(Addr) base = f->baseaddr; - - for (sec = f->load_order; sec ; sec = sec->load_next) - { - char *secimg; - - if (sec->contents == 0) - continue; - - secimg = image + (sec->header.sh_addr - base); - - /* Note that we allocated data for NOBITS sections earlier. */ - memcpy(secimg, sec->contents, sec->header.sh_size); - } - - return 1; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_s390.c b/mdk-stage1/insmod-modutils/obj/obj_s390.c deleted file mode 100644 index 3da72e771..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_s390.c +++ /dev/null @@ -1,245 +0,0 @@ -/* S/390 specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include -#include -#include - - -/*======================================================================*/ - -struct s390_got_entry -{ - int offset; - unsigned offset_done : 1; - unsigned reloc_done : 1; -}; - -struct s390_file -{ - struct obj_file root; - struct obj_section *got; -}; - -struct s390_symbol -{ - struct obj_symbol root; - struct s390_got_entry gotent; -}; - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - struct s390_file *f; - f = xmalloc(sizeof(*f)); - f->got = NULL; - return &f->root; -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - struct s390_symbol *sym; - sym = xmalloc(sizeof(*sym)); - memset(&sym->gotent, 0, sizeof(sym->gotent)); - return &sym->root; -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *f, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - struct s390_file *ifile = (struct s390_file *)f; - struct s390_symbol *isym = (struct s390_symbol *)sym; - - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - Elf32_Addr got = ifile->got ? ifile->got->header.sh_addr : 0; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_390_NONE: - break; - - case R_390_32: - *loc += v; - break; - - case R_390_PLT32: - case R_390_PC32: - *loc += v - dot; - break; - - case R_390_GLOB_DAT: - case R_390_JMP_SLOT: - *loc = v; - break; - - case R_390_RELATIVE: - *loc += f->baseaddr; - break; - - case R_390_GOTPC: - assert(got != 0); - *loc += got - dot; - break; - - case R_390_GOT32: - assert(isym != NULL); - if (!isym->gotent.reloc_done) - { - isym->gotent.reloc_done = 1; - *(Elf32_Addr *)(ifile->got->contents + isym->gotent.offset) = v; - } - *loc += isym->gotent.offset; - break; - - case R_390_GOTOFF: - assert(got != 0); - *loc += v - got; - break; - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *f) -{ - struct s390_file *ifile = (struct s390_file *)f; - int i, n, offset = 0, gotneeded = 0; - - n = ifile->root.header.e_shnum; - for (i = 0; i < n; ++i) - { - struct obj_section *relsec, *symsec, *strsec; - Elf32_Rel *rel, *relend; - Elf32_Sym *symtab; - const char *strtab; - - relsec = ifile->root.sections[i]; - if (relsec->header.sh_type != SHT_REL) - continue; - - symsec = ifile->root.sections[relsec->header.sh_link]; - strsec = ifile->root.sections[symsec->header.sh_link]; - - rel = (Elf32_Rel *)relsec->contents; - relend = rel + (relsec->header.sh_size / sizeof(Elf32_Rel)); - symtab = (Elf32_Sym *)symsec->contents; - strtab = (const char *)strsec->contents; - - for (; rel < relend; ++rel) - { - Elf32_Sym *extsym; - struct s390_symbol *intsym; - const char *name; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_390_GOTPC: - case R_390_GOTOFF: - gotneeded = 1; - default: - continue; - - case R_390_GOT32: - break; - } - - extsym = &symtab[ELF32_R_SYM(rel->r_info)]; - if (extsym->st_name) - name = strtab + extsym->st_name; - else - name = f->sections[extsym->st_shndx]->name; - intsym = (struct s390_symbol *)obj_find_symbol(&ifile->root, name); - - if (!intsym->gotent.offset_done) - { - intsym->gotent.offset_done = 1; - intsym->gotent.offset = offset; - offset += 4; - } - } - } - - if (offset > 0 || gotneeded) - ifile->got = obj_create_alloced_section(&ifile->root, ".got", 4, offset); - - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *m) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_sparc.c b/mdk-stage1/insmod-modutils/obj/obj_sparc.c deleted file mode 100644 index 1a03c9090..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_sparc.c +++ /dev/null @@ -1,226 +0,0 @@ -/* Sparc specific support for Elf loading and relocation. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include -#include - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - return xmalloc(sizeof(struct obj_file)); -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - return xmalloc(sizeof(struct obj_symbol)); -} - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -enum obj_reloc -arch_apply_relocation (struct obj_file *ef, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf32_Rela *rel, - Elf32_Addr v) -{ - Elf32_Addr *loc = (Elf32_Addr *)(targsec->contents + rel->r_offset); - Elf32_Addr dot = targsec->header.sh_addr + rel->r_offset; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF32_R_TYPE(rel->r_info)) - { - case R_SPARC_NONE: - break; - case R_SPARC_8: - if (v > 0xff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xff) | (v & 0xff); - break; - case R_SPARC_16: - if (v > 0xffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xffff) | (v & 0xffff); - break; - case R_SPARC_32: - *loc = v; - break; - case R_SPARC_DISP8: - v -= dot; - if (v > 0xff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xff) | (v & 0xff); - break; - case R_SPARC_DISP16: - v -= dot; - if (v > 0xffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xffff) | (v & 0xffff); - break; - case R_SPARC_DISP32: - v -= dot; - *loc = v; - break; - case R_SPARC_WDISP30: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x3fffffff) | (v >> 2); - break; - case R_SPARC_WDISP22: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x3fffff) | ((v >> 2) & 0x3fffff); - break; - case R_SPARC_HI22: - *loc = (*loc & ~0x3fffff) | (v >> 10); - break; - case R_SPARC_22: - if (v > 0x3fffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3fffff) | (v & 0x3fffff); - break; - case R_SPARC_13: - if (v > 0x1fff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x1fff) | (v & 0x1fff); - break; - case R_SPARC_LO10: - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - - case R_SPARC_PC10: - v -= dot; - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_PC22: - v -= dot; - *loc = (*loc & ~0x3fffff) | (v >> 10); - break; - - case R_SPARC_UA32: - *(((char *)loc) + 0) = (char)(v >> 24); - *(((char *)loc) + 1) = (char)(v >> 16); - *(((char *)loc) + 2) = (char)(v >> 8); - *(((char *)loc) + 3) = (char)v; - break; - -#ifdef R_SPARC_10 - case R_SPARC_10: - if (v > 0x3ff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_11: - if (v > 0x7ff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x7ff) | (v & 0x7ff); - break; - case R_SPARC_WDISP16: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x303fff) | ((v << 4) & 0x300000) | ((v >> 2) & 0x3fff); - break; - case R_SPARC_WDISP19: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x7ffff) | ((v >> 2) & 0x7ffff); - break; - case R_SPARC_7: - if (v > 0x7f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x7f) | (v & 0x7f); - break; - case R_SPARC_5: - if (v > 0x1f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x1f) | (v & 0x1f); - break; - case R_SPARC_6: - if (v > 0x3f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3f) | (v & 0x3f); - break; -#endif /* R_SPARC_10 */ - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *ef) -{ - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf32_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/obj/obj_sparc64.c b/mdk-stage1/insmod-modutils/obj/obj_sparc64.c deleted file mode 100644 index 84e8d18a0..000000000 --- a/mdk-stage1/insmod-modutils/obj/obj_sparc64.c +++ /dev/null @@ -1,352 +0,0 @@ -/* Sparc64 specific support for Elf loading and relocation. - Copyright 1997 Linux International. - - Contributed by Jakub Jelinek - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include -#include - - -/*======================================================================*/ - -struct obj_file * -arch_new_file (void) -{ - return xmalloc(sizeof(struct obj_file)); -} - -struct obj_section * -arch_new_section (void) -{ - return xmalloc(sizeof(struct obj_section)); -} - -struct obj_symbol * -arch_new_symbol (void) -{ - return xmalloc(sizeof(struct obj_symbol)); -} - -#ifdef BROKEN_SPARC64_RELOCS - -#undef R_SPARC_PLT32 -#undef R_SPARC_HIPLT22 -#undef R_SPARC_LOPLT10 -#undef R_SPARC_PCPLT32 -#undef R_SPARC_PCPLT22 -#undef R_SPARC_PCPLT10 -#undef R_SPARC_10 -#undef R_SPARC_11 -#undef R_SPARC_64 -#undef R_SPARC_OLO10 -#undef R_SPARC_HH22 -#undef R_SPARC_HM10 -#undef R_SPARC_LM22 -#undef R_SPARC_PC_HH22 -#undef R_SPARC_PC_HM10 -#undef R_SPARC_PC_LM22 -#undef R_SPARC_WDISP16 -#undef R_SPARC_WDISP19 -#undef R_SPARC_GLOB_JMP -#undef R_SPARC_7 -#undef R_SPARC_5 -#undef R_SPARC_6 - -#define R_SPARC_10 24 -#define R_SPARC_11 25 -#define R_SPARC_64 26 -#define R_SPARC_OLO10 27 -#define R_SPARC_HH22 28 -#define R_SPARC_HM10 29 -#define R_SPARC_LM22 30 -#define R_SPARC_PC_HH22 31 -#define R_SPARC_PC_HM10 32 -#define R_SPARC_PC_LM22 33 -#define R_SPARC_WDISP16 34 -#define R_SPARC_WDISP19 35 -#define R_SPARC_GLOB_JMP 36 -#define R_SPARC_7 37 -#define R_SPARC_5 38 -#define R_SPARC_6 39 - -#else - -#ifndef R_SPARC_64 - -#define R_SPARC_64 32 -#define R_SPARC_OLO10 33 -#define R_SPARC_HH22 34 -#define R_SPARC_HM10 35 -#define R_SPARC_LM22 36 -#define R_SPARC_PC_HH22 37 -#define R_SPARC_PC_HM10 38 -#define R_SPARC_PC_LM22 39 - -#endif - -#endif - -int -arch_load_proc_section(struct obj_section *sec, int fp) -{ - /* Assume it's just a debugging section that we can safely - ignore ... */ - sec->contents = NULL; - - return 0; -} - -#define ELF64_R_TYPE_ID(info) ((info) & 0xff) -#define ELF64_R_TYPE_DATA(info) ((info) >> 8) - -enum obj_reloc -arch_apply_relocation (struct obj_file *ef, - struct obj_section *targsec, - struct obj_section *symsec, - struct obj_symbol *sym, - Elf64_Rela *rel, - Elf64_Addr v) -{ - unsigned int *loc = (unsigned int *)(targsec->contents + rel->r_offset); - unsigned int dot = targsec->header.sh_addr + rel->r_offset; - - enum obj_reloc ret = obj_reloc_ok; - - switch (ELF64_R_TYPE_ID(rel->r_info)) - { - case R_SPARC_NONE: - break; - - case R_SPARC_64: - case R_SPARC_UA64: - if (! ((long) loc & 3)) { - /* Common in .eh_frame */ - ((unsigned int *) loc) [0] = v >> 32; - ((unsigned int *) loc) [1] = v; - break; - } - ((unsigned char *) loc) [0] = v >> 56; - ((unsigned char *) loc) [1] = v >> 48; - ((unsigned char *) loc) [2] = v >> 40; - ((unsigned char *) loc) [3] = v >> 32; - ((unsigned char *) loc) [4] = v >> 24; - ((unsigned char *) loc) [5] = v >> 16; - ((unsigned char *) loc) [6] = v >> 8; - ((unsigned char *) loc) [7] = v; - break; - case R_SPARC_32: - case R_SPARC_UA32: - if (! ((long) loc & 3)) { - *loc = v; - break; - } - ((unsigned char *) loc) [0] = v >> 24; - ((unsigned char *) loc) [1] = v >> 16; - ((unsigned char *) loc) [2] = v >> 8; - ((unsigned char *) loc) [3] = v; - break; - case R_SPARC_16: - if (v > 0xffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xffff) | (v & 0xffff); - break; - case R_SPARC_8: - if (v > 0xff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xff) | (v & 0xff); - break; - - case R_SPARC_DISP32: - v -= dot; - *loc = v; - break; - case R_SPARC_DISP16: - v -= dot; - if (v > 0xffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xffff) | (v & 0xffff); - break; - case R_SPARC_DISP8: - v -= dot; - if (v > 0xff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0xff) | (v & 0xff); - break; - case R_SPARC_WDISP30: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x3fffffff) | ((v >> 2) & 0x3fffffff); - break; - - /* MEDLOW code model relocs */ - case R_SPARC_LO10: - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_HI22: - *loc = (*loc & ~0x3fffff) | (v >> 10); - break; - case R_SPARC_OLO10: - *loc = (*loc & ~0x1fff) | (((v & 0x3ff) + ELF64_R_TYPE_DATA (rel->r_info)) & 0x1fff); - break; - - /* MEDMID code model relocs */ - case R_SPARC_H44: - *loc = (*loc & ~0x3fffff) | (v >> 22); - break; - case R_SPARC_M44: - *loc = (*loc & ~0x3ff) | ((v >> 12) & 0x3ff); - break; - case R_SPARC_L44: - *loc = (*loc & ~0xfff) | (v & 0xfff); - break; - - /* MEDANY code model relocs */ - case R_SPARC_HH22: - *loc = (*loc & ~0x3fffff) | (v >> 42); - break; - case R_SPARC_HM10: - *loc = (*loc & ~0x3ff) | ((v >> 32) & 0x3ff); - break; - case R_SPARC_LM22: - *loc = (*loc & ~0x3fffff) | ((v >> 10) & 0x3fffff); - break; - - case R_SPARC_WDISP22: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x3fffff) | ((v >> 2) & 0x3fffff); - break; - case R_SPARC_22: - if (v > 0x3fffff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3fffff) | (v & 0x3fffff); - break; - case R_SPARC_13: - if (v > 0x1fff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x1fff) | (v & 0x1fff); - break; - - case R_SPARC_PC10: - v -= dot; - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_PC22: - v -= dot; - *loc = (*loc & ~0x3fffff) | ((v >> 10) & 0x3fffff); - break; - -#ifdef R_SPARC_10 - case R_SPARC_10: - if (v > 0x3ff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3ff) | (v & 0x3ff); - break; - case R_SPARC_11: - if (v > 0x7ff) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x7ff) | (v & 0x7ff); - break; - -#ifdef R_SPARC_64 - case R_SPARC_PC_HH22: - v -= dot; - *loc = (*loc & ~0x3fffff) | (v >> 42); - break; - case R_SPARC_PC_HM10: - v -= dot; - *loc = (*loc & ~0x3ff) | ((v >> 32) & 0x3ff); - break; - case R_SPARC_PC_LM22: - v -= dot; - *loc = (*loc & ~0x3fffff) | ((v >> 10) & 0x3fffff); - break; -#endif - - case R_SPARC_WDISP16: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x303fff) | ((v << 4) & 0x300000) | ((v >> 2) & 0x3fff); - break; - case R_SPARC_WDISP19: - v -= dot; - if (v % 4) - ret = obj_reloc_dangerous; - *loc = (*loc & ~0x7ffff) | ((v >> 2) & 0x7ffff); - break; - case R_SPARC_7: - if (v > 0x7f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x7f) | (v & 0x7f); - break; - case R_SPARC_5: - if (v > 0x1f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x1f) | (v & 0x1f); - break; - case R_SPARC_6: - if (v > 0x3f) - ret = obj_reloc_overflow; - *loc = (*loc & ~0x3f) | (v & 0x3f); - break; -#endif /* R_SPARC_10 */ - - default: - ret = obj_reloc_unhandled; - break; - } - - return ret; -} - -int -arch_create_got (struct obj_file *ef) -{ - return 1; -} - -int -arch_init_module (struct obj_file *f, struct module *mod) -{ - return 1; -} - -int -arch_finalize_section_address(struct obj_file *f, Elf64_Addr base) -{ - int i, n = f->header.e_shnum; - - f->baseaddr = base; - for (i = 0; i < n; ++i) - f->sections[i]->header.sh_addr += base; - return 1; -} - -int -arch_archdata (struct obj_file *fin, struct obj_section *sec) -{ - return 0; -} diff --git a/mdk-stage1/insmod-modutils/util/Makefile b/mdk-stage1/insmod-modutils/util/Makefile deleted file mode 100644 index 763f046f2..000000000 --- a/mdk-stage1/insmod-modutils/util/Makefile +++ /dev/null @@ -1,42 +0,0 @@ - #****************************************************************************** - # - # insmod from modutils (generic) - # - # $Id$ - # - # Copyright 1996, 1997 Linux International. - # - #***************************************************************************** - -top_dir = ../.. - -include $(top_dir)/Makefile.common - - -all: libutil.a libutil-STANDALONE.a #libutil-DIET.a - -clean: - rm -f *.o *.a - - -INCS = -I./../include - -DEFS = -Wno-error -D_GNU_SOURCE -DELF_MACHINE_H='"elf_$(ARCH).h"' -DARCH_$(ARCH) -DHAVE_WORDEXP=1 -DHAVE_GLOB=1 -DCONFIG_ROOT_CHECK_OFF=0 - - -OBJS = xmalloc.o xrealloc.o xstrcat.o xstrdup.o xsystem.o xftw.o \ - modstat.o meta_expand.o config.o snap_shot.o arch64.o gzfiles.o sys_nim.o sys_oim.o - -libutil.a: $(OBJS) logger.o - ar cru $@ $^ - ranlib $@ - -libutil-STANDALONE.a: $(OBJS) logger-standalone.o - ar cru $@ $^ - ranlib $@ - -logger-standalone.o: logger.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ -c logger.c - -.c.o: - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< diff --git a/mdk-stage1/insmod-modutils/util/alias.h b/mdk-stage1/insmod-modutils/util/alias.h deleted file mode 100644 index c925a04f3..000000000 --- a/mdk-stage1/insmod-modutils/util/alias.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - * This file is split out from config.c for easier editing - */ - -/* - * tbpath and tbtype are used to build the complete set of paths for finding - * modules, but only when we search for individual directories, they are not - * used for [boot] and [toplevel] searches. - */ -static char *tbpath[] = -{ - "/lib/modules", - NULL /* marks the end of the list! */ -}; - -char *tbtype[] = -{ - "kernel", /* as of 2.3.14 this must be first */ - "fs", - "net", - "scsi", - "block", - "cdrom", - "ipv4", - "ipv6", - "sound", - "fc4", - "video", - "misc", - "pcmcia", - "atm", - "usb", - "ide", - "ieee1394", - "mtd", - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined aliases. - * Each entry can be overridden by an entry in /etc/modules.conf - */ -char *aliaslist[] = -{ - "binfmt-204 binfmt_aout", - "binfmt-263 binfmt_aout", - "binfmt-264 binfmt_aout", - "binfmt-267 binfmt_aout", - "binfmt-387 binfmt_aout", - "binfmt-332 iBCS", - "binfmt--310 binfmt_java", - - "block-major-1 rd", - "block-major-2 floppy", - "block-major-3 ide-probe-mod", - "block-major-7 loop", - "block-major-8 sd_mod", - "block-major-9 md", /* For modular RAID */ - "block-major-11 sr_mod", - "block-major-13 xd", - "block-major-15 cdu31a", - "block-major-16 gscd", - "block-major-17 optcd", - "block-major-18 sjcd", - "block-major-20 mcdx", - "block-major-22 ide-probe-mod", - "block-major-23 mcd", - "block-major-24 sonycd535", - "block-major-25 sbpcd", - "block-major-26 sbpcd", - "block-major-27 sbpcd", - "block-major-29 aztcd", - "block-major-32 cm206", - "block-major-33 ide-probe-mod", - "block-major-34 ide-probe-mod", - "block-major-37 ide-tape", - "block-major-44 ftl", /* from David Woodhouse */ - "block-major-56 ide-probe-mod", - "block-major-57 ide-probe-mod", - "block-major-88 ide-probe-mod", - "block-major-89 ide-probe-mod", - "block-major-90 ide-probe-mod", - "block-major-91 ide-probe-mod", - "block-major-93 nftl", /* from David Woodhouse */ - - "char-major-4 serial", - "char-major-5 serial", - "char-major-6 lp", - "char-major-9 st", - "char-major-10 off", /* was: mouse, was: misc */ - "char-major-10-0 busmouse", /* /dev/logibm Logitech bus mouse */ - "char-major-10-1 off", /* /dev/psaux PS/2-style mouse port */ - "char-major-10-2 msbusmouse", /* /dev/inportbm Microsoft Inport bus mouse */ - "char-major-10-3 atixlmouse", /* /dev/atibm ATI XL bus mouse */ - /* /dev/jbm J-mouse */ - /* /dev/amigamouse Amiga mouse (68k/Amiga) */ - /* /dev/atarimouse Atari mouse */ - /* /dev/sunmouse Sun mouse */ - /* /dev/beep Fancy beep device */ - /* /dev/modreq Kernel module load request */ - "char-major-10-130 wdt", /* /dev/watchdog Watchdog timer port */ - "char-major-10-131 wdt", /* /dev/temperature Machine internal temperature */ - /* /dev/hwtrap Hardware fault trap */ - /* /dev/exttrp External device trap */ - "char-major-10-135 off", /* rtc cannot be compiled as a module */ - "char-major-10-139 openprom", /* /dev/openprom Linux/Sparc interface */ - "char-major-10-144 nvram", /* from Tigran Aivazian */ - "char-major-10-157 applicom", /* from David Woodhouse */ - "char-major-10-175 agpgart", /* /dev/agpgart GART AGP mapping access */ - "char-major-10-184 microcode", /* Tigran Aivazian */ - - "char-major-14 soundcore", - "char-major-19 cyclades", - "char-major-20 cyclades", - "char-major-21 sg", - "char-major-22 pcxx", /* ?? */ - "char-major-23 pcxx", /* ?? */ - "char-major-27 ftape", - "char-major-34 scc", - "char-major-35 tclmidi", - "char-major-36 netlink", - "char-major-37 ide-tape", - "char-major-48 riscom8", - "char-major-49 riscom8", - "char-major-57 esp", - "char-major-58 esp", - "char-major-63 kdebug", - "char-major-90 mtdchar", /* from David Woodhouse */ - "char-major-99 ppdev", - "char-major-107 3dfx", /* from Tigran Aivazian */ - "char-major-161 ircomm-tty", - - "dos msdos", - "dummy0 dummy", - "dummy1 dummy", - "eth0 off", - "iso9660 isofs", - "md-personality-1 linear", - "md-personality-2 raid0", - "md-personality-3 raid1", - "md-personality-4 raid5", - - "net-pf-1 unix", /* PF_UNIX 1 Unix domain sockets */ - "net-pf-2 ipv4", /* PF_INET 2 Internet IP Protocol */ - "net-pf-3 off", /* PF_AX25 3 Amateur Radio AX.25 */ - "net-pf-4 ipx", /* PF_IPX 4 Novell IPX */ - "net-pf-5 appletalk", /* PF_APPLETALK 5 Appletalk DDP */ - "net-pf-6 off", /* PF_NETROM 6 Amateur radio NetROM */ - /* PF_BRIDGE 7 Multiprotocol bridge */ - /* PF_AAL5 8 Reserved for Werner's ATM */ - /* PF_X25 9 Reserved for X.25 project */ - /* PF_INET6 10 IP version 6 */ - - /* next two from Thanks! */ - "net-pf-17 af_packet", - "net-pf-19 off", /* acorn econet */ - - "netalias-2 ip_alias", - "plip0 plip", - "plip1 plip", - "cipcb0 cipcb", - "cipcb1 cipcb", - "cipcb2 cipcb", - "cipcb3 cipcb", - "ppp0 ppp", - "ppp1 ppp", - "scsi_hostadapter off", /* if not in config file */ - "slip0 slip", - "slip1 slip", - "tty-ldisc-1 slip", - "tty-ldisc-3 ppp", - "ppp-compress-21 bsd_comp", - "ppp-compress-24 ppp_deflate", - "ppp-compress-26 ppp_deflate", - -#ifndef __sparc__ - "parport_lowlevel parport_pc", -#else - "parport_lowlevel parport_ax", -#endif - - "tty-ldisc-11 irtty", - - "usbdevfs usbcore", - - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined options. - * Each entry can be overridden by an entry in /etc/modules.conf - */ -char *optlist[] = -{ - "dummy0 -o dummy0", - "dummy1 -o dummy1", - "sb io=0x220 irq=7 dma=1 dma16=5 mpu_io=0x330", - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined "above"s, - * used for pull-in of additional modules - * Each entry can be overridden by an entry in /etc/modules.conf - */ -char *above[] = -{ - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined "below"s, - * used for push-in of additional modules - * Each entry can be overridden by an entry in /etc/modules.conf - */ -char *below[] = -{ - NULL /* marks the end of the list! */ -}; - -/* - * This is the list of pre-defined "prune"s, - * used to exclude paths from scan of /lib/modules. - * /etc/modules.conf can add entries but not remove them. - */ -char *prune[] = -{ - ".rhkmvtag", - "modules.dep", - "modules.generic_string", - "modules.pcimap", - "modules.isapnpmap", - "modules.usbmap", - "modules.parportmap", - "System.map", - ".config", - "build", /* symlink to source tree */ - "vmlinux", - "vmlinuz", - "bzImage", - "zImage", - ".rhkmvtag", /* wish RedHat had told me before they did this */ - NULL /* marks the end of the list! */ -}; diff --git a/mdk-stage1/insmod-modutils/util/arch64.c b/mdk-stage1/insmod-modutils/util/arch64.c deleted file mode 100644 index 4d5ace223..000000000 --- a/mdk-stage1/insmod-modutils/util/arch64.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Misc utility functions. - Copyright 1996, 1997 Linux International. - Written by Keith Owens - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include -#include "util.h" - -/*======================================================================*/ - -/* Indicate if the current machine uses 64 bit architecture */ -int arch64(void) -{ - struct utsname u; - return(!uname(&u) && strstr(u.machine, "64")); -} diff --git a/mdk-stage1/insmod-modutils/util/config.c b/mdk-stage1/insmod-modutils/util/config.c deleted file mode 100644 index a860920f6..000000000 --- a/mdk-stage1/insmod-modutils/util/config.c +++ /dev/null @@ -1,1591 +0,0 @@ -/* - * Handle the configuration, including /etc/modules.conf - * - * Copyright 1994, 1995, 1996, 1997: - * Jacques Gelinas - * Björn Ekwall February 1999 - * Keith Owens October 1999 - * - * "kernelversion" idea from the Debian release via: - * Wichert Akkerman - * - * Björn, inspired by Richard Henderson , cleaned up - * the wildcard handling and started using ftw in March 1999 - * Cleanup of hardcoded arrays: Björn Ekwall March 1999 - * Many additional keywords: Björn Ekwall (C) March 1999 - * Standardize on /etc/modules.conf Keith Owens October 1999 - * - * Alpha typecast:Michal Jaegermann - * - * This file is part of the Linux modutils. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/* - * Specification: /etc/modules.conf / format - * Modules may be located at different places in the filesystem. - * - * The file /etc/modules.conf contains different definitions to - * control the manipulation of modules. - * - * Standard Unix style comments and continuation line are supported. - * Comments begin with a # and continue until the end of the line. - * A line continues on the next one if the last non-white character - * is a \. - */ -/* #Specification: /etc/modules.conf / format / official name */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "util.h" -#include "config.h" -#include "alias.h" - -int flag_autoclean; /* set/used by modprobe and insmod */ - -struct utsname uts_info; - -struct PATH_TYPE *modpath; -int nmodpath = 0; -static int maxpath = 0; - -struct EXEC_TYPE *execs; -int nexecs = 0; -static int maxexecs = 0; - -OPT_LIST *opt_list; -static int n_opt_list; - -OPT_LIST *abovelist; -static int n_abovelist; - -OPT_LIST *belowlist; -static int n_belowlist; - -OPT_LIST *prunelist; -static int n_prunelist; - -OPT_LIST *probe_list; -static int n_probe_list; - -OPT_LIST *probeall_list; -static int n_probeall_list; - -OPT_LIST *aliases; -static int n_aliases; - -char *persistdir = "/var/lib/modules/persist"; - -const char symprefix[] = SYMPREFIX; - -char *insmod_opt = NULL; -char *config_file = NULL; /* Which file was actually used */ -time_t config_mtime; -int root_check_off = CONFIG_ROOT_CHECK_OFF; /* Default is modules must be owned by root */ -static char *config_version; /* Hack for config_add */ -int quick = 0; /* Option -A */ - -/* The initialization order must match the gen_file_enum order in config.h */ -struct gen_files gen_file[] = { - {"generic_string", NULL, 0}, - {"pcimap", NULL, 0}, - {"isapnpmap", NULL, 0}, - {"usbmap", NULL, 0}, - {"parportmap", NULL, 0}, - {"dep", NULL, 0}, -}; - -const int gen_file_count = sizeof(gen_file)/sizeof(gen_file[0]); - -int flag_verbose; - -unsigned long safemode; - -void verbose(const char *ctl,...) -{ - if (flag_verbose) { - va_list list; - va_start(list, ctl); - vprintf(ctl, list); - va_end(list); - fflush(stdout); - } -} - - -/* - * Check to see if the existing modules.xxx files need updating, - * based on the timestamps of the modules and the config file. - */ -static int check_update (const char *file, const struct stat *sb) -{ - int len = strlen(file); - int i; - - if (!S_ISREG(sb->st_mode)) - return 0; - for (i = 0; i < gen_file_count; ++i) { - if (sb->st_mtime > gen_file[i].mtime) - break; - } - if (i == gen_file_count) - return 0; /* All generated files are up to date */ - - if (len > 2 && !strcmp(file + len - 2, ".o")) - return 1; - else if (len > 4 && !strcmp(file + len - 4, ".mod")) - return 1; -#ifdef CONFIG_USE_ZLIB - else if (len > 5 && !strcmp(file + len - 5, ".o.gz")) - return 1; -#endif - return 0; -} - -static int need_update (const char *force_ver, const char *base_dir) -{ - struct stat tmp; - char dep[PATH_MAX]; - int i; - uname (&uts_info); - if (!force_ver) - force_ver = uts_info.release; - - if (strlen (force_ver) > 50) - /* That's just silly. */ - return 1; - - for (i = 0; i < gen_file_count; ++i) { - if (stat(gen_file[i].name, &tmp)) - return 1; /* No dependency file yet, so we need to build it. */ - gen_file[i].mtime = tmp.st_mtime; - } - - if (stat ("/etc/modules.conf", &tmp) && - stat ("/etc/conf.modules", &tmp)) - return 1; - - for (i = 0; i < gen_file_count; ++i) { - if (tmp.st_mtime > gen_file[i].mtime) - return 1; /* Config file is newer. */ - } - - snprintf (dep, sizeof(dep), "%s/lib/modules/%s", base_dir, force_ver); - return xftw (dep, check_update); -} - - -/* - * Strip white char at the end of a string. - * Return the address of the last non white char + 1 (point on the '\0'). - */ -static char *strip_end(char *str) -{ - int len = strlen(str); - - for (str += len - 1; len > 0 && (isspace(*str)); --len, --str) - *str = '\0'; - return str + 1; -} - -/* - * Read a line of a configuration file and process continuation lines. - * Return buf, or NULL if EOF. - * Blank at the end of line are always stripped. - * Everything on a line following comchar is a comment. - * - * Continuation character is \ - * Comment character is # - */ -char *fgets_strip(char *buf, int sizebuf, FILE * fin, int *lineno) -{ - int nocomment = 1; /* No comments found ? */ - int contline = 0; - char *start = buf; - char *ret = NULL; - char comchar = '#'; - char contchar = '\\'; - - *buf = '\0'; - - while (fgets(buf, sizebuf, fin) != NULL) { - char *end = strip_end(buf); - char *pt = strchr(buf, comchar); - - if (pt != NULL) { - nocomment = 0; - *pt = '\0'; - end = strip_end(buf); - } - - if (lineno != NULL) - (*lineno)++; - ret = start; - if (contline) { - char *pt = buf; - - while (isspace(*pt)) - pt++; - if (pt > buf + 1) { - strcpy(buf + 1, pt); /* safe, backward copy */ - buf[0] = ' '; - end -= (int) (pt - buf) - 1; - } else if (pt == buf + 1) { - buf[0] = ' '; - } - } - if (end > buf && *(end - 1) == contchar) { - if (end == buf + 1 || *(end - 2) != contchar) { - /* Continuation */ - contline = 1; - end--; - *end = '\0'; - buf = end; - } else { - *(end - 1) = '\0'; - break; - } - } else { - break; - } - } - - return ret; -} - -static char *next_word(char *pt) -{ - char *match; - char *pt2; - - /* find end of word */ - for (pt2 = pt; *pt2 && !(isspace(*pt2)); ++pt2) { - if ((match = strchr("\"'`", *pt2)) != NULL) { - for (++pt2; *pt2 && *pt2 != *match; ++pt2) { - if (*pt2 == '\\' && *(pt2 + 1) == *match) - ++pt2; - } - } - } - - /* skip leading whitespace before next word */ - if (*pt2) { - *pt2++ = '\0'; /* terminate last word */ - while (*pt2 && isspace(*pt2)) - ++pt2; - } - return pt2; -} - -static GLOB_LIST *addlist(GLOB_LIST *orig, GLOB_LIST *add) -{ - if (!orig) - return add; - /* else */ - orig->pathv = (char **)xrealloc(orig->pathv, - (orig->pathc + add->pathc + 1) * - sizeof(char *)); - memcpy(orig->pathv + orig->pathc, add->pathv, - add->pathc * sizeof(char *)); - orig->pathc += add->pathc; - orig->pathv[orig->pathc] = NULL; - /* - free(add->pathv); - free(add); - */ - return orig; -} - -static void decode_list(int *n, OPT_LIST **list, char *arg, int adding, - char *version, int opts) -{ - GLOB_LIST *pg; - GLOB_LIST *prevlist = NULL; - int i, autoclean = 1; - int where = *n; - char *arg2 = next_word(arg); - - if (opts && !strcmp (arg, "-k")) { - if (!*arg2) - error("Missing module argument after -k\n"); - arg = arg2; - arg2 = next_word(arg); - autoclean = 0; - } - - for (i = 0; i < *n; ++i) { - if (strcmp((*list)[i].name, arg) == 0) { - if (adding) - prevlist = (*list)[i].opts; - else - free((*list)[i].opts); - (*list)[i].opts = NULL; - where = i; - break; - } - } - if (where == *n) { - (*list) = (OPT_LIST *)xrealloc((*list), - (*n + 2) * sizeof(OPT_LIST)); - (*list)[*n].name = xstrdup(arg); - (*list)[*n].autoclean = autoclean; - *n += 1; - memset(&(*list)[*n], 0, sizeof(OPT_LIST)); - } else if (!autoclean) - (*list)[where].autoclean = 0; - pg = (GLOB_LIST *)xmalloc(sizeof(GLOB_LIST)); - meta_expand(arg2, pg, NULL, version, ME_ALL); - (*list)[where].opts = addlist(prevlist, pg); -} - -static void decode_exec(char *arg, int type) -{ - char *arg2; - - execs[nexecs].when = type; - arg2 = next_word(arg); - execs[nexecs].module = xstrdup(arg); - execs[nexecs].cmd = xstrdup(arg2); - if (++nexecs >= maxexecs) { - maxexecs += 10; - execs = (struct EXEC_TYPE *)xrealloc(execs, - maxexecs * sizeof(struct EXEC_TYPE)); - } -} - -static int build_list(char **in, OPT_LIST **out, char *version, int opts) -{ - GLOB_LIST *pg; - int i; - - for (i = 0; in[i]; ++i) { - char *p = xstrdup(in[i]); - char *pt = next_word(p); - char *pn = p; - - *out = (OPT_LIST *)xrealloc(*out, (i + 2) * sizeof(OPT_LIST)); - (*out)[i].autoclean = 1; - if (opts && !strcmp (p, "-k")) { - pn = pt; - pt = next_word(pn); - (*out)[i].autoclean = 0; - } - pg = (GLOB_LIST *)xmalloc(sizeof(GLOB_LIST)); - meta_expand(pt, pg, NULL, version, ME_ALL); - (*out)[i].name = xstrdup(pn); - (*out)[i].opts = pg; - free(p); - } - memset(&(*out)[i], 0, sizeof(OPT_LIST)); - - return i; -} - -/* Environment variables can override defaults, testing only */ -static void gen_file_env(struct gen_files *gf) -{ - if (!safemode) { - char *e = xmalloc(strlen(gf->base)+5), *p1 = gf->base, *p2 = e; - while ((*p2++ = toupper(*p1++))) ; - strcpy(p2-1, "PATH"); /* safe, xmalloc */ - if ((p2 = getenv(e)) != NULL) { - free(gf->name); - gf->name = xstrdup(p2); - } - free(e); - } -} - -/* Read a config option for a generated filename */ -static int gen_file_conf(struct gen_files *gf, int assgn, const char *parm, const char *arg) -{ - - int l = strlen(gf->base); - if (assgn && - strncmp(parm, gf->base, l) == 0 && - strcmp(parm+l, "file") == 0 && - !gf->name) { - gf->name = xstrdup(arg); - return(0); - } - return(1); -} - -/* Check we have a name for a generated file */ -static int gen_file_check(struct gen_files *gf, GLOB_LIST *g, - char *base_dir, char *version) -{ - char tmp[PATH_MAX]; - int ret = 0; - if (!gf->name) { - /* - * Specification: config file / no xxxfile parameter - * The default value for generated filename xxx is: - * - * xxxfile=/lib/modules/`uname -r`/modules.xxx - * - * If the config file exists but lacks an xxxfile - * specification, the default value is used since - * the system can't work without one. - */ - snprintf(tmp, sizeof(tmp), "%s/lib/modules/%s/modules.%s", - base_dir, version, gf->base); - gf->name = xstrdup(tmp); - } else { /* xxxfile defined in modules.conf */ - /* - * If we have a xxxfile definition in the configuration file - * we must resolve any shell meta-chars in its value. - */ - if (meta_expand(gf->name, g, base_dir, version, ME_ALL)) - ret = -1; - else if (!g->pathv || g->pathv[0] == NULL) - ret = -1; - else { - free(gf->name); - gf->name = xstrdup(g->pathv[0]); - } - } - return(ret); -} - -/* - * Read the configuration file. - * If parameter "all" == 0 then ignore everything except path info - * Return -1 if any error. - * Error messages generated. - */ -static int do_read(int all, char *force_ver, char *base_dir, char *conf_file, int depth) -{ - #define MAX_LEVEL 20 - FILE *fin; - GLOB_LIST g; - int i; - int assgn; - int drop_default_paths = 1; - int lineno = 0; - int ret = 0; - int state[MAX_LEVEL + 1]; /* nested "if" */ - int level = 0; - char buf[3000]; - char tmpline[100]; - char **pathp; - char *envpath; - char *version; - char *type; - char **glb; - char old_name[] = "/etc/conf.modules"; - int conf_file_specified = 0; - - /* - * The configuration file is optional. - * No error is printed if it is missing. - * If it is missing the following content is assumed. - * - * path[boot]=/lib/modules/boot - * - * path[toplevel]=/lib/modules/`uname -r` - * - * path[toplevel]=/lib/modules/`kernelversion` - * (where kernelversion gives the major kernel version: "2.0", "2.2"...) - * - * path[toplevel]=/lib/modules/default - * - * path[kernel]=/lib/modules/kernel - * path[fs]=/lib/modules/fs - * path[net]=/lib/modules/net - * path[scsi]=/lib/modules/scsi - * path[block]=/lib/modules/block - * path[cdrom]=/lib/modules/cdrom - * path[ipv4]=/lib/modules/ipv4 - * path[ipv6]=/lib/modules/ipv6 - * path[sound]=/lib/modules/sound - * path[fc4]=/lib/modules/fc4 - * path[video]=/lib/modules/video - * path[misc]=/lib/modules/misc - * path[pcmcia]=/lib/modules/pcmcia - * path[atm]=/lib/modules/atm - * path[usb]=/lib/modules/usb - * path[ide]=/lib/modules/ide - * path[ieee1394]=/lib/modules/ieee1394 - * path[mtd]=/lib/modules/mtd - * - * The idea is that modprobe will look first if the - * modules are compiled for the current release of the kernel. - * If not found, it will look for modules that fit for the - * general kernelversion (2.0, 2.2 and so on). - * If still not found, it will look into the default release. - * And if still not found, it will look in the other directories. - * - * The strategy should be like this: - * When you install a new linux kernel, the modules should go - * into a directory related to the release (version) of the kernel. - * Then you can do a symlink "default" to this directory. - * - * Each time you compile a new kernel, the make modules_install - * will create a new directory, but it won't change thee default. - * - * When you get a module unrelated to the kernel distribution - * you can place it in one of the last three directory types. - * - * This is the default strategy. Of course you can overide - * this in /etc/modules.conf. - * - * 2.3.15 added a new file tree walk algorithm which made it possible to - * point at a top level directory and get the same behaviour as earlier - * versions of modutils. 2.3.16 takes this one stage further, it - * removes all the individual directory names from most of the scans, - * only pointing at the top level directory. The only exception is the - * last ditch scan, scanning all of /lib/modules would be a bad idea(TM) - * so the last ditch scan still runs individual directory names under - * /lib/modules. - * - * Additional syntax: - * - * [add] above module module1 ... - * Specify additional modules to pull in on top of a module - * - * [add] below module module1 ... - * Specify additional modules needed to be able to load a module - * - * [add] prune filename ... - * - * [add] probe name module1 ... - * When "name" is requested, modprobe tries to install each - * module in the list until it succeeds. - * - * [add] probeall name module1 ... - * When "name" is requested, modprobe tries to install all - * modules in the list. - * If any module is installed, the command has succeeded. - * - * [add] options module option_list - * - * For all of the above, the optional "add" prefix is used to - * add to a list instead of replacing the contents. - * - * include FILE_TO_INCLUDE - * This does what you expect. No limitation on include levels. - * - * persistdir=persist_directory - * Name the directory to save persistent data from modules. - * - * In the following WORD is a sequence if non-white characters. - * If ' " or ` is found in the string, all characters up to the - * matching ' " or ` will also be included, even whitespace. - * Every WORD will then be expanded w.r.t. meta-characters. - * If the expanded result gives more than one word, then only - * the first word of the result will be used. - * - * - * define CODE WORD - * Do a putenv("CODE=WORD") - * - * EXPRESSION below can be: - * WORD compare_op WORD - * where compare_op is one of == != < <= >= > - * The string values of the WORDs are compared - * or - * -n WORD compare_op WORD - * where compare_op is one of == != < <= >= > - * The numeric values of the WORDs are compared - * or - * WORD - * if the expansion of WORD fails, or if the - * expansion is "0" (zero), "false" or "" (empty) - * then the expansion has the value FALSE. - * Otherwise the expansion has the value TRUE - * or - * -f FILENAME - * Test if the file FILENAME exists - * or - * -k - * Test if "autoclean" (i.e. called from the kernel) - * or - * ! EXPRESSION - * A negated expression is also an expression - * - * if EXPRESSION - * any config line - * ... - * elseif EXPRESSION - * any config line - * ... - * else - * any config line - * ... - * endif - * - * The else and elseif keywords are optional. - * "if"-statements nest up to 20 levels. - */ - - state[0] = 1; - - if (force_ver) - version = force_ver; - else - version = uts_info.release; - - config_version = xstrdup(version); - - /* Only read the default entries on the first file */ - if (depth == 0) { - maxpath = 100; - modpath = (struct PATH_TYPE *)xmalloc(maxpath * sizeof(struct PATH_TYPE)); - nmodpath = 0; - - maxexecs = 10; - execs = (struct EXEC_TYPE *)xmalloc(maxexecs * sizeof(struct EXEC_TYPE)); - nexecs = 0; - - /* - * Build predef options - */ - if (all && optlist[0]) - n_opt_list = build_list(optlist, &opt_list, version, 1); - - /* - * Build predef above - */ - if (all && above[0]) - n_abovelist = build_list(above, &abovelist, version, 0); - - /* - * Build predef below - */ - if (all && below[0]) - n_belowlist = build_list(below, &belowlist, version, 0); - - /* - * Build predef prune list - */ - if (prune[0]) - n_prunelist = build_list(prune, &prunelist, version, 0); - - /* - * Build predef aliases - */ - if (all && aliaslist[0]) - n_aliases = build_list(aliaslist, &aliases, version, 0); - - /* Order and priority is now: (MODPATH + modules.conf) || (predefs + modules.conf) */ - if ((envpath = getenv("MODPATH")) != NULL && !safemode) { - size_t len; - char *p; - char *path; - - /* Make a copy so's we can mung it with strtok. */ - len = strlen(envpath) + 1; - p = alloca(len); - memcpy(p, envpath, len); - path = alloca(PATH_MAX); - - for (p = strtok(p, ":"); p != NULL; p = strtok(NULL, ":")) { - len = snprintf(path, PATH_MAX, p, version); - modpath[nmodpath].path = xstrdup(path); - if ((type = strrchr(path, '/')) != NULL) - type += 1; - else - type = "misc"; - modpath[nmodpath].type = xstrdup(type); - if (++nmodpath >= maxpath) { - maxpath += 100; - modpath = (struct PATH_TYPE *)xrealloc(modpath, - maxpath * sizeof(struct PATH_TYPE)); - } - - } - } else { - /* - * Build the default "path[type]" configuration - */ - int n; - char *k; - - /* The first entry in the path list */ - modpath[nmodpath].type = xstrdup("boot"); - snprintf(tmpline, sizeof(tmpline), "%s/lib/modules/boot", base_dir); - modpath[nmodpath].path = xstrdup(tmpline); - ++nmodpath; - - /* The second entry in the path list, `uname -r` */ - modpath[nmodpath].type = xstrdup("toplevel"); - snprintf(tmpline, sizeof(tmpline), "%s/lib/modules/%s", base_dir, version); - modpath[nmodpath].path = xstrdup(tmpline); - ++nmodpath; - - /* The third entry in the path list, `kernelversion` */ - modpath[nmodpath].type = xstrdup("toplevel"); - for (n = 0, k = version; *k; ++k) { - if (*k == '.' && ++n == 2) - break; - } - snprintf(tmpline, sizeof(tmpline), "%s/lib/modules/%.*s", base_dir, - (/* typecast for Alpha */ int)(k - version), version); - modpath[nmodpath].path = xstrdup(tmpline); - ++nmodpath; - - /* The rest of the entries in the path list */ - for (pathp = tbpath; *pathp; ++pathp) { - char **type; - - for (type = tbtype; *type; ++type) { - char path[PATH_MAX]; - - snprintf(path, sizeof(path), "%s%s/%s", base_dir, *pathp, *type); - if (meta_expand(path, &g, NULL, version, ME_ALL)) - return -1; - - for (glb = g.pathv; glb && *glb; ++glb) { - modpath[nmodpath].type = xstrdup(*type); - modpath[nmodpath].path = *glb; - if (++nmodpath >= maxpath) { - maxpath += 100; - modpath = (struct PATH_TYPE *)xrealloc(modpath, - maxpath * sizeof(struct PATH_TYPE)); - } - } - } - } - } - - /* Environment overrides for testing only, undocumented */ - for (i = 0; i < gen_file_count; ++i) - gen_file_env(gen_file+i); - - } /* End of depth == 0 */ - - if (conf_file || - ((conf_file = getenv("MODULECONFIG")) != NULL && *conf_file && !safemode)) { - if (!(fin = fopen(conf_file, "r"))) { - error("Can't open %s", conf_file); - return -1; - } - conf_file_specified = 1; - } else { - if (!(fin = fopen((conf_file = ETC_MODULES_CONF), "r"))) { - /* Fall back to non-standard name */ - if ((fin = fopen((conf_file = old_name), "r"))) { - fprintf(stderr, - "Warning: modutils is reading from %s because\n" - " %s does not exist. The use of %s is\n" - " deprecated, please rename %s to %s\n" - " as soon as possible. Command\n" - " mv %s %s\n", - old_name, ETC_MODULES_CONF, - old_name, old_name, ETC_MODULES_CONF, - old_name, ETC_MODULES_CONF); - } - /* So what... use the default configuration */ - } - } - - if (fin) { - struct stat statbuf1, statbuf2; - if (fstat(fileno(fin), &statbuf1) == 0) - config_mtime = statbuf1.st_mtime; - config_file = xstrdup(conf_file); /* Save name actually used */ - if (!conf_file_specified && - stat(ETC_MODULES_CONF, &statbuf1) == 0 && - stat(old_name, &statbuf2) == 0) { - /* Both /etc files exist */ - if (statbuf1.st_dev == statbuf2.st_dev && - statbuf1.st_ino == statbuf2.st_ino) { - if (lstat(ETC_MODULES_CONF, &statbuf1) == 0 && - S_ISLNK(statbuf1.st_mode)) - fprintf(stderr, - "Warning: You do not need a link from %s to\n" - " %s. The use of %s is deprecated,\n" - " please remove %s and rename %s\n" - " to %s as soon as possible. Commands.\n" - " rm %s\n" - " mv %s %s\n", - ETC_MODULES_CONF, old_name, - old_name, ETC_MODULES_CONF, old_name, ETC_MODULES_CONF, - ETC_MODULES_CONF, - old_name, ETC_MODULES_CONF); - else { -#ifndef NO_WARN_ON_OLD_LINK - fprintf(stderr, - "Warning: You do not need a link from %s to\n" - " %s. The use of %s is deprecated,\n" - " please remove %s as soon as possible. Command\n" - " rm %s\n", - old_name, ETC_MODULES_CONF, - old_name, old_name, - old_name); -#endif - } - } - else - fprintf(stderr, - "Warning: modutils is reading from %s and\n" - " ignoring %s. The use of %s is deprecated,\n" - " please remove %s as soon as possible. Command\n" - " rm %s\n", - ETC_MODULES_CONF, old_name, - old_name, old_name, - old_name); - } - } - - /* - * Finally, decode the file - */ - while (fin && fgets_strip(buf, sizeof(buf) - 1, fin, &lineno) != NULL) { - char *arg2; - char *parm = buf; - char *arg; - int one_err = 0; - int adding; - - while (isspace(*parm)) - parm++; - - if (strncmp(parm, "add", 3) == 0) { - adding = 1; - parm += 3; - while (isspace(*parm)) - parm++; - } else - adding = 0; - - arg = parm; - - if (*parm == '\0') - continue; - - one_err = 1; - - while (*arg > ' ' && *arg != '=') - arg++; - - if (*arg == '=') - assgn = 1; - else - assgn = 0; - *arg++ = '\0'; - while (isspace(*arg)) - arg++; - - /* - * endif - */ - if (!assgn && strcmp(parm, "endif") == 0) { - if (level > 0) - --level; - else { - error("unmatched endif in line %d", lineno); - return -1; - } - continue; - } - - /* - * else - */ - if (!assgn && strcmp(parm, "else") == 0) { - if (level <= 0) { - error("else without if in line %d", lineno); - return -1; - } - state[level] = !state[level]; - continue; - } - - /* - * elseif - */ - if (!assgn && strcmp(parm, "elseif") == 0) { - if (level <= 0) { - error("elseif without if in line %d", lineno); - return -1; - } - if (state[level] != 0) { - /* - * We have already found a TRUE - * if statement in this "chain". - * That's what "2" means. - */ - state[level] = 2; - continue; - } - /* else: No TRUE if has been found, cheat */ - /* - * The "if" handling increments level, - * but this is the _same_ level as before. - * So, compensate for it. - */ - --level; - parm = "if"; - /* Fallthru to "if" */ - } - - /* - * if - */ - if (strcmp(parm, "if") == 0) { - char *cmp; - int not = 0; - int numeric = 0; - - if (level >= MAX_LEVEL) { - error("Too many nested if's in line %d\n", lineno); - return -1; - } - state[++level] = 0; /* default false */ - - if (*arg == '!') { - not = 1; - arg = next_word(arg); - } - - if (strncmp(arg, "-k", 2) == 0) { - state[level] = flag_autoclean; - continue; - } - - if (strncmp(arg, "-f", 2) == 0) { - char *file = next_word(arg); - meta_expand(file, &g, NULL, version, ME_ALL); - if (access(g.pathc ? g.pathv[0] : file, R_OK) == 0) - state[level] = !not; - else - state[level] = not; - continue; - } - - if (strncmp(arg, "-n", 2) == 0) { - numeric = 1; - arg = next_word(arg); - } - - - cmp = next_word(arg); - if (*cmp) { - GLOB_LIST g2; - long n1 = 0; - long n2 = 0; - char *w1 = ""; - char *w2 = ""; - - arg2 = next_word(cmp); - - meta_expand(arg, &g, NULL, version, ME_ALL); - if (g.pathc && g.pathv[0]) - w1 = g.pathv[0]; - - meta_expand(arg2, &g2, NULL, version, ME_ALL); - if (g2.pathc && g2.pathv[0]) - w2 = g2.pathv[0]; - - if (numeric) { - n1 = strtol(w1, NULL, 0); - n2 = strtol(w2, NULL, 0); - } - - if (strcmp(cmp, "==") == 0 || - strcmp(cmp, "=") == 0) { - if (numeric) - state[level] = (n1 == n2); - else - state[level] = strcmp(w1, w2) == 0; - } else if (strcmp(cmp, "!=") == 0) { - if (numeric) - state[level] = (n1 != n2); - else - state[level] = strcmp(w1, w2) != 0; - } else if (strcmp(cmp, ">=") == 0) { - if (numeric) - state[level] = (n1 >= n2); - else - state[level] = strcmp(w1, w2) >= 0; - } else if (strcmp(cmp, "<=") == 0) { - if (numeric) - state[level] = (n1 <= n2); - else - state[level] = strcmp(w1, w2) <= 0; - } else if (strcmp(cmp, ">") == 0) { - if (numeric) - state[level] = (n1 > n2); - else - state[level] = strcmp(w1, w2) > 0; - } else if (strcmp(cmp, "<") == 0) { - if (numeric) - state[level] = (n1 < n2); - else - state[level] = strcmp(w1, w2) < 0; - } - } else { /* Check defined value, if any */ - /* undef or defined as - * "" or "0" or "false" => false - * defined => true - */ - if (!meta_expand(arg, &g, NULL, version, ME_ALL) && - g.pathc > 0 && - strcmp(g.pathv[0], "0") != 0 && - strcmp(g.pathv[0], "false") != 0 && - strlen(g.pathv[0]) != 0) - state[level] = 1; /* true */ - } - if (not) - state[level] = !state[level]; - - continue; - } - - /* - * Should we bother? - */ - if (state[level] != 1) - continue; - - /* - * define - */ - if (!assgn && strcmp(parm, "define") == 0) { - char env[PATH_MAX]; - - arg2 = next_word(arg); - meta_expand(arg2, &g, NULL, version, ME_ALL); - snprintf(env, sizeof(env), "%s=%s", arg, (g.pathc ? g.pathv[0] : "")); - putenv(env); - one_err = 0; - } - - /* - * include - */ - if (!assgn && strcmp(parm, "include") == 0) { - meta_expand(arg, &g, NULL, version, ME_ALL); - - if (!do_read(all, version, base_dir, g.pathc ? g.pathv[0] : arg, depth+1)) - one_err = 0; - else - error("include %s failed\n", arg); - } - - /* - * above - */ - else if (all && !assgn && strcmp(parm, "above") == 0) { - decode_list(&n_abovelist, &abovelist, arg, adding, version, 0); - one_err = 0; - } - - /* - * below - */ - else if (all && !assgn && strcmp(parm, "below") == 0) { - decode_list(&n_belowlist, &belowlist, arg, adding, version, 0); - one_err = 0; - } - - /* - * prune - */ - else if (all && !assgn && strcmp(parm, "prune") == 0) { - decode_list(&n_prunelist, &prunelist, arg, adding, version, 0); - one_err = 0; - } - - /* - * probe - */ - else if (all && !assgn && strcmp(parm, "probe") == 0) { - decode_list(&n_probe_list, &probe_list, arg, adding, version, 0); - one_err = 0; - } - - /* - * probeall - */ - else if (all && !assgn && strcmp(parm, "probeall") == 0) { - decode_list(&n_probeall_list, &probeall_list, arg, adding, version, 0); - one_err = 0; - } - - /* - * options - */ - else if (all && !assgn && strcmp(parm, "options") == 0) { - decode_list(&n_opt_list, &opt_list, arg, adding, version, 1); - one_err = 0; - } - - /* - * alias - */ - else if (all && !assgn && strcmp(parm, "alias") == 0) { - /* - * Replace any previous (default) definitions - * for the same module - */ - decode_list(&n_aliases, &aliases, arg, 0, version, 0); - one_err = 0; - } - - /* - * Specification: /etc/modules.conf - * The format of the commands in /etc/modules.conf are: - * - * pre-install module command - * install module command - * post-install module command - * pre-remove module command - * remove module command - * post-remove module command - * - * The different words are separated by tabs or spaces. - */ - /* - * pre-install - */ - else if (all && !assgn && (strcmp(parm, "pre-install") == 0)) { - decode_exec(arg, EXEC_PRE_INSTALL); - one_err = 0; - } - - /* - * install - */ - else if (all && !assgn && (strcmp(parm, "install") == 0)) { - decode_exec(arg, EXEC_INSTALL); - one_err = 0; - } - - /* - * post-install - */ - else if (all && !assgn && (strcmp(parm, "post-install") == 0)) { - decode_exec(arg, EXEC_POST_INSTALL); - one_err = 0; - } - - /* - * pre-remove - */ - else if (all && !assgn && (strcmp(parm, "pre-remove") == 0)) { - decode_exec(arg, EXEC_PRE_REMOVE); - one_err = 0; - } - - /* - * remove - */ - else if (all && !assgn && (strcmp(parm, "remove") == 0)) { - decode_exec(arg, EXEC_REMOVE); - one_err = 0; - } - - /* - * post-remove - */ - else if (all && !assgn && (strcmp(parm, "post-remove") == 0)) { - decode_exec(arg, EXEC_POST_REMOVE); - one_err = 0; - } - - /* - * insmod_opt= - */ - else if (assgn && (strcmp(parm, "insmod_opt") == 0)) { - insmod_opt = xstrdup(arg); - one_err = 0; - } - - /* - * keep - */ - else if (!assgn && (strcmp(parm, "keep") == 0)) { - drop_default_paths = 0; - one_err = 0; - } - - /* - * path...= - */ - else if (assgn && strncmp(parm, "path", 4) == 0) { - /* - * Specification: config file / path parameter - * The path parameter specifies a directory to - * search for modules. - * This parameter may be repeated multiple times. - * - * Note that the actual path may be defined using - * wildcards and other shell meta-chars, such as "*?`". - * For example: - * path[misc]=/lib/modules/1.1.5?/misc - * - * Optionally the path keyword carries a tag. - * This tells us a little more about the purpose of - * this directory and allows some automated operations. - * A path is marked with a tag by adding the tag, - * enclosed in square brackets, to the path keyword: - * # - * path[boot]=/lib/modules/boot - * # - * This case identifies the path a of directory - * holding modules loadable a boot time. - */ - - if (drop_default_paths) { - int n; - - /* - * Specification: config file / path / default - * - * Whenever there is a path[] specification - * in the config file, all the default - * path are reset. - * - * If one instead wants to _add_ to the default - * set of paths, one has to have the option - * keep - * before the first path[]-specification line - * in the configuration file. - */ - drop_default_paths = 0; - for (n = 0; n < nmodpath; n++) { - free(modpath[n].path); - free(modpath[n].type); - } - nmodpath = 0; - } - - /* - * Get (the optional) tag - * If the tag is missing, the word "misc" - * is assumed. - */ - type = "misc"; - - if (parm[4] == '[') { - char *pt_type = parm + 5; - - while (*pt_type != '\0' && *pt_type != ']') - pt_type++; - - if (*pt_type == ']' && pt_type[1] == '\0') { - *pt_type = '\0'; - type = parm + 5; - } /* else CHECKME */ - } - - /* - * Handle the actual path description - */ - if (meta_expand(arg, &g, base_dir, version, ME_ALL)) - return -1; - for (glb = g.pathv; glb && *glb; ++glb) { - modpath[nmodpath].type = xstrdup(type); - modpath[nmodpath].path = *glb; - if (++nmodpath >= maxpath) { - maxpath += 100; - modpath = (struct PATH_TYPE *)xrealloc(modpath, - maxpath * sizeof(struct PATH_TYPE)); - } - } - one_err = 0; - } - - /* - * persistdir - */ - else if (assgn && strcmp(parm, "persistdir") == 0) { - meta_expand(arg, &g, NULL, version, ME_ALL); - persistdir = xstrdup(g.pathc ? g.pathv[0] : arg); - one_err = 0; - } - - /* Names for generated files in config file */ - for (i = 0; one_err && i < gen_file_count; ++i) - one_err = gen_file_conf(gen_file+i, assgn, parm, arg); - - /* - * any errors so far? - */ - if (all == 0) - one_err = 0; - else if (one_err) { - error("Invalid line %d in %s\n\t%s", - lineno, conf_file, buf); - ret = -1; - } - } - if (fin) - fclose(fin); - - if (level) { - error("missing endif at %s EOF", conf_file); - ret = -1; - } - - if (ret) - return ret; - /* else */ - - /* Check we have names for generated files */ - for (i = 0; !ret && i < gen_file_count; ++i) - ret = gen_file_check(gen_file+i, &g, base_dir, version); - - return ret; -} - -int config_read(int all, char *force_ver, char *base_dir, char *conf_file) -{ - int r; - if (modpath != NULL) - return 0; /* already initialized */ - - if (uname(&uts_info) < 0) { - error("Failed to find kernel name information"); - return -1; - } - - r = do_read(all, force_ver, base_dir, conf_file, 0); - - if (quick && !r && !need_update (force_ver, base_dir)) - exit (0); - - return r; -} - -/****************************************************************************/ -/* - * FIXME: Far too much global state. KAO. - */ -static int found; -static int favail; -static int one_only; -static int meta_expand_type; -char **list; -static const char *filter_by_file; -static char *filter_by_dir; - -/* - * Add a file name if it exist - */ -static int config_add(const char *file, const struct stat *sb) -{ - int i; - int npaths = 0; - char **paths = NULL; - - if (meta_expand_type) { - GLOB_LIST g; - char **p; - char full[PATH_MAX]; - - snprintf(full, sizeof(full), "%s/%s", file, filter_by_file); - - if (filter_by_dir && !strstr(full, filter_by_dir)) - return 0; - - if (meta_expand(full, &g, NULL, config_version, meta_expand_type)) - return 1; - for (p = g.pathv; p && *p; ++p) { - paths = (char **)xrealloc(paths, - (npaths + 1) * sizeof(char *)); - paths[npaths++] = *p; - } - } else { /* normal path match or match with "*" */ - if (!S_ISREG(sb->st_mode)) - return 0; - - if (strcmp(filter_by_file, "*")) { - char *p; - - if ((p = strrchr(file, '/')) == NULL) - p = (char *)file; - else - p += 1; - - if (strcmp(p, filter_by_file)) - return 0; - } - if (filter_by_dir && !strstr(file, filter_by_dir)) - return 0; - paths = (char **)xmalloc(sizeof(char **)); - *paths = xstrdup(file); - npaths = 1; - } - - for (i = 0; i < npaths; ++i) { - struct stat sbuf; - - if (S_ISDIR(sb->st_mode)) { - if (stat(paths[i], &sbuf) == 0) - sb = &sbuf; - } - if (S_ISREG(sb->st_mode) && sb->st_mode & S_IRUSR) { - int j; - char **this; - - if (!root_check_off) { - if (sb->st_uid != 0) { - error("%s is not owned by root", paths[i]); - continue; - } - } - - /* avoid duplicates */ - for (j = 0, this = list; j < found; ++j, ++this) { - if (strcmp(*this, paths[i]) == 0) { - free(paths[i]); - goto next; - } - } - - list[found] = paths[i]; - if (++found >= favail) - list = (char **)xrealloc(list, - (favail += 100) * sizeof(char *)); - - if (one_only) { - for (j = i + 1; j < npaths; ++j) - free(paths[j]); - free(paths); - return 1; /* finish xftw */ - } - } - next: - } - - if (npaths > 0) - free(paths); - - return 0; -} - -/* - * Find modules matching the name "match" in directory of type "type" - * (type == NULL matches all) - * - * Return a pointer to the list of modules found (or NULL if error). - * Update the counter (sent as parameter). - */ -GLOB_LIST *config_lstmod(const char *match, const char *type, int first_only) -{ - /* - * Note: - * There are _no_ wildcards remaining in the path descriptions! - */ - struct stat sb; - int i; - int ret = 0; - char *path = NULL; - char this[PATH_MAX]; - - if (!match) - match = "*"; - one_only = first_only; - found = 0; - filter_by_file = match; - filter_by_dir = NULL; - if (type) { - char tmpdir[PATH_MAX]; - snprintf(tmpdir, sizeof(tmpdir), "/%s/", type); - filter_by_dir = xstrdup(tmpdir); - } - /* In safe mode, the module name is always handled as is, without meta - * expansion. It might have come from an end user via kmod and must - * not be trusted. Even in unsafe mode, only apply globbing to the - * module name, not command expansion. We trust config file input so - * applying command expansion is safe, we do not trust command line input. - * This assumes that the only time the user can specify -C config file - * is when they run under their own authority. In particular all - * mechanisms that call modprobe as root on behalf of the user must - * run in safe mode, without letting the user supply a config filename. - */ - meta_expand_type = 0; - if (strpbrk(match, SHELL_META) && strcmp(match, "*") && !safemode) - meta_expand_type = ME_GLOB|ME_BUILTIN_COMMAND; - - list = (char **)xmalloc((favail = 100) * sizeof(char *)); - - for (i = 0; i < nmodpath; i++) { - path = modpath[i].path; - /* Special case: insmod: handle single, non-wildcard match */ - if (first_only && strpbrk(match, SHELL_META) == NULL) { - /* Fix for "2.1.121 syntax */ - snprintf(this, sizeof(this), "%s/%s/%s", path, - modpath[i].type, match); - if (stat(this, &sb) == 0 && - config_add(this, &sb)) - break; - /* End fix for "2.1.121 syntax */ - - snprintf(this, sizeof(this), "%s/%s", path, match); - if (stat(this, &sb) == 0 && - config_add(this, &sb)) - break; - } - - /* Start looking */ - if ((ret = xftw(path, config_add))) { - break; - } - } - if (ret >= 0) { - GLOB_LIST *g = (GLOB_LIST *)xmalloc(sizeof(GLOB_LIST)); - g->pathc = found; - g->pathv = list; - free(filter_by_dir); - return g; - } - free(list); - free(filter_by_dir); - return NULL; -} - -/* Given a bare module name, poke through the module path to find the file. */ -char *search_module_path(const char *base) -{ - GLOB_LIST *g; - - if (config_read(0, NULL, "", NULL) < 0) - return NULL; - /* else */ - g = config_lstmod(base, NULL, 1); - if (g == NULL || g->pathc == 0) { - char base_o[PATH_MAX]; - - snprintf(base_o, sizeof(base_o), "%s.o", base); - g = config_lstmod(base_o, NULL, 1); -#ifdef CONFIG_USE_ZLIB - if (g == NULL || g->pathc == 0) { - snprintf(base_o, sizeof(base_o), "%s.o.gz", base); - g = config_lstmod(base_o, NULL, 1); - } -#endif - } - if (g == NULL || g->pathc == 0) - return NULL; - /* else */ - return g->pathv[0]; -} diff --git a/mdk-stage1/insmod-modutils/util/gzfiles.c b/mdk-stage1/insmod-modutils/util/gzfiles.c deleted file mode 100644 index 8d02253bb..000000000 --- a/mdk-stage1/insmod-modutils/util/gzfiles.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * This simple library intends to make it transparent to read gzipped and/or - * standard files. This is simple enough to fit modutils' needs, but may be - * easily adapted to anyone's needs. It's completely free, do what you want - * with it . - Willy Tarreau - 2000/05/05 - - */ - -#ifdef CONFIG_USE_ZLIB - -#include -#include -#include -#include -#include - -/* redefinition of gz_stream which isn't exported by zlib */ -typedef struct gz_stream { - z_stream stream; - int z_err; /* error code for last stream operation */ - int z_eof; /* set if end of input file */ - FILE *file; /* .gz file */ - Byte *inbuf; /* input buffer */ - Byte *outbuf; /* output buffer */ - uLong crc; /* crc32 of uncompressed data */ - char *msg; /* error message */ - char *path; /* path name for debugging only */ - int transparent; /* 1 if input file is not a .gz file */ - char mode; /* 'w' or 'r' */ - long startpos; /* start of compressed data in file (header skipped) */ -} gz_stream; - -/* maximum number of simultaneous open files, also greater file descriptor number */ -#define MAXFD 64 - -/* this static list is assumed to be filled with NULLs at runtime */ -static gzFile gzf_fds[MAXFD]; - -/* returns the filedesc of the opened file. */ -int gzf_open(const char *name, int mode) { - int fd; - gzFile g; - - if ((g=gzopen(name, "rb")) != NULL) { - fd=fileno(((gz_stream*)g)->file); - gzf_fds[fd]=g; - } - else if ((fd=open(name, mode)) != -1) { - gzf_fds[fd]=NULL; /* NULL means not GZ mode */ - } - return fd; -} - -off_t gzf_lseek(int fd, off_t offset, int whence) { - if (fd<0 || fd>=MAXFD || gzf_fds[fd]==NULL) - return lseek(fd, offset, whence); - else - return gzseek(gzf_fds[fd], offset, whence); -} - -int gzf_read(int fd, void *buf, size_t count) { - if (fd<0 || fd>=MAXFD || gzf_fds[fd]==NULL) - return read(fd, buf, count); - else - return gzread(gzf_fds[fd], buf, count); -} - -void gzf_close(int fd) { - if (fd<0 || fd>=MAXFD || gzf_fds[fd]==NULL) - close(fd); - else - gzclose(gzf_fds[fd]); -} -#endif - diff --git a/mdk-stage1/insmod-modutils/util/logger.c b/mdk-stage1/insmod-modutils/util/logger.c deleted file mode 100644 index 3b790df5a..000000000 --- a/mdk-stage1/insmod-modutils/util/logger.c +++ /dev/null @@ -1,163 +0,0 @@ -/* Error logging facilities. - Copyright 1996, 1997 Linux International. - - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ident "$Id$" - -#include -#include -#include -#include -#include - -#include "util.h" - -/*======================================================================*/ - -int errors; -const char *error_file; -int log; - -#define STOREMSG -#ifdef STOREMSG -struct cbuf { - struct cbuf *next; - int type; - char *msg; -} *head, *tail; - -static void savemsg(int type, char *msg) -{ - struct cbuf *me = (struct cbuf *)xmalloc(sizeof(struct cbuf)); - char *s = xstrdup(msg); - - me->next = NULL; - me->type = type; - me->msg = s; - - if (tail) - tail->next = me; - else - head = me; - tail = me; -} - -#endif /* STOREMSG */ - -static void dumpmsg(void) -{ - for (;head; head = head->next) - syslog(head->type, "%s", head->msg); -} - -void setsyslog(const char *program) -{ - openlog(program, LOG_CONS, LOG_DAEMON); -#ifdef STOREMSG - atexit(dumpmsg); -#endif - log = 1; -} - - - -#ifdef _STANDALONE_ -static int silent; - -const char *program_name; - -void error(const char *fmt,...) -{ - va_list args; - - if (silent) - ; - else if (log) { - char buf[1024]; - int n; - - if (error_file) - n = snprintf(buf, sizeof(buf), "%s: ", error_file); - else - n = 0; - va_start(args, fmt); - vsnprintf(buf + n, sizeof(buf) - n, fmt, args); - va_end(args); -#ifdef STOREMSG - savemsg(LOG_ERR, buf); -#else - syslog(LOG_ERR, "%s", buf); -#endif - } else { - if (error_file) - fprintf(stderr, "%s: ", error_file); - va_start(args, fmt); - vfprintf(stderr, fmt, args); - va_end(args); - putc('\n', stderr); - } - - errors++; -} - -void lprintf(const char *fmt,...) -{ - va_list args; - - if (silent); - else if (log) { - char buf[1024]; - va_start(args, fmt); - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); -#ifdef STOREMSG - savemsg(LOG_INFO, buf); -#else - syslog(LOG_INFO, "%s", buf); -#endif - } else { - va_start(args, fmt); - vfprintf(stdout, fmt, args); - va_end(args); - putchar('\n'); - } -} - -#else /* _STANDALONE_ */ -#include "../../log.h" -void error(const char *s, ...) -{ - va_list p; - - va_start(p, s); - vlog_message(s, p); - va_end(p); -} - -void lprintf(const char *s, ...) -{ - va_list p; - - va_start(p, s); - vlog_message(s, p); - va_end(p); -} -#endif diff --git a/mdk-stage1/insmod-modutils/util/meta_expand.c b/mdk-stage1/insmod-modutils/util/meta_expand.c deleted file mode 100644 index 41fb4024c..000000000 --- a/mdk-stage1/insmod-modutils/util/meta_expand.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * Handle expansion of meta charaters - * - * Copyright 1999 Björn Ekwall - * - * "kernelversion" idea from the Debian release via: - * Wichert Akkerman - * - * Use wordexp(): idea from Tim Waugh - * - * Alpha typecast: Michal Jaegermann - * - * This file is part of the Linux modutils. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_WORDEXP -#undef HAVE_WORDEXP -#define HAVE_WORDEXP 0 -#endif - -#include -#include -#include -#include -#include -#if HAVE_WORDEXP -#include -#elif HAVE_GLOB -#include -#endif -#include "util.h" - -/* - * Split into words delimited by whitespace, - * handle remaining quotes though... - * If strip_quotes != 0 then strip one level of quotes from the line. - */ -static void split_line(GLOB_LIST *g, char *line, int strip_quotes) -{ - int len; - char *d; - char *e; - char *p; - char tmpline[PATH_MAX]; - - for (p = line; *p; p = e) { - /* Skip leading whitespace */ - while (*p && isspace(*p)) - ++p; - - /* find end of word */ - d = tmpline; - for (e = p; *e && !(isspace(*e)); ++e) { - char match; - - /* Quote handling */ - switch (*e) { - case '\\': - if (!strip_quotes) - *d++ = *e; - break; - - case '"': - case '\'': - match = *e; - if (!strip_quotes) - *d++ = *e; - for (++e; *e && *e != match; ++e) { - *d++ = *e; - if (*e == '\\' && *(e + 1) == match) - *d++ = *++e; - } - if (!strip_quotes) - *d++ = *e; - break; - - default: - *d++ = *e; - break; - } - } - - if ((len = (int)(d - tmpline)) > 0) { - char *str = xmalloc(len + 1); - strncpy(str, tmpline, len); - str[len] = '\0'; - g->pathv = (char **)xrealloc(g->pathv, - (g->pathc + 2) * sizeof(char *)); - g->pathv[g->pathc++] = str; - } - } - - if (g->pathc) - g->pathv[g->pathc] = NULL; -} - -static int glob_it(char *pt, GLOB_LIST *g) -{ -#if HAVE_WORDEXP - wordexp_t w; - - memset(&w, 0, sizeof(w)); - if (wordexp(pt, &w, WRDE_UNDEF)) { - /* - error("wordexp %s failed", pt); - */ - return -1; - } - /* else */ - g->pathc = w.we_wordc; - g->pathv = w.we_wordv; - - return 0; -#elif HAVE_GLOB /* but not wordexp */ - glob_t w; - - memset(&w, 0, sizeof(w)); - if (glob(pt, GLOB_NOSORT, NULL, &w)) { - /* - error("glob %s failed", pt); - */ - return -1; - } - /* else */ - if (w.gl_pathc && strpbrk(w.gl_pathv[0], SHELL_META)) { - globfree(&w); - return -1; - } - g->pathc = w.gl_pathc; - g->pathv = w.gl_pathv; - - return 0; -#else /* Neither wordexp nor glob */ - return -1; -#endif -} - -/* - * Expand the string (including meta-character) to a list of matches - * - * Return 0 if OK else -1 - */ -int meta_expand(char *pt, GLOB_LIST *g, char *base_dir, char *version, int type) -{ - FILE *fin; - int len = 0; - char *line = NULL; - char *p, *p1; - char tmpline[PATH_MAX + 1]; - char wrk[sizeof(tmpline)]; - char tmpcmd[2*sizeof(tmpline)+20]; /* room for /bin/echo "text" */ - - g->pathc = 0; - g->pathv = NULL; - - /* - * Take care of version dependent expansions - * Needed for forced version handling - */ - if ((p = strchr(pt, '`')) != NULL && (type & ME_BUILTIN_COMMAND)) { - do { - char *s; - - for (s = p + 1; isspace(*s); ++s) - ; - - if (strncmp(s, "uname -r", 8) == 0) { - while (*s && (*s != '`')) - ++s; - if (*s == '`') { - *p = '\0'; - snprintf(wrk, sizeof(wrk), "%s%s%s", - pt, - version, - s + 1); - *p = '`'; - } - strcpy(tmpline, wrk); /* safe, same size */ - pt = tmpline; - } else if (strncmp(s, "kernelversion", 13) == 0) { - while (*s && (*s != '`')) - ++s; - if (*s == '`') { - int n; - char *k; - - *p = '\0'; - for (n = 0, k = version; *k; ++k) { - if (*k == '.' && ++n == 2) - break; - } - snprintf(wrk, sizeof(wrk), "%s%.*s%s", - pt, - /* typecast for Alpha */ - (int)(k - version), - version, - s + 1); - *p = '`'; - strcpy(tmpline, wrk); /* safe, same size */ - pt = tmpline; - } - } else - break; - } while ((p = strchr(pt, '`')) != NULL); - } - - /* - * Any remaining meta-chars? - */ - if (strpbrk(pt, SHELL_META) == NULL) { - /* - * No meta-chars. - * Split into words, delimited by whitespace. - */ - snprintf(wrk, sizeof(wrk), "%s%s", (base_dir ? base_dir : ""), pt); - strcpy(tmpline, wrk); /* safe, same size */ - if ((p = strtok(tmpline, " \t\n")) != NULL) { - while (p) { - g->pathv = (char **)xrealloc(g->pathv, - (g->pathc + 2) * sizeof(char *)); - g->pathv[g->pathc++] = xstrdup(p); - p = strtok(NULL, " \t\n"); - } - } - if (g->pathc) - g->pathv[g->pathc] = NULL; - return 0; - } - /* else */ - /* - * Handle remaining meta-chars - */ - - /* - * Just plain quotes? - */ - if (strpbrk(pt, "&();|<>$`!{}[]~=+:?*") == NULL && - (p = strpbrk(pt, "\"'\\"))) { - split_line(g, pt, 1); - return 0; - } - - if (strpbrk(pt, "&();|<>$`\"'\\!{}~+:[]~?*") == NULL) { - /* Only "=" remaining, should be module options */ - split_line(g, pt, 0); - return 0; - } - - /* - * If there are meta-characters and - * if they are only shell glob meta-characters: do globbing - */ -#if HAVE_WORDEXP - if (strpbrk(pt, "&();|<>`\"'\\!{}~=+:") == NULL && - strpbrk(pt, "$[]~?*")) -#else - if (strpbrk(pt, "&();|<>$`\"'\\!{}~=+:") == NULL && - strpbrk(pt, "[]~?*")) -#endif - if ((type & ME_GLOB) && glob_it(pt, g) == 0) - return 0; - - if (strpbrk(pt, "&();|<>$`\"'\\!{}~+:[]~?*") == NULL) { - /* Only "=" remaining, should be module options */ - split_line(g, pt, 0); - return 0; - } - - /* - * Last resort: Use "echo". - * DANGER: Applying shell expansion to user supplied input is a - * major security risk. Modutils code should only do meta - * expansion via shell commands for trusted data. Basically - * this means only for data in the config file. Even that - * assumes that the user cannot run modprobe as root with - * their own config file. Programs (including the kernel) - * that invoke modprobe as root with user supplied input must - * pass exactly one user supplied parameter and must set - * safe mode. - */ - if (!(type & ME_SHELL_COMMAND)) - return 0; - snprintf(wrk, sizeof(wrk), "%s%s", (base_dir ? base_dir : ""), pt); - strcpy(tmpline, wrk); /* safe, same size */ - snprintf(tmpcmd, sizeof(tmpcmd), "/bin/echo \""); - for (p = tmpline, p1 = tmpcmd + strlen(tmpcmd); *p; ++p, ++p1) { - if (*p == '"' || *p == '\\') - *p1++ = '\\'; - *p1 = *p; - } - *p1++ = '"'; - *p1++ = '\0'; - if (p1 - tmpcmd > sizeof(tmpcmd)) { - error("tmpcmd overflow, should never happen"); - exit(1); - } - if ((fin = popen(tmpcmd, "r")) == NULL) { - error("Can't execute: %s", tmpcmd); - return -1; - } - /* else */ - - /* - * Collect the result - */ - while (fgets(tmpcmd, PATH_MAX, fin) != NULL) { - int l = strlen(tmpcmd); - - line = (char *)xrealloc(line, len + l + 1); - line[len] = '\0'; - strcat(line + len, tmpcmd); /* safe, realloc */ - len += l; - } - pclose(fin); - - if (line) { - /* shell used to strip one set of quotes. Paranoia code in - * 2.3.20 stops that strip so we do it ourselves. - */ - split_line(g, line, 1); - free(line); - } - - return 0; -} diff --git a/mdk-stage1/insmod-modutils/util/modstat.c b/mdk-stage1/insmod-modutils/util/modstat.c deleted file mode 100644 index ad82306c0..000000000 --- a/mdk-stage1/insmod-modutils/util/modstat.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Get kernel symbol table(s) and other relevant module info. - * - * Add module_name_list and l_module_name_list. - * Keith Owens November 1999. - * Björn Ekwall in February 1999 (C) - * Initial work contributed by Richard Henderson - * - * This file is part of the Linux modutils. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "util.h" -#include "module.h" -#include "obj.h" -#include "modstat.h" - -struct module_stat *module_stat; -size_t n_module_stat; -char *module_name_list; -size_t l_module_name_list; -struct module_symbol *ksyms; -size_t nksyms; -int k_new_syscalls; - -static void *old_kernsym; - -/************************************************************************/ -static void drop(void) -{ - /* - * Clean the slate for multiple runs - */ - if (module_stat) { - struct module_stat *m; - int i; - - for (i = 0, m = module_stat; i < n_module_stat; ++i, ++m) { - if (m->syms) - free(m->syms); - if (m->refs) - free(m->refs); - } - free(module_stat); - module_stat = NULL; - n_module_stat = 0; - } - if (module_name_list) { - free(module_name_list); - module_name_list = NULL; - l_module_name_list = 0; - } - if (ksyms) { - free(ksyms); - ksyms = NULL; - nksyms = 0; - } - if (old_kernsym) { - free(old_kernsym); - old_kernsym = NULL; - } -} - -static int new_get_kernel_info(int type) -{ - struct module_stat *modules; - struct module_stat *m; - struct module_symbol *syms; - struct module_symbol *s; - size_t ret; - size_t bufsize; - size_t nmod; - size_t nsyms; - size_t i; - size_t j; - char *module_names; - char *mn; - - drop(); - - /* - * Collect the loaded modules - */ - module_names = xmalloc(bufsize = 256); - while (query_module(NULL, QM_MODULES, module_names, bufsize, &ret)) { - if (errno != ENOSPC) { - error("QM_MODULES: %m\n"); - return 0; - } - module_names = xrealloc(module_names, bufsize = ret); - } - module_name_list = module_names; - l_module_name_list = bufsize; - n_module_stat = nmod = ret; - module_stat = modules = xmalloc(nmod * sizeof(struct module_stat)); - memset(modules, 0, nmod * sizeof(struct module_stat)); - - /* Collect the info from the modules */ - for (i = 0, mn = module_names, m = modules; - i < nmod; - ++i, ++m, mn += strlen(mn) + 1) { - struct module_info info; - - m->name = mn; - if (query_module(mn, QM_INFO, &info, sizeof(info), &ret)) { - if (errno == ENOENT) { - /* The module was removed out from underneath us. */ - m->flags = NEW_MOD_DELETED; - continue; - } - /* else oops */ - error("module %s: QM_INFO: %m", mn); - return 0; - } - - m->addr = info.addr; - - if (type & K_INFO) { - m->size = info.size; - m->flags = info.flags; - m->usecount = info.usecount; - m->modstruct = info.addr; - } - - if (type & K_REFS) { - int mm; - char *mrefs; - char *mr; - - mrefs = xmalloc(bufsize = 64); - while (query_module(mn, QM_REFS, mrefs, bufsize, &ret)) { - if (errno != ENOSPC) { - error("QM_REFS: %m"); - return 1; - } - mrefs = xrealloc(mrefs, bufsize = ret); - } - for (j = 0, mr = mrefs; - j < ret; - ++j, mr += strlen(mr) + 1) { - for (mm = 0; mm < i; ++mm) { - if (strcmp(mr, module_stat[mm].name) == 0) { - m->nrefs += 1; - m->refs = xrealloc(m->refs, m->nrefs * sizeof(struct module_stat **)); - m->refs[m->nrefs - 1] = module_stat + mm; - break; - } - } - } - free(mrefs); - } - - if (type & K_SYMBOLS) { /* Want info about symbols */ - syms = xmalloc(bufsize = 1024); - while (query_module(mn, QM_SYMBOLS, syms, bufsize, &ret)) { - if (errno == ENOSPC) { - syms = xrealloc(syms, bufsize = ret); - continue; - } - if (errno == ENOENT) { - /* - * The module was removed out - * from underneath us. - */ - m->flags = NEW_MOD_DELETED; - free(syms); - goto next; - } else { - error("module %s: QM_SYMBOLS: %m", mn); - return 0; - } - } - nsyms = ret; - - m->nsyms = nsyms; - m->syms = syms; - - /* Convert string offsets to string pointers */ - for (j = 0, s = syms; j < nsyms; ++j, ++s) - s->name += (unsigned long) syms; - } - next: - } - - if (type & K_SYMBOLS) { /* Want info about symbols */ - /* Collect the kernel's symbols. */ - syms = xmalloc(bufsize = 16 * 1024); - while (query_module(NULL, QM_SYMBOLS, syms, bufsize, &ret)) { - if (errno != ENOSPC) { - error("kernel: QM_SYMBOLS: %m"); - return 0; - } - syms = xrealloc(syms, bufsize = ret); - } - nksyms = nsyms = ret; - ksyms = syms; - - /* Convert string offsets to string pointers */ - for (j = 0, s = syms; j < nsyms; ++j, ++s) - s->name += (unsigned long) syms; - } - - return 1; -} - -#ifdef COMPAT_2_0 -/************************************************************************/ - -#define mscan(offs,siz,ptr) \ - if (lseek(kmem_fd, (off_t)(offs), SEEK_SET) == -1 || \ - read(kmem_fd, (ptr), (siz)) != (siz)) { \ - if (kmem_fd != -1) \ - close(kmem_fd); \ - error("kmem: %m"); \ - return 0; \ - } - -#define OLD_MOD_RUNNING 1 -#define OLD_MOD_DELETED 2 -#define OLD_MOD_VISITED 0x20000000 - -/* Fetch all the symbols and divvy them up as appropriate for the modules. */ -static int old_get_kernel_info(int type) -{ - struct old_kernel_sym *kernsym; - struct old_kernel_sym *k; - struct module_stat *module; - struct module_stat *mod; - struct module_symbol *s = NULL; - int kmem_fd = -1; - int nkernsym; - int nmod; - int nm; - int nms; - int i; - - drop(); - module_name_list = xmalloc(1); - *module_name_list = '\0'; - - if ((nkernsym = get_kernel_syms(NULL)) < 0) { - error("get_kernel_syms: %m"); - return 0; - } - kernsym = k = xmalloc(nkernsym * sizeof(struct old_kernel_sym)); - old_kernsym = kernsym; - if (get_kernel_syms(kernsym) != nkernsym) { - error("inconsistency with get_kernel_syms -- is someone else " - "playing with modules?"); - free(kernsym); - return 0; - } - - /* Number of modules */ - for (k = kernsym, nmod = 0, i = 0; i < nkernsym; ++i, ++k) { - if (k->name[0] == '#') { - if (k->name[1]) { - ++nmod; - i = strlen(k->name+1) + 1; - module_name_list = - xrealloc(module_name_list, - l_module_name_list + i); - strcpy(module_name_list+l_module_name_list, /* safe, xrealloc */ - k->name+1); - l_module_name_list += i; /* NUL separated strings */ - } - else - break; - } - } - module_stat = mod = module = xmalloc(nmod * sizeof(struct module_stat)); - memset(module, 0, nmod * sizeof(struct module_stat)); - n_module_stat = nmod; - - /* - * Will we need kernel internal info? - */ - if ((type & K_INFO) || (type & K_REFS)) { - if ((kmem_fd = open("/dev/kmem", O_RDONLY)) < 0) { - perror("ksyms: open /dev/kmem"); - return 0; - } - } - - /* - * Collect the module information. - */ - for (k = kernsym, nm = 0, i = 0; i < nkernsym; ++i, ++k) { - if (k->name[0] == '#') { - struct old_kernel_sym *p; - struct old_module info; - - if (k->name[1] == '\0') - break; /* kernel resident symbols follow */ - /* else normal module */ - - module = mod++; - ++nm; - module->name = k->name + 1; - module->modstruct = k->value; - - if ((type & K_INFO) || (type & K_REFS)) { - long tmp; - /* - * k->value is the address of the - * struct old_module - * in the kernel (for use via /dev/kmem) - */ - mscan(k->value, sizeof(info), &info); - module->addr = info.addr; - module->size = info.size * getpagesize(); - - mscan(info.addr, sizeof(long), &tmp); - module->flags = info.state & - (OLD_MOD_RUNNING | OLD_MOD_DELETED); - module->flags |= NEW_MOD_USED_ONCE; /* Cheat */ - if (tmp & OLD_MOD_AUTOCLEAN) - module->flags |= NEW_MOD_AUTOCLEAN; - if (tmp & OLD_MOD_VISITED) - module->flags |= NEW_MOD_VISITED; - - module->usecount = tmp & ~(OLD_MOD_AUTOCLEAN | OLD_MOD_VISITED); - } - - if ((type & K_REFS) && info.ref) { - struct old_module_ref mr; - int j; - unsigned long ref = info.ref; - - do { - mscan(ref, sizeof(struct old_module_ref), &mr); - for (j = 0; j < nm -1; ++j) { - if (mr.module == module_stat[j].modstruct) { - module->nrefs += 1; - module->refs = xrealloc(module->refs, module->nrefs * sizeof(struct module_stat **)); - module->refs[module->nrefs - 1] = module_stat + j; - break; - } - } - } while ((ref = mr.next) != 0); - } - - if (!(type & K_SYMBOLS)) - continue; - /* - * Find out how many symbols this module has. - */ - for (nms = 0, p = k+1; p->name[0] != '#'; ++p) - ++nms; - s = xmalloc(nms * sizeof(struct module_symbol)); - module->syms = s; - module->nsyms = nms; - } else if (type & K_SYMBOLS) { /* Want info about symbols */ - s->name = (unsigned long) k->name; - s->value = k->value; - ++s; - } - } - if ((type & K_INFO) || (type & K_REFS)) { - if (kmem_fd != -1) - close(kmem_fd); - } - - /* - * Kernel resident symbols follows - */ - if (type & K_SYMBOLS) { /* Want info about symbols */ - if (k->name[0] == '#') - ++k; - nksyms = nkernsym - (k - kernsym); - if (nksyms) { - ksyms = s = xmalloc(nksyms * sizeof(struct module_symbol)); - for (i = 0; i < nksyms; ++i, ++k) { - if (k->name[0] != '#') { - s->name = (unsigned long) k->name; - s->value = k->value; - ++s; - } - } - nksyms = s - ksyms; - } else - ksyms = NULL; - } - - return 1; -} -#endif /* COMPAT_2_0 */ - -int get_kernel_info(int type) -{ - k_new_syscalls = !query_module(NULL, 0, NULL, 0, NULL); - -#ifdef COMPAT_2_0 - if (!k_new_syscalls) - return old_get_kernel_info(type); -#endif /* COMPAT_2_0 */ - - return new_get_kernel_info(type); -} diff --git a/mdk-stage1/insmod-modutils/util/snap_shot.c b/mdk-stage1/insmod-modutils/util/snap_shot.c deleted file mode 100644 index ae0cc7c79..000000000 --- a/mdk-stage1/insmod-modutils/util/snap_shot.c +++ /dev/null @@ -1,154 +0,0 @@ -/* Take a snap shot of ksyms and modules for Oops debugging - Copyright 1999 Linux International. - - Contributed by Keith Owens - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ident "$Id$" - -#include -#include -#include -#include -#include -#include - -#include "module.h" -#include "obj.h" -#include "modstat.h" -#include "util.h" - -static char snap_dir[] = "/var/log/ksymoops"; - -/* If snap_dir exists, take a snap shot of ksyms and modules to snap_dir. - * Prefix the files with the equivalent of - * date +%Y%m%d%T%M%S | sed -e 's/://g' - */ -void snap_shot(const char *module_names, int n_module_names) -{ - char file[] = "ccyymmddhhmmss.modules", buffer[4096]; - static char *infile[] = { "/proc/ksyms", "/proc/modules" }; - static char *suffix[] = { "ksyms", "modules" }; - struct tm *local; - time_t t; - int i, l; - FILE *in, *out; - - if (module_names) { - /* Only snap shot if the list of modules has changed. - * Otherwise auto cleanup takes a snap shot every time - * and ends up with a large snap shot directory. - */ - char *new_module_names; - size_t n_new_module_names; - get_kernel_info(0); - new_module_names = module_name_list; - n_new_module_names = n_module_stat; - if (n_module_names && n_new_module_names == n_module_names) { - while (n_module_names) { - if (strcmp(module_names, new_module_names)) - break; /* difference detected */ - i = strlen(module_names) + 1; - module_names += i; - new_module_names += i; - --n_module_names; - } - } - if (!n_module_names) - return; /* no difference, no need for snap shot */ - } - - if (chdir(snap_dir)) - return; - t = time(NULL); - local = localtime(&t); - for (i = 0; i < sizeof(infile)/sizeof(infile[0]); ++i) { - snprintf(file, sizeof(file), "%04d%02d%02d%02d%02d%02d.%s", - local->tm_year+1900, - local->tm_mon + 1, - local->tm_mday, - local->tm_hour, - local->tm_min, - local->tm_sec, - suffix[i]); - out = fopen(file, "w"); - if (!out) { - error("cannot create %s/%s %m", snap_dir, file); - return; - } - in = fopen(infile[i], "r"); - if (!in) { - error("cannot open %s %m", infile[i]); - return; - } - while ((l = fread(buffer, 1, sizeof(buffer), in)) > 0) { - if (fwrite(buffer, l, 1, out) != 1) { - error("unable to write to %s %m", file); - fclose(in); - fclose(out); - return; - } - } - if (ferror(in)) - error("unable to read from %s %m", infile[i]); - fclose(in); - fclose(out); - } -} - -/* If snap_dir exists, log a message to snap_dir. The log file is called the - * equivalent of date +%Y%m%d | sed -e 's/://g'. Each line is prefixed with - * timestamp down to seconds and followed by a newline. - */ -void snap_shot_log(const char *fmt,...) -{ - char date[] = "ccyymmdd", file[] = "ccyymmdd.log", stamp[] = "ccyymmdd hhmmss"; - struct tm *local; - time_t t; - FILE *log; - va_list args; - int save_errno = errno; - - if (chdir(snap_dir)) - return; - t = time(NULL); - local = localtime(&t); - snprintf(date, sizeof(date), "%04d%02d%02d", - local->tm_year+1900, - local->tm_mon + 1, - local->tm_mday); - snprintf(file, sizeof(file), "%s.log", date); - log = fopen(file, "a"); - if (!log) { - error("cannot create %s/%s %m", snap_dir, file); - return; - } - snprintf(stamp, sizeof(stamp), "%s %02d%02d%02d", - date, - local->tm_hour, - local->tm_min, - local->tm_sec); - fprintf(log, "%s ", stamp); - va_start(args, fmt); - errno = save_errno; /* fmt may use %m */ - vfprintf(log, fmt, args); - va_end(args); - fprintf(log, "\n"); - fclose(log); -} diff --git a/mdk-stage1/insmod-modutils/util/sys_cm.c b/mdk-stage1/insmod-modutils/util/sys_cm.c deleted file mode 100644 index 851fb709e..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_cm.c +++ /dev/null @@ -1,88 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include - - -/*======================================================================*/ - -#if defined(__i386__) || defined(__m68k__) || defined(__arm__) - -#define __NR__create_module __NR_create_module -static inline _syscall2(long, _create_module, const char *, name, size_t, size) - -unsigned long create_module(const char *name, size_t size) -{ - /* Why all this fuss? - - In linux 2.1, the address returned by create module point in - kernel space which is now mapped at the top of user space (at - 0xc0000000 on i386). This looks like a negative number for a - long. The normal syscall macro of linux 2.0 (and all libc compile - with linux 2.0 or below) consider that the return value is a - negative number and consider it is an error number (A kernel - convention, return value are positive or negative, indicating the - error number). - - By checking the value of errno, we know if we have been fooled by - the syscall2 macro and we fix it. */ - - long ret = _create_module(name, size); - if (ret == -1 && errno > 125) - { - ret = -errno; - errno = 0; - } - return ret; -} - -#elif defined(__alpha__) - -/* Alpha doesn't have the same problem, exactly, but a bug in older - kernels fails to clear the error flag. Clear it here explicitly. */ - -#define __NR__create_module __NR_create_module -static inline _syscall4(unsigned long, _create_module, const char *, name, - size_t, size, size_t, dummy, size_t, err); - -unsigned long create_module(const char *name, size_t size) -{ - return _create_module(name, size, 0, 0); -} - -#else - -/* Sparc, MIPS, (and Alpha, but that's another problem) don't mistake - return values for errors due to the nature of the system call. */ - -_syscall2(unsigned long, create_module, const char *, name, size_t, size) - -#endif diff --git a/mdk-stage1/insmod-modutils/util/sys_dm.c b/mdk-stage1/insmod-modutils/util/sys_dm.c deleted file mode 100644 index a166a30f4..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_dm.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include - - -/*======================================================================*/ - -_syscall1(int, delete_module, const char *, name) diff --git a/mdk-stage1/insmod-modutils/util/sys_gks.c b/mdk-stage1/insmod-modutils/util/sys_gks.c deleted file mode 100644 index f71772c71..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_gks.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include - - -/*======================================================================*/ - -_syscall1(int, get_kernel_syms, struct old_kernel_sym *, ksyms) diff --git a/mdk-stage1/insmod-modutils/util/sys_nim.c b/mdk-stage1/insmod-modutils/util/sys_nim.c deleted file mode 100644 index bbe42135c..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_nim.c +++ /dev/null @@ -1,53 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include - - -/*======================================================================*/ - -#ifndef CONFIG_USE_SYSCALL - -extern int init_module(const char *name, const struct module *info); - -int -sys_init_module(const char *name, const struct module *info) -{ - return init_module(name, info); -} - -#else - -#define __NR_sys_init_module __NR_init_module -_syscall2(int, sys_init_module, const char *, name, - const struct module *, info) - -#endif diff --git a/mdk-stage1/insmod-modutils/util/sys_oim.c b/mdk-stage1/insmod-modutils/util/sys_oim.c deleted file mode 100644 index 73ac6be52..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_oim.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include - - -/*======================================================================*/ - -#define __NR_old_sys_init_module __NR_init_module -_syscall5(int, old_sys_init_module, const char *, name, char *, code, - unsigned, codesize, struct old_mod_routines *, routines, - struct old_symbol_table *, symtab) diff --git a/mdk-stage1/insmod-modutils/util/sys_qm.c b/mdk-stage1/insmod-modutils/util/sys_qm.c deleted file mode 100644 index 119a219a2..000000000 --- a/mdk-stage1/insmod-modutils/util/sys_qm.c +++ /dev/null @@ -1,56 +0,0 @@ -/* Functions for the Linux module syscall interface. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include - -#include "module.h" - -/* Kernel headers before 2.1.mumble need this on the Alpha to get - _syscall* defined. */ -#define __LIBRARY__ - -#include - - -/*======================================================================*/ - -/* I am fucking tired of the "this doesn't build on 2.0.x" questions. - But if you ask, we still officially require 2.1.x to build. */ -#if !defined(__NR_query_module) -# if defined(__i386__) -# define __NR_query_module 167 -# elif defined(__alpha__) -# define __NR_query_module 347 -# elif defined(__sparc__) -# define __NR_query_module 184 -# elif defined(__mc68000__) -# define __NR_query_module 167 -# elif defined(__arm__) -# define __NR_query_module (__NR_SYSCALL_BASE + 167) -# elif defined(__mips__) -# define __NR_query_module 4187 -# endif -#endif - -_syscall5(int, query_module, const char *, name, int, which, - void *, buf, size_t, bufsize, size_t *, ret); diff --git a/mdk-stage1/insmod-modutils/util/xftw.c b/mdk-stage1/insmod-modutils/util/xftw.c deleted file mode 100644 index fe764a63c..000000000 --- a/mdk-stage1/insmod-modutils/util/xftw.c +++ /dev/null @@ -1,422 +0,0 @@ -/* - * modutils specific implementation of ftw(). - * - * Copyright 2000: - * Keith Owens August 2000 - * - * This file is part of the Linux modutils. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -/* - modutils requires special processing during the file tree walk - of /lib/modules/ and any paths that the user specifies. - The standard ftw() does a blind walk of all paths and can end - up following the build symlink down the kernel source tree. - Although nftw() has the option to get more control such as not - automatically following symbolic links, even that is not enough - for modutils. The requirements are: - - Paths must be directories or symlinks to directories. - - Each directory is read and sorted into alphabetical order - before processing. - - A directory is type 1 iff it was specified on a path statement - (either explicit or default) and the directory contains a - subdirectory with one of the known names and the directory name - does not end with "/kernel". Otherwise it is type 2. - - In a type 1 directory, walk the kernel subdirectory if it exists, - then the old known names in their historical order then any - remaining directory entries in alphabetical order and finally any - non-directory entries in alphabetical order. - - Entries in a type 1 directory are filtered against the "prune" - list. A type 1 directory can contain additional files which - are not modules nor symlinks to modules. The prune list skips - known additional files, if a distribution wants to store - additional text files in the top level directory they should be - added to the prune list. - - A type 2 directory must contain only modules or symlinks to - modules. They are processed in alphabetical order, without - pruning. Symlinks to directories are an error in type 2 - directories. - - The user function is not called for type 1 directories, nor for - pruned entries. It is called for type 2 directories and their - contents. It is also called for any files left in a type 1 - directory after pruning and processing type 2 subdirectories. - The user function never sees symlinks, they are resolved before - calling the function. - - Why have different directory types? The original file tree - walk was not well defined. Some users specified each directory - individually, others just pointed at the top level directory. - Either version worked until the "build" symlink was added. Now - users who specify the top level directory end up running the - entire kernel source tree looking for modules, not nice. We - cannot just ignore symlinks because pcmcia uses symlinks to - modules for backwards compatibility. - - Type 1 is when a user specifies the top level directory which needs - special processing, type 2 is individual subdirectories. But the - only way to tell the difference is by looking at the contents. The - "/kernel" directory introduced in 2.3.12 either contains nothing - (old make modules_install) or contains all the kernel modules using - the same tree structure as the source. Because "/kernel" can - contain old names but is really a type 2 directory, it is detected - as a special case. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "util.h" -#include "config.h" - -extern char *tbpath[]; - -extern OPT_LIST *prune_list; -extern int n_prune_list; - -extern char *tbtype[]; - -struct xftw_dirent { - struct stat statbuf; - char *name; - char *fullname; -}; - -#define XFTW_MAXDEPTH 64 /* Maximum directory depth handled */ - -typedef struct { - struct xftw_dirent *contents; - int size; - int used; -} xftw_tree_t; - -static xftw_tree_t tree[XFTW_MAXDEPTH]; - -/* Free all data for one tree level */ -static void xftw_free_tree(int depth) -{ - int i; - xftw_tree_t *t = tree+depth; - for (i = 0; i < t->size; ++i) { - free(t->contents[i].name); - free(t->contents[i].fullname); - } - free(t->contents); - t->contents = NULL; - t->size = 0; - t->used = 0; -} - -/* Increment dirents used at this depth, resizing if necessary */ -static void xftw_add_dirent(int depth) -{ - xftw_tree_t *t = tree+depth; - int i, size = t->size; - if (++t->used < size) - return; - size += 10; /* arbitrary increment */ - t->contents = xrealloc(t->contents, size*sizeof(*(t->contents))); - for (i = t->size; i < size; ++i) { - memset(&(t->contents[i].statbuf), 0, sizeof(t->contents[i].statbuf)); - t->contents[i].name = NULL; - t->contents[i].fullname = NULL; - } - t->size = size; -} - -/* Concatenate directory name and entry name into one string. - * Note: caller must free result or leak. - */ -static char *xftw_dir_name(const char *directory, const char *entry) -{ - int i = strlen(directory); - char *name; - if (entry) - i += strlen(entry); - i += 2; - name = xmalloc(i); - strcpy(name, directory); /* safe, xmalloc */ - if (*directory && entry) - strcat(name, "/"); /* safe, xmalloc */ - if (entry) - strcat(name, entry); /* safe, xmalloc */ - return(name); -} - -/* Call the user function for a directory entry */ -static int xftw_do_name(const char *directory, const char *entry, struct stat *sb, xftw_func_t funcptr) -{ - int ret = 0; - char *name = xftw_dir_name(directory, entry); - - if (S_ISLNK(sb->st_mode)) { - char real[PATH_MAX], *newname; - verbose("resolving %s symlink to ", name); - if (!(newname = realpath(name, real))) { - if (errno == ENOENT) { - verbose("%s: does not exist, dangling symlink ignored\n", real); - goto cleanup; - } - perror("... failed"); - goto cleanup; - } - verbose("%s ", newname); - if (lstat(newname, sb)) { - error("lstat on %s failed ", newname); - perror(""); - goto cleanup; - } - free(name); - name = xstrdup(newname); - } - - if (!S_ISREG(sb->st_mode) && - !S_ISDIR(sb->st_mode)) { - error("%s is not plain file nor directory\n", name); - goto cleanup; - } - - verbose("user function %s\n", name); - ret = (*funcptr)(name, sb); -cleanup: - free(name); - return(ret); -} - -/* Sort directory entries into alphabetical order */ -static int xftw_sortdir(const void *a, const void *b) -{ - return(strcmp(((struct xftw_dirent *)a)->name, ((struct xftw_dirent *)b)->name)); -} - -/* Read a directory and sort it, ignoring "." and ".." */ -static int xftw_readdir(const char *directory, int depth) -{ - DIR *d; - struct dirent *ent; - verbose("xftw_readdir %s\n", directory); - if (!(d = opendir(directory))) { - perror(directory); - return(1); - } - while ((ent = readdir(d))) { - char *name; - struct xftw_dirent *f; - if (strcmp(ent->d_name, ".") == 0 || - strcmp(ent->d_name, "..") == 0) - continue; - name = xftw_dir_name(directory, ent->d_name); - xftw_add_dirent(depth); - f = tree[depth].contents+tree[depth].used-1; - f->name = xstrdup(ent->d_name); - f->fullname = name; /* do not free name, it is in use */ - if (lstat(name, &(f->statbuf))) { - perror(name); - return(1); - } - } - closedir(d); - qsort(tree[depth].contents, tree[depth].used, sizeof(*(tree[0].contents)), &xftw_sortdir); - return(0); -} - -/* Process a type 2 directory */ -int xftw_type2(const char *directory, const char *entry, int depth, xftw_func_t funcptr) -{ - int ret, i; - xftw_tree_t *t = tree+depth; - struct stat statbuf; - char *dirname = xftw_dir_name(directory, entry); - - verbose("type 2 %s\n", dirname); - if (depth > XFTW_MAXDEPTH) { - error("xftw_type2 exceeded maxdepth\n"); - ret = 1; - goto cleanup; - } - if ((ret = xftw_readdir(dirname, depth))) - goto cleanup; - - t = tree+depth; - /* user function sees type 2 directories */ - if ((ret = lstat(dirname, &statbuf)) || - (ret = xftw_do_name("", dirname, &statbuf, funcptr))) - goto cleanup; - - /* user sees all contents of type 2 directory, no pruning */ - for (i = 0; i < t->used; ++i) { - struct xftw_dirent *c = t->contents+i; - if (S_ISLNK(c->statbuf.st_mode)) { - if (!stat(c->name, &(c->statbuf))) { - if (S_ISDIR(c->statbuf.st_mode)) { - error("symlink to directory is not allowed, %s ignored\n", c->name); - *(c->name) = '\0'; /* ignore it */ - } - } - } - if (!*(c->name)) - continue; - if (S_ISDIR(c->statbuf.st_mode)) { - /* recursion is the curse of the programming classes */ - ret = xftw_type2(dirname, c->name, depth+1, funcptr); - if (ret) - goto cleanup; - } - else if ((ret = xftw_do_name(dirname, c->name, &(c->statbuf), funcptr))) - goto cleanup; - *(c->name) = '\0'; /* processed */ - } - - ret = 0; -cleanup: - free(dirname); - return(ret); -} - -/* Only external visible function. Decide on the type of directory and - * process accordingly. - */ -int xftw(const char *directory, xftw_func_t funcptr) -{ - struct stat statbuf; - int ret, i, j, type; - xftw_tree_t *t; - struct xftw_dirent *c; - - verbose("xftw starting at %s ", directory); - if (lstat(directory, &statbuf)) { - verbose("lstat on %s failed\n", directory); - return(0); - } - if (S_ISLNK(statbuf.st_mode)) { - char real[PATH_MAX]; - verbose("resolving symlink to "); - if (!(directory = realpath(directory, real))) { - if (errno == ENOENT) { - verbose("%s: does not exist, dangling symlink ignored\n", real); - return(0); - } - perror("... failed"); - return(-1); - } - verbose("%s ", directory); - if (lstat(directory, &statbuf)) { - error("lstat on %s failed ", directory); - perror(""); - return(-1); - } - } - if (!S_ISDIR(statbuf.st_mode)) { - error("%s is not a directory\n", directory); - return(-1); - } - verbose("\n"); - - /* All returns after this point must be via cleanup */ - - if ((ret = xftw_readdir(directory, 0))) - goto cleanup; - - t = tree; /* depth 0 */ - type = 2; - for (i = 0 ; type == 2 && i < t->used; ++i) { - c = t->contents+i; - for (j = 0; tbtype[j]; ++j) { - if (strcmp(c->name, tbtype[j]) == 0 && - S_ISDIR(c->statbuf.st_mode)) { - const char *p = directory + strlen(directory) - 1; - if (*p == '/') - --p; - if (p - directory >= 6 && strncmp(p-6, "/kernel", 7) == 0) - continue; /* "/kernel" path is a special case, type 2 */ - type = 1; /* known subdirectory */ - break; - } - } - } - - if (type == 1) { - OPT_LIST *p; - /* prune entries in type 1 directories only */ - for (i = 0 ; i < t->used; ++i) { - for (p = prunelist; p->name; ++p) { - c = t->contents+i; - if (strcmp(p->name, c->name) == 0) { - verbose("pruned %s\n", c->name); - *(c->name) = '\0'; /* ignore */ - } - } - } - /* run known subdirectories first in historical order, "kernel" is now top of list */ - for (i = 0 ; i < t->used; ++i) { - c = t->contents+i; - for (j = 0; tbtype[j]; ++j) { - if (*(c->name) && - strcmp(c->name, tbtype[j]) == 0 && - S_ISDIR(c->statbuf.st_mode)) { - if ((ret = xftw_type2(directory, c->name, 1, funcptr))) - goto cleanup; - *(c->name) = '\0'; /* processed */ - } - } - } - /* any other directories left, in alphabetical order */ - for (i = 0 ; i < t->used; ++i) { - c = t->contents+i; - if (*(c->name) && - S_ISDIR(c->statbuf.st_mode)) { - if ((ret = xftw_type2(directory, c->name, 1, funcptr))) - goto cleanup; - *(c->name) = '\0'; /* processed */ - } - } - /* anything else is passed to the user function */ - for (i = 0 ; i < t->used; ++i) { - c = t->contents+i; - if (*(c->name)) { - verbose("%s found in type 1 directory %s\n", c->name, directory); - if ((ret = xftw_do_name(directory, c->name, &(c->statbuf), funcptr))) - goto cleanup; - *(c->name) = '\0'; /* processed */ - } - } - } - else { - /* type 2 */ - xftw_free_tree(0); - if ((ret = xftw_type2(directory, NULL, 0, funcptr))) - goto cleanup; - } - - /* amazing, it all worked */ - ret = 0; -cleanup: - for (i = 0; i < XFTW_MAXDEPTH; ++i) - xftw_free_tree(i); - return(ret); -} diff --git a/mdk-stage1/insmod-modutils/util/xmalloc.c b/mdk-stage1/insmod-modutils/util/xmalloc.c deleted file mode 100644 index 9113d47fe..000000000 --- a/mdk-stage1/insmod-modutils/util/xmalloc.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Misc utility functions. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include "util.h" - - -/*======================================================================*/ - -void * -xmalloc(size_t size) -{ - void *ptr = malloc(size); - if (!ptr) - { - error("Out of memory"); - exit(1); - } - return ptr; -} diff --git a/mdk-stage1/insmod-modutils/util/xrealloc.c b/mdk-stage1/insmod-modutils/util/xrealloc.c deleted file mode 100644 index d287486f7..000000000 --- a/mdk-stage1/insmod-modutils/util/xrealloc.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Misc utility functions. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include "util.h" - - -/*======================================================================*/ - -void * -xrealloc(void *old, size_t size) -{ - void *ptr = realloc(old, size); - if (!ptr) - { - error("Out of memory"); - exit(1); - } - return ptr; -} diff --git a/mdk-stage1/insmod-modutils/util/xstrcat.c b/mdk-stage1/insmod-modutils/util/xstrcat.c deleted file mode 100644 index abb075c83..000000000 --- a/mdk-stage1/insmod-modutils/util/xstrcat.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Misc utility functions. - Copyright 2000 Keith Owens - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id" - -#include -#include -#include "util.h" - - -/*======================================================================*/ - -char * -xstrcat(char *dest, const char *src, size_t size) -{ - int ldest = strlen(dest); - int lsrc = strlen(src); - if ((size - ldest - 1) < lsrc) { - error("xstrcat: destination overflow"); - exit(1); - } - memcpy(dest+ldest, src, lsrc+1); - return(dest); -} diff --git a/mdk-stage1/insmod-modutils/util/xstrdup.c b/mdk-stage1/insmod-modutils/util/xstrdup.c deleted file mode 100644 index 11b289eb0..000000000 --- a/mdk-stage1/insmod-modutils/util/xstrdup.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Misc utility functions. - Copyright 1996, 1997 Linux International. - Contributed by Richard Henderson - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id$" - -#include -#include -#include -#include "util.h" - - -/*======================================================================*/ - -char * -xstrdup(const char *s) -{ - char *n = strdup(s); - if (!n) - { - error("Out of memory"); - exit(1); - } - return n; -} diff --git a/mdk-stage1/insmod-modutils/util/xsystem.c b/mdk-stage1/insmod-modutils/util/xsystem.c deleted file mode 100644 index edb995268..000000000 --- a/mdk-stage1/insmod-modutils/util/xsystem.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Misc utility functions. - Copyright 2000 Keith Owens - - This file is part of the Linux modutils. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2 of the License, or (at your - option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ident "$Id" - -#include -#include -#include -#include - - -/*======================================================================*/ - -/* Clone of the system() function From Steven's Advanced Programming in a Unix - * Environment. Modified to use *argv[] and execvp to avoid shell expansion - * problems, modutils runs as root so system() is unsafe. - */ - -int -xsystem(const char *file, char *const argv[]) -{ - pid_t pid; - int status; - if ((pid = fork()) < 0) - return(-1); - if (pid == 0) { - execvp(file, argv); - _exit(127); - } - while (waitpid(pid, &status, 0) < 0) { - if (errno != EINTR) - return(-1); - } - return(status); -} diff --git a/mdk-stage1/insmod.h b/mdk-stage1/insmod.h deleted file mode 100644 index d91f239cf..000000000 --- a/mdk-stage1/insmod.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _INSMOD_INTERFACE_H_ -#define _INSMOD_INTERFACE_H_ - -int insmod_call(char * full_filename, char * params); - -#endif diff --git a/mdk-stage1/linux-2.2/nfs.h b/mdk-stage1/linux-2.2/nfs.h deleted file mode 100644 index 7936d5a71..000000000 --- a/mdk-stage1/linux-2.2/nfs.h +++ /dev/null @@ -1,226 +0,0 @@ -/* - * NFS protocol definitions - */ -#ifndef _LINUX_NFS_H -#define _LINUX_NFS_H - -#include - -#define NFS_PORT 2049 -#define NFS_MAXDATA 8192 -#define NFS_MAXPATHLEN 1024 -#define NFS_MAXNAMLEN 255 -#define NFS_MAXGROUPS 16 -#define NFS_FHSIZE 32 -#define NFS_COOKIESIZE 4 -#define NFS_FIFO_DEV (-1) -#define NFSMODE_FMT 0170000 -#define NFSMODE_DIR 0040000 -#define NFSMODE_CHR 0020000 -#define NFSMODE_BLK 0060000 -#define NFSMODE_REG 0100000 -#define NFSMODE_LNK 0120000 -#define NFSMODE_SOCK 0140000 -#define NFSMODE_FIFO 0010000 - - -enum nfs_stat { - NFS_OK = 0, - NFSERR_PERM = 1, - NFSERR_NOENT = 2, - NFSERR_IO = 5, - NFSERR_NXIO = 6, - NFSERR_EAGAIN = 11, - NFSERR_ACCES = 13, - NFSERR_EXIST = 17, - NFSERR_XDEV = 18, - NFSERR_NODEV = 19, - NFSERR_NOTDIR = 20, - NFSERR_ISDIR = 21, - NFSERR_INVAL = 22, /* that Sun forgot */ - NFSERR_FBIG = 27, - NFSERR_NOSPC = 28, - NFSERR_ROFS = 30, - NFSERR_OPNOTSUPP = 45, - NFSERR_NAMETOOLONG = 63, - NFSERR_NOTEMPTY = 66, - NFSERR_DQUOT = 69, - NFSERR_STALE = 70, - NFSERR_WFLUSH = 99 -}; - -enum nfs_ftype { - NFNON = 0, - NFREG = 1, - NFDIR = 2, - NFBLK = 3, - NFCHR = 4, - NFLNK = 5, - NFSOCK = 6, - NFBAD = 7, - NFFIFO = 8 -}; - -struct nfs_fh { - char data[NFS_FHSIZE]; -}; - -#define NFS_PROGRAM 100003 -#define NFS_VERSION 2 -#define NFSPROC_NULL 0 -#define NFSPROC_GETATTR 1 -#define NFSPROC_SETATTR 2 -#define NFSPROC_ROOT 3 -#define NFSPROC_LOOKUP 4 -#define NFSPROC_READLINK 5 -#define NFSPROC_READ 6 -#define NFSPROC_WRITECACHE 7 -#define NFSPROC_WRITE 8 -#define NFSPROC_CREATE 9 -#define NFSPROC_REMOVE 10 -#define NFSPROC_RENAME 11 -#define NFSPROC_LINK 12 -#define NFSPROC_SYMLINK 13 -#define NFSPROC_MKDIR 14 -#define NFSPROC_RMDIR 15 -#define NFSPROC_READDIR 16 -#define NFSPROC_STATFS 17 - -/* Mount support for NFSroot */ -#ifdef __KERNEL__ -#define NFS_MNT_PROGRAM 100005 -#define NFS_MNT_VERSION 1 -#define NFS_MNT_PORT 627 -#define NFS_MNTPROC_MNT 1 -#define NFS_MNTPROC_UMNT 3 -#endif - -#if defined(__KERNEL__) || defined(NFS_NEED_KERNEL_TYPES) - -extern struct rpc_program nfs_program; -extern struct rpc_stat nfs_rpcstat; - -struct nfs_time { - __u32 seconds; - __u32 useconds; -}; - -struct nfs_fattr { - enum nfs_ftype type; - __u32 mode; - __u32 nlink; - __u32 uid; - __u32 gid; - __u32 size; - __u32 blocksize; - __u32 rdev; - __u32 blocks; - __u32 fsid; - __u32 fileid; - struct nfs_time atime; - struct nfs_time mtime; - struct nfs_time ctime; -}; - -struct nfs_sattr { - __u32 mode; - __u32 uid; - __u32 gid; - __u32 size; - struct nfs_time atime; - struct nfs_time mtime; -}; - -struct nfs_fsinfo { - __u32 tsize; - __u32 bsize; - __u32 blocks; - __u32 bfree; - __u32 bavail; -}; - -struct nfs_writeargs { - struct nfs_fh * fh; - __u32 offset; - __u32 count; - const void * buffer; -}; - -#ifdef NFS_NEED_XDR_TYPES - -struct nfs_sattrargs { - struct nfs_fh * fh; - struct nfs_sattr * sattr; -}; - -struct nfs_diropargs { - struct nfs_fh * fh; - const char * name; -}; - -struct nfs_readargs { - struct nfs_fh * fh; - __u32 offset; - __u32 count; - void * buffer; -}; - -struct nfs_createargs { - struct nfs_fh * fh; - const char * name; - struct nfs_sattr * sattr; -}; - -struct nfs_renameargs { - struct nfs_fh * fromfh; - const char * fromname; - struct nfs_fh * tofh; - const char * toname; -}; - -struct nfs_linkargs { - struct nfs_fh * fromfh; - struct nfs_fh * tofh; - const char * toname; -}; - -struct nfs_symlinkargs { - struct nfs_fh * fromfh; - const char * fromname; - const char * topath; - struct nfs_sattr * sattr; -}; - -struct nfs_readdirargs { - struct nfs_fh * fh; - __u32 cookie; - void * buffer; - unsigned int bufsiz; -}; - -struct nfs_diropok { - struct nfs_fh * fh; - struct nfs_fattr * fattr; -}; - -struct nfs_readres { - struct nfs_fattr * fattr; - unsigned int count; -}; - -struct nfs_readlinkres { - char ** string; - unsigned int * lenp; - unsigned int maxlen; - void * buffer; -}; - -struct nfs_readdirres { - void * buffer; - unsigned int bufsiz; -}; - -#endif /* NFS_NEED_XDR_TYPES */ -#endif /* __KERNEL__ */ - -#endif diff --git a/mdk-stage1/linux-2.2/nfs_mount.h b/mdk-stage1/linux-2.2/nfs_mount.h deleted file mode 100644 index 60493b150..000000000 --- a/mdk-stage1/linux-2.2/nfs_mount.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef _LINUX_NFS_MOUNT_H -#define _LINUX_NFS_MOUNT_H - -/* - * linux/include/linux/nfs_mount.h - * - * Copyright (C) 1992 Rick Sladkey - * - * structure passed from user-space to kernel-space during an nfs mount - */ - -/* - * WARNING! Do not delete or change the order of these fields. If - * a new field is required then add it to the end. The version field - * tracks which fields are present. This will ensure some measure of - * mount-to-kernel version compatibility. Some of these aren't used yet - * but here they are anyway. - */ -#define NFS_MOUNT_VERSION 3 - -struct nfs_mount_data { - int version; /* 1 */ - int fd; /* 1 */ - struct nfs_fh root; /* 1 */ - int flags; /* 1 */ - int rsize; /* 1 */ - int wsize; /* 1 */ - int timeo; /* 1 */ - int retrans; /* 1 */ - int acregmin; /* 1 */ - int acregmax; /* 1 */ - int acdirmin; /* 1 */ - int acdirmax; /* 1 */ - struct sockaddr_in addr; /* 1 */ - char hostname[256]; /* 1 */ - int namlen; /* 2 */ - unsigned int bsize; /* 3 */ -}; - -/* bits in the flags field */ - -#define NFS_MOUNT_SOFT 0x0001 /* 1 */ -#define NFS_MOUNT_INTR 0x0002 /* 1 */ -#define NFS_MOUNT_SECURE 0x0004 /* 1 */ -#define NFS_MOUNT_POSIX 0x0008 /* 1 */ -#define NFS_MOUNT_NOCTO 0x0010 /* 1 */ -#define NFS_MOUNT_NOAC 0x0020 /* 1 */ -#define NFS_MOUNT_TCP 0x0040 /* 2 */ -#define NFS_MOUNT_VER3 0x0080 /* 3 */ -#define NFS_MOUNT_KERBEROS 0x0100 /* 3 */ -#define NFS_MOUNT_NONLM 0x0200 /* 3 */ - -#endif diff --git a/mdk-stage1/log.c b/mdk-stage1/log.c deleted file mode 100644 index 5379c96dd..000000000 --- a/mdk-stage1/log.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "stage1.h" - -#include "log.h" - -static FILE * logfile = NULL; - - -void vlog_message(const char * s, va_list args) -{ - fprintf(logfile, "* "); - vfprintf(logfile, s, args); - fprintf(logfile, "\n"); - fflush(logfile); -} - - -void log_message(const char * s, ...) -{ - va_list args; - - if (!logfile) { - fprintf(stderr, "Log is not open!\n"); - return; - } - - va_start(args, s); - vlog_message(s, args); - va_end(args); - - return; -} - -void log_perror(char *msg) -{ - log_message("%s: %s", msg, strerror(errno)); -} - - -void open_log(void) -{ - if (!IS_TESTING) { - logfile = fopen("/dev/tty3", "w"); - if (!logfile) - logfile = fopen("/tmp/install.log", "a"); - } - else - logfile = fopen("debug.log", "w"); -} - -void close_log(void) -{ - if (logfile) { - log_message("stage1: disconnecting life support systems"); - fclose(logfile); - } -} diff --git a/mdk-stage1/log.h b/mdk-stage1/log.h deleted file mode 100644 index 90aa3f6e6..000000000 --- a/mdk-stage1/log.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - - -#ifndef _LOG_H_ -#define _LOG_H_ - -#include - -void log_message(const char * s, ...) __attribute__ ((format (printf, 1, 2))); -void vlog_message(const char * s, va_list args); -void log_perror(char *msg); -void open_log(void); -void close_log(void); - -#endif diff --git a/mdk-stage1/lomount.c b/mdk-stage1/lomount.c deleted file mode 100644 index 7d34948b0..000000000 --- a/mdk-stage1/lomount.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* This code comes from util-linux-2.10n (mount/lomount.c) - * (this is a simplified version of this code) - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "stage1.h" -#include "frontend.h" -#include "log.h" -#include "mount.h" -#include "modules.h" - -#include "lomount.h" - - -#define LO_NAME_SIZE 64 -#define LO_KEY_SIZE 32 - -struct loop_info -{ - int lo_number; /* ioctl r/o */ - dev_t lo_device; /* ioctl r/o */ - unsigned long lo_inode; /* ioctl r/o */ - dev_t lo_rdevice; /* ioctl r/o */ - int lo_offset; - int lo_encrypt_type; - int lo_encrypt_key_size; /* ioctl w/o */ - int lo_flags; /* ioctl r/o */ - char lo_name[LO_NAME_SIZE]; - unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ - unsigned long lo_init[2]; - char reserved[4]; -}; - -#define LOOP_SET_FD 0x4C00 -#define LOOP_CLR_FD 0x4C01 -#define LOOP_SET_STATUS 0x4C02 -#define LOOP_GET_STATUS 0x4C03 - -int -set_loop (const char *device, const char *file) -{ - struct loop_info loopinfo; - int fd, ffd, mode; - - mode = O_RDONLY; - - if ((ffd = open (file, mode)) < 0) - return 1; - - if ((fd = open (device, mode)) < 0) { - close(ffd); - return 1; - } - - memset(&loopinfo, 0, sizeof (loopinfo)); - strncpy(loopinfo.lo_name, file, LO_NAME_SIZE); - loopinfo.lo_name[LO_NAME_SIZE - 1] = 0; - loopinfo.lo_offset = 0; - -#ifdef MCL_FUTURE - /* - * Oh-oh, sensitive data coming up. Better lock into memory to prevent - * passwd etc being swapped out and left somewhere on disk. - */ - - if(mlockall(MCL_CURRENT|MCL_FUTURE)) { - log_message("CRITICAL Couldn't lock into memory! %s (memlock)", strerror(errno)); - return 1; - } -#endif - - if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { - close(fd); - close(ffd); - return 1; - } - - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - (void) ioctl (fd, LOOP_CLR_FD, 0); - close(fd); - close(ffd); - return 1; - } - - close(fd); - close(ffd); - return 0; -} - - -char * loopdev = "/dev/loop3"; /* Ugly. But do I care? */ - -void -del_loop(void) -{ - int fd; - - if ((fd = open (loopdev, O_RDONLY)) < 0) - return; - - if (ioctl (fd, LOOP_CLR_FD, 0) < 0) - return; - - close (fd); -} - - -static char * where_mounted = NULL; - -int -lomount(char *loopfile, char *where) -{ - - long int flag; - - flag = MS_MGC_VAL; - flag |= MS_RDONLY; - - my_insmod("loop", ANY_DRIVER_TYPE, NULL); - - if (set_loop(loopdev, loopfile)) { - log_message("set_loop failed on %s (%s)", loopdev, strerror(errno)); - return 1; - } - - if (my_mount(loopdev, where, "iso9660")) { - del_loop(); - return 1; - } - - where_mounted = strdup(where); - log_message("lomount succeeded for %s on %s", loopfile, where); - return 0; -} - - -int -loumount() -{ - if (where_mounted) { - umount(where_mounted); - where_mounted = NULL; - } - del_loop(); - return 0; -} - - diff --git a/mdk-stage1/lomount.h b/mdk-stage1/lomount.h deleted file mode 100644 index 3b8a30ac1..000000000 --- a/mdk-stage1/lomount.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef LOMOUNT_H -#define LOMOUNT_H - -int lomount(char *loopfile, char *where); -int loumount(void); - -#endif diff --git a/mdk-stage1/mar/.cvsignore b/mdk-stage1/mar/.cvsignore deleted file mode 100644 index bfde37886..000000000 --- a/mdk-stage1/mar/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -mar diff --git a/mdk-stage1/mar/Makefile b/mdk-stage1/mar/Makefile deleted file mode 100644 index 801785947..000000000 --- a/mdk-stage1/mar/Makefile +++ /dev/null @@ -1,61 +0,0 @@ - #****************************************************************************** - # - # mar - The Mandrake Archiver - # - # $Id$ - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -TARGETS = libmar.a mar - - -ifeq (DIETLIBC, $(L)) -TARGETS += libmar-DIET.a -endif - - -all: $(TARGETS) - -clean: - rm -f *.o libmar.a libmar-DIET.a mar - - -mar: mar-frontend.o mar-extract-only-standalone.o - gcc -o mar mar-frontend.o mar-extract-only-standalone.o -lbz2 - $(STRIPCMD) $@ - -libmar.a: mar-extract-only.o - ar -cru $@ $^ - ranlib $@ - -libmar-DIET.a: mar-extract-only-DIET.o - ar -cru $@ $^ - ranlib $@ - -mar-extract-only.o: mar-extract-only.c mar-extract-only.h mar.h - gcc $(CFLAGS) $(GLIBC_INCLUDES) -c mar-extract-only.c - -mar-extract-only-DIET.o: mar-extract-only.c mar-extract-only.h mar.h - gcc $(CFLAGS) $(DIETLIBC_INCLUDES) -o $@ -c mar-extract-only.c - -mar-frontend.o: mar-frontend.c mar.h mar-extract-only.h - gcc $(CFLAGS) $(GLIBC_INCLUDES) -c mar-frontend.c - -mar-extract-only-standalone.o: mar-extract-only.c mar-extract-only.h mar.h - gcc $(CFLAGS) $(GLIBC_INCLUDES) -o $@ -D_STANDALONE_ -c mar-extract-only.c diff --git a/mdk-stage1/mar/mar-extract-only.c b/mdk-stage1/mar/mar-extract-only.c deleted file mode 100644 index 723cc376d..000000000 --- a/mdk-stage1/mar/mar-extract-only.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * mar - The Mandrake Archiver - * - * An archiver that supports compression (through zlib). - * - */ - -/* - * This code should suffice for stage1 on-the-fly uncompression of kernel modules. - * (and it DOES perform tests and return values, blaaaah..) - */ - -#include "mar-extract-only.h" -#include "mar.h" - -#ifdef _STANDALONE_ -void -zerr(BZFILE * f) /* decrease code size */ -{ - fprintf(stderr, BZ2_bzerror(f, &z_errnum)); -} - -inline void -log_perror(char *msg) -{ - perror(msg); -} -void -log_message(char *msg) -{ - fprintf(stderr, msg); -} -#else /* _STANDALONE_ */ -#include "../log.h" -void -zerr(BZFILE * f) /* decrease code size */ -{ - log_message(BZ2_bzerror(f, &z_errnum)); -} -#endif /* _STANDALONE_ */ - - -static int -mar_open_file(char *filename, struct mar_stream *s) -{ - int end_filetable = 0; - struct mar_element * previous_element = NULL; - - /* mar_zfile */ - s->mar_zfile = BZ2_bzopen(filename, "rb"); - if (!s->mar_zfile) - { - log_perror(filename); - return -1; - } - - while (end_filetable == 0) - { - char buf[512]; - int ptr = 0; - /* read filename */ - do - { - if (BZ2_bzread(s->mar_zfile, &(buf[ptr]), sizeof(char)) != sizeof(char)) - { - zerr(s->mar_zfile); - return -1; - } - ptr++; - } while ((buf[ptr-1] != 0) && (ptr < 512)); - /* ptr == 1 when we arrive on the "char 0" of the end of the filetable */ - if (ptr > 1) - { - struct mar_element * e = (struct mar_element *) malloc(sizeof(struct mar_element)); - e->filename = strdup(buf); - /* read file_length */ - if (BZ2_bzread(s->mar_zfile, &(e->file_length), sizeof(int)) != sizeof(int)) - { - zerr(s->mar_zfile); - return -1; - } - /* read data_offset */ - if (BZ2_bzread(s->mar_zfile, &(e->data_offset), sizeof(int)) != sizeof(int)) - { - zerr(s->mar_zfile); - return -1; - } - /* write down chaining */ - if (previous_element) - previous_element->next_element = e; - else - s->first_element = e; - previous_element = e; - } - else - end_filetable = 1; - - } - /* chaining for last element */ - previous_element->next_element = NULL; - - return 0; -} - - -char ** -mar_list_contents(char * mar_filename) -{ - struct mar_stream s; - struct mar_element * elem; - char * tmp_contents[500]; - char ** answ; - int i = 0; - - if (mar_open_file(mar_filename, &s)) - return NULL; - - elem = s.first_element; - while (elem) - { - tmp_contents[i++] = strdup(elem->filename); - elem = elem->next_element; - } - tmp_contents[i++] = NULL; - answ = (char **) malloc(sizeof(char *) * i); - memcpy(answ, tmp_contents, sizeof(char *) * i); - return answ; -} - - -int -mar_extract_file(char *mar_filename, char *filename_to_extract, char *dest_dir) -{ - struct mar_stream s; - struct mar_element * elem; - - if (mar_open_file(mar_filename, &s)) - return -1; - - elem = s.first_element; - while (elem) - { - if (strcmp(elem->filename, filename_to_extract) == 0) - { - char garb_buf[4096]; - char *buf; - char *dest_file; - int fd, i; - dest_file = (char *) alloca(strlen(dest_dir) + strlen(filename_to_extract) + 1); - strcpy(dest_file, dest_dir); - strcat(dest_file, filename_to_extract); - fd = creat(dest_file, 00660); - if (fd == -1) - { - log_perror(dest_file); - return -1; - } - buf = (char *) alloca(elem->file_length); - if (!buf) - { - log_perror(dest_file); - return -1; - } - i = elem->data_offset; - while (i > 0) { - int to_read = i > sizeof(garb_buf) ? sizeof(garb_buf) : i; - if (BZ2_bzread(s.mar_zfile, garb_buf, to_read) != to_read) { - log_message("MAR: unexpected EOF in stream"); - return -1; - } - i -= to_read; - } - if (BZ2_bzread(s.mar_zfile, buf, elem->file_length) != elem->file_length) - { - zerr(s.mar_zfile); - return -1; - } - if (write(fd, buf, elem->file_length) != elem->file_length) - { - log_perror(dest_file); - return -1; - } - close(fd); /* do not check return value for code size */ - BZ2_bzclose(s.mar_zfile); - return 0; - } - elem = elem->next_element; - } - BZ2_bzclose(s.mar_zfile); - return 1; /* 1 for file_not_found_in_archive */ -} - - diff --git a/mdk-stage1/mar/mar-extract-only.h b/mdk-stage1/mar/mar-extract-only.h deleted file mode 100644 index 6fa34efe4..000000000 --- a/mdk-stage1/mar/mar-extract-only.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * mar - The Mandrake Archiver - * - * An archiver that supports compression (through zlib). - * - */ - -/* - * Header for stage1 on-the-fly needs. - */ - -#ifndef MAR_EXTRACT_ONLY_H -#define MAR_EXTRACT_ONLY_H - -int mar_extract_file(char *mar_filename, char *filename_to_extract, char *dest_dir); -char ** mar_list_contents(char *mar_filename); - -#endif diff --git a/mdk-stage1/mar/mar-frontend.c b/mdk-stage1/mar/mar-frontend.c deleted file mode 100644 index 2e87626db..000000000 --- a/mdk-stage1/mar/mar-frontend.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * mar - The Mandrake Archiver - * - * An archiver that supports compression (through zlib). - * - */ - -/* - * This code includes the extracting and creating features. - * - */ - -#include "mar.h" -#include "mar-extract-only.h" - - -int -file_size(char *filename) -{ - struct stat buf; - if (stat(filename, &buf) != 0) - { - perror(filename); - return -1; - } - return buf.st_size; -} - - -/* Yes I don't use the datastructure I directly write the final fileformat in memory then write down it. - * Yes it's bad. - */ -/* ``files'' is a NULL-terminated array of char* */ - -char * fnf_tag = "FILE_NOT_FOUND&"; - -int -mar_create_file(char *dest_file, char **files) -{ - int filenum = 0; - int current_offset_filetable = 0; - int current_delta_rawdata = 0; - int filetable_size; - char * temp_marfile_buffer; - int total_length = 0; - - filetable_size = sizeof(char); /* ``char 0'' */ - while (files[filenum]) - { - int fsiz = file_size(files[filenum]); - if (fsiz == -1) - files[filenum] = fnf_tag; - else { - filetable_size += 2*sizeof(int) /* file_length, data_offset */ + strlen(files[filenum]) + 1; - total_length += fsiz; - } - filenum++; - } - - total_length += filetable_size; - - temp_marfile_buffer = (char *) malloc(total_length); /* create the whole file in-memory (not with alloca! it can be bigger than typical limit for stack of programs (ulimit -s) */ - DEBUG_MAR(printf("D: mar::create_marfile total-length %d\n", total_length);); - - filenum = 0; - while (files[filenum]) - { - if (strcmp(files[filenum], fnf_tag)) { - FILE * f = fopen(files[filenum], "r"); - int fsize; - if (!f) - { - perror(files[filenum]); - return -1; - } - - /* filename */ - strcpy(&(temp_marfile_buffer[current_offset_filetable]), files[filenum]); - current_offset_filetable += strlen(files[filenum]) + 1; - - /* file_length */ - fsize = file_size(files[filenum]); - if (fsize == -1) return -1; - memcpy(&temp_marfile_buffer[current_offset_filetable], &fsize, sizeof(int)); - current_offset_filetable += sizeof(int); - - /* data_offset */ - memcpy(&temp_marfile_buffer[current_offset_filetable], ¤t_delta_rawdata, sizeof(int)); - current_offset_filetable += sizeof(int); - - /* data_raw_data */ - if (fread(&temp_marfile_buffer[current_delta_rawdata + filetable_size], 1, fsize, f) != fsize) - { - perror(files[filenum]); - return -1; - } - fclose(f); - - current_delta_rawdata += fsize; - } - - filenum++; - } - - /* write down ``char 0'' to terminate file table */ - memset(&temp_marfile_buffer[current_offset_filetable], 0, sizeof(char)); - - /* ok, buffer is ready, let's write it on-disk */ - { - BZFILE * f = BZ2_bzopen(dest_file, "w9"); - if (!f) - { - perror(dest_file); - return -1; - } - if (BZ2_bzwrite(f, temp_marfile_buffer, total_length) != total_length) - { - fprintf(stderr, BZ2_bzerror(f, &z_errnum)); - return -1; - } - BZ2_bzclose(f); - } - - printf("mar: created archive %s (%d files, length %d)\n", dest_file, filenum, total_length); - return 0; -} - - -void -print_usage(char *progname) -{ - printf("Usage: %s [-lxc] [files..]\n", progname); - exit(0); -} - -int -main(int argc, char **argv) -{ - if (argc <= 2) - print_usage(argv[0]); - - if (argc >= 3) - { - if (strcmp(argv[1], "-l") == 0) - { - char ** contents = mar_list_contents(argv[2]); - if (contents) - while (contents && *contents) { - printf("\t%s\n", *contents); - contents++; - } - exit(0); - } - if ((strcmp(argv[1], "-x") == 0) && argc == 4) - { - int res = mar_extract_file(argv[2], argv[3], "./"); - if (res == 1) - fprintf(stderr, "W: file-not-found-in-archive %s\n", argv[3]); - if (res == -1) - exit(-1); - exit(0); - } - if ((strcmp(argv[1], "-c") == 0) && argc >= 4) - { - char **files = (char **) alloca(((argc-3)+1) * sizeof(char *)); - int i = 3; - while (i < argc) - { - files[i-3] = argv[i]; - i++; - } - files[argc-3] = NULL; - { - int results; - results = mar_create_file(argv[2], files); - if (results != 0) - fprintf(stderr, "E: create-marfile-failed\n"); - exit(results); - } - - } - } - - return 0; -} diff --git a/mdk-stage1/mar/mar.h b/mdk-stage1/mar/mar.h deleted file mode 100644 index 672d7ded8..000000000 --- a/mdk-stage1/mar/mar.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * mar - The Mandrake Archiver - * - * An archiver that supports compression (through bzlib). - * - * Designed to be small so these bad designs are inside: - * . archive and compression are mixed together - * . create the mar file in-memory - * . does not free memory - * - */ - -#ifndef MAR_H -#define MAR_H - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -/* - * Format of a mar file: - * - * ASCIIZ filename \ | - * int file_length | repeated | bzipped - * int pointer_in_archive / | - * char 0 | - * raw_files_data / - * - */ - -struct mar_element -{ - char * filename; /* filename (ASCIIZ) of the element */ - int file_length; /* length (in bytes) of the raw data of the element */ - int data_offset; /* seek start of the raw data in the underlying mar stream */ - struct mar_element * next_element; /* pointer to the next element in the mar stream; NULL if last */ -}; - -struct mar_stream -{ - struct mar_element * first_element; /* pointer to the first element inside the mar stream */ - BZFILE * mar_zfile; /* associated zfile (opened) */ -}; - -int z_errnum; - -#define DEBUG_MAR(x) - -#endif diff --git a/mdk-stage1/minilibc.c b/mdk-stage1/minilibc.c deleted file mode 100644 index 77b65accc..000000000 --- a/mdk-stage1/minilibc.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - - -#define MINILIBC_INTERNAL - -#include "minilibc.h" - -int atexit (void (*__func) (void)) -{ - return 0; -} - -void exit() -{ - _do_exit(0); - for (;;); /* Shut up gcc */ -} - - -char ** _environ = NULL; -int errno = 0; - -void _init (int __status) -{ -} - -void __libc_init_first (int __status) -{ -} - -int __libc_start_main (int (*main) (int, char **, char **), int argc, - char **argv, void (*init) (void), void (*fini) (void), - void (*rtld_fini) (void), void *stack_end) -{ - exit ((*main) (argc, argv, NULL)); - /* never get here */ - return 0; -} - -void _fini (int __status) -{ -} - -inline int socket(int a, int b, int c) -{ - unsigned long args[] = { a, b, c }; - - return socketcall(SYS_SOCKET, args); -} - -inline int bind(int a, void * b, int c) -{ - unsigned long args[] = { a, (long) b, c }; - - return socketcall(SYS_BIND, args); -} - -inline int listen(int a, int b) -{ - unsigned long args[] = { a, b, 0 }; - - return socketcall(SYS_LISTEN, args); -} - -inline int accept(int a, void * addr, void * addr2) -{ - unsigned long args[] = { a, (long) addr, (long) addr2 }; - - return socketcall(SYS_ACCEPT, args); -} - - -void sleep(int secs) -{ - struct timeval tv; - - tv.tv_sec = secs; - tv.tv_usec = 0; - - select(0, NULL, NULL, NULL, &tv); -} - - -int strlen(const char * string) -{ - int i = 0; - - while (*string++) i++; - - return i; -} - -char * strncpy(char * dst, const char * src, int len) -{ - char * chptr = dst; - int i = 0; - - while (*src && i < len) *dst++ = *src++, i++; - if (i < len) *dst = '\0'; - - return chptr; -} - -char * strcpy(char * dst, const char * src) -{ - char * chptr = dst; - - while (*src) *dst++ = *src++; - *dst = '\0'; - - return chptr; -} - -void * memcpy(void * dst, const void * src, size_t count) -{ - char * a = dst; - const char * b = src; - - while (count--) - *a++ = *b++; - - return dst; -} - - -int strcmp(const char * a, const char * b) -{ - int i, j; - - i = strlen(a); j = strlen(b); - if (i < j) - return -1; - else if (j < i) - return 1; - - while (*a && (*a == *b)) a++, b++; - - if (!*a) return 0; - - if (*a < *b) - return -1; - else - return 1; -} - -int strncmp(const char * a, const char * b, int len) -{ - char buf1[1000], buf2[1000]; - - strncpy(buf1, a, len); - strncpy(buf2, b, len); - buf1[len] = '\0'; - buf2[len] = '\0'; - - return strcmp(buf1, buf2); -} - -char * strchr(char * str, int ch) -{ - char * chptr; - - chptr = str; - while (*chptr) - { - if (*chptr == ch) return chptr; - chptr++; - } - - return NULL; -} - - -char * strstr(char *haystack, char *needle) -{ - char * tmp = haystack; - while ((tmp = strchr(tmp, needle[0])) != NULL) { - int i = 1; - while (i < strlen(tmp) && i < strlen(needle) && tmp[i] == needle[i]) - i++; - if (needle[i] == '\0') - return tmp; - tmp++; - } - return NULL; -} - - -/* Minimum printf which handles only characters, %d's and %s's */ -void printf(char * fmt, ...) -{ - char buf[2048]; - char * start = buf; - char * chptr = buf; - va_list args; - char * strarg; - int numarg; - - strncpy(buf, fmt, sizeof(buf)); - va_start(args, fmt); - - while (start) - { - while (*chptr != '%' && *chptr) chptr++; - - if (*chptr == '%') - { - *chptr++ = '\0'; - print_str_init(1, start); - - switch (*chptr++) - { - case 's': - strarg = va_arg(args, char *); - print_str_init(1, strarg); - break; - - case 'd': - numarg = va_arg(args, int); - print_int_init(1, numarg); - break; - } - - start = chptr; - } - else - { - print_str_init(1, start); - start = NULL; - } - } -} - diff --git a/mdk-stage1/minilibc.h b/mdk-stage1/minilibc.h deleted file mode 100644 index e0775e3a0..000000000 --- a/mdk-stage1/minilibc.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - - -#include - -#define _LOOSE_KERNEL_NAMES 1 - -#define NULL ((void *) 0) - -#define WIFSTOPPED(status) (((status) & 0xff) == 0x7f) -#define WIFSIGNALED(status) (!WIFSTOPPED(status) && !WIFEXITED(status)) -#define WEXITSTATUS(status) (((status) & 0xff00) >> 8) -#define WTERMSIG(status) ((status) & 0x7f) -#define WSTOPSIG(status) WEXITSTATUS(status) -#define WIFEXITED(status) (WTERMSIG(status) == 0) - -#define MS_MGC_VAL 0xc0ed0000 - -#define isspace(a) (a == ' ' || a == '\t') - -extern char ** _environ; - -extern int errno; - -/* Aieee, gcc 2.95+ creates a stub for posix_types.h on i386 which brings - glibc headers in and thus makes __FD_SET etc. not defined with 2.3+ kernels. */ -#define _FEATURES_H 1 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#ifndef MINILIBC_INTERNAL -static inline _syscall5(int,mount,const char *,spec,const char *,dir,const char *,type,unsigned long,rwflag,const void *,data); -static inline _syscall5(int,_newselect,int,n,fd_set *,rd,fd_set *,wr,fd_set *,ex,struct timeval *,timeval); -static inline _syscall4(int,wait4,pid_t,pid,int *,status,int,opts,void *,rusage) -static inline _syscall3(int,write,int,fd,const char *,buf,unsigned long,count) -static inline _syscall3(int,reboot,int,magic,int,magic_too,int,flag) -static inline _syscall3(int,execve,const char *,fn,void *,argv,void *,envp) -static inline _syscall3(int,read,int,fd,const char *,buf,unsigned long,count) -static inline _syscall3(int,open,const char *,fn,int,flags,mode_t,mode) -static inline _syscall3(int,ioctl,int,fd,int,request,void *,argp) -static inline _syscall2(int,dup2,int,one,int,two) -static inline _syscall2(int,kill,pid_t,pid,int,sig) -static inline _syscall2(int,symlink,const char *,a,const char *,b) -static inline _syscall2(int,chmod,const char * ,path,mode_t,mode) -static inline _syscall2(int,sethostname,const char *,name,int,len) -static inline _syscall2(int,setdomainname,const char *,name,int,len) -static inline _syscall2(int,setpgid,int,name,int,len) -static inline _syscall2(int,signal,int,num,void *,len) -static inline _syscall1(int,umount,const char *,dir) -static inline _syscall1(int,unlink,const char *,fn) -static inline _syscall1(int,close,int,fd) -static inline _syscall1(int,swapoff,const char *,fn) -static inline _syscall0(int,getpid) -static inline _syscall0(int,sync) -#ifdef __sparc__ -/* Nonstandard fork calling convention :( */ -static inline int fork(void) { - int __res; - __asm__ __volatile__ ( - "mov %0, %%g1\n\t" - "t 0x10\n\t" - "bcc 1f\n\t" - "dec %%o1\n\t" - "sethi %%hi(%2), %%g1\n\t" - "st %%o0, [%%g1 + %%lo(%2)]\n\t" - "b 2f\n\t" - "mov -1, %0\n\t" - "1:\n\t" - "and %%o0, %%o1, %0\n\t" - "2:\n\t" - : "=r" (__res) - : "0" (__NR_fork), "i" (&errno) - : "g1", "o0", "cc"); - return __res; -} -#else -static inline _syscall0(int,fork) -#endif -static inline _syscall0(pid_t,setsid) -static inline _syscall3(int,syslog,int, type, char *, buf, int, len); -#else -static inline _syscall5(int,_newselect,int,n,fd_set *,rd,fd_set *,wr,fd_set *,ex,struct timeval *,timeval); -static inline _syscall3(int,write,int,fd,const char *,buf,unsigned long,count) -static inline _syscall2(int,socketcall,int,code,unsigned long *, args) -#define __NR__do_exit __NR_exit -extern inline _syscall1(int,_do_exit,int,exitcode) -#endif - -#define select _newselect - -extern int errno; - -inline int socket(int a, int b, int c); -inline int bind(int a, void * b, int c); -inline int listen(int a, int b); -inline int accept(int a, void * addr, void * addr2); - -void sleep(int secs); - -int strlen(const char * string); -char * strcpy(char * dst, const char * src); -void * memcpy(void * dst, const void * src, size_t count); -int strcmp(const char * a, const char * b); -int strncmp(const char * a, const char * b, int len); -char * strchr(char * str, int ch); -char * strstr(char *haystack, char *needle); -char * strncpy(char * dst, const char * src, int len); - -void print_str_init(int fd, char * string); -void print_int_init(int fd, int i); -/* Minimum printf which handles only characters, %d's and %s's */ -void printf(char * fmt, ...) __attribute__ ((format (printf, 1, 2))); - diff --git a/mdk-stage1/mkinitrd_helper/Makefile b/mdk-stage1/mkinitrd_helper/Makefile deleted file mode 100644 index 1fa6a345a..000000000 --- a/mdk-stage1/mkinitrd_helper/Makefile +++ /dev/null @@ -1,46 +0,0 @@ - #****************************************************************************** - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -VERSION = 1.1.1 - -DEFS = -DVERSION=\"$(VERSION)\" - - -MKINITRD_HELPER_SRC = mkinitrd_helper.c -MKINITRD_HELPER_LIBS = ../insmod-busybox/libinsmod-DIET.a - -MKINITRD_HELPER_OBJS = $(subst .c,.o,$(MKINITRD_HELPER_SRC)) - -BIN = mkinitrd_helper - -all: $(BIN) - -clean: - rm -f *.o $(BIN) - -FLAGS = -Wall -Werror -Os -fomit-frame-pointer -c - - -$(MKINITRD_HELPER_OBJS): %.o: %.c - $(CC) $(DEFS) $(DIETLIBC_INCLUDES) -I.. -c $< -o $@ - -mkinitrd_helper: $(MKINITRD_HELPER_OBJS) $(MKINITRD_HELPER_LIBS) $(DIETLIBC_LIBC) - $(CC) $(DIETLIBC_LDFLAGS_STAGE1) -o $@ $^ - $(STRIPCMD) $@ diff --git a/mdk-stage1/mkinitrd_helper/mkinitrd_helper.c b/mdk-stage1/mkinitrd_helper/mkinitrd_helper.c deleted file mode 100644 index 67be7c340..000000000 --- a/mdk-stage1/mkinitrd_helper/mkinitrd_helper.c +++ /dev/null @@ -1,308 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2001 MandrakeSoft - * - * This software is covered by the GPL license. - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - * This little program replaces usual sash and insmod.static based script - * from mkinitrd (that insmod modules, plus possibly mount a partition and - * losetup a loopback-based / on the partition). - * - * - * On my machine: - * gzipped sash + insmod.static 502491 bytes - * gzipped 14243 bytes - * - * There will be room for linux-2.4 and many modules, now. Cool. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "insmod.h" - -int quiet = 0; - -void vlog_message(const char * s, va_list args) -{ - vprintf(s, args); - printf("\n"); -} - -void log_perror(char *msg) -{ - perror(msg); -} - - -static void fatal_error(char *msg) -{ - printf("[] E: %s\n[] giving hand to kernel.\n", msg); - exit(-1); -} - -static void warning(char *msg) -{ - printf("[] W: %s\n", msg); -} - -static void parse_parms(const char * parm, char ** parm1, char ** parm2, char ** parm3) -{ - char * ptr; - - ptr = strchr(parm, '\n'); - if (!ptr) - fatal_error("bad config file: no newline after parms"); - - *parm1 = malloc(ptr-parm+1); /* yup, never freed :-) */ - memcpy(*parm1, parm, ptr-parm); - (*parm1)[ptr-parm] = '\0'; - - if (!parm2) - return; - - *parm2 = strchr(*parm1, ' '); - if (!*parm2) - return; - **parm2 = '\0'; - (*parm2)++; - - if (!parm3) - return; - - *parm3 = strchr(*parm2, ' '); - if (!*parm3) - return; - **parm3 = '\0'; - (*parm3)++; -} - - -static void insmod_(const char * parm) -{ - char * mod_name, * options; - - parse_parms(parm, &mod_name, &options, NULL); - -#ifdef DEBUG - printf("insmod %s options %s\n", mod_name, options); -#endif - if (!quiet) - printf("[] Loading module %s\n", mod_name); - - if (insmod_call(mod_name, options)) - perror("insmod failed"); -} - - -static void mount_(const char * parm) -{ - char * dev, * location, * fs; - unsigned long flags; - char * opts = NULL; - - parse_parms(parm, &dev, &location, &fs); - -#ifdef DEBUG - printf("mounting %s on %s as type %s\n", dev, location, fs); -#endif - if (!quiet) - printf("[] Mounting device containing loopback root filesystem\n"); - - flags = MS_MGC_VAL; - - if (!strcmp(fs, "vfat")) - opts = "check=relaxed"; - - if (mount(dev, location, fs, flags, opts)) - perror("mount failed"); -} - - -#define LO_NAME_SIZE 64 -#define LO_KEY_SIZE 32 - -struct loop_info -{ - int lo_number; /* ioctl r/o */ - dev_t lo_device; /* ioctl r/o */ - unsigned long lo_inode; /* ioctl r/o */ - dev_t lo_rdevice; /* ioctl r/o */ - int lo_offset; - int lo_encrypt_type; - int lo_encrypt_key_size; /* ioctl w/o */ - int lo_flags; /* ioctl r/o */ - char lo_name[LO_NAME_SIZE]; - unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ - unsigned long lo_init[2]; - char reserved[4]; -}; - -#define LOOP_SET_FD 0x4C00 -#define LOOP_CLR_FD 0x4C01 -#define LOOP_SET_STATUS 0x4C02 - -static void set_loop_(const char * parm) -{ - struct loop_info loopinfo; - int fd, ffd; - char * device, * file; - - parse_parms(parm, &device, &file, NULL); - -#ifdef DEBUG - printf("set_looping %s with %s\n", device, file); -#endif - if (!quiet) - printf("[] Setting up loopback file %s\n", file); - - if ((ffd = open(file, O_RDWR)) < 0) { - perror("set_loop, opening file in rw"); - exit(-1); - } - - if ((fd = open(device, O_RDWR)) < 0) { - perror("set_loop, opening loop device in rw"); - close(ffd); - exit(-1); - } - - memset(&loopinfo, 0, sizeof (loopinfo)); - strncpy(loopinfo.lo_name, file, LO_NAME_SIZE); - loopinfo.lo_name[LO_NAME_SIZE - 1] = 0; - loopinfo.lo_offset = 0; - - if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { - close(fd); - close(ffd); - perror("LOOP_SET_FD"); - exit(-1); - } - - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - (void) ioctl (fd, LOOP_CLR_FD, 0); - close(fd); - close(ffd); - perror("LOOP_SET_STATUS"); - exit(-1); - } - - close(fd); - close(ffd); -} - - -#define MD_MAJOR 9 -#define RAID_AUTORUN _IO (MD_MAJOR, 0x14) -#include - -static void raidautorun_(const char * parm) -{ - char * device; - int fd; - - parse_parms(parm, &device, NULL, NULL); - - if (!quiet) - printf("[] Calling raid autorun for %s\n", device); - - fd = open(device, O_RDWR, 0); - if (fd < 0) { - printf("raidautorun: failed to open %s: %d\n", device, errno); - return; - } - - if (ioctl(fd, RAID_AUTORUN, 0)) { - printf("raidautorun: RAID_AUTORUN failed: %d\n", errno); - } - - close(fd); -} - -static int handle_command(char ** ptr, char * cmd_name, void (*cmd_func)(const char * parm)) -{ - if (!strncmp(*ptr, cmd_name, strlen(cmd_name))) { - *ptr = strchr(*ptr, '\n'); - if (!*ptr) - fatal_error("Bad config file: no newline after command"); - (*ptr)++; - cmd_func(*ptr); - *ptr = strchr(*ptr, '\n'); - if (!*ptr) - exit(0); - (*ptr)++; - return 1; - } - return 0; -} - - -int main(int argc, char **argv) -{ - int fd_conf, i; - char buf[5000]; - char * ptr; - - if (strstr(argv[0], "modprobe")) - exit(0); - - if (mount("/proc", "/loopfs", "proc", 0, NULL)) - printf("[] couldn't mount proc filesystem\n"); - else { - int fd_cmdline = open("/loopfs/cmdline", O_RDONLY); - if (fd_cmdline > 0) { - i = read(fd_cmdline, buf, sizeof(buf)); - if (i == -1) - warning("could not read cmdline"); - else { - buf[i] = '\0'; - if (strstr(buf, "quiet")) - quiet = 1; - } - close(fd_cmdline); - } - umount("/loopfs"); - } - - if (!quiet) - printf("[] initrd_helper v" VERSION "\n"); - - if ((fd_conf = open("/mkinitrd_helper.conf", O_RDONLY)) < 0) - fatal_error("could not open mkinitrd_helper config file"); - - i = read(fd_conf, buf, sizeof(buf)); - if (i == -1) - fatal_error("could not read mkinitrd_helper config file"); - buf[i] = '\0'; - close(fd_conf); - - ptr = buf; - - while (*ptr) - if (!(handle_command(&ptr, "insmod", insmod_) + - handle_command(&ptr, "mount", mount_) + - handle_command(&ptr, "raidautorun", raidautorun_) + - handle_command(&ptr, "set_loop", set_loop_))) - warning("unkown command (trying to continue)"); - - return 0; -} diff --git a/mdk-stage1/modules.c b/mdk-stage1/modules.c deleted file mode 100644 index 31d20bbaa..000000000 --- a/mdk-stage1/modules.c +++ /dev/null @@ -1,377 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * (1) calculate dependencies - * (2) unarchive relevant modules - * (3) insmod them - */ - -#include -#include -#include -#include -#include -#include -#include -#include "insmod.h" -#include "stage1.h" -#include "log.h" -#include "mar/mar-extract-only.h" -#include "frontend.h" -#include "modules_descr.h" - -#include "modules.h" - -static struct module_deps_elem * modules_deps = NULL; - -static char * archive_name = "/modules/modules.mar"; -static int disable_modules = 0; - - -/* unarchive and insmod given module - * WARNING: module must not contain the trailing ".o" - */ -static enum insmod_return insmod_archived_file(const char * mod_name, char * options) -{ - char module_name[50]; - char final_name[50] = "/tmp/"; - int i, rc; - - strncpy(module_name, mod_name, sizeof(module_name)); - strcat(module_name, ".o"); - i = mar_extract_file(archive_name, module_name, "/tmp/"); - if (i == 1) { - log_message("file-not-found-in-archive %s", module_name); - return INSMOD_FAILED_FILE_NOT_FOUND; - } - if (i != 0) - return INSMOD_FAILED; - - strcat(final_name, mod_name); - strcat(final_name, ".o"); - - rc = insmod_call(final_name, options); - unlink(final_name); /* sucking no space left on device */ - if (rc) { - log_message("\tfailed"); - return INSMOD_FAILED; - } - return INSMOD_OK; -} - - - -static int load_modules_dependencies(void) -{ - char * deps_file = "/modules/modules.dep"; - char * buf, * ptr, * start, * end; - struct stat s; - int fd, line, i; - - log_message("loading modules dependencies"); - - if (IS_TESTING) - return 0; - - fd = open(deps_file, O_RDONLY); - if (fd == -1) { - log_perror(deps_file); - return -1; - } - - fstat(fd, &s); - buf = alloca(s.st_size + 1); - if (read(fd, buf, s.st_size) != s.st_size) { - log_perror(deps_file); - return -1; - } - buf[s.st_size] = '\0'; - close(fd); - - ptr = buf; - line = 0; - while (ptr) { - line++; - ptr = strchr(ptr + 1, '\n'); - } - - modules_deps = malloc(sizeof(*modules_deps) * (line+1)); - - start = buf; - line = 0; - while (start < (buf+s.st_size) && *start) { - char * tmp_deps[50]; - - end = strchr(start, '\n'); - *end = '\0'; - - ptr = strchr(start, ':'); - if (!ptr) { - start = end + 1; - continue; - } - *ptr = '\0'; - ptr++; - - while (*ptr && (*ptr == ' ')) ptr++; - if (!*ptr) { - start = end + 1; - continue; - } - - /* sort of a good line */ - modules_deps[line].name = strdup(start); - - start = ptr; - i = 0; - while (start && *start) { - ptr = strchr(start, ' '); - if (ptr) *ptr = '\0'; - tmp_deps[i++] = strdup(start); - if (ptr) - start = ptr + 1; - else - start = NULL; - while (start && *start && *start == ' ') - start++; - } - tmp_deps[i++] = NULL; - - modules_deps[line].deps = memdup(tmp_deps, sizeof(char *) * i); - - line++; - start = end + 1; - } - modules_deps[line].name = NULL; - - return 0; -} - - -void init_modules_insmoding(void) -{ - if (load_modules_dependencies()) { - log_message("warning, error initing modules stuff, modules loading disabled"); - disable_modules = 1; - } -} - - -static void add_modules_conf(char * str) -{ - static char data[500] = ""; - char * target = "/etc/modules.conf"; - int fd; - - if (strlen(data) + strlen(str) >= sizeof(data)) - return; - - strcat(data, str); - strcat(data, "\n"); - - fd = open(target, O_CREAT|O_WRONLY|O_TRUNC, 00660); - - if (fd == -1) { - log_perror(str); - return; - } - - if (write(fd, data, strlen(data) + 1) != strlen(data) + 1) - log_perror(str); - - close(fd); -} - - -static int module_already_present(const char * name) -{ - FILE * f; - int answ = 0; - f = fopen("/proc/modules", "rb"); - while (1) { - char buf[500]; - if (!fgets(buf, sizeof(buf), f)) break; - if (!strncmp(name, buf, strlen(name)) && buf[strlen(name)] == ' ') - answ = 1; - } - fclose(f); - return answ; -} - - -static enum insmod_return insmod_with_deps(const char * mod_name, char * options) -{ - struct module_deps_elem * dep; - - dep = modules_deps; - while (dep && dep->name && strcmp(dep->name, mod_name)) dep++; - - if (dep && dep->name && dep->deps) { - char ** one_dep; - one_dep = dep->deps; - while (*one_dep) { - /* here, we can fail but we don't care, if the error is - * important, the desired module will fail also */ - insmod_with_deps(*one_dep, NULL); - one_dep++; - } - } - - if (module_already_present(mod_name)) - return INSMOD_OK; - - log_message("needs %s", mod_name); - return insmod_archived_file(mod_name, options); -} - - -enum insmod_return my_insmod(const char * mod_name, enum driver_type type, char * options) -{ - char alias[500]; - int i; -#ifndef DISABLE_MEDIAS - static int number_scsi = 0; -#endif -#ifndef DISABLE_NETWORK - char ** net_devices = NULL; /* fucking compiler */ -#endif - - log_message("have to insmod %s", mod_name); - - if (disable_modules) { - log_message("\tdisabled"); - return INSMOD_OK; - } - -#ifndef DISABLE_NETWORK - if (type == NETWORK_DEVICES) - net_devices = get_net_devices(); -#endif - - if (IS_TESTING) - return INSMOD_OK; - - i = insmod_with_deps(mod_name, options); - if (i == 0) { - log_message("\tsucceeded %s", mod_name); -#ifndef DISABLE_MEDIAS - if (type == SCSI_ADAPTERS) { - if (number_scsi > 0) - sprintf(alias, "alias scsi_hostadapter%d %s", number_scsi, mod_name); - else - sprintf(alias, "alias scsi_hostadapter %s", mod_name); - number_scsi++; - add_modules_conf(alias); - log_message("SCSI: %s", alias); - } -#endif -#ifndef DISABLE_NETWORK - if (type == NETWORK_DEVICES) { - char ** new_net_devices = get_net_devices(); - while (new_net_devices && *new_net_devices) { - char ** ptr = net_devices; - while (ptr && *ptr) { - if (!strcmp(*new_net_devices, *ptr)) - goto already_present; - ptr++; - } - sprintf(alias, "alias %s %s", *new_net_devices, mod_name); - add_modules_conf(alias); - log_message("NET: %s", alias); - net_discovered_interface(*new_net_devices); - - already_present: - new_net_devices++; - } - } -#endif - } else - log_message("warning, insmod failed (%s %s) (%d)", mod_name, options, i); - - return i; - -} - -static enum return_type insmod_with_options(char * mod, enum driver_type type) -{ - char * questions[] = { "Options", NULL }; - static char ** answers = NULL; - enum return_type results; - char options[500] = "options "; - - results = ask_from_entries("Please enter the parameters to give to the kernel:", questions, &answers, 24, NULL); - if (results != RETURN_OK) - return results; - - strcat(options, mod); - strcat(options, " "); - strcat(options, answers[0]); // because my_insmod will eventually modify the string - - if (my_insmod(mod, type, answers[0]) != INSMOD_OK) { - stg1_error_message("Insmod failed."); - return RETURN_ERROR; - } - - add_modules_conf(options); - - return RETURN_OK; -} - -enum return_type ask_insmod(enum driver_type type) -{ - char * mytype; - char msg[200]; - enum return_type results; - char * choice; - - unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ - - if (type == SCSI_ADAPTERS) - mytype = "SCSI"; - else if (type == NETWORK_DEVICES) - mytype = "NET"; - else - return RETURN_ERROR; - - if (disable_modules) - return RETURN_BACK; - - snprintf(msg, sizeof(msg), "Which driver should I try to gain %s access?", mytype); - - { - char ** drivers = mar_list_contents(archive_name); - char ** descrs = malloc(sizeof(char *) * string_array_length(drivers)); - char ** p_drivers = drivers; - char ** p_descrs = descrs; - while (p_drivers && *p_drivers) { - int i; - *p_descrs = NULL; - for (i = 0 ; i < modules_descriptions_num ; i++) { - if (!strncmp(*p_drivers, modules_descriptions[i].module, strlen(modules_descriptions[i].module)) - && (*p_drivers)[strlen(modules_descriptions[i].module)] == '.') /* one contains '.o' not the other */ - *p_descrs = modules_descriptions[i].descr; - } - p_drivers++; - p_descrs++; - } - results = ask_from_list_comments(msg, drivers, descrs, &choice); - } - - if (results == RETURN_OK) { - choice[strlen(choice)-2] = '\0'; /* remove trailing .o */ - return insmod_with_options(choice, type); - } else - return results; -} diff --git a/mdk-stage1/modules.h b/mdk-stage1/modules.h deleted file mode 100644 index 9ed992033..000000000 --- a/mdk-stage1/modules.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _MODULES_H_ -#define _MODULES_H_ - -#include "stage1.h" -#include "probing.h" - -enum insmod_return { INSMOD_OK, INSMOD_FAILED, INSMOD_FAILED_FILE_NOT_FOUND }; - -void init_modules_insmoding(void); -enum insmod_return my_insmod(const char * mod_name, enum driver_type type, char * options); -enum return_type ask_insmod(enum driver_type); - -struct module_deps_elem { - char * name; - char ** deps; -}; - - - -#endif diff --git a/mdk-stage1/modules_descr.h b/mdk-stage1/modules_descr.h deleted file mode 100644 index 356605137..000000000 --- a/mdk-stage1/modules_descr.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2001 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _MODULES_DESCR_H_ -#define _MODULES_DESCR_H_ - -struct module_descr { - const char * module; - char * descr; -}; - -struct module_descr modules_descriptions[] = { - /* description of network drivers that have not very explicit names */ - { "ne", "NE1000/NE2000/clones" }, - { "ne2k-pci", "PCI NE2000" }, - { "depca", "DEC DEPCA/DE100/DE101/DE200/DE201/DE202/DE210/DE422" }, - { "dgrs", "Digi RightSwitch SE-X" }, - { "ewrk3", "DEC DE203/DE204/DE205" }, - { "lance", "Allied Telesis AT1500, HP J2405A, NE2100/NE2500" }, - { "sis900", "SiS 900/7016/630E, Am79c901, RTL8201" }, - { "via-rhine", "VIA VT86c100A Rhine-II, 3043 Rhine-I" }, - { "tulip", "DEC 21040-family based cards" }, - { "wd", "WD8003/WD8013" }, - - /* description of scsi drivers that have not very explicit names */ - { "53c7,8xx", "NCR53c810/700" }, - { "sim710", "NCR53c710" }, - { "aic7xxx", "Adaptec 7xxx family (AIC/AHA/etc)" }, - { "atp870u", "ACARD/ARTOP AEC-6710/6712" }, - { "ncr53c8xx", "Symbios 53c family" }, - { "sym53c8xx", "Symbios 53c family" }, - { "sim710", "NCR53C710 family" }, - -}; - -int modules_descriptions_num = sizeof(modules_descriptions) / sizeof(struct module_descr); - - -#endif diff --git a/mdk-stage1/mount.c b/mdk-stage1/mount.c deleted file mode 100644 index 171bf30b5..000000000 --- a/mdk-stage1/mount.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include -#include -#include -#include -#include -#include -#include "log.h" -#include "modules.h" - -#include "mount.h" - - - -#ifndef DISABLE_MEDIAS -/* WARNING: this won't work if the argument is not /dev/ based */ -static int ensure_dev_exists(char *dev) -{ - int major, minor; - int type = S_IFBLK; /* my default type is block. don't forget to change for chars */ - char * name; - struct stat buf; - - name = &dev[5]; /* we really need that dev be passed as /dev/something.. */ - - if (!stat(dev, &buf)) - return 0; /* if the file already exists, we assume it's correct */ - - if (name[0] == 's' && name[1] == 'd') { - /* SCSI disks */ - major = 8; - minor = (name[2] - 'a') << 4; - if (name[3] && name[4]) - minor += 10 + (name[4] - '0'); - else if (name[3]) - minor += (name[3] - '0'); - } else if (name[0] == 'h' && name[1] == 'd') { - /* IDE disks/cd's */ - if (name[2] == 'a') - major = 3, minor = 0; - else if (name[2] == 'b') - major = 3, minor = 64; - else if (name[2] == 'c') - major = 22, minor = 0; - else if (name[2] == 'd') - major = 22, minor = 64; - else if (name[2] == 'e') - major = 33, minor = 0; - else if (name[2] == 'f') - major = 33, minor = 64; - else if (name[2] == 'g') - major = 34, minor = 0; - else if (name[2] == 'h') - major = 34, minor = 64; - else - return -1; - - if (name[3] && name[4]) - minor += 10 + (name[4] - '0'); - else if (name[3]) - minor += (name[3] - '0'); - } else if (name[0] == 's' && name[1] == 'c' && name[2] == 'd') { - /* SCSI cd's */ - major = 11; - minor = name[3] - '0'; - } else { - log_message("I don't know how to create device %s, please post bugreport to me!", dev); - return -1; - } - - if (mknod(dev, type | 0600, makedev(major, minor))) { - log_perror(dev); - return -1; - } - - return 0; -} -#endif /* DISABLE_MEDIAS */ - - -/* mounts, creating the device if needed+possible */ -int my_mount(char *dev, char *location, char *fs) -{ - unsigned long flags; - char * opts = NULL; - struct stat buf; - int rc; - -#ifndef DISABLE_MEDIAS - if (strcmp(fs, "nfs")) { - rc = ensure_dev_exists(dev); - if (rc != 0) { - log_message("could not create required device file"); - return -1; - } - } -#endif - - log_message("mounting %s on %s as type %s", dev, location, fs); - - if (stat(location, &buf)) { - if (mkdir(location, 0755)) { - log_perror("could not create location dir"); - return -1; - } - } else if (!S_ISDIR(buf.st_mode)) { - log_message("not a dir %s, will unlink and mkdir", location); - if (unlink(location)) { - log_perror("could not unlink"); - return -1; - } - if (mkdir(location, 0755)) { - log_perror("could not create location dir"); - return -1; - } - } - - flags = MS_MGC_VAL; - -#ifndef DISABLE_MEDIAS - if (!strcmp(fs, "vfat")) { - my_insmod("vfat", ANY_DRIVER_TYPE, NULL); - opts = "check=relaxed"; - } - - if (!strcmp(fs, "reiserfs")) { - my_insmod("reiserfs", ANY_DRIVER_TYPE, NULL); - } - - if (!strcmp(fs, "iso9660")) { - my_insmod("isofs", ANY_DRIVER_TYPE, NULL); - flags |= MS_RDONLY; - } -#endif - -#ifndef DISABLE_NETWORK - if (!strcmp(fs, "nfs")) { - int flags = 0; - - my_insmod("nfs", ANY_DRIVER_TYPE, NULL); - flags |= MS_RDONLY; - - log_message("preparing nfsmount for %s", dev); - - rc = nfsmount_prepare(dev, &flags, &opts); - if (rc != 0) - return rc; - } -#endif - - rc = mount(dev, location, fs, flags, opts); - - if (rc != 0) { - log_perror("mount failed"); - rmdir(location); - } - - return rc; -} diff --git a/mdk-stage1/mount.h b/mdk-stage1/mount.h deleted file mode 100644 index b679e5c30..000000000 --- a/mdk-stage1/mount.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#ifndef _MOUNT_H_ -#define _MOUNT_H_ - -#ifndef DISABLE_NETWORK -#include "nfsmount.h" -#endif - -int my_mount(char *dev, char *location, char *fs); - -#endif diff --git a/mdk-stage1/mount_rpcgen.h b/mdk-stage1/mount_rpcgen.h deleted file mode 100644 index d70ccaf9d..000000000 --- a/mdk-stage1/mount_rpcgen.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Please do not edit this file. - * It was generated using rpcgen. - */ - -#ifndef _MOUNT_H_RPCGEN -#define _MOUNT_H_RPCGEN - -#include - -#define MNTPATHLEN 1024 -#define MNTNAMLEN 255 -#define FHSIZE 32 - -typedef char fhandle[FHSIZE]; -#ifdef __cplusplus -extern "C" bool_t xdr_fhandle(XDR *, fhandle); -#elif __STDC__ -extern bool_t xdr_fhandle(XDR *, fhandle); -#else /* Old Style C */ -bool_t xdr_fhandle(); -#endif /* Old Style C */ - - -struct fhstatus { - u_int fhs_status; - union { - fhandle fhs_fhandle; - } fhstatus_u; -}; -typedef struct fhstatus fhstatus; -#ifdef __cplusplus -extern "C" bool_t xdr_fhstatus(XDR *, fhstatus*); -#elif __STDC__ -extern bool_t xdr_fhstatus(XDR *, fhstatus*); -#else /* Old Style C */ -bool_t xdr_fhstatus(); -#endif /* Old Style C */ - - -typedef char *dirpath; -#ifdef __cplusplus -extern "C" bool_t xdr_dirpath(XDR *, dirpath*); -#elif __STDC__ -extern bool_t xdr_dirpath(XDR *, dirpath*); -#else /* Old Style C */ -bool_t xdr_dirpath(); -#endif /* Old Style C */ - - -typedef char *name; -#ifdef __cplusplus -extern "C" bool_t xdr_name(XDR *, name*); -#elif __STDC__ -extern bool_t xdr_name(XDR *, name*); -#else /* Old Style C */ -bool_t xdr_name(); -#endif /* Old Style C */ - - -typedef struct mountbody *mountlist; -#ifdef __cplusplus -extern "C" bool_t xdr_mountlist(XDR *, mountlist*); -#elif __STDC__ -extern bool_t xdr_mountlist(XDR *, mountlist*); -#else /* Old Style C */ -bool_t xdr_mountlist(); -#endif /* Old Style C */ - - -struct mountbody { - name ml_hostname; - dirpath ml_directory; - mountlist ml_next; -}; -typedef struct mountbody mountbody; -#ifdef __cplusplus -extern "C" bool_t xdr_mountbody(XDR *, mountbody*); -#elif __STDC__ -extern bool_t xdr_mountbody(XDR *, mountbody*); -#else /* Old Style C */ -bool_t xdr_mountbody(); -#endif /* Old Style C */ - - -typedef struct groupnode *groups; -#ifdef __cplusplus -extern "C" bool_t xdr_groups(XDR *, groups*); -#elif __STDC__ -extern bool_t xdr_groups(XDR *, groups*); -#else /* Old Style C */ -bool_t xdr_groups(); -#endif /* Old Style C */ - - -struct groupnode { - name gr_name; - groups gr_next; -}; -typedef struct groupnode groupnode; -#ifdef __cplusplus -extern "C" bool_t xdr_groupnode(XDR *, groupnode*); -#elif __STDC__ -extern bool_t xdr_groupnode(XDR *, groupnode*); -#else /* Old Style C */ -bool_t xdr_groupnode(); -#endif /* Old Style C */ - - -typedef struct exportnode *exports; -#ifdef __cplusplus -extern "C" bool_t xdr_exports(XDR *, exports*); -#elif __STDC__ -extern bool_t xdr_exports(XDR *, exports*); -#else /* Old Style C */ -bool_t xdr_exports(); -#endif /* Old Style C */ - - -struct exportnode { - dirpath ex_dir; - groups ex_groups; - exports ex_next; -}; -typedef struct exportnode exportnode; -#ifdef __cplusplus -extern "C" bool_t xdr_exportnode(XDR *, exportnode*); -#elif __STDC__ -extern bool_t xdr_exportnode(XDR *, exportnode*); -#else /* Old Style C */ -bool_t xdr_exportnode(); -#endif /* Old Style C */ - - -#define MOUNTPROG ((u_long)100005) -#define MOUNTVERS ((u_long)1) - -#ifdef __cplusplus -#define MOUNTPROC_NULL ((u_long)0) -extern "C" void * mountproc_null_1(void *, CLIENT *); -extern "C" void * mountproc_null_1_svc(void *, struct svc_req *); -#define MOUNTPROC_MNT ((u_long)1) -extern "C" fhstatus * mountproc_mnt_1(dirpath *, CLIENT *); -extern "C" fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_DUMP ((u_long)2) -extern "C" mountlist * mountproc_dump_1(void *, CLIENT *); -extern "C" mountlist * mountproc_dump_1_svc(void *, struct svc_req *); -#define MOUNTPROC_UMNT ((u_long)3) -extern "C" void * mountproc_umnt_1(dirpath *, CLIENT *); -extern "C" void * mountproc_umnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern "C" void * mountproc_umntall_1(void *, CLIENT *); -extern "C" void * mountproc_umntall_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORT ((u_long)5) -extern "C" exports * mountproc_export_1(void *, CLIENT *); -extern "C" exports * mountproc_export_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern "C" exports * mountproc_exportall_1(void *, CLIENT *); -extern "C" exports * mountproc_exportall_1_svc(void *, struct svc_req *); - -#elif __STDC__ -#define MOUNTPROC_NULL ((u_long)0) -extern void * mountproc_null_1(void *, CLIENT *); -extern void * mountproc_null_1_svc(void *, struct svc_req *); -#define MOUNTPROC_MNT ((u_long)1) -extern fhstatus * mountproc_mnt_1(dirpath *, CLIENT *); -extern fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_DUMP ((u_long)2) -extern mountlist * mountproc_dump_1(void *, CLIENT *); -extern mountlist * mountproc_dump_1_svc(void *, struct svc_req *); -#define MOUNTPROC_UMNT ((u_long)3) -extern void * mountproc_umnt_1(dirpath *, CLIENT *); -extern void * mountproc_umnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern void * mountproc_umntall_1(void *, CLIENT *); -extern void * mountproc_umntall_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORT ((u_long)5) -extern exports * mountproc_export_1(void *, CLIENT *); -extern exports * mountproc_export_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern exports * mountproc_exportall_1(void *, CLIENT *); -extern exports * mountproc_exportall_1_svc(void *, struct svc_req *); - -#else /* Old Style C */ -#define MOUNTPROC_NULL ((u_long)0) -extern void * mountproc_null_1(); -extern void * mountproc_null_1_svc(); -#define MOUNTPROC_MNT ((u_long)1) -extern fhstatus * mountproc_mnt_1(); -extern fhstatus * mountproc_mnt_1_svc(); -#define MOUNTPROC_DUMP ((u_long)2) -extern mountlist * mountproc_dump_1(); -extern mountlist * mountproc_dump_1_svc(); -#define MOUNTPROC_UMNT ((u_long)3) -extern void * mountproc_umnt_1(); -extern void * mountproc_umnt_1_svc(); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern void * mountproc_umntall_1(); -extern void * mountproc_umntall_1_svc(); -#define MOUNTPROC_EXPORT ((u_long)5) -extern exports * mountproc_export_1(); -extern exports * mountproc_export_1_svc(); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern exports * mountproc_exportall_1(); -extern exports * mountproc_exportall_1_svc(); -#endif /* Old Style C */ - -#endif /* !_MOUNT_H_RPCGEN */ diff --git a/mdk-stage1/network.c b/mdk-stage1/network.c deleted file mode 100644 index e3052b149..000000000 --- a/mdk-stage1/network.c +++ /dev/null @@ -1,823 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "stage1.h" -#include "frontend.h" -#include "modules.h" -#include "probing.h" -#include "log.h" -#include "mount.h" -#include "automatic.h" -#include "dhcp.h" -#include "adsl.h" -#include "url.h" -#include "dns.h" - -#include "network.h" - - -static void error_message_net(void) /* reduce code size */ -{ - stg1_error_message("Could not configure network."); -} - - -int configure_net_device(struct interface_info * intf) -{ - struct ifreq req; - struct rtentry route; - int s; - struct sockaddr_in addr; - struct in_addr ia; - char ip[20], nm[20], nw[20], bc[20]; - - addr.sin_family = AF_INET; - addr.sin_port = 0; - - memcpy(&ia, &intf->ip, sizeof(intf->ip)); - strcpy(ip, inet_ntoa(ia)); - - memcpy(&ia, &intf->netmask, sizeof(intf->netmask)); - strcpy(nm, inet_ntoa(ia)); - - memcpy(&ia, &intf->broadcast, sizeof(intf->broadcast)); - strcpy(bc, inet_ntoa(ia)); - - memcpy(&ia, &intf->network, sizeof(intf->network)); - strcpy(nw, inet_ntoa(ia)); - - log_message("configuring device %s ip: %s nm: %s nw: %s bc: %s", intf->device, ip, nm, nw, bc); - - if (IS_TESTING) - return 0; - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - log_perror("socket"); - error_message_net(); - return 1; - } - - strcpy(req.ifr_name, intf->device); - - if (intf->is_up == 1) { - log_message("interface already up, downing before reconfigure"); - - req.ifr_flags = 0; - if (ioctl(s, SIOCSIFFLAGS, &req)) { - close(s); - log_perror("SIOCSIFFLAGS (downing)"); - error_message_net(); - return 1; - } - } - - /* sets IP address */ - addr.sin_port = 0; - memcpy(&addr.sin_addr, &intf->ip, sizeof(intf->ip)); - memcpy(&req.ifr_addr, &addr, sizeof(addr)); - if (ioctl(s, SIOCSIFADDR, &req)) { - close(s); - log_perror("SIOCSIFADDR"); - error_message_net(); - return 1; - } - - /* sets broadcast */ - memcpy(&addr.sin_addr, &intf->broadcast, sizeof(intf->broadcast)); - memcpy(&req.ifr_broadaddr, &addr, sizeof(addr)); - if (ioctl(s, SIOCSIFBRDADDR, &req)) { - close(s); - log_perror("SIOCSIFBRDADDR"); - error_message_net(); - return 1; - } - - /* sets netmask */ - memcpy(&addr.sin_addr, &intf->netmask, sizeof(intf->netmask)); - memcpy(&req.ifr_netmask, &addr, sizeof(addr)); - if (ioctl(s, SIOCSIFNETMASK, &req)) { - close(s); - log_perror("SIOCSIFNETMASK"); - error_message_net(); - return 1; - } - - if (intf->is_ptp) - req.ifr_flags = IFF_UP | IFF_RUNNING | IFF_POINTOPOINT | IFF_NOARP; - else - req.ifr_flags = IFF_UP | IFF_RUNNING | IFF_BROADCAST; - - /* brings up networking! */ - if (ioctl(s, SIOCSIFFLAGS, &req)) { - close(s); - log_perror("SIOCSIFFLAGS (upping)"); - error_message_net(); - return 1; - } - - memset(&route, 0, sizeof(route)); - route.rt_dev = intf->device; - route.rt_flags = RTF_UP; - - memcpy(&addr.sin_addr, &intf->network, sizeof(intf->network)); - memcpy(&route.rt_dst, &addr, sizeof(addr)); - - memcpy(&addr.sin_addr, &intf->netmask, sizeof(intf->netmask)); - memcpy(&route.rt_genmask, &addr, sizeof(addr)); - - /* adds route */ - if (ioctl(s, SIOCADDRT, &route)) { - close(s); - log_perror("SIOCADDRT"); - error_message_net(); - return 1; - } - - close(s); - - intf->is_up = 1; - - if (intf->boot_proto == BOOTPROTO_STATIC && !streq(intf->device, "lo")) { - /* I need to sleep a bit in order for kernel to finish - init of the network device; if not, first sendto() for - gethostbyaddr will get an EINVAL. */ - wait_message("Bringing up networking..."); - sleep(2); - remove_wait_message(); - } - - return 0; -} - -/* host network informations */ -char * hostname = NULL; -char * domain = NULL; -struct in_addr gateway = { 0 }; -struct in_addr dns_server = { 0 }; -struct in_addr dns_server2 = { 0 }; - -static int add_default_route(void) -{ - int s; - struct rtentry route; - struct sockaddr_in addr; - - if (IS_TESTING) - return 0; - - if (gateway.s_addr == 0) { - log_message("no gateway provided, can't add default route"); - return 0; - } - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - close(s); - log_perror("socket"); - error_message_net(); - return 1; - } - - memset(&route, 0, sizeof(route)); - - addr.sin_family = AF_INET; - addr.sin_port = 0; - addr.sin_addr = gateway; - memcpy(&route.rt_gateway, &addr, sizeof(addr)); - - addr.sin_addr.s_addr = INADDR_ANY; - memcpy(&route.rt_dst, &addr, sizeof(addr)); - memcpy(&route.rt_genmask, &addr, sizeof(addr)); - - route.rt_flags = RTF_UP | RTF_GATEWAY; - route.rt_metric = 0; - - if (ioctl(s, SIOCADDRT, &route)) { - close(s); - log_perror("SIOCADDRT"); - error_message_net(); - return 1; - } - - close(s); - - return 0; -} - - -static int write_resolvconf(void) { - char * filename = "/etc/resolv.conf"; - FILE * f; - - if (dns_server.s_addr == 0) { - log_message("resolvconf needs a dns server"); - return -1; - } - - f = fopen(filename, "w"); - if (!f) { - log_perror(filename); - return -1; - } - - if (domain) - fprintf(f, "search %s\n", domain); /* we can live without the domain search (user will have to enter fully-qualified names) */ - fprintf(f, "nameserver %s\n", inet_ntoa(dns_server)); - if (dns_server2.s_addr != 0) - fprintf(f, "nameserver %s\n", inet_ntoa(dns_server2)); - - fclose(f); - res_init(); /* reinit the resolver so DNS changes take affect */ - - return 0; -} - - -static int save_netinfo(struct interface_info * intf) { - char * file_network = "/tmp/network"; - char file_intf[500]; - FILE * f; - - f = fopen(file_network, "w"); - if (!f) { - log_perror(file_network); - return -1; - } - - fprintf(f, "NETWORKING=yes\n"); - fprintf(f, "FORWARD_IPV4=false\n"); - - if (hostname) - fprintf(f, "HOSTNAME=%s\n", hostname); - if (domain) - fprintf(f, "DOMAINNAME=%s\n", domain); - - if (gateway.s_addr != 0) - fprintf(f, "GATEWAY=%s\n", inet_ntoa(gateway)); - - fclose(f); - - - strcpy(file_intf, "/tmp/ifcfg-"); - strcat(file_intf, intf->device); - - f = fopen(file_intf, "w"); - if (!f) { - log_perror(file_intf); - return -1; - } - - fprintf(f, "DEVICE=%s\n", intf->device); - - if (intf->boot_proto == BOOTPROTO_DHCP) - fprintf(f, "BOOTPROTO=dhcp\n"); - else { - fprintf(f, "BOOTPROTO=static\n"); - fprintf(f, "IPADDR=%s\n", inet_ntoa(intf->ip)); - fprintf(f, "NETMASK=%s\n", inet_ntoa(intf->netmask)); - fprintf(f, "NETWORK=%s\n", inet_ntoa(intf->network)); - fprintf(f, "BROADCAST=%s\n", inet_ntoa(intf->broadcast)); - } - - fclose(f); - - return 0; -} - - -char * guess_netmask(char * ip_addr) -{ - struct in_addr addr; - unsigned long int tmp; - - if (streq(ip_addr, "") || !inet_aton(ip_addr, &addr)) - return ""; - - log_message("guessing netmask"); - - tmp = ntohl(addr.s_addr); - - if (((tmp & 0xFF000000) >> 24) <= 127) - return "255.0.0.0"; - else if (((tmp & 0xFF000000) >> 24) <= 191) - return "255.255.0.0"; - else - return "255.255.255.0"; -} - - -static void static_ip_callback(char ** strings) -{ - struct in_addr addr; - - if (!inet_aton(strings[0], &addr)) - return; - - if (!strcmp(strings[1], "")) { - char * ptr; - strings[1] = strdup(strings[0]); - ptr = strrchr(strings[1], '.'); - if (ptr) - *(ptr+1) = '\0'; - } - - if (!strcmp(strings[2], "")) - strings[2] = strdup(strings[1]); - - if (!strcmp(strings[3], "")) - strings[3] = strdup(guess_netmask(strings[0])); -} - - -static enum return_type setup_network_interface(struct interface_info * intf) -{ - enum return_type results; - char * bootprotos[] = { "Static", "DHCP", "ADSL", NULL }; - char * bootprotos_auto[] = { "static", "dhcp", "adsl" }; - char * choice; - - results = ask_from_list_auto("Please choose the desired IP attribution.", bootprotos, &choice, "network", bootprotos_auto); - if (results != RETURN_OK) - return results; - - if (!strcmp(choice, "Static")) { - char * questions[] = { "IP of this machine", "IP of DNS", "IP of default gateway", "Netmask", NULL }; - char * questions_auto[] = { "ip", "dns", "gateway", "netmask" }; - static char ** answers = NULL; - struct in_addr addr; - - results = ask_from_entries_auto("Please enter the network information. (leave netmask void for Internet standard)", - questions, &answers, 16, questions_auto, static_ip_callback); - if (results != RETURN_OK) - return setup_network_interface(intf); - - if (streq(answers[0], "") || !inet_aton(answers[0], &addr)) { - stg1_error_message("Invalid IP address."); - return setup_network_interface(intf); - } - memcpy(&intf->ip, &addr, sizeof(addr)); - - if (!inet_aton(answers[1], &dns_server)) { - log_message("invalid DNS"); - dns_server.s_addr = 0; /* keep an understandable state */ - } - - if (!inet_aton(answers[2], &gateway)) { - log_message("invalid gateway"); - gateway.s_addr = 0; /* keep an understandable state */ - } - - if ((streq(answers[3], "") && inet_aton(guess_netmask(answers[0]), &addr)) - || inet_aton(answers[3], &addr)) - memcpy(&intf->netmask, &addr, sizeof(addr)); - else { - stg1_error_message("Invalid netmask."); - return setup_network_interface(intf); - } - - *((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) & - *((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask)); - - inet_aton("255.255.255.255", &addr); - if (!memcmp(&addr, &intf->netmask, sizeof(addr))) { - log_message("netmask is 255.255.255.255 -> point to point device"); - intf->network = gateway; - intf->is_ptp = 1; - } else { - *((uint32_t *) &intf->network) = *((uint32_t *) &intf->ip) & *((uint32_t *) &intf->netmask); - intf->is_ptp = 0; - } - intf->boot_proto = BOOTPROTO_STATIC; - - if (configure_net_device(intf)) - return RETURN_ERROR; - - } else if (streq(choice, "DHCP")) { - results = perform_dhcp(intf); - - if (results == RETURN_BACK) - return setup_network_interface(intf); - if (results == RETURN_ERROR) - return results; - intf->boot_proto = BOOTPROTO_DHCP; - - if (configure_net_device(intf)) - return RETURN_ERROR; - - } else if (streq(choice, "ADSL")) { - intf->boot_proto = BOOTPROTO_STATIC; - - results = perform_adsl(intf); - - if (results == RETURN_BACK) - return setup_network_interface(intf); - if (results == RETURN_ERROR) - return results; - } else - return RETURN_ERROR; - - return add_default_route(); -} - - -static enum return_type configure_network(struct interface_info * intf) -{ - char * dnshostname; - - if (hostname && domain) - return RETURN_OK; - - dnshostname = mygethostbyaddr(inet_ntoa(intf->ip)); - - if (dnshostname) { - hostname = strdup(dnshostname); - domain = strchr(strdup(hostname), '.') + 1; - log_message("got hostname and domain from dns entry, %s and %s", hostname, domain); - return RETURN_OK; - } - - log_message("reverse name lookup on self failed"); - - if (domain) - return RETURN_OK; - - if (dns_server.s_addr != 0) { - wait_message("Trying to resolve dns..."); - dnshostname = mygethostbyaddr(inet_ntoa(dns_server)); - remove_wait_message(); - } - - if (dnshostname) { - domain = strchr(strdup(dnshostname), '.') + 1; - log_message("got domain from DNS fullname, %s", domain); - } else { - enum return_type results; - char * questions[] = { "Host name", "Domain name", NULL }; - char * questions_auto[] = { "hostname", "domain" }; - static char ** answers = NULL; - char * boulet; - - log_message("reverse name lookup on DNS failed"); - - results = ask_from_entries_auto("I could not guess hostname and domain name; please fill in this information. " - "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for " - "domain name, for a machine called `mybox.mynetwork.com' on the Internet.", - questions, &answers, 32, questions_auto, NULL); - if (results != RETURN_OK) - return results; - - hostname = answers[0]; - if ((boulet = strchr(hostname, '.')) != NULL) - boulet[0] = '\0'; - domain = answers[1]; - } - - return RETURN_OK; -} - - -static enum return_type bringup_networking(struct interface_info * intf) -{ - static struct interface_info loopback; - enum return_type results = RETURN_ERROR; - - my_insmod("af_packet", ANY_DRIVER_TYPE, NULL); - - while (results != RETURN_OK) { - results = setup_network_interface(intf); - if (results != RETURN_OK) - return results; - write_resolvconf(); - results = configure_network(intf); - } - - write_resolvconf(); /* maybe we have now domain to write also */ - - if (loopback.is_up == 0) { - int rc; - strcpy(loopback.device, "lo"); - loopback.is_ptp = 0; - loopback.is_up = 0; - loopback.ip.s_addr = htonl(0x7f000001); - loopback.netmask.s_addr = htonl(0xff000000); - loopback.broadcast.s_addr = htonl(0x7fffffff); - loopback.network.s_addr = htonl(0x7f000000); - rc = configure_net_device(&loopback); - if (rc) - return RETURN_ERROR; - } - - return RETURN_OK; -} - - -static char * interface_select(void) -{ - char ** interfaces, ** ptr; - char * descriptions[50]; - char * choice; - int i, count = 0; - enum return_type results; - - interfaces = get_net_devices(); - - ptr = interfaces; - while (ptr && *ptr) { - count++; - ptr++; - } - - if (count == 0) { - stg1_error_message("No NET device found."); - i = ask_insmod(NETWORK_DEVICES); - if (i == RETURN_BACK) - return NULL; - return interface_select(); - } - - if (count == 1) - return *interfaces; - - i = 0; - while (interfaces[i]) { - descriptions[i] = get_net_intf_description(interfaces[i]); - i++; - } - - results = ask_from_list_comments_auto("Please choose the NET device to use for the installation.", - interfaces, descriptions, &choice, "interface", interfaces); - - if (results != RETURN_OK) - return NULL; - - return choice; -} - - - -/* -=-=-- */ - - -static enum return_type intf_select_and_up(void) -{ - static struct interface_info intf[20]; - static int num_interfaces = 0; - struct interface_info * sel_intf = NULL; - int i; - enum return_type results; - char * iface = interface_select(); - - if (iface == NULL) - return RETURN_BACK; - - for (i = 0; i < num_interfaces ; i++) - if (!strcmp(intf[i].device, iface)) - sel_intf = &(intf[i]); - - if (sel_intf == NULL) { - sel_intf = &(intf[num_interfaces]); - strcpy(sel_intf->device, iface); - sel_intf->is_up = 0; - num_interfaces++; - } - - results = bringup_networking(sel_intf); - - if (results == RETURN_OK) - save_netinfo(sel_intf); - - return results; -} - - - -enum return_type nfs_prepare(void) -{ - char * questions[] = { "NFS server name", DISTRIB_NAME " directory", NULL }; - char * questions_auto[] = { "server", "directory", NULL }; - static char ** answers = NULL; - char * nfsmount_location; - enum return_type results = intf_select_and_up(); - - if (results != RETURN_OK) - return results; - - do { - results = ask_from_entries_auto("Please enter the name or IP address of your NFS server, " - "and the directory containing the " DISTRIB_NAME " Distribution.", - questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK) - return nfs_prepare(); - - nfsmount_location = malloc(strlen(answers[0]) + strlen(answers[1]) + 2); - strcpy(nfsmount_location, answers[0]); - strcat(nfsmount_location, ":"); - strcat(nfsmount_location, answers[1]); - - if (my_mount(nfsmount_location, IMAGE_LOCATION, "nfs") == -1) { - stg1_error_message("I can't mount the directory from the NFS server."); - results = RETURN_BACK; - continue; - } - - if (access(IMAGE_LOCATION LIVE_LOCATION, R_OK)) { - stg1_error_message("That NFS volume does not seem to contain the " DISTRIB_NAME " Distribution."); - umount(IMAGE_LOCATION); - results = RETURN_BACK; - } - } - while (results == RETURN_BACK); - - log_message("found the " DISTRIB_NAME " Installation, good news!"); - - if (IS_SPECIAL_STAGE2) { - if (load_ramdisk() != RETURN_OK) { - stg1_error_message("Could not load program into memory."); - return nfs_prepare(); - } - } - - if (IS_RESCUE) - umount(IMAGE_LOCATION); - - method_name = strdup("nfs"); - return RETURN_OK; -} - - -enum return_type ftp_prepare(void) -{ - char * questions[] = { "FTP server", DISTRIB_NAME " directory", "Login", "Password", NULL }; - char * questions_auto[] = { "server", "directory", "user", "pass", NULL }; - static char ** answers = NULL; - enum return_type results; - - if (!ramdisk_possible()) { - stg1_error_message("FTP install needs more than %d Mbytes of memory (detected %d Mbytes).", - MEM_LIMIT_RAMDISK, total_memory()); - return RETURN_ERROR; - } - - results = intf_select_and_up(); - - if (results != RETURN_OK) - return results; - - do { - char location_full[500]; - int ftp_serv_response; - int fd, size; - - results = ask_from_entries_auto("Please enter the name or IP address of the FTP server, " - "the directory containing the " DISTRIB_NAME " Distribution, " - "and the login/pass if necessary (leave login blank for anonymous).", - questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK) - return ftp_prepare(); - - log_message("FTP: trying to connect to %s", answers[0]); - - ftp_serv_response = ftp_open_connection(answers[0], answers[2], answers[3], ""); - if (ftp_serv_response < 0) { - log_message("FTP: error connect %d", ftp_serv_response); - if (ftp_serv_response == FTPERR_BAD_HOSTNAME) - stg1_error_message("Error: bad hostname."); - else if (ftp_serv_response == FTPERR_FAILED_CONNECT) - stg1_error_message("Error: failed to connect to remote host."); - else - stg1_error_message("Error: couldn't connect."); - results = RETURN_BACK; - continue; - } - - strcpy(location_full, answers[1]); - strcat(location_full, get_ramdisk_realname()); - - log_message("FTP: trying to retrieve %s", location_full); - - fd = ftp_start_download(ftp_serv_response, location_full, &size); - if (fd < 0) { - log_message("FTP: error get %d", fd); - if (fd == FTPERR_PASSIVE_ERROR) - stg1_error_message("Error: error with passive connection."); - else if (fd == FTPERR_FILE_NOT_FOUND) - stg1_error_message("Error: file not found (%s).", location_full); - else if (fd == FTPERR_BAD_SERVER_RESPONSE) - stg1_error_message("Error: bad server response (server too busy?)."); - else - stg1_error_message("Error: couldn't retrieve Installation program."); - results = RETURN_BACK; - continue; - } - - log_message("FTP: size of download %d bytes", size); - - results = load_ramdisk_fd(fd, size); - if (results == RETURN_OK) - ftp_end_data_command(ftp_serv_response); - else - return results; - - method_name = strdup("ftp"); - add_to_env("HOST", answers[0]); - add_to_env("PREFIX", answers[1]); - if (strcmp(answers[2], "")) { - add_to_env("LOGIN", answers[2]); - add_to_env("PASSWORD", answers[3]); - } - } - while (results == RETURN_BACK); - - return RETURN_OK; -} - -enum return_type http_prepare(void) -{ - char * questions[] = { "HTTP server", DISTRIB_NAME " directory", NULL }; - char * questions_auto[] = { "server", "directory", NULL }; - static char ** answers = NULL; - enum return_type results; - - if (!ramdisk_possible()) { - stg1_error_message("HTTP install needs more than %d Mbytes of memory (detected %d Mbytes).", - MEM_LIMIT_RAMDISK, total_memory()); - return RETURN_ERROR; - } - - results = intf_select_and_up(); - - if (results != RETURN_OK) - return results; - - do { - char location_full[500]; - int fd, size; - - results = ask_from_entries_auto("Please enter the name or IP address of the HTTP server, " - "and the directory containing the " DISTRIB_NAME " Distribution.", - questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK) - return http_prepare(); - - strcpy(location_full, answers[1]); - strcat(location_full, get_ramdisk_realname()); - - log_message("HTTP: trying to retrieve %s", location_full); - - fd = http_download_file(answers[0], location_full, &size); - if (fd < 0) { - log_message("HTTP: error %d", fd); - if (fd == FTPERR_FAILED_CONNECT) - stg1_error_message("Error: couldn't connect to server."); - else - stg1_error_message("Error: couldn't get file (%s).", location_full); - results = RETURN_BACK; - continue; - } - - log_message("HTTP: size of download %d bytes", size); - - if (load_ramdisk_fd(fd, size) != RETURN_OK) - return RETURN_ERROR; - - method_name = strdup("http"); - sprintf(location_full, "http://%s/%s", answers[0], answers[1]); - add_to_env("URLPREFIX", location_full); - } - while (results == RETURN_BACK); - - return RETURN_OK; - -} diff --git a/mdk-stage1/network.h b/mdk-stage1/network.h deleted file mode 100644 index 0848c715e..000000000 --- a/mdk-stage1/network.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#ifndef _NETWORK_H_ -#define _NETWORK_H_ - -#include -#include -#include - - -enum return_type nfs_prepare(void); -enum return_type ftp_prepare(void); -enum return_type http_prepare(void); - - -enum boot_proto_type { BOOTPROTO_STATIC, BOOTPROTO_DHCP }; - -/* all of these in_addr things are in network byte order! */ -struct interface_info { - char device[10]; - int is_ptp, is_up; - struct in_addr ip, netmask, broadcast, network; - enum boot_proto_type boot_proto; -}; - - -/* these are to be used only by dhcp.c */ - -char * guess_netmask(char * ip_addr); - -int configure_net_device(struct interface_info * intf); - -extern char * hostname; -extern char * domain; -extern struct in_addr gateway; -extern struct in_addr dns_server; -extern struct in_addr dns_server2; - - - -#endif diff --git a/mdk-stage1/newt-frontend.c b/mdk-stage1/newt-frontend.c deleted file mode 100644 index c9f498260..000000000 --- a/mdk-stage1/newt-frontend.c +++ /dev/null @@ -1,390 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - - -/* - * Each different frontend must implement all functions defined in frontend.h - */ - - -#include -#include -#include -#include -#include -#include -#include "newt/newt.h" - -#include "frontend.h" - -void init_frontend(char * welcome_msg) -{ - newtInit(); - newtCls(); - - newtDrawRootText(0, 0, welcome_msg); - - newtPushHelpLine(" for here, to see the logs, for kernel msg"); - newtRefresh(); -} - - -void finish_frontend(void) -{ - newtFinished(); -} - - -void verror_message(char *msg, va_list ap) -{ - newtWinMessagev("Error", "Ok", msg, ap); -} - -void vinfo_message(char *msg, va_list ap) -{ - newtWinMessagev("Notice", "Ok", msg, ap); -} - - -void vwait_message(char *msg, va_list ap) -{ - int width, height; - char * title = "Please wait..."; - newtComponent c, f; - newtGrid grid; - char * buf = NULL; - char * flowed; - int size = 0; - int i = 0; - - do { - size += 1000; - if (buf) free(buf); - buf = malloc(size); - i = vsnprintf(buf, size, msg, ap); - } while (i >= size || i == -1); - - flowed = newtReflowText(buf, 60, 5, 5, &width, &height); - - c = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP); - newtTextboxSetText(c, flowed); - - grid = newtCreateGrid(1, 1); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, c, 0, 0, 0, 0, 0, 0); - newtGridWrappedWindow(grid, title); - - free(flowed); - free(buf); - - f = newtForm(NULL, NULL, 0); - newtFormAddComponent(f, c); - - newtDrawForm(f); - newtRefresh(); - newtFormDestroy(f); -} - -void remove_wait_message(void) -{ - newtPopWindow(); -} - - -static newtComponent form = NULL, scale = NULL; -static int size_progress; -static int actually_drawn; -static char * msg_progress; - -void init_progression(char *msg, int size) -{ - size_progress = size; - if (size) { - actually_drawn = 0; - newtCenteredWindow(70, 5, "Please wait..."); - form = newtForm(NULL, NULL, 0); - newtFormAddComponent(form, newtLabel(1, 1, msg)); - scale = newtScale(1, 3, 68, size); - newtFormAddComponent(form, scale); - newtDrawForm(form); - newtRefresh(); - } - else { - wait_message(msg); - msg_progress = msg; - } -} - -void update_progression(int current_size) -{ - if (size_progress) { - if (current_size <= size_progress) - newtScaleSet(scale, current_size); - newtRefresh(); - } - else { - struct timeval t; - int time; - static int last_time = -1; - gettimeofday(&t, NULL); - time = t.tv_sec*3 + t.tv_usec/300000; - if (time != last_time) { - char msg_prog_final[500]; - sprintf(msg_prog_final, "%s (%d bytes read) ", msg_progress, current_size); - remove_wait_message(); - wait_message(msg_prog_final); - } - last_time = time; - } -} - -void end_progression(void) -{ - if (size_progress) { - newtPopWindow(); - newtFormDestroy(form); - } - else - remove_wait_message(); -} - - -enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice) -{ - char * items[50]; - int answer = 0, rc; - char ** sav_elems = elems; - int i; - - i = 0; - while (elems && *elems) { - int j = (*elems_comments) ? strlen(*elems_comments) : 0; - items[i] = malloc(sizeof(char) * (strlen(*elems) + j + 4)); - strcpy(items[i], *elems); - if (*elems_comments) { - strcat(items[i], " ("); - strcat(items[i], *elems_comments); - strcat(items[i], ")"); - } - elems_comments++; - i++; - elems++; - } - items[i] = NULL; - - rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, items, &answer, "Ok", "Cancel", NULL); - - if (rc == 2) - return RETURN_BACK; - - *choice = strdup(sav_elems[answer]); - - return RETURN_OK; -} - - -enum return_type ask_from_list(char *msg, char ** elems, char ** choice) -{ - int answer = 0, rc; - - rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, elems, &answer, "Ok", "Cancel", NULL); - - if (rc == 2) - return RETURN_BACK; - - *choice = strdup(elems[answer]); - - return RETURN_OK; -} - - -enum return_type ask_yes_no(char *msg) -{ - int rc; - - rc = newtWinTernary("Please answer...", "Yes", "No", "Back", msg); - - if (rc == 1) - return RETURN_OK; - else if (rc == 3) - return RETURN_BACK; - else return RETURN_ERROR; -} - - -static void (*callback_real_function)(char ** strings) = NULL; - -static void default_callback(newtComponent co, void * data) -{ - newtComponent * entries = data; - char * strings[50], ** ptr; - - if (!callback_real_function) - return; - - ptr = strings; - while (entries && *entries) { - *ptr = newtEntryGetValue(*entries); - entries++; - ptr++; - } - - callback_real_function(strings); - - ptr = strings; - entries = data; - while (entries && *entries) { - newtEntrySet(*entries, strdup(*ptr), 1); - entries++; - ptr++; - } -} - -/* only supports up to 50 buttons and entries -- shucks! */ -static int mynewtWinEntries(char * title, char * text, int suggestedWidth, int flexDown, - int flexUp, int dataWidth, void (*callback_func)(char ** strings), - struct newtWinEntry * items, char * button1, ...) { - newtComponent buttons[50], result, form, textw; - newtGrid grid, buttonBar, subgrid; - int numItems; - int rc, i; - int numButtons; - char * buttonName; - newtComponent entries[50]; - - va_list args; - - textw = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown, - flexUp, 0); - - for (numItems = 0; items[numItems].text; numItems++); - - buttonName = button1, numButtons = 0; - va_start(args, button1); - while (buttonName) { - buttons[numButtons] = newtButton(-1, -1, buttonName); - numButtons++; - buttonName = va_arg(args, char *); - } - - va_end(args); - - buttonBar = newtCreateGrid(numButtons, 1); - for (i = 0; i < numButtons; i++) { - newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT, - buttons[i], - i ? 1 : 0, 0, 0, 0, 0, 0); - } - - if (callback_func) { - callback_real_function = callback_func; - entries[numItems] = NULL; - } - else - callback_real_function = NULL; - - subgrid = newtCreateGrid(2, numItems); - for (i = 0; i < numItems; i++) { - newtComponent entr = newtEntry(-1, -1, items[i].value ? - *items[i].value : NULL, dataWidth, - items[i].value, items[i].flags); - - newtGridSetField(subgrid, 0, i, NEWT_GRID_COMPONENT, - newtLabel(-1, -1, items[i].text), - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(subgrid, 1, i, NEWT_GRID_COMPONENT, - entr, - 1, 0, 0, 0, 0, 0); - if (callback_func) { - entries[i] = entr; - newtComponentAddCallback(entr, default_callback, entries); - } - } - - - grid = newtCreateGrid(1, 3); - form = newtForm(NULL, 0, 0); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, textw, - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, subgrid, - 0, 1, 0, 0, 0, 0); - newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttonBar, - 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX); - newtGridAddComponentsToForm(grid, form, 1); - newtGridWrappedWindow(grid, title); - newtGridFree(grid, 1); - - result = newtRunForm(form); - - for (rc = 0; rc < numItems; rc++) - *items[rc].value = strdup(*items[rc].value); - - for (rc = 0; result != buttons[rc] && rc < numButtons; rc++); - if (rc == numButtons) - rc = 0; /* F12 */ - else - rc++; - - newtFormDestroy(form); - newtPopWindow(); - - return rc; -} - - -enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings)) -{ - struct newtWinEntry entries[50]; - int j, i = 0; - int rc; - char ** already_answers = NULL; - - while (questions && *questions) { - entries[i].text = *questions; - entries[i].flags = NEWT_FLAG_SCROLL | (!strcmp(*questions, "Password") ? NEWT_FLAG_HIDDEN : 0); - i++; - questions++; - } - entries[i].text = NULL; - entries[i].value = NULL; - - if (*answers == NULL) - *answers = (char **) malloc(sizeof(char *) * i); - else - already_answers = *answers; - - for (j = 0 ; j < i ; j++) { - entries[j].value = &((*answers)[j]); - if (already_answers && *already_answers) { - *(entries[j].value) = *already_answers; - already_answers++; - } else - *(entries[j].value) = NULL; - } - - rc = mynewtWinEntries("Please fill entries...", msg, 52, 5, 5, entry_size, callback_func, entries, "Ok", "Cancel", NULL); - - if (rc == 3) - return RETURN_BACK; - if (rc != 1) - return RETURN_ERROR; - - return RETURN_OK; -} diff --git a/mdk-stage1/newt/Makefile b/mdk-stage1/newt/Makefile deleted file mode 100644 index 171bcf0cb..000000000 --- a/mdk-stage1/newt/Makefile +++ /dev/null @@ -1,56 +0,0 @@ - #****************************************************************************** - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -LIBNAME = libnewt - -OBJS = newt.o button.o form.o checkbox.o entry.o label.o listbox.o scrollbar.o textbox.o scale.o grid.o windows.o buttonbar.o checkboxtree.o - -DEFS = -DVERSION=\"0.50.19\" - -INCS = -I../slang - - -TARGETS = $(LIBNAME).a - -ifeq (DIETLIBC, $(L)) -TARGETS += $(LIBNAME)-DIET.a -endif - -all: $(TARGETS) - -clean: - rm -f *.o *.a - -OBJS-DIET = $(subst .o,-DIET.o,$(OBJS)) - -$(LIBNAME).a: $(OBJS) - ar -cru $@ $^ - ranlib $@ - -$(LIBNAME)-DIET.a: $(OBJS-DIET) - ar -cru $@ $^ - ranlib $@ - -$(OBJS): %.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< -o $@ - -$(OBJS-DIET): %-DIET.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(DIETLIBC_INCLUDES) -c $< -o $@ - diff --git a/mdk-stage1/newt/button.c b/mdk-stage1/newt/button.c deleted file mode 100644 index 1ff360dc5..000000000 --- a/mdk-stage1/newt/button.c +++ /dev/null @@ -1,190 +0,0 @@ -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -struct button { - char * text; - int compact; -}; - -static void buttonDrawIt(newtComponent co, int active, int pushed); -static void buttonDrawText(newtComponent co, int active, int pushed); - -static void buttonDraw(newtComponent c); -static void buttonDestroy(newtComponent co); -static struct eventResult buttonEvent(newtComponent c, - struct event ev); -static void buttonPlace(newtComponent co, int newLeft, int newTop); - -static struct componentOps buttonOps = { - buttonDraw, - buttonEvent, - buttonDestroy, - buttonPlace, - newtDefaultMappedHandler, -} ; - -static newtComponent createButton(int left, int row, const char * text, int compact) { - newtComponent co; - struct button * bu; - - co = malloc(sizeof(*co)); - bu = malloc(sizeof(struct button)); - co->data = bu; - - bu->text = strdup(text); - bu->compact = compact; - co->ops = &buttonOps; - - if (bu->compact) { - co->height = 1; - co->width = strlen(text) + 3; - } else { - co->height = 4; - co->width = strlen(text) + 5; - } - - co->top = row; - co->left = left; - co->takesFocus = 1; - co->isMapped = 0; - - newtGotorc(co->top, co->left); - - return co; -} - -newtComponent newtCompactButton(int left, int row, const char * text) { - return createButton(left, row, text, 1); -} - -newtComponent newtButton(int left, int row, const char * text) { - return createButton(left, row, text, 0); -} - -static void buttonDestroy(newtComponent co) { - struct button * bu = co->data; - - free(bu->text); - free(bu); - free(co); -} - -static void buttonPlace(newtComponent co, int newLeft, int newTop) { - co->top = newTop; - co->left = newLeft; - - newtGotorc(co->top, co->left); -} - -static void buttonDraw(newtComponent co) { - buttonDrawIt(co, 0, 0); -} - -static void buttonDrawIt(newtComponent co, int active, int pushed) { - struct button * bu = co->data; - - if (!co->isMapped) return; - - SLsmg_set_color(NEWT_COLORSET_BUTTON); - - if (bu->compact) { - if (active) - SLsmg_set_color(NEWT_COLORSET_COMPACTBUTTON); - else - SLsmg_set_color(NEWT_COLORSET_BUTTON); - newtGotorc(co->top+ pushed, co->left + 1 + pushed); - SLsmg_write_char('<'); - SLsmg_write_string(bu->text); - SLsmg_write_char('>'); - } else { - if (pushed) { - SLsmg_set_color(NEWT_COLORSET_BUTTON); - newtDrawBox(co->left + 1, co->top + 1, co->width - 1, 3, 0); - - SLsmg_set_color(NEWT_COLORSET_WINDOW); - newtClearBox(co->left, co->top, co->width, 1); - newtClearBox(co->left, co->top, 1, co->height); - } else { - newtDrawBox(co->left, co->top, co->width - 1, 3, 1); - } - - buttonDrawText(co, active, pushed); - } -} - -static void buttonDrawText(newtComponent co, int active, int pushed) { - struct button * bu = co->data; - - if (pushed) pushed = 1; - - if (active) - SLsmg_set_color(NEWT_COLORSET_ACTBUTTON); - else - SLsmg_set_color(NEWT_COLORSET_BUTTON); - - newtGotorc(co->top + 1 + pushed, co->left + 1 + pushed); - SLsmg_write_char(' '); - SLsmg_write_string(bu->text); - SLsmg_write_char(' '); -} - -static struct eventResult buttonEvent(newtComponent co, - struct event ev) { - struct eventResult er; - struct button * bu = co->data; - - if (ev.when == EV_NORMAL) { - switch (ev.event) { - case EV_FOCUS: - buttonDrawIt(co, 1, 0); - er.result = ER_SWALLOWED; - break; - - case EV_UNFOCUS: - buttonDrawIt(co, 0, 0); - er.result = ER_SWALLOWED; - break; - - case EV_KEYPRESS: - if (ev.u.key == ' ' || ev.u.key == '\r') { - if (!bu->compact) { - /* look pushed */ - buttonDrawIt(co, 1, 1); - newtRefresh(); - newtDelay(150000); - buttonDrawIt(co, 1, 0); - newtRefresh(); - newtDelay(150000); - } - - er.result = ER_EXITFORM; - } else - er.result = ER_IGNORED; - break; - case EV_MOUSE: - if (ev.u.mouse.type == MOUSE_BUTTON_DOWN && - co->top <= ev.u.mouse.y && - co->top + co->height - !bu->compact > ev.u.mouse.y && - co->left <= ev.u.mouse.x && - co->left + co->width - !bu->compact > ev.u.mouse.x) { - if (!bu->compact) { - buttonDrawIt(co, 1, 1); - newtRefresh(); - newtDelay(150000); - buttonDrawIt(co, 1, 0); - newtRefresh(); - newtDelay(150000); - } - er.result = ER_EXITFORM; - } - break; - } - } else - er.result = ER_IGNORED; - - return er; -} diff --git a/mdk-stage1/newt/buttonbar.c b/mdk-stage1/newt/buttonbar.c deleted file mode 100644 index 45473c9d2..000000000 --- a/mdk-stage1/newt/buttonbar.c +++ /dev/null @@ -1,46 +0,0 @@ -#include - -#include "newt.h" - -/* if they try and pack more then 50 buttons, screw 'em */ -newtGrid newtButtonBarv(char * button1, newtComponent * b1comp, va_list args) { - newtGrid grid; - struct buttonInfo { - char * name; - newtComponent * compPtr; - } buttons[50]; - int num; - int i; - - buttons[0].name = button1, buttons[0].compPtr = b1comp, num = 1; - while (1) { - buttons[num].name = va_arg(args, char *); - if (!buttons[num].name) break; - buttons[num].compPtr = va_arg(args, newtComponent *); - num++; - } - - grid = newtCreateGrid(num, 1); - - for (i = 0; i < num; i++) { - *buttons[i].compPtr = newtButton(-1, -1, buttons[i].name); - newtGridSetField(grid, i, 0, NEWT_GRID_COMPONENT, - *buttons[i].compPtr, - num ? 1 : 0, 0, 0, 0, 0, 0); - } - - return grid; -} - -newtGrid newtButtonBar(char * button1, newtComponent * b1comp, ...) { - va_list args; - newtGrid grid; - - va_start(args, b1comp); - - grid = newtButtonBarv(button1, b1comp, args); - - va_end(args); - - return grid; -} diff --git a/mdk-stage1/newt/checkbox.c b/mdk-stage1/newt/checkbox.c deleted file mode 100644 index eee514c98..000000000 --- a/mdk-stage1/newt/checkbox.c +++ /dev/null @@ -1,290 +0,0 @@ -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -enum type { CHECK, RADIO }; - -struct checkbox { - char * text; - char * seq; - char * result; - newtComponent prevButton, lastButton; - enum type type; - char value; - int active, inactive; - const void * data; - int flags; - int hasFocus; -}; - -static void makeActive(newtComponent co); - -static void cbDraw(newtComponent c); -static void cbDestroy(newtComponent co); -struct eventResult cbEvent(newtComponent co, struct event ev); - -static struct componentOps cbOps = { - cbDraw, - cbEvent, - cbDestroy, - newtDefaultPlaceHandler, - newtDefaultMappedHandler, -} ; - -newtComponent newtRadiobutton(int left, int top, const char * text, int isDefault, - newtComponent prevButton) { - newtComponent co; - newtComponent curr; - struct checkbox * rb; - char initialValue; - - if (isDefault) - initialValue = '*'; - else - initialValue = ' '; - - co = newtCheckbox(left, top, text, initialValue, " *", NULL); - rb = co->data; - rb->type = RADIO; - - rb->prevButton = prevButton; - - for (curr = co; curr; curr = rb->prevButton) { - rb = curr->data; - rb->lastButton = co; - } - - return co; -} - -newtComponent newtRadioGetCurrent(newtComponent setMember) { - struct checkbox * rb = setMember->data; - - setMember = rb->lastButton; - rb = setMember->data; - - while (rb && rb->value != '*') { - setMember = rb->prevButton; - if (!setMember) - return NULL; - rb = setMember->data; - } - - return setMember; -} - -char newtCheckboxGetValue(newtComponent co) { - struct checkbox * cb = co->data; - - return cb->value; -} - -void newtCheckboxSetValue(newtComponent co, char value) { - struct checkbox * cb = co->data; - - *cb->result = value; - cbDraw(co); -} - -newtComponent newtCheckbox(int left, int top, const char * text, char defValue, - const char * seq, char * result) { - newtComponent co; - struct checkbox * cb; - - if (!seq) seq = " *"; - - co = malloc(sizeof(*co)); - cb = malloc(sizeof(struct checkbox)); - co->data = cb; - cb->flags = 0; - if (result) - cb->result = result; - else - cb->result = &cb->value; - - cb->text = strdup(text); - cb->seq = strdup(seq); - cb->type = CHECK; - cb->hasFocus = 0; - cb->inactive = COLORSET_CHECKBOX; - cb->active = COLORSET_ACTCHECKBOX; - defValue ? (*cb->result = defValue) : (*cb->result = cb->seq[0]); - - co->ops = &cbOps; - - co->callback = NULL; - co->height = 1; - co->width = strlen(text) + 4; - co->top = top; - co->left = left; - co->takesFocus = 1; - - return co; -} - -void newtCheckboxSetFlags(newtComponent co, int flags, enum newtFlagsSense sense) { - struct checkbox * cb = co->data; - int row, col; - - cb->flags = newtSetFlags(cb->flags, flags, sense); - - if (!(cb->flags & NEWT_FLAG_DISABLED)) - co->takesFocus = 1; - else - co->takesFocus = 0; - - newtGetrc(&row, &col); - cbDraw(co); - newtGotorc(row, col); -} - -static void cbDraw(newtComponent c) { - struct checkbox * cb = c->data; - - if (c->top == -1 || !c->isMapped) return; - - if (cb->flags & NEWT_FLAG_DISABLED) { - cb->inactive = NEWT_COLORSET_DISENTRY; - cb->active = NEWT_COLORSET_DISENTRY; - } else { - cb->inactive = COLORSET_CHECKBOX; - cb->active = COLORSET_ACTCHECKBOX; - } - - SLsmg_set_color(cb->inactive); - - newtGotorc(c->top, c->left); - - switch (cb->type) { - case RADIO: - SLsmg_write_string("( ) "); - break; - - case CHECK: - SLsmg_write_string("[ ] "); - break; - - default: - break; - } - - SLsmg_write_string(cb->text); - - if (cb->hasFocus) - SLsmg_set_color(cb->active); - - newtGotorc(c->top, c->left + 1); - SLsmg_write_char(*cb->result); -} - -static void cbDestroy(newtComponent co) { - struct checkbox * cb = co->data; - - free(cb->text); - free(cb->seq); - free(cb); - free(co); -} - -struct eventResult cbEvent(newtComponent co, struct event ev) { - struct checkbox * cb = co->data; - struct eventResult er; - const char * cur; - - if (ev.when == EV_NORMAL) { - switch (ev.event) { - case EV_FOCUS: - cb->hasFocus = 1; - cbDraw(co); - er.result = ER_SWALLOWED; - break; - - case EV_UNFOCUS: - cb->hasFocus = 0; - cbDraw(co); - er.result = ER_SWALLOWED; - break; - - case EV_KEYPRESS: - if (ev.u.key == ' ') { - if (cb->type == RADIO) { - makeActive(co); - } else if (cb->type == CHECK) { - cur = strchr(cb->seq, *cb->result); - if (!cur) - *cb->result = *cb->seq; - else { - cur++; - if (! *cur) - *cb->result = *cb->seq; - else - *cb->result = *cur; - } - cbDraw(co); - er.result = ER_SWALLOWED; - - if (co->callback) - co->callback(co, co->callbackData); - } else { - er.result = ER_IGNORED; - } - } else if(ev.u.key == NEWT_KEY_ENTER) { - er.result = ER_IGNORED; - } else { - er.result = ER_IGNORED; - } - break; - case EV_MOUSE: - if (ev.u.mouse.type == MOUSE_BUTTON_DOWN) { - if (cb->type == RADIO) { - makeActive(co); - } else if (cb->type == CHECK) { - cur = strchr(cb->seq, *cb->result); - if (!cur) - *cb->result = *cb->seq; - else { - cur++; - if (! *cur) - *cb->result = *cb->seq; - else - *cb->result = *cur; - } - cbDraw(co); - er.result = ER_SWALLOWED; - - if (co->callback) - co->callback(co, co->callbackData); - } - } - } - } else - er.result = ER_IGNORED; - - return er; -} - -static void makeActive(newtComponent co) { - struct checkbox * cb = co->data; - struct checkbox * rb; - newtComponent curr; - - /* find the one that's turned off */ - curr = cb->lastButton; - rb = curr->data; - while (curr && rb->value == rb->seq[0]) { - curr = rb->prevButton; - if (curr) rb = curr->data; - } - if (curr) { - rb->value = rb->seq[0]; - cbDraw(curr); - } - cb->value = cb->seq[1]; - cbDraw(co); - - if (co->callback) - co->callback(co, co->callbackData); -} diff --git a/mdk-stage1/newt/checkboxtree.c b/mdk-stage1/newt/checkboxtree.c deleted file mode 100644 index b56bd1e9f..000000000 --- a/mdk-stage1/newt/checkboxtree.c +++ /dev/null @@ -1,714 +0,0 @@ -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -struct items { - char * text; - const void *data; - unsigned char selected; - struct items *next; - struct items *prev; - struct items *branch; - int flags; - int depth; -}; - -struct CheckboxTree { - newtComponent sb; - int curWidth; /* size of text w/o scrollbar or border*/ - int curHeight; /* size of text w/o border */ - struct items * itemlist; - struct items ** flatList, ** currItem, ** firstItem; - int flatCount; - int flags; - int pad; - char * seq; - char * result; -}; - -static void ctDraw(newtComponent c); -static void ctDestroy(newtComponent co); -static void ctPlace(newtComponent co, int newLeft, int newTop); -struct eventResult ctEvent(newtComponent co, struct event ev); -static void ctMapped(newtComponent co, int isMapped); -static struct items * findItem(struct items * items, const void * data); -static void buildFlatList(newtComponent co); -static void doBuildFlatList(struct CheckboxTree * ct, struct items * item); -enum countWhat { COUNT_EXPOSED=0, COUNT_SELECTED=1 }; -static int countItems(struct items * item, enum countWhat justExposed); - -static struct componentOps ctOps = { - ctDraw, - ctEvent, - ctDestroy, - ctPlace, - ctMapped, -} ; - -static int countItems(struct items * item, enum countWhat what) { - int count = 0; - - while (item) { - if ((!item->branch && item->selected == what) || (what == COUNT_EXPOSED)) - count++; - if (item->branch || (what == COUNT_EXPOSED && item->selected)) - count += countItems(item->branch, what); - item = item->next; - } - - return count; -} - -static void doBuildFlatList(struct CheckboxTree * ct, struct items * item) { - while (item) { - ct->flatList[ct->flatCount++] = item; - if (item->branch && item->selected) doBuildFlatList(ct, item->branch); - item = item->next; - } -} - -static void buildFlatList(newtComponent co) { - struct CheckboxTree * ct = co->data; - - if (ct->flatList) free(ct->flatList); - ct->flatCount = countItems(ct->itemlist, COUNT_EXPOSED); - - ct->flatList = malloc(sizeof(*ct->flatList) * (ct->flatCount+1)); - ct->flatCount = 0; - doBuildFlatList(ct, ct->itemlist); - ct->flatList[ct->flatCount] = NULL; -} - -int newtCheckboxTreeAddItem(newtComponent co, - const char * text, const void * data, - int flags, int index, ...) { - va_list argList; - int numIndexes; - int * indexes; - int i; - - va_start(argList, index); - numIndexes = 0; - i = index; - while (i != NEWT_ARG_LAST) { - numIndexes++; - i = va_arg(argList, int); - } - - va_end(argList); - - indexes = alloca(sizeof(*indexes) * (numIndexes + 1)); - va_start(argList, index); - numIndexes = 0; - i = index; - va_start(argList, index); - while (i != NEWT_ARG_LAST) { - indexes[numIndexes++] = i; - i = va_arg(argList, int); - } - va_end(argList); - - indexes[numIndexes++] = NEWT_ARG_LAST; - - return newtCheckboxTreeAddArray(co, text, data, flags, indexes); -} - -static int doFindItemPath(struct items * items, void * data, int * path, - int * len) { - int where = 0; - - while (items) { - if (items->data == data) { - if (path) path[items->depth] = where; - if (len) *len = items->depth + 1; - return 1; - } - - if (items->branch && doFindItemPath(items->branch, data, path, len)) { - if (path) path[items->depth] = where; - return 1; - } - - items = items->next; - where++; - } - - return 0; -} - -int * newtCheckboxTreeFindItem(newtComponent co, void * data) { - int len; - int * path; - struct CheckboxTree * ct = co->data; - - if (!doFindItemPath(ct->itemlist, data, NULL, &len)) return NULL; - - path = malloc(sizeof(*path) * (len + 1)); - doFindItemPath(ct->itemlist, data, path, NULL); - path[len] = NEWT_ARG_LAST; - - return path; -} - -int newtCheckboxTreeAddArray(newtComponent co, - const char * text, const void * data, - int flags, int * indexes) { - struct items * curList, * newNode, * item = NULL; - struct items ** listPtr = NULL; - int i, index, numIndexes; - struct CheckboxTree * ct = co->data; - - numIndexes = 0; - while (indexes[numIndexes] != NEWT_ARG_LAST) numIndexes++; - - if (!ct->itemlist) { - if (numIndexes > 1) return -1; - - ct->itemlist = malloc(sizeof(*ct->itemlist)); - item = ct->itemlist; - item->prev = NULL; - item->next = NULL; - } else { - curList = ct->itemlist; - listPtr = &ct->itemlist; - - i = 0; - index = indexes[i]; - while (i < numIndexes) { - item = curList; - - if (index == NEWT_ARG_APPEND) { - item = NULL; - } else { - while (index && item) - item = item->next, index--; - } - - i++; - if (i < numIndexes) { - curList = item->branch; - listPtr = &item->branch; - if (!curList && (i + 1 != numIndexes)) return -1; - - index = indexes[i]; - } - } - - if (!curList) { /* create a new branch */ - item = malloc(sizeof(*curList->prev)); - item->next = item->prev = NULL; - *listPtr = item; - } else if (!item) { /* append to end */ - item = curList; - while (item->next) item = item->next; - item->next = malloc(sizeof(*curList->prev)); - item->next->prev = item; - item = item->next; - item->next = NULL; - } else { - newNode = malloc(sizeof(*newNode)); - newNode->prev = item->prev; - newNode->next = item; - - if (item->prev) item->prev->next = newNode; - item->prev = newNode; - item = newNode; - if (!item->prev) *listPtr = item; - } - } - - item->text = strdup(text); - item->data = data; - if (flags & NEWT_FLAG_SELECTED) { - item->selected = 1; - } else { - item->selected = 0; - } - item->flags = flags; - item->branch = NULL; - item->depth = numIndexes - 1; - - i = 4 + (3 * item->depth); - - if ((strlen(text) + i + ct->pad) > co->width) { - co->width = strlen(text) + i + ct->pad; - } - - return 0; -} - -static struct items * findItem(struct items * items, const void * data) { - struct items * i; - - while (items) { - if (items->data == data) return items; - if (items->branch) { - i = findItem(items->branch, data); - if (i) return i; - } - - items = items->next; - } - - return NULL; -} - -static void listSelected(struct items * items, int * num, const void ** list, int seqindex) { - while (items) { - if ((seqindex ? items->selected==seqindex : items->selected) && !items->branch) - list[(*num)++] = (void *) items->data; - if (items->branch) - listSelected(items->branch, num, list, seqindex); - items = items->next; - } -} - -const void ** newtCheckboxTreeGetSelection(newtComponent co, int *numitems) -{ - return newtCheckboxTreeGetMultiSelection(co, numitems, 0); -} - -const void ** newtCheckboxTreeGetMultiSelection(newtComponent co, int *numitems, char seqnum) -{ - struct CheckboxTree * ct; - const void **retval; - int seqindex=0; - - if(!co || !numitems) return NULL; - - ct = co->data; - - if (seqnum) { - while( ct->seq[seqindex] && ( ct->seq[seqindex] != seqnum )) seqindex++; - } else { - seqindex = 0; - } - - *numitems = countItems(ct->itemlist, (seqindex ? seqindex : COUNT_SELECTED)); - if (!*numitems) return NULL; - - retval = malloc(*numitems * sizeof(void *)); - *numitems = 0; - listSelected(ct->itemlist, numitems, retval, seqindex); - - return retval; -} - -newtComponent newtCheckboxTree(int left, int top, int height, int flags) { - return newtCheckboxTreeMulti(left, top, height, NULL, flags); -} - -newtComponent newtCheckboxTreeMulti(int left, int top, int height, char *seq, int flags) { - newtComponent co; - struct CheckboxTree * ct; - - co = malloc(sizeof(*co)); - ct = malloc(sizeof(struct CheckboxTree)); - co->callback = NULL; - co->data = ct; - co->ops = &ctOps; - co->takesFocus = 1; - co->height = height; - co->width = 0; - co->isMapped = 0; - ct->itemlist = NULL; - ct->firstItem = NULL; - ct->currItem = NULL; - ct->flatList = NULL; - if (seq) - ct->seq = strdup(seq); - else - ct->seq = strdup(" *"); - if (flags & NEWT_FLAG_SCROLL) { - ct->sb = newtVerticalScrollbar(left, top, height, - COLORSET_LISTBOX, COLORSET_ACTLISTBOX); - ct->pad = 2; - } else { - ct->sb = NULL; - ct->pad = 0; - } - - return co; -} - -static void ctMapped(newtComponent co, int isMapped) { - struct CheckboxTree * ct = co->data; - - co->isMapped = isMapped; - if (ct->sb) - ct->sb->ops->mapped(ct->sb, isMapped); -} - -static void ctPlace(newtComponent co, int newLeft, int newTop) { - struct CheckboxTree * ct = co->data; - - co->top = newTop; - co->left = newLeft; - - if (ct->sb) - ct->sb->ops->place(ct->sb, co->left + co->width - 1, co->top); -} - -int ctSetItem(newtComponent co, struct items *item, enum newtFlagsSense sense) -{ - struct CheckboxTree * ct = co->data; - struct items * currItem; - struct items * firstItem; - - if (!item) - return 1; - - switch(sense) { - case NEWT_FLAGS_RESET: - item->selected = 0; - break; - case NEWT_FLAGS_SET: - item->selected = 1; - break; - case NEWT_FLAGS_TOGGLE: - if (item->branch) - item->selected = !item->selected; - else { - item->selected++; - if (item->selected==strlen(ct->seq)) - item->selected = 0; - } - break; - } - - if (item->branch) { - currItem = *ct->currItem; - firstItem = *ct->firstItem; - - buildFlatList(co); - - ct->currItem = ct->flatList; - while (*ct->currItem != currItem) ct->currItem++; - - ct->firstItem = ct->flatList; - if (ct->flatCount > co->height) { - struct items ** last = ct->flatList + ct->flatCount - co->height; - while (*ct->firstItem != firstItem && ct->firstItem != last) - ct->firstItem++; - } - } - - return 0; -} - -static void ctSetItems(struct items *item, int selected) -{ - for (; item; item = item->next) { - if (!item->branch) - item->selected = selected; - else - ctSetItems(item->branch, selected); - } -} - -static void ctDraw(newtComponent co) { - struct CheckboxTree * ct = co->data; - struct items ** item; - int i, j; - char * spaces = NULL; - int currRow = -1; - - if (!co->isMapped) return ; - - if (!ct->firstItem) { - buildFlatList(co); - ct->firstItem = ct->currItem = ct->flatList; - } - - item = ct->firstItem; - - i = 0; - while (*item && i < co->height) { - newtGotorc(co->top + i, co->left); - if (*item == *ct->currItem) { - SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX); - currRow = co->top + i; - } else - SLsmg_set_color(NEWT_COLORSET_LISTBOX); - - for (j = 0; j < (*item)->depth; j++) - SLsmg_write_string(" "); - - if ((*item)->branch) { - if ((*item)->selected) - SLsmg_write_string("<-> "); - else - SLsmg_write_string("<+> "); - } else { - char tmp[5]; - snprintf(tmp,5,"[%c] ",ct->seq[(*item)->selected]); - SLsmg_write_string(tmp); - } - - SLsmg_write_nstring((*item)->text, co->width - 4 - - (3 * (*item)->depth)); - item++; - i++; - } - - /* There could be empty lines left (i.e. if the user closes an expanded - list which is the last thing in the tree, and whose elements are - displayed at the bottom of the screen */ - if (i < co->height) { - spaces = alloca(co->width); - memset(spaces, ' ', co->width); - SLsmg_set_color(NEWT_COLORSET_LISTBOX); - } - while (i < co->height) { - newtGotorc(co->top + i, co->left); - SLsmg_write_nstring(spaces, co->width); - i++; - } - - if(ct->sb) { - newtScrollbarSet(ct->sb, ct->currItem - ct->flatList, - ct->flatCount - 1); - ct->sb->ops->draw(ct->sb); - } - - newtGotorc(currRow, co->left + 1); -} - -static void ctDestroy(newtComponent co) { - struct CheckboxTree * ct = co->data; - struct items * item, * nextitem; - - nextitem = item = ct->itemlist; - - while (item != NULL) { - nextitem = item->next; - free(item->text); - free(item); - item = nextitem; - } - - free(ct->seq); - free(ct); - free(co); -} - -struct eventResult ctEvent(newtComponent co, struct event ev) { - struct CheckboxTree * ct = co->data; - struct eventResult er; - struct items ** listEnd, ** lastItem; - int key, selnum = 1; - - er.result = ER_IGNORED; - - if(ev.when == EV_EARLY || ev.when == EV_LATE) { - return er; - } - - switch(ev.event) { - case EV_KEYPRESS: - key = ev.u.key; - if (key == (char) key && key != ' ') { - for (selnum = 0; ct->seq[selnum]; selnum++) - if (key == ct->seq[selnum]) - break; - if (!ct->seq[selnum]) - switch (key) { - case '-': selnum = 0; break; - case '+': - case '*': selnum = 1; break; - } - if (ct->seq[selnum]) - key = '*'; - } - switch(key) { - case ' ': - case NEWT_KEY_ENTER: - ctSetItem(co, *ct->currItem, NEWT_FLAGS_TOGGLE); - er.result = ER_SWALLOWED; - if (!(*ct->currItem)->branch || (*ct->currItem)->selected) - key = NEWT_KEY_DOWN; - else - key = '*'; - break; - case '*': - if ((*ct->currItem)->branch) { - ctSetItems((*ct->currItem)->branch, selnum); - if (!(*ct->currItem)->selected) - key = NEWT_KEY_DOWN; - } else { - (*ct->currItem)->selected = selnum; - key = NEWT_KEY_DOWN; - } - er.result = ER_SWALLOWED; - break; - } - switch (key) { - case '*': - ctDraw(co); - if(co->callback) co->callback(co, co->callbackData); - return er; - case NEWT_KEY_HOME: - ct->currItem = ct->flatList; - ct->firstItem = ct->flatList; - ctDraw(co); - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - return er; - case NEWT_KEY_END: - ct->currItem = ct->flatList + ct->flatCount - 1; - if (ct->flatCount <= co->height) - ct->firstItem = ct->flatList; - else - ct->firstItem = ct->flatList + ct->flatCount - co->height; - ctDraw(co); - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - return er; - case NEWT_KEY_DOWN: - if (ev.u.key != NEWT_KEY_DOWN) { - if(co->callback) co->callback(co, co->callbackData); - if (strlen(ct->seq) != 2) { - ctDraw(co); - return er; - } - } - if ((ct->currItem - ct->flatList + 1) < ct->flatCount) { - ct->currItem++; - - if (ct->currItem - ct->firstItem >= co->height) - ct->firstItem++; - - ctDraw(co); - } else if (ev.u.key != NEWT_KEY_DOWN) - ctDraw(co); - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - return er; - case NEWT_KEY_UP: - if (ct->currItem != ct->flatList) { - ct->currItem--; - - if (ct->currItem < ct->firstItem) - ct->firstItem = ct->currItem; - - ctDraw(co); - } - er.result = ER_SWALLOWED; - if(co->callback) co->callback(co, co->callbackData); - return er; - case NEWT_KEY_PGUP: - if (ct->firstItem - co->height < ct->flatList) { - ct->firstItem = ct->currItem = ct->flatList; - } else { - ct->currItem -= co->height; - ct->firstItem -= co->height; - } - - ctDraw(co); - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - return er; - case NEWT_KEY_PGDN: - listEnd = ct->flatList + ct->flatCount - 1; - lastItem = ct->firstItem + co->height - 1; - - if (lastItem + co->height > listEnd) { - ct->firstItem = listEnd - co->height + 1; - ct->currItem = listEnd; - } else { - ct->currItem += co->height; - ct->firstItem += co->height; - } - - ctDraw(co); - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - return er; - } - break; - - case EV_FOCUS: - ctDraw(co); - er.result = ER_SWALLOWED; - break; - - case EV_UNFOCUS: - ctDraw(co); - er.result = ER_SWALLOWED; - break; - default: - break; - } - - return er; -} - -const void * newtCheckboxTreeGetCurrent(newtComponent co) { - struct CheckboxTree * ct = co->data; - - if (!ct->currItem) return NULL; - return (*ct->currItem)->data; -} - -void newtCheckboxTreeSetEntry(newtComponent co, const void * data, const char * text) -{ - struct CheckboxTree * ct; - struct items * item; - int i; - - if (!co) return; - ct = co->data; - item = findItem(ct->itemlist, data); - if (!item) return; - - free(item->text); - item->text = strdup(text); - - i = 4 + (3 * item->depth); - - if ((strlen(text) + i + ct->pad) > co->width) { - co->width = strlen(text) + i + ct->pad; - } - - ctDraw(co); -} - -char newtCheckboxTreeGetEntryValue(newtComponent co, const void * data) -{ - struct CheckboxTree * ct; - struct items * item; - - if (!co) return -1; - ct = co->data; - item = findItem(ct->itemlist, data); - if (!item) return -1; - if (item->branch) - return item->selected ? NEWT_CHECKBOXTREE_EXPANDED : NEWT_CHECKBOXTREE_COLLAPSED; - else - return ct->seq[item->selected]; -} - -void newtCheckboxTreeSetEntryValue(newtComponent co, const void * data, char value) -{ - struct CheckboxTree * ct; - struct items * item; - int i; - - if (!co) return; - ct = co->data; - item = findItem(ct->itemlist, data); - if (!item || item->branch) return; - - for(i = 0; ct->seq[i]; i++) - if (value == ct->seq[i]) - break; - - if (!ct->seq[i]) return; - item->selected = i; - - ctDraw(co); -} - diff --git a/mdk-stage1/newt/entry.c b/mdk-stage1/newt/entry.c deleted file mode 100644 index 154edba71..000000000 --- a/mdk-stage1/newt/entry.c +++ /dev/null @@ -1,376 +0,0 @@ -#include -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -struct entry { - int flags; - char * buf; - char ** resultPtr; - int bufAlloced; - int bufUsed; /* amount of the buffer that's been used */ - int cursorPosition; /* cursor *in the string* on on screen */ - int firstChar; /* first character position being shown */ - newtEntryFilter filter; - void * filterData; -}; - -static void entryDraw(newtComponent co); -static void entryDestroy(newtComponent co); -static struct eventResult entryEvent(newtComponent co, - struct event ev); - -static struct eventResult entryHandleKey(newtComponent co, int key); - -static struct componentOps entryOps = { - entryDraw, - entryEvent, - entryDestroy, - newtDefaultPlaceHandler, - newtDefaultMappedHandler, -} ; - -void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd) { - struct entry * en = co->data; - - if ((strlen(value) + 1) > (unsigned int)en->bufAlloced) { - free(en->buf); - en->bufAlloced = strlen(value) + 1; - en->buf = malloc(en->bufAlloced); - if (en->resultPtr) *en->resultPtr = en->buf; - } - memset(en->buf, 0, en->bufAlloced); /* clear the buffer */ - strcpy(en->buf, value); - en->bufUsed = strlen(value); - en->firstChar = 0; - if (cursorAtEnd) - en->cursorPosition = en->bufUsed; - else - en->cursorPosition = 0; - - entryDraw(co); -} ; - -newtComponent newtEntry(int left, int top, const char * initialValue, int width, - char ** resultPtr, int flags) { - newtComponent co; - struct entry * en; - - co = malloc(sizeof(*co)); - en = malloc(sizeof(struct entry)); - co->data = en; - - co->top = top; - co->left = left; - co->height = 1; - co->width = width; - co->isMapped = 0; - co->callback = NULL; - - co->ops = &entryOps; - - en->flags = flags; - en->cursorPosition = 0; - en->firstChar = 0; - en->bufUsed = 0; - en->bufAlloced = width + 1; - en->filter = NULL; - - if (!(en->flags & NEWT_FLAG_DISABLED)) - co->takesFocus = 1; - else - co->takesFocus = 0; - - if (initialValue && strlen(initialValue) > (unsigned int)width) { - en->bufAlloced = strlen(initialValue) + 1; - } - en->buf = malloc(en->bufAlloced); - en->resultPtr = resultPtr; - if (en->resultPtr) *en->resultPtr = en->buf; - - memset(en->buf, 0, en->bufAlloced); - if (initialValue) { - strcpy(en->buf, initialValue); - en->bufUsed = strlen(initialValue); - en->cursorPosition = en->bufUsed; - } else { - *en->buf = '\0'; - en->bufUsed = 0; - en->cursorPosition = 0; - } - - return co; -} - -static void entryDraw(newtComponent co) { - struct entry * en = co->data; - int i; - char * chptr; - int len; - - if (!co->isMapped) return; - - if (en->flags & NEWT_FLAG_DISABLED) - SLsmg_set_color(NEWT_COLORSET_DISENTRY); - else - SLsmg_set_color(NEWT_COLORSET_ENTRY); - - if (en->flags & NEWT_FLAG_HIDDEN) { - newtGotorc(co->top, co->left); - for (i = 0; i < co->width; i++) - SLsmg_write_char('_'); - newtGotorc(co->top, co->left); - - return; - } - - newtGotorc(co->top, co->left); - - if (en->cursorPosition < en->firstChar) { - /* scroll to the left */ - en->firstChar = en->cursorPosition; - } else if ((en->firstChar + co->width) <= en->cursorPosition) { - /* scroll to the right */ - en->firstChar = en->cursorPosition - co->width + 1; - } - - chptr = en->buf + en->firstChar; - - if (en->flags & NEWT_FLAG_PASSWORD) { - char *tmpptr, *p; - - tmpptr = alloca(strlen(chptr+2)); - strcpy(tmpptr, chptr); - for (p = tmpptr; *p; p++) - *p = '*'; - chptr = tmpptr; - } - - len = strlen(chptr); - - if (len <= co->width) { - i = len; - SLsmg_write_string(chptr); - while (i < co->width) { - SLsmg_write_char('_'); - i++; - } - } else { - SLsmg_write_nstring(chptr, co->width); - } - - if (en->flags & NEWT_FLAG_HIDDEN) - newtGotorc(co->top, co->left); - else - newtGotorc(co->top, co->left + (en->cursorPosition - en->firstChar)); -} - -void newtEntrySetFlags(newtComponent co, int flags, enum newtFlagsSense sense) { - struct entry * en = co->data; - int row, col; - - en->flags = newtSetFlags(en->flags, flags, sense); - - if (!(en->flags & NEWT_FLAG_DISABLED)) - co->takesFocus = 1; - else - co->takesFocus = 0; - - newtGetrc(&row, &col); - entryDraw(co); - newtGotorc(row, col); -} - -static void entryDestroy(newtComponent co) { - struct entry * en = co->data; - - free(en->buf); - free(en); - free(co); -} - -static struct eventResult entryEvent(newtComponent co, - struct event ev) { - struct entry * en = co->data; - struct eventResult er; - int ch; - - if (ev.when == EV_NORMAL) { - switch (ev.event) { - case EV_FOCUS: - newtCursorOn(); - if (en->flags & NEWT_FLAG_HIDDEN) - newtGotorc(co->top, co->left); - else - newtGotorc(co->top, co->left + - (en->cursorPosition - en->firstChar)); - er.result = ER_SWALLOWED; - break; - - case EV_UNFOCUS: - newtCursorOff(); - newtGotorc(0, 0); - er.result = ER_SWALLOWED; - if (co->callback) - co->callback(co, co->callbackData); - break; - - case EV_KEYPRESS: - ch = ev.u.key; - if (en->filter) - ch = en->filter(co, en->filterData, ch, en->cursorPosition); - if (ch) er = entryHandleKey(co, ch); - break; - - case EV_MOUSE: - if ((ev.u.mouse.type == MOUSE_BUTTON_DOWN) && - (en->flags ^ NEWT_FLAG_HIDDEN)) { - if (strlen(en->buf) >= ev.u.mouse.x - co->left) { - en->cursorPosition = ev.u.mouse.x - co->left; - newtGotorc(co->top, - co->left +(en->cursorPosition - en->firstChar)); - } else { - en->cursorPosition = strlen(en->buf); - newtGotorc(co->top, - co->left +(en->cursorPosition - en->firstChar)); - } - } - break; - } - } else - er.result = ER_IGNORED; - - return er; -} - -static struct eventResult entryHandleKey(newtComponent co, int key) { - struct entry * en = co->data; - struct eventResult er; - char * chptr, * insPoint; - - er.result = ER_SWALLOWED; - switch (key) { - case '\r': /* Return */ - if (en->flags & NEWT_FLAG_RETURNEXIT) { - er.result = ER_EXITFORM; - } else { - er.result = ER_NEXTCOMP; - } - break; - - case '\001': /* ^A */ - case NEWT_KEY_HOME: - en->cursorPosition = 0; - break; - - case '\005': /* ^E */ - case NEWT_KEY_END: - en->cursorPosition = en->bufUsed; - break; - - case '\013': /* ^K */ - en->bufUsed = en->cursorPosition; - memset(en->buf + en->bufUsed, 0, en->bufAlloced - en->bufUsed); - break; - - case '\002': /* ^B */ - case NEWT_KEY_LEFT: - if (en->cursorPosition) - en->cursorPosition--; - break; - - case '\004': - case NEWT_KEY_DELETE: - chptr = en->buf + en->cursorPosition; - if (*chptr) { - chptr++; - while (*chptr) { - *(chptr - 1) = *chptr; - chptr++; - } - *(chptr - 1) = '\0'; - en->bufUsed--; - } - break; - - case NEWT_KEY_BKSPC: - if (en->cursorPosition) { - /* if this isn't true, there's nothing to erase */ - chptr = en->buf + en->cursorPosition; - en->bufUsed--; - en->cursorPosition--; - while (*chptr) { - *(chptr - 1) = *chptr; - chptr++; - } - *(chptr - 1) = '\0'; - } - break; - - case '\006': /* ^B */ - case NEWT_KEY_RIGHT: - if (en->cursorPosition < en->bufUsed) - en->cursorPosition++; - break; - - default: - if ((key >= 0x20 && key <= 0x7e) || (key >= 0xa0 && key <= 0xff)) { - if (!(en->flags & NEWT_FLAG_SCROLL) && en->bufUsed >= co->width) { - SLtt_beep(); - break; - } - - if ((en->bufUsed + 1) == en->bufAlloced) { - en->bufAlloced += 20; - en->buf = realloc(en->buf, en->bufAlloced); - if (en->resultPtr) *en->resultPtr = en->buf; - memset(en->buf + en->bufUsed + 1, 0, 20); - } - - if (en->cursorPosition == en->bufUsed) { - en->bufUsed++; - } else { - /* insert the new character */ - - /* chptr is the last character in the string */ - chptr = (en->buf + en->bufUsed) - 1; - if ((en->bufUsed + 1) == en->bufAlloced) { - /* this string fills the buffer, so clip it */ - chptr--; - } else - en->bufUsed++; - - insPoint = en->buf + en->cursorPosition; - - while (chptr >= insPoint) { - *(chptr + 1) = *chptr; - chptr--; - } - - } - - en->buf[en->cursorPosition++] = key; - } else { - er.result = ER_IGNORED; - } - } - - entryDraw(co); - - return er; -} - -char * newtEntryGetValue(newtComponent co) { - struct entry * en = co->data; - - return en->buf; -} - -void newtEntrySetFilter(newtComponent co, newtEntryFilter filter, void * data) { - struct entry * en = co->data; - en->filter = filter; - en->filterData = data; -} diff --git a/mdk-stage1/newt/form.c b/mdk-stage1/newt/form.c deleted file mode 100644 index 4ad465e38..000000000 --- a/mdk-stage1/newt/form.c +++ /dev/null @@ -1,712 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - - -/**************************************************************************** - These forms handle vertical scrolling of components with a height of 1 - - Horizontal scrolling won't work, and scrolling large widgets will fail - miserably. It shouldn't be too hard to fix either of those if anyone - cares to. I only use scrolling for listboxes and text boxes though so - I didn't bother. -*****************************************************************************/ - -struct element { - int top, left; /* Actual, not virtual. These are translated */ - newtComponent co; /* into actual through vertOffset */ -}; - -struct fdInfo { - int fd; - int flags; -}; - -struct form { - int numCompsAlloced; - struct element * elements; - int numComps; - int currComp; - int fixedHeight; - int flags; - int vertOffset; - newtComponent vertBar, exitComp; - const char * help; - int numRows; - int * hotKeys; - int numHotKeys; - int background; - int beenSet; - int numFds; - struct fdInfo * fds; - int maxFd; - int timer; /* in milliseconds */ - struct timeval lastTimeout; - void * helpTag; - newtCallback helpCb; -}; - -static void gotoComponent(struct form * form, int newComp); -static struct eventResult formEvent(newtComponent co, struct event ev); -static struct eventResult sendEvent(newtComponent comp, struct event ev); -static void formPlace(newtComponent co, int left, int top); - -/* Global, ick */ -static newtCallback helpCallback; - -/* this isn't static as grid.c tests against it to find forms */ -struct componentOps formOps = { - newtDrawForm, - formEvent, - newtFormDestroy, - formPlace, - newtDefaultMappedHandler, -} ; - -static inline int componentFits(newtComponent co, int compNum) { - struct form * form = co->data; - struct element * el = form->elements + compNum; - - if ((co->top + form->vertOffset) > el->top) return 0; - if ((co->top + form->vertOffset + co->height) < - (el->top + el->co->height)) return 0; - - return 1; -} - -newtComponent newtForm(newtComponent vertBar, void * help, int flags) { - newtComponent co; - struct form * form; - - co = malloc(sizeof(*co)); - form = malloc(sizeof(*form)); - co->data = form; - co->width = 0; - co->height = 0; - co->top = -1; - co->left = -1; - co->isMapped = 0; - - co->takesFocus = 0; /* we may have 0 components */ - co->ops = &formOps; - - form->help = help; - form->flags = flags; - form->numCompsAlloced = 5; - form->numComps = 0; - form->currComp = -1; - form->vertOffset = 0; - form->fixedHeight = 0; - form->numRows = 0; - form->numFds = 0; - form->maxFd = 0; - form->fds = NULL; - form->beenSet = 0; - form->elements = malloc(sizeof(*(form->elements)) * form->numCompsAlloced); - - form->background = COLORSET_WINDOW; - form->hotKeys = malloc(sizeof(int)); - form->numHotKeys = 0; - form->timer = 0; - form->lastTimeout.tv_sec = form->lastTimeout.tv_usec = 0; - if (!(form->flags & NEWT_FLAG_NOF12)) { - newtFormAddHotKey(co, NEWT_KEY_F12); - } - - if (vertBar) - form->vertBar = vertBar; - else - form->vertBar = NULL; - - form->helpTag = help; - form->helpCb = helpCallback; - - return co; -} - -newtComponent newtFormGetCurrent(newtComponent co) { - struct form * form = co->data; - - return form->elements[form->currComp].co; -} - -void newtFormSetCurrent(newtComponent co, newtComponent subco) { - struct form * form = co->data; - int i, new; - - for (i = 0; i < form->numComps; i++) { - if (form->elements[i].co == subco) break; - } - - if (form->elements[i].co != subco) return; - new = i; - - if (co->isMapped && !componentFits(co, new)) { - gotoComponent(form, -1); - form->vertOffset = form->elements[new].top - co->top - 1; - if (form->vertOffset > (form->numRows - co->height)) - form->vertOffset = form->numRows - co->height; - } - - gotoComponent(form, new); -} - -void newtFormSetTimer(newtComponent co, int millisecs) { - struct form * form = co->data; - - form->timer = millisecs; - form->lastTimeout.tv_usec = 0; - form->lastTimeout.tv_sec = 0; -} - -void newtFormSetHeight(newtComponent co, int height) { - struct form * form = co->data; - - form->fixedHeight = 1; - co->height = height; -} - -void newtFormSetWidth(newtComponent co, int width) { - co->width = width; -} - -void newtFormAddComponent(newtComponent co, newtComponent newco) { - struct form * form = co->data; - - co->takesFocus = 1; - - if (form->numCompsAlloced == form->numComps) { - form->numCompsAlloced += 5; - form->elements = realloc(form->elements, - sizeof(*(form->elements)) * form->numCompsAlloced); - } - - /* we grab real values for these a bit later */ - form->elements[form->numComps].left = -2; - form->elements[form->numComps].top = -2; - form->elements[form->numComps].co = newco; - - if (newco->takesFocus && form->currComp == -1) - form->currComp = form->numComps; - - form->numComps++; -} - -void newtFormAddComponents(newtComponent co, ...) { - va_list ap; - newtComponent subco; - - va_start(ap, co); - - while ((subco = va_arg(ap, newtComponent))) - newtFormAddComponent(co, subco); - - va_end(ap); -} - -static void formPlace(newtComponent co, int left, int top) { - struct form * form = co->data; - int vertDelta, horizDelta; - struct element * el; - int i; - - newtFormSetSize(co); - - vertDelta = top - co->top; - horizDelta = left - co->left; - co->top = top; - co->left = left; - - for (i = 0, el = form->elements; i < form->numComps; i++, el++) { - el->co->top += vertDelta; - el->top += vertDelta; - el->co->left += horizDelta; - el->left += horizDelta; - } -} - -void newtDrawForm(newtComponent co) { - struct form * form = co->data; - struct element * el; - int i; - - newtFormSetSize(co); - - SLsmg_set_color(form->background); - newtClearBox(co->left, co->top, co->width, co->height); - for (i = 0, el = form->elements; i < form->numComps; i++, el++) { - /* the scrollbar *always* fits somewhere */ - if (el->co == form->vertBar) { - el->co->ops->mapped(el->co, 1); - el->co->ops->draw(el->co); - } else { - /* only draw it if it'll fit on the screen vertically */ - if (componentFits(co, i)) { - el->co->top = el->top - form->vertOffset; - el->co->ops->mapped(el->co, 1); - el->co->ops->draw(el->co); - } else { - el->co->ops->mapped(el->co, 0); - } - } - } - - if (form->vertBar) - newtScrollbarSet(form->vertBar, form->vertOffset, - form->numRows - co->height); -} - -static struct eventResult formEvent(newtComponent co, struct event ev) { - struct form * form = co->data; - newtComponent subco = form->elements[form->currComp].co; - int new, wrap = 0; - struct eventResult er; - int dir = 0, page = 0; - int i, num, found; - struct element * el; - - er.result = ER_IGNORED; - if (!form->numComps) return er; - - subco = form->elements[form->currComp].co; - - switch (ev.when) { - case EV_EARLY: - if (ev.event == EV_KEYPRESS) { - if (ev.u.key == NEWT_KEY_TAB) { - er.result = ER_SWALLOWED; - dir = 1; - wrap = 1; - } else if (ev.u.key == NEWT_KEY_UNTAB) { - er.result = ER_SWALLOWED; - dir = -1; - wrap = 1; - } - } - - if (form->numComps) { - i = form->currComp; - num = 0; - while (er.result == ER_IGNORED && num != form->numComps ) { - er = form->elements[i].co->ops->event(form->elements[i].co, ev); - - num++; - i++; - if (i == form->numComps) i = 0; - } - } - - break; - - case EV_NORMAL: - if (ev.event == EV_MOUSE) { - found = 0; - for (i = 0, el = form->elements; i < form->numComps; i++, el++) { - if ((el->co->top <= ev.u.mouse.y) && - (el->co->top + el->co->height > ev.u.mouse.y) && - (el->co->left <= ev.u.mouse.x) && - (el->co->left + el->co->width > ev.u.mouse.x)) { - found = 1; - if (el->co->takesFocus) { - gotoComponent(form, i); - subco = form->elements[form->currComp].co; - } - } - /* If we did not find a co to send this event to, we - should just swallow the event here. */ - } - if (!found) { - er.result = ER_SWALLOWED; - - return er; - } - } - er = subco->ops->event(subco, ev); - switch (er.result) { - case ER_NEXTCOMP: - er.result = ER_SWALLOWED; - dir = 1; - break; - - case ER_EXITFORM: - form->exitComp = subco; - break; - - default: - break; - } - break; - - case EV_LATE: - er = subco->ops->event(subco, ev); - - if (er.result == ER_IGNORED) { - switch (ev.u.key) { - case NEWT_KEY_UP: - case NEWT_KEY_LEFT: - case NEWT_KEY_BKSPC: - er.result = ER_SWALLOWED; - dir = -1; - break; - - case NEWT_KEY_DOWN: - case NEWT_KEY_RIGHT: - er.result = ER_SWALLOWED; - dir = 1; - break; - - case NEWT_KEY_PGUP: - er.result = ER_SWALLOWED; - dir = -1; - page = 1; - break; - - case NEWT_KEY_PGDN: - er.result = ER_SWALLOWED; - dir = 1; - page = 1; - break; - } - } - } - - if (dir) { - new = form->currComp; - - if (page) { - new += dir * co->height; - if (new < 0) - new = 0; - else if (new >= form->numComps) - new = (form->numComps - 1); - - while (!form->elements[new].co->takesFocus) - new = new - dir; - } else { - do { - new += dir; - - if (wrap) { - if (new < 0) - new = form->numComps - 1; - else if (new >= form->numComps) - new = 0; - } else if (new < 0 || new >= form->numComps) - return er; - } while (!form->elements[new].co->takesFocus); - } - - /* make sure this component is visible */ - if (!componentFits(co, new)) { - gotoComponent(form, -1); - - if (dir < 0) { - /* make the new component the first one */ - form->vertOffset = form->elements[new].top - co->top; - } else { - /* make the new component the last one */ - form->vertOffset = (form->elements[new].top + - form->elements[new].co->height) - - (co->top + co->height); - } - - if (form->vertOffset < 0) form->vertOffset = 0; - if (form->vertOffset > (form->numRows - co->height)) - form->vertOffset = form->numRows - co->height; - - newtDrawForm(co); - } - - gotoComponent(form, new); - er.result = ER_SWALLOWED; - } - - return er; -} - -/* this also destroys all of the components on the form */ -void newtFormDestroy(newtComponent co) { - newtComponent subco; - struct form * form = co->data; - int i; - - /* first, destroy all of the components */ - for (i = 0; i < form->numComps; i++) { - subco = form->elements[i].co; - if (subco->ops->destroy) { - subco->ops->destroy(subco); - } else { - if (subco->data) free(subco->data); - free(subco); - } - } - - if (form->hotKeys) free(form->hotKeys); - - free(form->elements); - free(form); - free(co); -} - -newtComponent newtRunForm(newtComponent co) { - struct newtExitStruct es; - - newtFormRun(co, &es); - if (es.reason == NEWT_EXIT_HOTKEY) { - if (es.u.key == NEWT_KEY_F12) { - es.reason = NEWT_EXIT_COMPONENT; - es.u.co = co; - } else { - return NULL; - } - } - - return es.u.co; -} - -void newtFormAddHotKey(newtComponent co, int key) { - struct form * form = co->data; - - form->numHotKeys++; - form->hotKeys = realloc(form->hotKeys, sizeof(int) * form->numHotKeys); - form->hotKeys[form->numHotKeys - 1] = key; -} - -void newtFormSetSize(newtComponent co) { - struct form * form = co->data; - int delta, i; - struct element * el; - - if (form->beenSet) return; - - form->beenSet = 1; - - if (!form->numComps) return; - - co->width = 0; - if (!form->fixedHeight) co->height = 0; - - co->top = form->elements[0].co->top; - co->left = form->elements[0].co->left; - for (i = 0, el = form->elements; i < form->numComps; i++, el++) { - if (el->co->ops == &formOps) - newtFormSetSize(el->co); - - el->left = el->co->left; - el->top = el->co->top; - - if (co->left > el->co->left) { - delta = co->left - el->co->left; - co->left -= delta; - co->width += delta; - } - - if (co->top > el->co->top) { - delta = co->top - el->co->top; - co->top -= delta; - if (!form->fixedHeight) - co->height += delta; - } - - if ((co->left + co->width) < (el->co->left + el->co->width)) - co->width = (el->co->left + el->co->width) - co->left; - - if (!form->fixedHeight) { - if ((co->top + co->height) < (el->co->top + el->co->height)) - co->height = (el->co->top + el->co->height) - co->top; - } - - if ((el->co->top + el->co->height - co->top) > form->numRows) { - form->numRows = el->co->top + el->co->height - co->top; - } - } -} - -void newtFormRun(newtComponent co, struct newtExitStruct * es) { - struct form * form = co->data; - struct event ev; - struct eventResult er; - int key, i, max; - int done = 0; - fd_set readSet, writeSet; - struct timeval nextTimeout, now, timeout; - - newtFormSetSize(co); - /* draw all of the components */ - newtDrawForm(co); - - if (form->currComp == -1) { - gotoComponent(form, 0); - } else - gotoComponent(form, form->currComp); - - while (!done) { - newtRefresh(); - - FD_ZERO(&readSet); - FD_ZERO(&writeSet); - FD_SET(0, &readSet); - max = form->maxFd; - - for (i = 0; i < form->numFds; i++) { - if (form->fds[i].flags & NEWT_FD_READ) - FD_SET(form->fds[i].fd, &readSet); - if (form->fds[i].flags & NEWT_FD_WRITE) - FD_SET(form->fds[i].fd, &writeSet); - } - - if (form->timer) { - /* Calculate when we next need to return with a timeout. Do - this inside the loop in case a callback resets the timer. */ - if (!form->lastTimeout.tv_sec && !form->lastTimeout.tv_usec) - gettimeofday(&form->lastTimeout, NULL); - - nextTimeout.tv_sec = form->lastTimeout.tv_sec + - (form->timer / 1000); - nextTimeout.tv_usec = form->lastTimeout.tv_usec + - (form->timer % 1000) * 1000; - - gettimeofday(&now, 0); - - if (now.tv_sec > nextTimeout.tv_sec) { - timeout.tv_sec = timeout.tv_usec = 0; - } else if (now.tv_sec == nextTimeout.tv_sec) { - timeout.tv_sec = 0; - if (now.tv_usec > nextTimeout.tv_usec) - timeout.tv_usec = 0; - else - timeout.tv_usec = nextTimeout.tv_usec - now.tv_usec; - } else if (now.tv_sec < nextTimeout.tv_sec) { - timeout.tv_sec = nextTimeout.tv_sec - now.tv_sec; - if (now.tv_usec > nextTimeout.tv_usec) - timeout.tv_sec--, - timeout.tv_usec = nextTimeout.tv_usec + 1000000 - - now.tv_usec; - else - timeout.tv_usec = nextTimeout.tv_usec - now.tv_usec; - } - } else { - timeout.tv_sec = timeout.tv_usec = 0; - } - - i = select(max + 1, &readSet, &writeSet, NULL, - form->timer ? &timeout : NULL); - if (i < 0) continue; /* ?? What should we do here? */ - - if (i == 0) { - done = 1; - es->reason = NEWT_EXIT_TIMER; - gettimeofday(&form->lastTimeout, NULL); - } else - { - if (FD_ISSET(0, &readSet)) { - - key = newtGetKey(); - - if (key == NEWT_KEY_RESIZE) { - /* newtResizeScreen(1); */ - continue; - } - - for (i = 0; i < form->numHotKeys; i++) { - if (form->hotKeys[i] == key) { - es->reason = NEWT_EXIT_HOTKEY; - es->u.key = key; - done = 1; - break; - } - } - - if (key == NEWT_KEY_F1 && form->helpTag && form->helpCb) - form->helpCb(co, form->helpTag); - - if (!done) { - ev.event = EV_KEYPRESS; - ev.u.key = key; - - er = sendEvent(co, ev); - - if (er.result == ER_EXITFORM) { - done = 1; - es->reason = NEWT_EXIT_COMPONENT; - es->u.co = form->exitComp; - } - } - } else { - es->reason = NEWT_EXIT_FDREADY; - done = 1; - } - } - } - newtRefresh(); -} - -static struct eventResult sendEvent(newtComponent co, struct event ev) { - struct eventResult er; - - ev.when = EV_EARLY; - er = co->ops->event(co, ev); - - if (er.result == ER_IGNORED) { - ev.when = EV_NORMAL; - er = co->ops->event(co, ev); - } - - if (er.result == ER_IGNORED) { - ev.when = EV_LATE; - er = co->ops->event(co, ev); - } - - return er; -} - -static void gotoComponent(struct form * form, int newComp) { - struct event ev; - - if (form->currComp != -1) { - ev.event = EV_UNFOCUS; - sendEvent(form->elements[form->currComp].co, ev); - } - - form->currComp = newComp; - - if (form->currComp != -1) { - ev.event = EV_FOCUS; - ev.when = EV_NORMAL; - sendEvent(form->elements[form->currComp].co, ev); - } -} - -void newtComponentAddCallback(newtComponent co, newtCallback f, void * data) { - co->callback = f; - co->callbackData = data; -} - -void newtComponentTakesFocus(newtComponent co, int val) { - co->takesFocus = val; -} - -void newtFormSetBackground(newtComponent co, int color) { - struct form * form = co->data; - - form->background = color; -} - -void newtFormWatchFd(newtComponent co, int fd, int fdFlags) { - struct form * form = co->data; - - form->fds = realloc(form->fds, (form->numFds + 1) * sizeof(*form->fds)); - form->fds[form->numFds].fd = fd; - form->fds[form->numFds++].flags = fdFlags; - if (form->maxFd < fd) form->maxFd = fd; -} - -void newtSetHelpCallback(newtCallback cb) { - helpCallback = cb; -} diff --git a/mdk-stage1/newt/grid.c b/mdk-stage1/newt/grid.c deleted file mode 100644 index 433011396..000000000 --- a/mdk-stage1/newt/grid.c +++ /dev/null @@ -1,389 +0,0 @@ -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -struct gridField { - enum newtGridElement type; - union { - newtGrid grid; - newtComponent co; - } u; - int padLeft, padTop, padRight, padBottom; - int anchor; - int flags; -}; - -struct grid_s { - int rows, cols; - int width, height; /* totals, -1 means unknown */ - struct gridField ** fields; -}; - -/* this is a bit of a hack */ -extern struct componentOps formOps[]; - -newtGrid newtCreateGrid(int cols, int rows) { - newtGrid grid; - - grid = malloc(sizeof(*grid)); - grid->rows = rows; - grid->cols = cols; - - grid->fields = malloc(sizeof(*grid->fields) * cols); - while (cols--) { - grid->fields[cols] = malloc(sizeof(**(grid->fields)) * rows); - memset(grid->fields[cols], 0, sizeof(**(grid->fields)) * rows); - } - - grid->width = grid->height = -1; - - return grid; -} - -void newtGridSetField(newtGrid grid, int col, int row, - enum newtGridElement type, void * val, int padLeft, - int padTop, int padRight, int padBottom, int anchor, - int flags) { - struct gridField * field = &grid->fields[col][row]; - - if (field->type == NEWT_GRID_SUBGRID) - newtGridFree(field->u.grid, 1); - - field->type = type; - field->u.co = (void *) val; - - field->padLeft = padLeft; - field->padRight = padRight; - field->padTop = padTop; - field->padBottom = padBottom; - field->anchor = anchor; - field->flags = flags; - - grid->width = grid->height = -1; -} - -static void distSpace(int extra, int items, int * list) { - int all, some, i; - - all = extra / items; - some = extra % items; - for (i = 0; i < items; i++) { - list[i] += all; - if (some) { - list[i]++; - some--; - } - } -} - -static void shuffleGrid(newtGrid grid, int left, int top, int set) { - struct gridField * field; - int row, col; - int i, j; - int minWidth, minHeight; - int * widths, * heights; - int thisLeft, thisTop; - int x, y, remx, remy; - - widths = alloca(sizeof(*widths) * grid->cols); - memset(widths, 0, sizeof(*widths) * grid->cols); - heights = alloca(sizeof(*heights) * grid->rows); - memset(heights, 0, sizeof(*heights) * grid->rows); - - minWidth = 0; - for (row = 0; row < grid->rows; row++) { - i = 0; - for (col = 0; col < grid->cols; col++) { - field = &grid->fields[col][row]; - if (field->type == NEWT_GRID_SUBGRID) { - /* we'll have to redo this later */ - if (field->u.grid->width == -1) - shuffleGrid(field->u.grid, left, top, 0); - j = field->u.grid->width; - } else if (field->type == NEWT_GRID_COMPONENT) { - if (field->u.co->ops == formOps) - newtFormSetSize(field->u.co); - j = field->u.co->width; - } else - j = 0; - - j += field->padLeft + field->padRight; - - if (j > widths[col]) widths[col] = j; - i += widths[col]; - } - - if (i > minWidth) minWidth = i; - } - - minHeight = 0; - for (col = 0; col < grid->cols; col++) { - i = 0; - for (row = 0; row < grid->rows; row++) { - field = &grid->fields[col][row]; - if (field->type == NEWT_GRID_SUBGRID) { - /* we'll have to redo this later */ - if (field->u.grid->height == -1) - shuffleGrid(field->u.grid, 0, 0, 0); - j = field->u.grid->height; - } else if (field->type == NEWT_GRID_COMPONENT){ - j = field->u.co->height; - } else - j = 0; - - j += field->padTop + field->padBottom; - - if (j > heights[row]) heights[row] = j; - i += heights[row]; - } - - if (i > minHeight) minHeight = i; - } - - /* this catches the -1 case */ - if (grid->width < minWidth) grid->width = minWidth; /* ack! */ - if (grid->height < minHeight) grid->height = minHeight; /* ditto! */ - - if (!set) return; - - distSpace(grid->width - minWidth, grid->cols, widths); - distSpace(grid->height - minHeight, grid->rows, heights); - - thisTop = top; - for (row = 0; row < grid->rows; row++) { - i = 0; - thisLeft = left; - for (col = 0; col < grid->cols; col++) { - field = &grid->fields[col][row]; - - if (field->type == NEWT_GRID_EMPTY) continue; - - x = thisLeft + field->padLeft; - remx = widths[col] - field->padLeft - field->padRight; - y = thisTop + field->padTop; - remy = heights[row] - field->padTop - field->padBottom; - - if (field->type == NEWT_GRID_SUBGRID) { - remx -= field->u.grid->width; - remy -= field->u.grid->height; - } else if (field->type == NEWT_GRID_COMPONENT) { - remx -= field->u.co->width; - remy -= field->u.co->height; - } - - if (!(field->flags & NEWT_GRID_FLAG_GROWX)) { - if (field->anchor & NEWT_ANCHOR_RIGHT) - x += remx; - else if (!(field->anchor & NEWT_ANCHOR_LEFT)) - x += (remx / 2); - } - - if (!(field->flags & NEWT_GRID_FLAG_GROWY)) { - if (field->anchor & NEWT_ANCHOR_BOTTOM) - y += remx; - else if (!(field->anchor & NEWT_ANCHOR_TOP)) - y += (remy / 2); - } - - if (field->type == NEWT_GRID_SUBGRID) { - if (field->flags & NEWT_GRID_FLAG_GROWX) - field->u.grid->width = widths[col] - field->padLeft - - field->padRight; - if (field->flags & NEWT_GRID_FLAG_GROWY) - field->u.grid->height = heights[col] - field->padTop - - field->padBottom; - - shuffleGrid(field->u.grid, x, y, 1); - } else if (field->type == NEWT_GRID_COMPONENT) { - field->u.co->ops->place(field->u.co, x, y); - } - - thisLeft += widths[col]; - } - - thisTop += heights[row]; - } -} - -void newtGridPlace(newtGrid grid, int left, int top) { - shuffleGrid(grid, left, top, 1); -} - -void newtGridFree(newtGrid grid, int recurse) { - int row, col; - - for (col = 0; col < grid->cols; col++) { - if (recurse) { - for (row = 0; row < grid->rows; row++) { - if (grid->fields[col][row].type == NEWT_GRID_SUBGRID) - newtGridFree(grid->fields[col][row].u.grid, 1); - } - } - - free(grid->fields[col]); - } - - free(grid->fields); - free(grid); -} - -void newtGridGetSize(newtGrid grid, int * width, int * height) { - if (grid->width == -1 || grid->height == -1) { - grid->width = grid->height = -1; - shuffleGrid(grid, 0, 0, 1); - } - - *width = grid->width; - *height = grid->height; -} - -void newtGridWrappedWindow(newtGrid grid, char * title) { - int width, height, offset = 0; - - newtGridGetSize(grid, &width, &height); - if (width < strlen(title) + 2) { - offset = ((strlen(title) + 2) - width) / 2; - width = strlen(title) + 2; - } - newtCenteredWindow(width + 2, height + 2, title); - newtGridPlace(grid, 1 + offset, 1); -} - -void newtGridWrappedWindowAt(newtGrid grid, char * title, int left, int top) { - int width, height; - - newtGridGetSize(grid, &width, &height); - newtOpenWindow(left, top, width + 2, height + 2, title); - newtGridPlace(grid, 1, 1); -} - -void newtGridAddComponentsToForm(newtGrid grid, newtComponent form, - int recurse) { - int row, col; - - for (col = 0; col < grid->cols; col++) { - for (row = 0; row < grid->rows; row++) { - if (grid->fields[col][row].type == NEWT_GRID_SUBGRID && recurse) - newtGridAddComponentsToForm(grid->fields[col][row].u.grid, - form, 1); - else if (grid->fields[col][row].type == NEWT_GRID_COMPONENT) - newtFormAddComponent(form, grid->fields[col][row].u.co); - } - } -} - -/* this handles up to 50 items */ -static newtGrid stackem(int isVert, enum newtGridElement type1, void * what1, - va_list args, int close) { - struct item { - enum newtGridElement type; - void * what; - } items[50]; - int i, num; - newtGrid grid; - - items[0].type = type1, items[0].what = what1, num = 1; - while (1) { - items[num].type = va_arg(args, enum newtGridElement); - if (items[num].type == NEWT_GRID_EMPTY) break; - - items[num].what = va_arg(args, void *); - num++; - } - - grid = newtCreateGrid(isVert ? 1 : num, isVert ? num : 1); - - for (i = 0; i < num; i++) { - newtGridSetField(grid, isVert ? 0 : i, isVert ? i : 0, - items[i].type, items[i].what, - close ? 0 : (i ? (isVert ? 0 : 1) : 0), - close ? 0 : (i ? (isVert ? 1 : 0) : 0), 0, 0, 0, 0); - } - - return grid; -} - -newtGrid newtGridHCloseStacked(enum newtGridElement type1, void * what1, ...) { - va_list args; - newtGrid grid; - - va_start(args, what1); - - grid = stackem(0, type1, what1, args, 1); - - va_start(args, what1); - - return grid; -} - -newtGrid newtGridVCloseStacked(enum newtGridElement type1, void * what1, ...) { - va_list args; - newtGrid grid; - - va_start(args, what1); - - grid = stackem(1, type1, what1, args, 1); - - va_start(args, what1); - - return grid; -} - -newtGrid newtGridVStacked(enum newtGridElement type1, void * what1, ...) { - va_list args; - newtGrid grid; - - va_start(args, what1); - - grid = stackem(1, type1, what1, args, 0); - - va_start(args, what1); - - return grid; -} - -newtGrid newtGridHStacked(enum newtGridElement type1, void * what1, ...) { - va_list args; - newtGrid grid; - - va_start(args, what1); - - grid = stackem(0, type1, what1, args, 0); - - va_start(args, what1); - - return grid; -} - -newtGrid newtGridBasicWindow(newtComponent text, newtGrid middle, - newtGrid buttons) { - newtGrid grid; - - grid = newtCreateGrid(1, 3); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text, - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, middle, - 0, 1, 0, 0, 0, 0); - newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttons, - 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX); - - return grid; -} - -newtGrid newtGridSimpleWindow(newtComponent text, newtComponent middle, - newtGrid buttons) { - newtGrid grid; - - grid = newtCreateGrid(1, 3); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, text, - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(grid, 0, 1, NEWT_GRID_COMPONENT, middle, - 0, 1, 0, 0, 0, 0); - newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttons, - 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX); - - return grid; -} diff --git a/mdk-stage1/newt/label.c b/mdk-stage1/newt/label.c deleted file mode 100644 index f1a9cebbf..000000000 --- a/mdk-stage1/newt/label.c +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -struct label { - char * text; - int length; -}; - -static void labelDraw(newtComponent co); -static void labelDestroy(newtComponent co); - -static struct componentOps labelOps = { - labelDraw, - newtDefaultEventHandler, - labelDestroy, - newtDefaultPlaceHandler, - newtDefaultMappedHandler, -} ; - -newtComponent newtLabel(int left, int top, const char * text) { - newtComponent co; - struct label * la; - - co = malloc(sizeof(*co)); - la = malloc(sizeof(struct label)); - co->data = la; - - co->ops = &labelOps; - - co->height = 1; - co->width = strlen(text); - co->top = top; - co->left = left; - co->takesFocus = 0; - - la->length = strlen(text); - la->text = strdup(text); - - return co; -} - -void newtLabelSetText(newtComponent co, const char * text) { - int newLength; - struct label * la = co->data; - - newLength = strlen(text); - if (newLength <= la->length) { - memset(la->text, ' ', la->length); - memcpy(la->text, text, newLength); - } else { - free(la->text); - la->text = strdup(text); - la->length = newLength; - co->width = newLength; - } - - labelDraw(co); -} - -static void labelDraw(newtComponent co) { - struct label * la = co->data; - - if (co->isMapped == -1) return; - - SLsmg_set_color(COLORSET_LABEL); - - newtGotorc(co->top, co->left); - SLsmg_write_string(la->text); -} - -static void labelDestroy(newtComponent co) { - struct label * la = co->data; - - free(la->text); - free(la); - free(co); -} diff --git a/mdk-stage1/newt/listbox.c b/mdk-stage1/newt/listbox.c deleted file mode 100644 index ef276aeb4..000000000 --- a/mdk-stage1/newt/listbox.c +++ /dev/null @@ -1,752 +0,0 @@ -/* This goofed-up box whacked into shape by Elliot Lee - (from the original listbox by Erik Troan ) - and contributed to newt for use under the LGPL license. - Copyright (C) 1996, 1997 Elliot Lee */ - -#include -#include -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - - -/* Linked list of items in the listbox */ -struct items { - char * text; - const void *data; - unsigned char isSelected; - struct items *next; -}; - -/* Holds all the relevant information for this listbox */ -struct listbox { - newtComponent sb; /* Scrollbar on right side of listbox */ - int curWidth; /* size of text w/o scrollbar or border*/ - int curHeight; /* size of text w/o border */ - int sbAdjust; - int bdxAdjust, bdyAdjust; - int numItems, numSelected; - int userHasSetWidth; - int currItem, startShowItem; /* startShowItem is the first item displayed - on the screen */ - int isActive; /* If we handle key events all the time, it seems - to do things even when they are supposed to be for - another button/whatever */ - struct items *boxItems; - int grow; - int flags; /* flags for this listbox, right now just - NEWT_FLAG_RETURNEXIT */ -}; - -static void listboxDraw(newtComponent co); -static void listboxDestroy(newtComponent co); -static struct eventResult listboxEvent(newtComponent co, struct event ev); -static void newtListboxRealSetCurrent(newtComponent co); -static void listboxPlace(newtComponent co, int newLeft, int newTop); -static inline void updateWidth(newtComponent co, struct listbox * li, - int maxField); -static void listboxMapped(newtComponent co, int isMapped); - -static struct componentOps listboxOps = { - listboxDraw, - listboxEvent, - listboxDestroy, - listboxPlace, - listboxMapped, -}; - -static void listboxMapped(newtComponent co, int isMapped) { - struct listbox * li = co->data; - - co->isMapped = isMapped; - if (li->sb) - li->sb->ops->mapped(li->sb, isMapped); -} - -static void listboxPlace(newtComponent co, int newLeft, int newTop) { - struct listbox * li = co->data; - - co->top = newTop; - co->left = newLeft; - - if (li->sb) - li->sb->ops->place(li->sb, co->left + co->width - li->bdxAdjust - 1, - co->top); -} - -newtComponent newtListbox(int left, int top, int height, int flags) { - newtComponent co, sb; - struct listbox * li; - - if (!(co = malloc(sizeof(*co)))) - return NULL; - - if (!(li = malloc(sizeof(struct listbox)))) { - free(co); - return NULL; - } - - li->boxItems = NULL; - li->numItems = 0; - li->currItem = 0; - li->numSelected = 0; - li->isActive = 0; - li->userHasSetWidth = 0; - li->startShowItem = 0; - li->sbAdjust = 0; - li->bdxAdjust = 0; - li->bdyAdjust = 0; - li->flags = flags & (NEWT_FLAG_RETURNEXIT | NEWT_FLAG_BORDER | - NEWT_FLAG_MULTIPLE); - - if (li->flags & NEWT_FLAG_BORDER) { - li->bdxAdjust = 2; - li->bdyAdjust = 1; - } - - co->height = height; - li->curHeight = co->height - (2 * li->bdyAdjust); - - if (height) { - li->grow = 0; - if (flags & NEWT_FLAG_SCROLL) { - sb = newtVerticalScrollbar(left, top + li->bdyAdjust, - li->curHeight, - COLORSET_LISTBOX, COLORSET_ACTLISTBOX); - li->sbAdjust = 3; - } else { - sb = NULL; - } - } else { - li->grow = 1; - sb = NULL; - } - - li->sb = sb; - co->data = li; - co->isMapped = 0; - co->left = left; - co->top = top; - co->ops = &listboxOps; - co->takesFocus = 1; - co->callback = NULL; - - updateWidth(co, li, 5); - - return co; -} - -static inline void updateWidth(newtComponent co, struct listbox * li, - int maxField) { - li->curWidth = maxField; - co->width = li->curWidth + li->sbAdjust + 2 * li->bdxAdjust; - - if (li->sb) - li->sb->left = co->left + co->width - li->bdxAdjust - 1; -} - -void newtListboxSetCurrentByKey(newtComponent co, void * key) { - struct listbox * li = co->data; - struct items * item; - int i; - - item = li->boxItems, i = 0; - while (item && item->data != key) - item = item->next, i++; - - if (item) - newtListboxSetCurrent(co, i); -} - -void newtListboxSetCurrent(newtComponent co, int num) -{ - struct listbox * li = co->data; - - if (num >= li->numItems) - li->currItem = li->numItems - 1; - else if (num < 0) - li->currItem = 0; - else - li->currItem = num; - - if (li->currItem < li->startShowItem) - li->startShowItem = li->currItem; - else if (li->currItem - li->startShowItem > li->curHeight - 1) - li->startShowItem = li->currItem - li->curHeight + 1; - if (li->startShowItem + li->curHeight > li->numItems) - li->startShowItem = li->numItems - li->curHeight; - if(li->startShowItem < 0) - li->startShowItem = 0; - - newtListboxRealSetCurrent(co); -} - -static void newtListboxRealSetCurrent(newtComponent co) -{ - struct listbox * li = co->data; - - if(li->sb) - newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); - listboxDraw(co); - if(co->callback) co->callback(co, co->callbackData); -} - -void newtListboxSetWidth(newtComponent co, int width) { - struct listbox * li = co->data; - - co->width = width; - li->curWidth = co->width - li->sbAdjust - 2 * li->bdxAdjust; - li->userHasSetWidth = 1; - if (li->sb) li->sb->left = co->width + co->left - 1; - listboxDraw(co); -} - -void * newtListboxGetCurrent(newtComponent co) { - struct listbox * li = co->data; - int i; - struct items *item; - - for(i = 0, item = li->boxItems; item != NULL && i < li->currItem; - i++, item = item->next); - - if (item) - return (void *)item->data; - else - return NULL; -} - -void newtListboxSelectItem(newtComponent co, const void * key, - enum newtFlagsSense sense) -{ - struct listbox * li = co->data; - int i; - struct items * item; - - item = li->boxItems, i = 0; - while (item && item->data != key) - item = item->next, i++; - - if (!item) return; - - if (item->isSelected) - li->numSelected--; - - switch(sense) { - case NEWT_FLAGS_RESET: - item->isSelected = 0; break; - case NEWT_FLAGS_SET: - item->isSelected = 1; break; - case NEWT_FLAGS_TOGGLE: - item->isSelected = !item->isSelected; - } - - if (item->isSelected) - li->numSelected++; - - listboxDraw(co); -} - -void newtListboxClearSelection(newtComponent co) -{ - struct items *item; - struct listbox * li = co->data; - - for(item = li->boxItems; item != NULL; - item = item->next) - item->isSelected = 0; - li->numSelected = 0; - listboxDraw(co); -} - -/* Free the returned array after use, but NOT the values in the array */ -void ** newtListboxGetSelection(newtComponent co, int *numitems) -{ - struct listbox * li; - int i; - void **retval; - struct items *item; - - if(!co || !numitems) return NULL; - - li = co->data; - if(!li || !li->numSelected) return NULL; - - retval = malloc(li->numSelected * sizeof(void *)); - for(i = 0, item = li->boxItems; item != NULL; - item = item->next) - if(item->isSelected) - retval[i++] = (void *)item->data; - *numitems = li->numSelected; - return retval; -} - -void newtListboxSetEntry(newtComponent co, int num, const char * text) { - struct listbox * li = co->data; - int i; - struct items *item; - - for(i = 0, item = li->boxItems; item != NULL && i < num; - i++, item = item->next); - - if(!item) - return; - else { - free(item->text); - item->text = strdup(text); - } - if (li->userHasSetWidth == 0 && strlen(text) > li->curWidth) { - updateWidth(co, li, strlen(text)); - } - - if (num >= li->startShowItem && num <= li->startShowItem + co->height) - listboxDraw(co); -} - -void newtListboxSetData(newtComponent co, int num, void * data) { - struct listbox * li = co->data; - int i; - struct items *item; - - for(i = 0, item = li->boxItems; item != NULL && i < num; - i++, item = item->next); - - item->data = data; -} - -int newtListboxAppendEntry(newtComponent co, const char * text, - const void * data) { - struct listbox * li = co->data; - struct items *item; - - if(li->boxItems) { - for (item = li->boxItems; item->next != NULL; item = item->next); - - item = item->next = malloc(sizeof(struct items)); - } else { - item = li->boxItems = malloc(sizeof(struct items)); - } - - if (!li->userHasSetWidth && text && (strlen(text) > li->curWidth)) - updateWidth(co, li, strlen(text)); - - item->text = strdup(text); item->data = data; item->next = NULL; - item->isSelected = 0; - - if (li->grow) - co->height++, li->curHeight++; - li->numItems++; - - return 0; -} - -int newtListboxInsertEntry(newtComponent co, const char * text, - const void * data, void * key) { - struct listbox * li = co->data; - struct items *item, *t; - - if (li->boxItems) { - if (key) { - item = li->boxItems; - while (item && item->data != key) item = item->next; - - if (!item) return 1; - - t = item->next; - item = item->next = malloc(sizeof(struct items)); - item->next = t; - } else { - t = li->boxItems; - item = li->boxItems = malloc(sizeof(struct items)); - item->next = t; - } - } else if (key) { - return 1; - } else { - item = li->boxItems = malloc(sizeof(struct items)); - item->next = NULL; - } - - if (!li->userHasSetWidth && text && (strlen(text) > li->curWidth)) - updateWidth(co, li, strlen(text)); - - item->text = strdup(text?text:"(null)"); item->data = data; - item->isSelected = 0; - - if (li->sb) - li->sb->left = co->left + co->width - li->bdxAdjust - 1; - li->numItems++; - - listboxDraw(co); - - return 0; -} - -int newtListboxDeleteEntry(newtComponent co, void * key) { - struct listbox * li = co->data; - int widest = 0, t; - struct items *item, *item2 = NULL; - int num; - - if (li->boxItems == NULL || li->numItems <= 0) - return 0; - - num = 0; - - item2 = NULL, item = li->boxItems; - while (item && item->data != key) { - item2 = item; - item = item->next; - num++; - } - - if (!item) - return -1; - - if (item2) - item2->next = item->next; - else - li->boxItems = item->next; - - free(item->text); - free(item); - li->numItems--; - - if (!li->userHasSetWidth) { - widest = 0; - for (item = li->boxItems; item != NULL; item = item->next) - if ((t = strlen(item->text)) > widest) widest = t; - } - - if (li->currItem >= num) - li->currItem--; - - if (!li->userHasSetWidth) { - updateWidth(co, li, widest); - } - - listboxDraw(co); - - return 0; -} - -void newtListboxClear(newtComponent co) -{ - struct listbox * li; - struct items *anitem, *nextitem; - if(co == NULL || (li = co->data) == NULL) - return; - for(anitem = li->boxItems; anitem != NULL; anitem = nextitem) { - nextitem = anitem->next; - free(anitem->text); - free(anitem); - } - li->numItems = li->numSelected = li->currItem = li->startShowItem = 0; - li->boxItems = NULL; - if (!li->userHasSetWidth) - updateWidth(co, li, 5); -} - -/* If you don't want to get back the text, pass in NULL for the ptr-ptr. Same - goes for the data. */ -void newtListboxGetEntry(newtComponent co, int num, char **text, void **data) { - struct listbox * li = co->data; - int i; - struct items *item; - - if (!li->boxItems || num >= li->numItems) { - if(text) - *text = NULL; - if(data) - *data = NULL; - return; - } - - i = 0; - item = li->boxItems; - while (item && i < num) { - i++, item = item->next; - } - - if (item) { - if (text) - *text = item->text; - if (data) - *data = (void *)item->data; - } -} - -static void listboxDraw(newtComponent co) -{ - struct listbox * li = co->data; - struct items *item; - int i, j; - - if (!co->isMapped) return ; - - if(li->flags & NEWT_FLAG_BORDER) { - if(li->isActive) - SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX); - else - SLsmg_set_color(NEWT_COLORSET_LISTBOX); - - newtDrawBox(co->left, co->top, co->width, co->height, 0); - } - - if(li->sb) - li->sb->ops->draw(li->sb); - - SLsmg_set_color(NEWT_COLORSET_LISTBOX); - - for(i = 0, item = li->boxItems; item != NULL && i < li->startShowItem; - i++, item = item->next); - - j = i; - - for (i = 0; item != NULL && i < li->curHeight; i++, item = item->next) { - if (!item->text) continue; - - newtGotorc(co->top + i + li->bdyAdjust, co->left + li->bdxAdjust); - if(j + i == li->currItem) { - if(item->isSelected) - SLsmg_set_color(NEWT_COLORSET_ACTSELLISTBOX); - else - SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX); - } else if(item->isSelected) - SLsmg_set_color(NEWT_COLORSET_SELLISTBOX); - else - SLsmg_set_color(NEWT_COLORSET_LISTBOX); - - SLsmg_write_nstring(item->text, li->curWidth); - - } - newtGotorc(co->top + (li->currItem - li->startShowItem), co->left); -} - -static struct eventResult listboxEvent(newtComponent co, struct event ev) { - struct eventResult er; - struct listbox * li = co->data; - struct items *item; - int i; - - er.result = ER_IGNORED; - - if(ev.when == EV_EARLY || ev.when == EV_LATE) { - return er; - } - - switch(ev.event) { - case EV_KEYPRESS: - if (!li->isActive) break; - - switch(ev.u.key) { - case ' ': - if(!(li->flags & NEWT_FLAG_MULTIPLE)) break; - newtListboxSelectItem(co, li->boxItems[li->currItem].data, - NEWT_FLAGS_TOGGLE); - er.result = ER_SWALLOWED; - /* We don't break here, because it is cool to be able to - hold space to select a bunch of items in a list at once */ - - case NEWT_KEY_DOWN: - if(li->numItems <= 0) break; - if(li->currItem < li->numItems - 1) { - li->currItem++; - if(li->currItem > (li->startShowItem + li->curHeight - 1)) { - li->startShowItem = li->currItem - li->curHeight + 1; - if(li->startShowItem + li->curHeight > li->numItems) - li->startShowItem = li->numItems - li->curHeight; - } - if(li->sb) - newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); - listboxDraw(co); - } - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - break; - - case NEWT_KEY_ENTER: - if(li->numItems <= 0) break; - if(li->flags & NEWT_FLAG_RETURNEXIT) - er.result = ER_EXITFORM; - break; - - case NEWT_KEY_UP: - if(li->numItems <= 0) break; - if(li->currItem > 0) { - li->currItem--; - if(li->currItem < li->startShowItem) - li->startShowItem = li->currItem; - if(li->sb) - newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); - listboxDraw(co); - } - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - break; - - case NEWT_KEY_PGUP: - if(li->numItems <= 0) break; - li->startShowItem -= li->curHeight - 1; - if(li->startShowItem < 0) - li->startShowItem = 0; - li->currItem -= li->curHeight - 1; - if(li->currItem < 0) - li->currItem = 0; - newtListboxRealSetCurrent(co); - er.result = ER_SWALLOWED; - break; - - case NEWT_KEY_PGDN: - if(li->numItems <= 0) break; - li->startShowItem += li->curHeight; - if(li->startShowItem > (li->numItems - li->curHeight)) { - li->startShowItem = li->numItems - li->curHeight; - } - li->currItem += li->curHeight; - if(li->currItem >= li->numItems) { - li->currItem = li->numItems - 1; - } - newtListboxRealSetCurrent(co); - er.result = ER_SWALLOWED; - break; - - case NEWT_KEY_HOME: - if(li->numItems <= 0) break; - newtListboxSetCurrent(co, 0); - er.result = ER_SWALLOWED; - break; - - case NEWT_KEY_END: - if(li->numItems <= 0) break; - li->startShowItem = li->numItems - li->curHeight; - if(li->startShowItem < 0) - li->startShowItem = 0; - li->currItem = li->numItems - 1; - newtListboxRealSetCurrent(co); - er.result = ER_SWALLOWED; - break; - default: - if (li->numItems <= 0) break; - if (ev.u.key < NEWT_KEY_EXTRA_BASE && isalpha(ev.u.key)) { - for(i = 0, item = li->boxItems; item != NULL && - i < li->currItem; i++, item = item->next); - - if (item && item->text && (toupper(*item->text) == toupper(ev.u.key))) { - item = item->next; - i++; - } else { - item = li->boxItems; - i = 0; - } - while (item && item->text && - toupper(*item->text) != toupper(ev.u.key)) { - item = item->next; - i++; - } - if (item) { - li->currItem = i; - if(li->currItem < li->startShowItem || - li->currItem > li->startShowItem) - li->startShowItem = - li->currItem > li->numItems - li->curHeight ? - li->startShowItem = li->numItems - li->curHeight : - li->currItem; - if(li->sb) - newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); - newtListboxRealSetCurrent(co); - er.result = ER_SWALLOWED; - } - } - } - break; - - case EV_FOCUS: - li->isActive = 1; - listboxDraw(co); - er.result = ER_SWALLOWED; - break; - - case EV_UNFOCUS: - li->isActive = 0; - listboxDraw(co); - er.result = ER_SWALLOWED; - break; - - case EV_MOUSE: - /* if this mouse click was within the listbox, make the current - item the item clicked on. */ - /* Up scroll arrow */ - if (li->sb && - ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 && - ev.u.mouse.y == co->top + li->bdyAdjust) { - if(li->numItems <= 0) break; - if(li->currItem > 0) { - li->currItem--; - if(li->currItem < li->startShowItem) - li->startShowItem = li->currItem; - if(li->sb) - newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); - listboxDraw(co); - } - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - break; - } - /* Down scroll arrow */ - if (li->sb && - ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 && - ev.u.mouse.y == co->top + co->height - li->bdyAdjust - 1) { - if(li->numItems <= 0) break; - if(li->currItem < li->numItems - 1) { - li->currItem++; - if(li->currItem > (li->startShowItem + li->curHeight - 1)) { - li->startShowItem = li->currItem - li->curHeight + 1; - if(li->startShowItem + li->curHeight > li->numItems) - li->startShowItem = li->numItems - li->curHeight; - } - if(li->sb) - newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); - listboxDraw(co); - } - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - break; - } - if ((ev.u.mouse.y >= co->top + li->bdyAdjust) && - (ev.u.mouse.y <= co->top + co->height - (li->bdyAdjust * 2)) && - (ev.u.mouse.x >= co->left + li->bdxAdjust) && - (ev.u.mouse.x <= co->left + co->width + (li->bdxAdjust * 2))) { - li->currItem = li->startShowItem + - (ev.u.mouse.y - li->bdyAdjust - co->top); - newtListboxRealSetCurrent(co); - listboxDraw(co); - if(co->callback) co->callback(co, co->callbackData); - er.result = ER_SWALLOWED; - break; - } - } - - return er; -} - -static void listboxDestroy(newtComponent co) { - struct listbox * li = co->data; - struct items * item, * nextitem; - - nextitem = item = li->boxItems; - - while (item != NULL) { - nextitem = item->next; - free(item->text); - free(item); - item = nextitem; - } - - if (li->sb) li->sb->ops->destroy(li->sb); - - free(li); - free(co); -} diff --git a/mdk-stage1/newt/newt.c b/mdk-stage1/newt/newt.c deleted file mode 100644 index 1cfe3ac93..000000000 --- a/mdk-stage1/newt/newt.c +++ /dev/null @@ -1,672 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -struct Window { - int height, width, top, left; - short * buffer; - char * title; -}; - -struct keymap { - char * str; - int code; - char * tc; -}; - -static struct Window windowStack[20]; -static struct Window * currentWindow = NULL; - -static char * helplineStack[20]; -static char ** currentHelpline = NULL; - -static int cursorRow, cursorCol; -static int needResize; -static int cursorOn = 1; - -static const char * defaultHelpLine = -" / between elements | selects | next screen" -; - -const struct newtColors newtDefaultColorPalette = { - "cyan", "black", /* root fg, bg */ - "black", "blue", /* border fg, bg */ - "white", "blue", /* window fg, bg */ - "white", "black", /* shadow fg, bg */ - "white", "blue", /* title fg, bg */ - "black", "cyan", /* button fg, bg */ - "yellow", "cyan", /* active button fg, bg */ - "yellow", "blue", /* checkbox fg, bg */ - "blue", "brown", /* active checkbox fg, bg */ - "yellow", "blue", /* entry box fg, bg */ - "white", "blue", /* label fg, bg */ - "black", "cyan", /* listbox fg, bg */ - "yellow", "cyan", /* active listbox fg, bg */ - "white", "blue", /* textbox fg, bg */ - "cyan", "black", /* active textbox fg, bg */ - "white", "blue", /* help line */ - "yellow", "blue", /* root text */ - "blue", /* scale full */ - "red", /* scale empty */ - "blue", "cyan", /* disabled entry fg, bg */ - "white", "blue", /* compact button fg, bg */ - "yellow", "red", /* active & sel listbox */ - "black", "brown" /* selected listbox */ -}; - -static const struct keymap keymap[] = { - { "\033OA", NEWT_KEY_UP, "kh" }, - { "\033[A", NEWT_KEY_UP, "ku" }, - { "\033OB", NEWT_KEY_DOWN, "kd" }, - { "\033[B", NEWT_KEY_DOWN, "kd" }, - { "\033[C", NEWT_KEY_RIGHT, "kr" }, - { "\033OC", NEWT_KEY_RIGHT, "kr" }, - { "\033[D", NEWT_KEY_LEFT, "kl" }, - { "\033OD", NEWT_KEY_LEFT, "kl" }, - { "\033[H", NEWT_KEY_HOME, "kh" }, - { "\033[1~", NEWT_KEY_HOME, "kh" }, - { "\033Ow", NEWT_KEY_END, "kH" }, - { "\033[4~", NEWT_KEY_END, "kH" }, - - { "\033[3~", NEWT_KEY_DELETE, "kl" }, - { "\033[2~", NEWT_KEY_INSERT, NULL }, - - { "\033\t", NEWT_KEY_UNTAB, NULL }, - - { "\033[5~", NEWT_KEY_PGUP, NULL }, - { "\033[6~", NEWT_KEY_PGDN, NULL }, - { "\033V", NEWT_KEY_PGUP, "kH" }, - { "\033v", NEWT_KEY_PGUP, "kH" }, - - { "\033[[A", NEWT_KEY_F1, NULL }, - { "\033[[B", NEWT_KEY_F2, NULL }, - { "\033[[C", NEWT_KEY_F3, NULL }, - { "\033[[D", NEWT_KEY_F4, NULL }, - { "\033[[E", NEWT_KEY_F5, NULL }, - - { "\033OP", NEWT_KEY_F1, NULL }, - { "\033OQ", NEWT_KEY_F2, NULL }, - { "\033OR", NEWT_KEY_F3, NULL }, - { "\033OS", NEWT_KEY_F4, NULL }, - - { "\033[11~", NEWT_KEY_F1, NULL }, - { "\033[12~", NEWT_KEY_F2, NULL }, - { "\033[13~", NEWT_KEY_F3, NULL }, - { "\033[14~", NEWT_KEY_F4, NULL }, - { "\033[15~", NEWT_KEY_F5, NULL }, - { "\033[17~", NEWT_KEY_F6, NULL }, - { "\033[18~", NEWT_KEY_F7, NULL }, - { "\033[19~", NEWT_KEY_F8, NULL }, - { "\033[20~", NEWT_KEY_F9, NULL }, - { "\033[21~", NEWT_KEY_F10, NULL }, - { "\033[23~", NEWT_KEY_F11, NULL }, - { "\033[24~", NEWT_KEY_F12, NULL }, - - { NULL, 0, NULL }, /* LEAVE this one */ -}; -static char keyPrefix = '\033'; - -static const char * version = "Newt windowing library version " VERSION - " - (C) 1996-2000 Red Hat Software. " - "Redistributable under the term of the Library " - "GNU Public License. " - "Written by Erik Troan\n"; - -static newtSuspendCallback suspendCallback = NULL; -static void * suspendCallbackData = NULL; - -void newtSetSuspendCallback(newtSuspendCallback cb, void * data) { - suspendCallback = cb; - suspendCallbackData = data; -} - -static void handleSigwinch(int signum) { - needResize = 1; -} - -static int getkeyInterruptHook(void) { - return -1; -} - -void newtFlushInput(void) { - while (SLang_input_pending(0)) { - SLang_getkey(); - } -} - -void newtRefresh(void) { - SLsmg_refresh(); -} - -void newtSuspend(void) { - SLtt_set_cursor_visibility (1); - SLsmg_suspend_smg(); - SLang_reset_tty(); - SLtt_set_cursor_visibility (cursorOn); -} - -void newtResume(void) { - SLsmg_resume_smg (); - SLsmg_refresh(); - SLang_init_tty(0, 0, 0); -} - -void newtCls(void) { - SLsmg_set_color(NEWT_COLORSET_ROOT); - SLsmg_gotorc(0, 0); - SLsmg_erase_eos(); - - newtRefresh(); -} - -#if defined(THIS_DOESNT_WORK) -void newtResizeScreen(int redraw) { - newtPushHelpLine(""); - - SLtt_get_screen_size(); - SLang_init_tty(0, 0, 0); - - SLsmg_touch_lines (0, SLtt_Screen_Rows - 1); - - /* I don't know why I need this */ - SLsmg_refresh(); - - newtPopHelpLine(); - - if (redraw) - SLsmg_refresh(); -} -#endif - -int newtInit(void) { - char * MonoValue, * MonoEnv = "NEWT_MONO"; - - /* use the version variable just to be sure it gets included */ - strlen(version); - - SLtt_get_terminfo(); - SLtt_get_screen_size(); - - MonoValue = getenv(MonoEnv); - if ( MonoValue == NULL ) { - SLtt_Use_Ansi_Colors = 1; - } else { - SLtt_Use_Ansi_Colors = 0; - } - - SLsmg_init_smg(); - SLang_init_tty(0, 0, 0); - - newtSetColors(newtDefaultColorPalette); - newtCursorOff(); - /*initKeymap();*/ - - /*memset(&sa, 0, sizeof(sa)); - sa.sa_handler = handleSigwinch; - sigaction(SIGWINCH, &sa, NULL);*/ - - SLsignal_intr(SIGWINCH, handleSigwinch); - SLang_getkey_intr_hook = getkeyInterruptHook; - - - - return 0; -} - -int newtFinished(void) { - SLsmg_gotorc(SLtt_Screen_Rows - 1, 0); - newtCursorOn(); - SLsmg_refresh(); - SLsmg_reset_smg(); - SLang_reset_tty(); - - return 0; -} - -void newtSetColors(struct newtColors colors) { - SLtt_set_color(NEWT_COLORSET_ROOT, "", colors.rootFg, colors.rootBg); - SLtt_set_color(NEWT_COLORSET_BORDER, "", colors.borderFg, colors.borderBg); - SLtt_set_color(NEWT_COLORSET_WINDOW, "", colors.windowFg, colors.windowBg); - SLtt_set_color(NEWT_COLORSET_SHADOW, "", colors.shadowFg, colors.shadowBg); - SLtt_set_color(NEWT_COLORSET_TITLE, "", colors.titleFg, colors.titleBg); - SLtt_set_color(NEWT_COLORSET_BUTTON, "", colors.buttonFg, colors.buttonBg); - SLtt_set_color(NEWT_COLORSET_ACTBUTTON, "", colors.actButtonFg, - colors.actButtonBg); - SLtt_set_color(NEWT_COLORSET_CHECKBOX, "", colors.checkboxFg, - colors.checkboxBg); - SLtt_set_color(NEWT_COLORSET_ACTCHECKBOX, "", colors.actCheckboxFg, - colors.actCheckboxBg); - SLtt_set_color(NEWT_COLORSET_ENTRY, "", colors.entryFg, colors.entryBg); - SLtt_set_color(NEWT_COLORSET_LABEL, "", colors.labelFg, colors.labelBg); - SLtt_set_color(NEWT_COLORSET_LISTBOX, "", colors.listboxFg, - colors.listboxBg); - SLtt_set_color(NEWT_COLORSET_ACTLISTBOX, "", colors.actListboxFg, - colors.actListboxBg); - SLtt_set_color(NEWT_COLORSET_TEXTBOX, "", colors.textboxFg, - colors.textboxBg); - SLtt_set_color(NEWT_COLORSET_ACTTEXTBOX, "", colors.actTextboxFg, - colors.actTextboxBg); - SLtt_set_color(NEWT_COLORSET_HELPLINE, "", colors.helpLineFg, - colors.helpLineBg); - SLtt_set_color(NEWT_COLORSET_ROOTTEXT, "", colors.rootTextFg, - colors.rootTextBg); - - SLtt_set_color(NEWT_COLORSET_EMPTYSCALE, "", "black", - colors.emptyScale); - SLtt_set_color(NEWT_COLORSET_FULLSCALE, "", "black", - colors.fullScale); - SLtt_set_color(NEWT_COLORSET_DISENTRY, "", colors.disabledEntryFg, - colors.disabledEntryBg); - - SLtt_set_color(NEWT_COLORSET_COMPACTBUTTON, "", colors.compactButtonFg, - colors.compactButtonBg); - - SLtt_set_color(NEWT_COLORSET_ACTSELLISTBOX, "", colors.actSelListboxFg, - colors.actSelListboxBg); - SLtt_set_color(NEWT_COLORSET_SELLISTBOX, "", colors.selListboxFg, - colors.selListboxBg); -} - -int newtGetKey(void) { - int key; - char buf[10], * chptr = buf; - const struct keymap * curr; - - do { - key = SLang_getkey(); - if (key == 0xFFFF) { - if (needResize) - return NEWT_KEY_RESIZE; - - /* ignore other signals */ - continue; - } - - if (key == NEWT_KEY_SUSPEND && suspendCallback) - suspendCallback(suspendCallbackData); - } while (key == NEWT_KEY_SUSPEND); - - switch (key) { - case 'v' | 0x80: - case 'V' | 0x80: - return NEWT_KEY_PGUP; - - case 22: - return NEWT_KEY_PGDN; - - return NEWT_KEY_BKSPC; - case 0x7f: - return NEWT_KEY_BKSPC; - - case 0x08: - return NEWT_KEY_BKSPC; - - default: - if (key != keyPrefix) return key; - } - - memset(buf, 0, sizeof(buf)); - - *chptr++ = key; - while (SLang_input_pending(5)) { - key = SLang_getkey(); - if (key == keyPrefix) { - /* he hit unknown keys too many times -- start over */ - memset(buf, 0, sizeof(buf)); - chptr = buf; - } - - *chptr++ = key; - - /* this search should use bsearch(), but when we only look through - a list of 20 (or so) keymappings, it's probably faster just to - do a inline linear search */ - - for (curr = keymap; curr->code; curr++) { - if (curr->str) { - if (!strcmp(curr->str, buf)) - return curr->code; - } - } - } - - for (curr = keymap; curr->code; curr++) { - if (curr->str) { - if (!strcmp(curr->str, buf)) - return curr->code; - } - } - - /* Looks like we were a bit overzealous in reading characters. Return - just the first character, and put everything else back in the buffer - for later */ - - chptr--; - while (chptr > buf) - SLang_ungetkey(*chptr--); - - return *chptr; -} - -void newtWaitForKey(void) { - newtRefresh(); - - SLang_getkey(); - newtClearKeyBuffer(); -} - -void newtClearKeyBuffer(void) { - while (SLang_input_pending(1)) { - SLang_getkey(); - } -} - -int newtOpenWindow(int left, int top, int width, int height, - const char * title) { - int j, row, col; - int n; - int i; - - newtFlushInput(); - - if (!currentWindow) { - currentWindow = windowStack; - } else { - currentWindow++; - } - - currentWindow->left = left; - currentWindow->top = top; - currentWindow->width = width; - currentWindow->height = height; - currentWindow->title = title ? strdup(title) : NULL; - - currentWindow->buffer = malloc(sizeof(short) * (width + 3) * (height + 3)); - - row = top - 1; - col = left - 1; - n = 0; - for (j = 0; j < height + 3; j++, row++) { - SLsmg_gotorc(row, col); - SLsmg_read_raw(currentWindow->buffer + n, - currentWindow->width + 3); - n += currentWindow->width + 3; - } - - SLsmg_set_color(NEWT_COLORSET_BORDER); - SLsmg_draw_box(top - 1, left - 1, height + 2, width + 2); - - if (currentWindow->title) { - i = strlen(currentWindow->title) + 4; - i = ((width - i) / 2) + left; - SLsmg_gotorc(top - 1, i); - SLsmg_set_char_set(1); - SLsmg_write_char(SLSMG_RTEE_CHAR); - SLsmg_set_char_set(0); - SLsmg_write_char(' '); - SLsmg_set_color(NEWT_COLORSET_TITLE); - SLsmg_write_string((char *)currentWindow->title); - SLsmg_set_color(NEWT_COLORSET_BORDER); - SLsmg_write_char(' '); - SLsmg_set_char_set(1); - SLsmg_write_char(SLSMG_LTEE_CHAR); - SLsmg_set_char_set(0); - } - - SLsmg_set_color(NEWT_COLORSET_WINDOW); - SLsmg_fill_region(top, left, height, width, ' '); - - SLsmg_set_color(NEWT_COLORSET_SHADOW); - SLsmg_fill_region(top + height + 1, left, 1, width + 2, ' '); - SLsmg_fill_region(top, left + width + 1, height + 1, 1, ' '); - - for (i = top; i < (top + height + 1); i++) { - SLsmg_gotorc(i, left + width + 1); - SLsmg_write_string(" "); - } - - return 0; -} - -int newtCenteredWindow(int width, int height, const char * title) { - int top, left; - - top = (SLtt_Screen_Rows - height) / 2; - - /* I don't know why, but this seems to look better */ - if ((SLtt_Screen_Rows % 2) && (top % 2)) top--; - - left = (SLtt_Screen_Cols - width) / 2; - - newtOpenWindow(left, top, width, height, title); - - return 0; -} - -void newtPopWindow(void) { - int j, row, col; - int n = 0; - - row = col = 0; - - row = currentWindow->top - 1; - col = currentWindow->left - 1; - for (j = 0; j < currentWindow->height + 3; j++, row++) { - SLsmg_gotorc(row, col); - SLsmg_write_raw(currentWindow->buffer + n, - currentWindow->width + 3); - n += currentWindow->width + 3; - } - - free(currentWindow->buffer); - free(currentWindow->title); - - if (currentWindow == windowStack) - currentWindow = NULL; - else - currentWindow--; - - SLsmg_set_char_set(0); - - newtRefresh(); -} - -void newtGetWindowPos(int * x, int * y) { - if (currentWindow) { - *x = currentWindow->left; - *y = currentWindow->top; - } else - *x = *y = 0; -} - -void newtGetrc(int * row, int * col) { - *row = cursorRow; - *col = cursorCol; -} - -void newtGotorc(int newRow, int newCol) { - if (currentWindow) { - newRow += currentWindow->top; - newCol += currentWindow->left; - } - - cursorRow = newRow; - cursorCol = newCol; - SLsmg_gotorc(cursorRow, cursorCol); -} - -void newtDrawBox(int left, int top, int width, int height, int shadow) { - if (currentWindow) { - top += currentWindow->top; - left += currentWindow->left; - } - - SLsmg_draw_box(top, left, height, width); - - if (shadow) { - SLsmg_set_color(NEWT_COLORSET_SHADOW); - SLsmg_fill_region(top + height, left + 1, 1, width - 1, ' '); - SLsmg_fill_region(top + 1, left + width, height, 1, ' '); - } -} - -void newtClearBox(int left, int top, int width, int height) { - if (currentWindow) { - top += currentWindow->top; - left += currentWindow->left; - } - - SLsmg_fill_region(top, left, height, width, ' '); -} - -#if 0 -/* This doesn't seem to work quite right. I don't know why not, but when - I rsh from an rxvt into a box and run this code, the machine returns - console key's (\033[B) rather then xterm ones (\033OB). */ -static void initKeymap(void) { - struct keymap * curr; - - for (curr = keymap; curr->code; curr++) { - if (!curr->str) - curr->str = SLtt_tgetstr(curr->tc); - } - - /* Newt's keymap handling is a bit broken. It assumes that any extended - keystrokes begin with ESC. If you're using a homebrek terminal you - will probably need to fix this, or just yell at me and I'll be so - ashamed of myself for doing it this way I'll fix it */ - - keyPrefix = 0x1b; /* ESC */ -} -#endif - -void newtDelay(int usecs) { - fd_set set; - struct timeval tv; - - FD_ZERO(&set); - - tv.tv_sec = usecs / 1000000; - tv.tv_usec = usecs % 1000000; - - select(0, &set, &set, &set, &tv); -} - -struct eventResult newtDefaultEventHandler(newtComponent c, - struct event ev) { - struct eventResult er; - - er.result = ER_IGNORED; - return er; -} - -void newtRedrawHelpLine(void) { - char * buf; - - SLsmg_set_color(NEWT_COLORSET_HELPLINE); - - buf = alloca(SLtt_Screen_Cols + 1); - memset(buf, ' ', SLtt_Screen_Cols); - buf[SLtt_Screen_Cols] = '\0'; - - if (currentHelpline) - memcpy(buf, *currentHelpline, strlen(*currentHelpline)); - - SLsmg_gotorc(SLtt_Screen_Rows - 1, 0); - SLsmg_write_string(buf); -} - -void newtPushHelpLine(const char * text) { - if (!text) - text = defaultHelpLine; - - if (currentHelpline) - (*(++currentHelpline)) = strdup(text); - else { - currentHelpline = helplineStack; - *currentHelpline = strdup(text); - } - - newtRedrawHelpLine(); -} - -void newtPopHelpLine(void) { - if (!currentHelpline) return; - - free(*currentHelpline); - if (currentHelpline == helplineStack) - currentHelpline = NULL; - else - currentHelpline--; - - newtRedrawHelpLine(); -} - -void newtDrawRootText(int col, int row, const char * text) { - SLsmg_set_color(NEWT_COLORSET_ROOTTEXT); - - if (col < 0) { - col = SLtt_Screen_Cols + col; - } - - if (row < 0) { - row = SLtt_Screen_Rows + row; - } - - SLsmg_gotorc(row, col); - SLsmg_write_string((char *)text); -} - -int newtSetFlags(int oldFlags, int newFlags, enum newtFlagsSense sense) { - switch (sense) { - case NEWT_FLAGS_SET: - return oldFlags | newFlags; - - case NEWT_FLAGS_RESET: - return oldFlags & (~newFlags); - - case NEWT_FLAGS_TOGGLE: - return oldFlags ^ newFlags; - - default: - return oldFlags; - } -} - -void newtBell(void) -{ - SLtt_beep(); -} - -void newtGetScreenSize(int * cols, int * rows) { - if (rows) *rows = SLtt_Screen_Rows; - if (cols) *cols = SLtt_Screen_Cols; -} - -void newtDefaultPlaceHandler(newtComponent c, int newLeft, int newTop) { - c->left = newLeft; - c->top = newTop; -} - -void newtDefaultMappedHandler(newtComponent c, int isMapped) { - c->isMapped = isMapped; -} - -void newtCursorOff(void) { - cursorOn = 0; - SLtt_set_cursor_visibility (cursorOn); -} - -void newtCursorOn(void) { - cursorOn = 1; - SLtt_set_cursor_visibility (cursorOn); -} diff --git a/mdk-stage1/newt/newt.h b/mdk-stage1/newt/newt.h deleted file mode 100644 index d3fd8bedc..000000000 --- a/mdk-stage1/newt/newt.h +++ /dev/null @@ -1,362 +0,0 @@ -#ifndef H_NEWT -#define H_NEWT - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -#define NEWT_COLORSET_ROOT 2 -#define NEWT_COLORSET_BORDER 3 -#define NEWT_COLORSET_WINDOW 4 -#define NEWT_COLORSET_SHADOW 5 -#define NEWT_COLORSET_TITLE 6 -#define NEWT_COLORSET_BUTTON 7 -#define NEWT_COLORSET_ACTBUTTON 8 -#define NEWT_COLORSET_CHECKBOX 9 -#define NEWT_COLORSET_ACTCHECKBOX 10 -#define NEWT_COLORSET_ENTRY 11 -#define NEWT_COLORSET_LABEL 12 -#define NEWT_COLORSET_LISTBOX 13 -#define NEWT_COLORSET_ACTLISTBOX 14 -#define NEWT_COLORSET_TEXTBOX 15 -#define NEWT_COLORSET_ACTTEXTBOX 16 -#define NEWT_COLORSET_HELPLINE 17 -#define NEWT_COLORSET_ROOTTEXT 18 -#define NEWT_COLORSET_EMPTYSCALE 19 -#define NEWT_COLORSET_FULLSCALE 20 -#define NEWT_COLORSET_DISENTRY 21 -#define NEWT_COLORSET_COMPACTBUTTON 22 -#define NEWT_COLORSET_ACTSELLISTBOX 23 -#define NEWT_COLORSET_SELLISTBOX 24 - -#define NEWT_ARG_LAST -100000 -#define NEWT_ARG_APPEND -1 - -struct newtColors { - char * rootFg, * rootBg; - char * borderFg, * borderBg; - char * windowFg, * windowBg; - char * shadowFg, * shadowBg; - char * titleFg, * titleBg; - char * buttonFg, * buttonBg; - char * actButtonFg, * actButtonBg; - char * checkboxFg, * checkboxBg; - char * actCheckboxFg, * actCheckboxBg; - char * entryFg, * entryBg; - char * labelFg, * labelBg; - char * listboxFg, * listboxBg; - char * actListboxFg, * actListboxBg; - char * textboxFg, * textboxBg; - char * actTextboxFg, * actTextboxBg; - char * helpLineFg, * helpLineBg; - char * rootTextFg, * rootTextBg; - char * emptyScale, * fullScale; - char * disabledEntryFg, * disabledEntryBg; - char * compactButtonFg, * compactButtonBg; - char * actSelListboxFg, * actSelListboxBg; - char * selListboxFg, * selListboxBg; -}; - -enum newtFlagsSense { NEWT_FLAGS_SET, NEWT_FLAGS_RESET, NEWT_FLAGS_TOGGLE }; - -#define NEWT_FLAG_RETURNEXIT (1 << 0) -#define NEWT_FLAG_HIDDEN (1 << 1) -#define NEWT_FLAG_SCROLL (1 << 2) -#define NEWT_FLAG_DISABLED (1 << 3) -/* OBSOLETE #define NEWT_FLAG_NOSCROLL (1 << 4) for listboxes */ -#define NEWT_FLAG_BORDER (1 << 5) -#define NEWT_FLAG_WRAP (1 << 6) -#define NEWT_FLAG_NOF12 (1 << 7) -#define NEWT_FLAG_MULTIPLE (1 << 8) -#define NEWT_FLAG_SELECTED (1 << 9) -#define NEWT_FLAG_CHECKBOX (1 << 10) -#define NEWT_FLAG_PASSWORD (1 << 11) /* draw '*' of chars in entrybox */ -#define NEWT_FD_READ (1 << 0) -#define NEWT_FD_WRITE (1 << 1) - -#define NEWT_CHECKBOXTREE_COLLAPSED '\0' -#define NEWT_CHECKBOXTREE_EXPANDED '\1' -#define NEWT_CHECKBOXTREE_UNSELECTED ' ' -#define NEWT_CHECKBOXTREE_SELECTED '*' - -/* Backwards compatibility */ -#define NEWT_LISTBOX_RETURNEXIT NEWT_FLAG_RETURNEXIT -#define NEWT_ENTRY_SCROLL NEWT_FLAG_SCROLL -#define NEWT_ENTRY_HIDDEN NEWT_FLAG_HIDDEN -#define NEWT_ENTRY_RETURNEXIT NEWT_FLAG_RETURNEXIT -#define NEWT_ENTRY_DISABLED NEWT_FLAG_DISABLED - -#define NEWT_TEXTBOX_WRAP NEWT_FLAG_WRAP -#define NEWT_TEXTBOX_SCROLL NEWT_FLAG_SCROLL -#define NEWT_FORM_NOF12 NEWT_FLAG_NOF12 - -#define newtListboxAddEntry newtListboxAppendEntry - - -typedef struct newtComponent_struct * newtComponent; - -extern const struct newtColors newtDefaultColorPalette; - -typedef void (*newtCallback)(newtComponent, void *); -typedef void (*newtSuspendCallback)(void * data); - -int newtInit(void); -int newtFinished(void); -void newtCls(void); -void newtResizeScreen(int redraw); -void newtWaitForKey(void); -void newtClearKeyBuffer(void); -void newtDelay(int usecs); -/* top, left are *not* counting the border */ -int newtOpenWindow(int left, int top, int width, int height, - const char * title); -int newtCenteredWindow(int width, int height, const char * title); -void newtPopWindow(void); -void newtSetColors(struct newtColors colors); -void newtRefresh(void); -void newtSuspend(void); -void newtSetSuspendCallback(newtSuspendCallback cb, void * data); -void newtSetHelpCallback(newtCallback cb); -void newtResume(void); -void newtPushHelpLine(const char * text); -void newtRedrawHelpLine(void); -void newtPopHelpLine(void); -void newtDrawRootText(int col, int row, const char * text); -void newtBell(void); -void newtCursorOff(void); -void newtCursorOn(void); - -/* Components */ - -newtComponent newtCompactButton(int left, int top, const char * text); -newtComponent newtButton(int left, int top, const char * text); -newtComponent newtCheckbox(int left, int top, const char * text, char defValue, - const char * seq, char * result); -char newtCheckboxGetValue(newtComponent co); -void newtCheckboxSetValue(newtComponent co, char value); -void newtCheckboxSetFlags(newtComponent co, int flags, enum newtFlagsSense sense); - - -newtComponent newtRadiobutton(int left, int top, const char * text, int isDefault, - newtComponent prevButton); -newtComponent newtRadioGetCurrent(newtComponent setMember); -newtComponent newtListitem(int left, int top, const char * text, int isDefault, - newtComponent prevItem, const void * data, int flags); -void newtListitemSet(newtComponent co, const char * text); -void * newtListitemGetData(newtComponent co); -void newtGetScreenSize(int * cols, int * rows); - -newtComponent newtLabel(int left, int top, const char * text); -void newtLabelSetText(newtComponent co, const char * text); -newtComponent newtVerticalScrollbar(int left, int top, int height, - int normalColorset, int thumbColorset); -void newtScrollbarSet(newtComponent co, int where, int total); - -newtComponent newtListbox(int left, int top, int height, int flags); -void * newtListboxGetCurrent(newtComponent co); -void newtListboxSetCurrent(newtComponent co, int num); -void newtListboxSetCurrentByKey(newtComponent co, void * key); -void newtListboxSetEntry(newtComponent co, int num, const char * text); -void newtListboxSetWidth(newtComponent co, int width); -void newtListboxSetData(newtComponent co, int num, void * data); -int newtListboxAppendEntry(newtComponent co, const char * text, - const void * data); -/* Send the key to insert after, or NULL to insert at the top */ -int newtListboxInsertEntry(newtComponent co, const char * text, const void * data, void * key); -int newtListboxDeleteEntry(newtComponent co, void * data); -void newtListboxClear(newtComponent co); /* removes all entries from listbox */ -void newtListboxGetEntry(newtComponent co, int num, char **text, void **data); -/* Returns an array of data pointers from items, last element is NULL */ -void **newtListboxGetSelection(newtComponent co, int *numitems); -void newtListboxClearSelection(newtComponent co); -void newtListboxSelectItem(newtComponent co, const void * key, - enum newtFlagsSense sense); - -newtComponent newtCheckboxTree(int left, int top, int height, int flags); -newtComponent newtCheckboxTreeMulti(int left, int top, int height, char *seq, int flags); -const void ** newtCheckboxTreeGetSelection(newtComponent co, int *numitems); -const void * newtCheckboxTreeGetCurrent(newtComponent co); -const void ** newtCheckboxTreeGetMultiSelection(newtComponent co, int *numitems, char seqnum); -/* last item is NEWT_ARG_LAST for all of these */ -int newtCheckboxTreeAddItem(newtComponent co, - const char * text, const void * data, - int flags, int index, ...); -int newtCheckboxTreeAddArray(newtComponent co, - const char * text, const void * data, - int flags, int * indexes); -int * newtCheckboxTreeFindItem(newtComponent co, void * data); -void newtCheckboxTreeSetEntry(newtComponent co, const void * data, - const char * text); -char newtCheckboxTreeGetEntryValue(newtComponent co, const void * data); -void newtCheckboxTreeSetEntryValue(newtComponent co, const void * data, - char value); - -newtComponent newtTextboxReflowed(int left, int top, char * text, int width, - int flexDown, int flexUp, int flags); -newtComponent newtTextbox(int left, int top, int width, int height, int flags); -void newtTextboxSetText(newtComponent co, const char * text); -void newtTextboxSetHeight(newtComponent co, int height); -int newtTextboxGetNumLines(newtComponent co); -char * newtReflowText(char * text, int width, int flexDown, int flexUp, - int * actualWidth, int * actualHeight); - -struct newtExitStruct { - enum { NEWT_EXIT_HOTKEY, NEWT_EXIT_COMPONENT, NEWT_EXIT_FDREADY, - NEWT_EXIT_TIMER } reason; - union { - int key; - newtComponent co; - } u; -} ; - -newtComponent newtForm(newtComponent vertBar, void * helpTag, int flags); -void newtFormSetTimer(newtComponent form, int millisecs); -void newtFormWatchFd(newtComponent form, int fd, int fdFlags); -void newtFormSetSize(newtComponent co); -newtComponent newtFormGetCurrent(newtComponent co); -void newtFormSetBackground(newtComponent co, int color); -void newtFormSetCurrent(newtComponent co, newtComponent subco); -void newtFormAddComponent(newtComponent form, newtComponent co); -void newtFormAddComponents(newtComponent form, ...); -void newtFormSetHeight(newtComponent co, int height); -void newtFormSetWidth(newtComponent co, int width); -newtComponent newtRunForm(newtComponent form); /* obsolete */ -void newtFormRun(newtComponent co, struct newtExitStruct * es); -void newtDrawForm(newtComponent form); -void newtFormAddHotKey(newtComponent co, int key); - -typedef int (*newtEntryFilter)(newtComponent entry, void * data, int ch, - int cursor); -newtComponent newtEntry(int left, int top, const char * initialValue, int width, - char ** resultPtr, int flags); -void newtEntrySet(newtComponent co, const char * value, int cursorAtEnd); -void newtEntrySetFilter(newtComponent co, newtEntryFilter filter, void * data); -char * newtEntryGetValue(newtComponent co); -void newtEntrySetFlags(newtComponent co, int flags, enum newtFlagsSense sense); - -newtComponent newtScale(int left, int top, int width, int fullValue); -void newtScaleSet(newtComponent co, unsigned int amount); - -void newtComponentAddCallback(newtComponent co, newtCallback f, void * data); -void newtComponentTakesFocus(newtComponent co, int val); - -/* this also destroys all of the components (including other forms) on the - form */ -void newtFormDestroy(newtComponent form); - -/* Key codes */ - -#define NEWT_KEY_TAB '\t' -#define NEWT_KEY_ENTER '\r' -#define NEWT_KEY_SUSPEND '\032' /* ctrl - z*/ -#define NEWT_KEY_RETURN NEWT_KEY_ENTER - -#define NEWT_KEY_EXTRA_BASE 0x8000 -#define NEWT_KEY_UP NEWT_KEY_EXTRA_BASE + 1 -#define NEWT_KEY_DOWN NEWT_KEY_EXTRA_BASE + 2 -#define NEWT_KEY_LEFT NEWT_KEY_EXTRA_BASE + 4 -#define NEWT_KEY_RIGHT NEWT_KEY_EXTRA_BASE + 5 -#define NEWT_KEY_BKSPC NEWT_KEY_EXTRA_BASE + 6 -#define NEWT_KEY_DELETE NEWT_KEY_EXTRA_BASE + 7 -#define NEWT_KEY_HOME NEWT_KEY_EXTRA_BASE + 8 -#define NEWT_KEY_END NEWT_KEY_EXTRA_BASE + 9 -#define NEWT_KEY_UNTAB NEWT_KEY_EXTRA_BASE + 10 -#define NEWT_KEY_PGUP NEWT_KEY_EXTRA_BASE + 11 -#define NEWT_KEY_PGDN NEWT_KEY_EXTRA_BASE + 12 -#define NEWT_KEY_INSERT NEWT_KEY_EXTRA_BASE + 13 - -#define NEWT_KEY_F1 NEWT_KEY_EXTRA_BASE + 101 -#define NEWT_KEY_F2 NEWT_KEY_EXTRA_BASE + 102 -#define NEWT_KEY_F3 NEWT_KEY_EXTRA_BASE + 103 -#define NEWT_KEY_F4 NEWT_KEY_EXTRA_BASE + 104 -#define NEWT_KEY_F5 NEWT_KEY_EXTRA_BASE + 105 -#define NEWT_KEY_F6 NEWT_KEY_EXTRA_BASE + 106 -#define NEWT_KEY_F7 NEWT_KEY_EXTRA_BASE + 107 -#define NEWT_KEY_F8 NEWT_KEY_EXTRA_BASE + 108 -#define NEWT_KEY_F9 NEWT_KEY_EXTRA_BASE + 109 -#define NEWT_KEY_F10 NEWT_KEY_EXTRA_BASE + 110 -#define NEWT_KEY_F11 NEWT_KEY_EXTRA_BASE + 111 -#define NEWT_KEY_F12 NEWT_KEY_EXTRA_BASE + 112 - -/* not really a key, but newtGetKey returns it */ -#define NEWT_KEY_RESIZE NEWT_KEY_EXTRA_BASE + 113 - -#define NEWT_ANCHOR_LEFT (1 << 0) -#define NEWT_ANCHOR_RIGHT (1 << 1) -#define NEWT_ANCHOR_TOP (1 << 2) -#define NEWT_ANCHOR_BOTTOM (1 << 3) - -#define NEWT_GRID_FLAG_GROWX (1 << 0) -#define NEWT_GRID_FLAG_GROWY (1 << 1) - -typedef struct grid_s * newtGrid; -enum newtGridElement { NEWT_GRID_EMPTY = 0, - NEWT_GRID_COMPONENT, NEWT_GRID_SUBGRID }; - -newtGrid newtCreateGrid(int cols, int rows); -/* TYPE, what, TYPE, what, ..., NULL */ -newtGrid newtGridVStacked(enum newtGridElement type, void * what, ...); -newtGrid newtGridVCloseStacked(enum newtGridElement type, void * what, ...); -newtGrid newtGridHStacked(enum newtGridElement type1, void * what1, ...); -newtGrid newtGridHCloseStacked(enum newtGridElement type1, void * what1, ...); -newtGrid newtGridBasicWindow(newtComponent text, newtGrid middle, - newtGrid buttons); -newtGrid newtGridSimpleWindow(newtComponent text, newtComponent middle, - newtGrid buttons); -void newtGridSetField(newtGrid grid, int col, int row, - enum newtGridElement type, void * val, int padLeft, - int padTop, int padRight, int padBottom, int anchor, - int flags); -void newtGridPlace(newtGrid grid, int left, int top); -#define newtGridDestroy newtGridFree -void newtGridFree(newtGrid grid, int recurse); -void newtGridGetSize(newtGrid grid, int * width, int * height); -void newtGridWrappedWindow(newtGrid grid, char * title); -void newtGridWrappedWindowAt(newtGrid grid, char * title, int left, int top); -void newtGridAddComponentsToForm(newtGrid grid, newtComponent form, - int recurse); - -/* convienve */ -newtGrid newtButtonBarv(char * button1, newtComponent * b1comp, va_list args); -newtGrid newtButtonBar(char * button1, newtComponent * b1comp, ...); - -/* automatically centered and shrink wrapped */ -void newtWinMessage(char * title, char * buttonText, char * text, ...); -void newtWinMessagev(char * title, char * buttonText, char * text, - va_list argv); - -/* having separate calls for these two seems silly, but having two separate - variable length-arg lists seems like a bad idea as well */ - -/* Returns 0 if F12 was pressed, 1 for button1, 2 for button2 */ -int newtWinChoice(char * title, char * button1, char * button2, - char * text, ...); -/* Returns 0 if F12 was pressed, 1 for button1, 2 for button2, - 3 for button3 */ -int newtWinTernary(char * title, char * button1, char * button2, - char * button3, char * message, ...); - -/* Returns the button number pressed, 0 on F12 */ -int newtWinMenu(char * title, char * text, int suggestedWidth, int flexDown, - int flexUp, int maxListHeight, char ** items, int * listItem, - char * button1, ...); - -struct newtWinEntry { - char * text; - char ** value; /* may be initialized to set default */ - int flags; -}; - -/* Returns the button number pressed, 0 on F12. The final values are - dynamically allocated, and need to be freed. */ -int newtWinEntries(char * title, char * text, int suggestedWidth, int flexDown, - int flexUp, int dataWidth, - struct newtWinEntry * items, char * button1, ...); - -#ifdef __cplusplus -} /* End of extern "C" { */ -#endif - -#endif /* H_NEWT */ diff --git a/mdk-stage1/newt/newt_pr.h b/mdk-stage1/newt/newt_pr.h deleted file mode 100644 index 76f5e2f6f..000000000 --- a/mdk-stage1/newt/newt_pr.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef H_NEWT_PR -#define H_NEWT_PR - -#define COLORSET_ROOT NEWT_COLORSET_ROOT -#define COLORSET_BORDER NEWT_COLORSET_BORDER -#define COLORSET_WINDOW NEWT_COLORSET_WINDOW -#define COLORSET_SHADOW NEWT_COLORSET_SHADOW -#define COLORSET_TITLE NEWT_COLORSET_TITLE -#define COLORSET_BUTTON NEWT_COLORSET_BUTTON -#define COLORSET_ACTBUTTON NEWT_COLORSET_ACTBUTTON -#define COLORSET_CHECKBOX NEWT_COLORSET_CHECKBOX -#define COLORSET_ACTCHECKBOX NEWT_COLORSET_ACTCHECKBOX -#define COLORSET_ENTRY NEWT_COLORSET_ENTRY -#define COLORSET_LABEL NEWT_COLORSET_LABEL -#define COLORSET_LISTBOX NEWT_COLORSET_LISTBOX -#define COLORSET_ACTLISTBOX NEWT_COLORSET_ACTLISTBOX -#define COLORSET_TEXTBOX NEWT_COLORSET_TEXTBOX -#define COLORSET_ACTTEXTBOX NEWT_COLORSET_ACTTEXTBOX - -int newtSetFlags(int oldFlags, int newFlags, enum newtFlagsSense sense); - -void newtGotorc(int row, int col); -void newtGetrc(int * row, int * col); -void newtGetWindowPos(int * x, int * y); -void newtDrawBox(int left, int top, int width, int height, int shadow); -void newtClearBox(int left, int top, int width, int height); - -int newtGetKey(void); - -struct newtComponent_struct { - /* common data */ - int height, width; - int top, left; - int takesFocus; - int isMapped; - - struct componentOps * ops; - - newtCallback callback; - void * callbackData; - - void * data; -} ; - -enum eventResultTypes { ER_IGNORED, ER_SWALLOWED, ER_EXITFORM, ER_SETFOCUS, - ER_NEXTCOMP }; -struct eventResult { - enum eventResultTypes result; - union { - newtComponent focus; - } u; -}; - -enum eventTypes { EV_FOCUS, EV_UNFOCUS, EV_KEYPRESS, EV_MOUSE }; -enum eventSequence { EV_EARLY, EV_NORMAL, EV_LATE }; - -struct event { - enum eventTypes event; - enum eventSequence when; - union { - int key; - struct { - enum { MOUSE_MOTION, MOUSE_BUTTON_DOWN, MOUSE_BUTTON_UP } type; - int x, y; - } mouse; - } u; -} ; - -struct componentOps { - void (* draw)(newtComponent c); - struct eventResult (* event)(newtComponent c, struct event ev); - void (* destroy)(newtComponent c); - void (* place)(newtComponent c, int newLeft, int newTop); - void (* mapped)(newtComponent c, int isMapped); -} ; - -void newtDefaultPlaceHandler(newtComponent c, int newLeft, int newTop); -void newtDefaultMappedHandler(newtComponent c, int isMapped); -struct eventResult newtDefaultEventHandler(newtComponent c, - struct event ev); - -#endif /* H_NEWT_PR */ diff --git a/mdk-stage1/newt/scale.c b/mdk-stage1/newt/scale.c deleted file mode 100644 index 800958580..000000000 --- a/mdk-stage1/newt/scale.c +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -struct scale { - int fullValue; - int charsSet; -}; - -static void scaleDraw(newtComponent co); - -static struct componentOps scaleOps = { - scaleDraw, - newtDefaultEventHandler, - NULL, - newtDefaultPlaceHandler, - newtDefaultMappedHandler, -} ; - -newtComponent newtScale(int left, int top, int width, int fullValue) { - newtComponent co; - struct scale * sc; - - co = malloc(sizeof(*co)); - sc = malloc(sizeof(struct scale)); - co->data = sc; - - co->ops = &scaleOps; - - co->height = 1; - co->width = width; - co->top = top; - co->left = left; - co->takesFocus = 0; - - sc->fullValue = fullValue; - sc->charsSet = 0; - - return co; -} - -void newtScaleSet(newtComponent co, unsigned int amount) { - struct scale * sc = co->data; - int newCharsSet; - - newCharsSet = (amount * co->width) / sc->fullValue; - - if (newCharsSet != sc->charsSet) { - sc->charsSet = newCharsSet; - scaleDraw(co); - } -} - -static void scaleDraw(newtComponent co) { - struct scale * sc = co->data; - int i; - - if (co->top == -1) return; - - newtGotorc(co->top, co->left); - - SLsmg_set_color(NEWT_COLORSET_FULLSCALE); - for (i = 0; i < sc->charsSet; i++) - SLsmg_write_string(" "); - - SLsmg_set_color(NEWT_COLORSET_EMPTYSCALE); - for (i = 0; i < (co->width - sc->charsSet); i++) - SLsmg_write_string(" "); -} diff --git a/mdk-stage1/newt/scrollbar.c b/mdk-stage1/newt/scrollbar.c deleted file mode 100644 index cb4bc2757..000000000 --- a/mdk-stage1/newt/scrollbar.c +++ /dev/null @@ -1,124 +0,0 @@ -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -struct scrollbar { - int curr; - int cs, csThumb; - int arrows; -} ; - -static void sbDraw(newtComponent co); -static void sbDestroy(newtComponent co); -static void sbDrawThumb(newtComponent co, int isOn); - -static struct componentOps sbOps = { - sbDraw, - newtDefaultEventHandler, - sbDestroy, - newtDefaultPlaceHandler, - newtDefaultMappedHandler, -} ; - -void newtScrollbarSet(newtComponent co, int where, int total) { - struct scrollbar * sb = co->data; - int new; - - if (sb->arrows) - new = (where * (co->height - 3)) / (total ? total : 1) + 1; - else - new = (where * (co->height - 1)) / (total ? total : 1); - if (new != sb->curr) { - sbDrawThumb(co, 0); - sb->curr = new; - sbDrawThumb(co, 1); - } -} - -newtComponent newtVerticalScrollbar(int left, int top, int height, - int normalColorset, int thumbColorset) { - newtComponent co; - struct scrollbar * sb; - - co = malloc(sizeof(*co)); - sb = malloc(sizeof(*sb)); - co->data = sb; - - if (!strcmp(getenv("TERM"), "linux") && height >= 2) { - sb->arrows = 1; - sb->curr = 1; - } else { - sb->arrows = 0; - sb->curr = 0; - } - sb->cs = normalColorset; - sb->csThumb = thumbColorset; - - co->ops = &sbOps; - co->isMapped = 0; - co->left = left; - co->top = top; - co->height = height; - co->width = 1; - co->takesFocus = 0; - - return co; -} - -static void sbDraw(newtComponent co) { - struct scrollbar * sb = co->data; - int i; - - if (!co->isMapped) return; - - SLsmg_set_color(sb->cs); - - SLsmg_set_char_set(1); - if (sb->arrows) { - newtGotorc(co->top, co->left); - SLsmg_write_char('\x2d'); - for (i = 1; i < co->height - 1; i++) { - newtGotorc(i + co->top, co->left); - SLsmg_write_char('\x61'); - } - newtGotorc(co->top + co->height - 1, co->left); - SLsmg_write_char('\x2e'); - } else { - for (i = 0; i < co->height; i++) { - newtGotorc(i + co->top, co->left); - SLsmg_write_char('\x61'); - } - } - - SLsmg_set_char_set(0); - - sbDrawThumb(co, 1); -} - -static void sbDrawThumb(newtComponent co, int isOn) { - struct scrollbar * sb = co->data; - char ch = isOn ? '#' : '\x61'; - - if (!co->isMapped) return; - - newtGotorc(sb->curr + co->top, co->left); - SLsmg_set_char_set(1); - - /*if (isOn) - SLsmg_set_color(sb->csThumb); - else*/ - SLsmg_set_color(sb->cs); - - SLsmg_write_char(ch); - SLsmg_set_char_set(0); -} - -static void sbDestroy(newtComponent co) { - struct scrollbar * sb = co->data; - - free(sb); - free(co); -} diff --git a/mdk-stage1/newt/textbox.c b/mdk-stage1/newt/textbox.c deleted file mode 100644 index 2f2880fe2..000000000 --- a/mdk-stage1/newt/textbox.c +++ /dev/null @@ -1,409 +0,0 @@ -#include -#include -#include -#include - -#include "newt.h" -#include "newt_pr.h" - -struct textbox { - char ** lines; - int numLines; - int linesAlloced; - int doWrap; - newtComponent sb; - int topLine; - int textWidth; -}; - -static char * expandTabs(const char * text); -static void textboxDraw(newtComponent co); -static void addLine(newtComponent co, const char * s, int len); -static void doReflow(const char * text, char ** resultPtr, int width, - int * badness, int * heightPtr); -static struct eventResult textboxEvent(newtComponent c, - struct event ev); -static void textboxDestroy(newtComponent co); -static void textboxPlace(newtComponent co, int newLeft, int newTop); -static void textboxMapped(newtComponent co, int isMapped); - -static struct componentOps textboxOps = { - textboxDraw, - textboxEvent, - textboxDestroy, - textboxPlace, - textboxMapped, -} ; - -static void textboxMapped(newtComponent co, int isMapped) { - struct textbox * tb = co->data; - - co->isMapped = isMapped; - if (tb->sb) - tb->sb->ops->mapped(tb->sb, isMapped); -} - -static void textboxPlace(newtComponent co, int newLeft, int newTop) { - struct textbox * tb = co->data; - - co->top = newTop; - co->left = newLeft; - - if (tb->sb) - tb->sb->ops->place(tb->sb, co->left + co->width - 1, co->top); -} - -void newtTextboxSetHeight(newtComponent co, int height) { - co->height = height; -} - -int newtTextboxGetNumLines(newtComponent co) { - struct textbox * tb = co->data; - - return (tb->numLines); -} - -newtComponent newtTextboxReflowed(int left, int top, char * text, int width, - int flexDown, int flexUp, int flags) { - newtComponent co; - char * reflowedText; - int actWidth, actHeight; - - reflowedText = newtReflowText(text, width, flexDown, flexUp, - &actWidth, &actHeight); - - co = newtTextbox(left, top, actWidth, actHeight, NEWT_FLAG_WRAP); - newtTextboxSetText(co, reflowedText); - free(reflowedText); - - return co; -} - -newtComponent newtTextbox(int left, int top, int width, int height, int flags) { - newtComponent co; - struct textbox * tb; - - co = malloc(sizeof(*co)); - tb = malloc(sizeof(*tb)); - co->data = tb; - - co->ops = &textboxOps; - - co->height = height; - co->top = top; - co->left = left; - co->takesFocus = 0; - co->width = width; - - tb->doWrap = flags & NEWT_FLAG_WRAP; - tb->numLines = 0; - tb->linesAlloced = 0; - tb->lines = NULL; - tb->topLine = 0; - tb->textWidth = width; - - if (flags & NEWT_FLAG_SCROLL) { - co->width += 2; - tb->sb = newtVerticalScrollbar(co->left + co->width - 1, co->top, - co->height, COLORSET_TEXTBOX, COLORSET_TEXTBOX); - } else { - tb->sb = NULL; - } - - return co; -} - -static char * expandTabs(const char * text) { - int bufAlloced = strlen(text) + 40; - char * buf, * dest; - const char * src; - int bufUsed = 0; - int linePos = 0; - int i; - - buf = malloc(bufAlloced + 1); - for (src = text, dest = buf; *src; src++) { - if ((bufUsed + 10) > bufAlloced) { - bufAlloced += strlen(text) / 2; - buf = realloc(buf, bufAlloced + 1); - dest = buf + bufUsed; - } - if (*src == '\t') { - i = 8 - (linePos & 8); - memset(dest, ' ', i); - dest += i, bufUsed += i, linePos += i; - } else { - if (*src == '\n') - linePos = 0; - else - linePos++; - - *dest++ = *src; - bufUsed++; - } - } - - *dest = '\0'; - return buf; -} - -#define iseuckanji(c) (0xa1 <= (unsigned char)(c&0xff) && (unsigned char)(c&0xff) <= 0xfe) - -static void doReflow(const char * text, char ** resultPtr, int width, - int * badness, int * heightPtr) { - char * result = NULL; - const char * chptr, * end; - int i; - int howbad = 0; - int height = 0; - int kanji = 0; - - if (resultPtr) { - /* XXX I think this will work */ - result = malloc(strlen(text) + (strlen(text) / width) + 50); - *result = '\0'; - } - - while (*text) { - kanji = 0; - end = strchr(text, '\n'); - if (!end) - end = text + strlen(text); - - while (*text && text < end) { - if (end - text < width) { - if (result) { - strncat(result, text, end - text); - strcat(result, "\n"); - height++; - } - - if (end - text < (width / 2)) - howbad += ((width / 2) - (end - text)) / 2; - text = end; - if (*text) text++; - } else { - chptr = text; - kanji = 0; - for ( i = 0; i < width - 1; i++ ) { - if ( !iseuckanji(*chptr)) { - kanji = 0; - } else if ( kanji == 1 ) { - kanji = 2; - } else { - kanji = 1; - } - chptr++; - } - if (kanji == 0) { - while (chptr > text && !isspace(*chptr)) chptr--; - while (chptr > text && isspace(*chptr)) chptr--; - chptr++; - } - - if (chptr-text == 1 && !isspace(*chptr)) - chptr = text + width - 1; - - if (chptr > text) - howbad += width - (chptr - text) + 1; - if (result) { - if (kanji == 1) { - strncat(result, text, chptr - text + 1); - chptr++; - kanji = 0; - } else { - strncat(result, text, chptr - text); - } - strcat(result, "\n"); - height++; - } - - if (isspace(*chptr)) - text = chptr + 1; - else - text = chptr; - while (isspace(*text)) text++; - } - } - } - -// if (result) printf("result: %s\n", result); - - if (badness) *badness = howbad; - if (resultPtr) *resultPtr = result; - if (heightPtr) *heightPtr = height; -} - -char * newtReflowText(char * text, int width, int flexDown, int flexUp, - int * actualWidth, int * actualHeight) { - int min, max; - int i; - char * result; - int minbad, minbadwidth, howbad; - char * expandedText; - - expandedText = expandTabs(text); - - if (flexDown || flexUp) { - min = width - flexDown; - max = width + flexUp; - - minbad = -1; - minbadwidth = width; - - for (i = min; i <= max; i++) { - doReflow(expandedText, NULL, i, &howbad, NULL); - - if (minbad == -1 || howbad < minbad) { - minbad = howbad; - minbadwidth = i; - } - } - - width = minbadwidth; - } - - doReflow(expandedText, &result, width, NULL, actualHeight); - free(expandedText); - if (actualWidth) *actualWidth = width; - return result; -} - -void newtTextboxSetText(newtComponent co, const char * text) { - const char * start, * end; - struct textbox * tb = co->data; - char * reflowed, * expanded; - int badness, height; - - if (tb->lines) { - free(tb->lines); - tb->linesAlloced = tb->numLines = 0; - } - - expanded = expandTabs(text); - - if (tb->doWrap) { - doReflow(expanded, &reflowed, tb->textWidth, &badness, &height); - free(expanded); - expanded = reflowed; - } - - for (start = expanded; *start; start++) - if (*start == '\n') tb->linesAlloced++; - - /* This ++ leaves room for an ending line w/o a \n */ - tb->linesAlloced++; - tb->lines = malloc(sizeof(char *) * tb->linesAlloced); - - start = expanded; - while ((end = strchr(start, '\n'))) { - addLine(co, start, end - start); - start = end + 1; - } - - if (*start) - addLine(co, start, strlen(start)); - - free(expanded); -} - -/* This assumes the buffer is allocated properly! */ -static void addLine(newtComponent co, const char * s, int len) { - struct textbox * tb = co->data; - - if (len > tb->textWidth) len = tb->textWidth; - - tb->lines[tb->numLines] = malloc(tb->textWidth + 1); - memset(tb->lines[tb->numLines], ' ', tb->textWidth); - memcpy(tb->lines[tb->numLines], s, len); - tb->lines[tb->numLines++][tb->textWidth] = '\0'; -} - -static void textboxDraw(newtComponent c) { - int i; - struct textbox * tb = c->data; - int size; - - if (tb->sb) { - size = tb->numLines - c->height; - newtScrollbarSet(tb->sb, tb->topLine, size ? size : 0); - tb->sb->ops->draw(tb->sb); - } - - SLsmg_set_color(NEWT_COLORSET_TEXTBOX); - - for (i = 0; (i + tb->topLine) < tb->numLines && i < c->height; i++) { - newtGotorc(c->top + i, c->left); - SLsmg_write_string(tb->lines[i + tb->topLine]); - } -} - -static struct eventResult textboxEvent(newtComponent co, - struct event ev) { - struct textbox * tb = co->data; - struct eventResult er; - - er.result = ER_IGNORED; - - if (ev.when == EV_EARLY && ev.event == EV_KEYPRESS && tb->sb) { - switch (ev.u.key) { - case NEWT_KEY_UP: - if (tb->topLine) tb->topLine--; - textboxDraw(co); - er.result = ER_SWALLOWED; - break; - - case NEWT_KEY_DOWN: - if (tb->topLine < (tb->numLines - co->height)) tb->topLine++; - textboxDraw(co); - er.result = ER_SWALLOWED; - break; - - case NEWT_KEY_PGDN: - tb->topLine += co->height; - if (tb->topLine > (tb->numLines - co->height)) { - tb->topLine = tb->numLines - co->height; - if (tb->topLine < 0) tb->topLine = 0; - } - textboxDraw(co); - er.result = ER_SWALLOWED; - break; - - case NEWT_KEY_PGUP: - tb->topLine -= co->height; - if (tb->topLine < 0) tb->topLine = 0; - textboxDraw(co); - er.result = ER_SWALLOWED; - break; - } - } - if (ev.when == EV_EARLY && ev.event == EV_MOUSE && tb->sb) { - /* Top scroll arrow */ - if (ev.u.mouse.x == co->width && ev.u.mouse.y == co->top) { - if (tb->topLine) tb->topLine--; - textboxDraw(co); - - er.result = ER_SWALLOWED; - } - /* Bottom scroll arrow */ - if (ev.u.mouse.x == co->width && - ev.u.mouse.y == co->top + co->height - 1) { - if (tb->topLine < (tb->numLines - co->height)) tb->topLine++; - textboxDraw(co); - - er.result = ER_SWALLOWED; - } - } - return er; -} - -static void textboxDestroy(newtComponent co) { - int i; - struct textbox * tb = co->data; - - for (i = 0; i < tb->numLines; i++) - free(tb->lines[i]); - free(tb->lines); - free(tb); - free(co); -} diff --git a/mdk-stage1/newt/windows.c b/mdk-stage1/newt/windows.c deleted file mode 100644 index 30a8d526c..000000000 --- a/mdk-stage1/newt/windows.c +++ /dev/null @@ -1,275 +0,0 @@ -#include -#include -#include -#include -#include - -#include "errno.h" -#include "newt.h" - -static void * newtvwindow(char * title, char * button1, char * button2, - char * button3, char * message, va_list args) { - newtComponent b1, b2 = NULL, b3 = NULL, t, f, answer; - char * buf = NULL; - int size = 0; - int i = 0; - int scroll = 0; - int width, height; - char * flowedText; - newtGrid grid, buttonGrid; - - do { - size += 1000; - if (buf) free(buf); - buf = malloc(size); - i = vsnprintf(buf, size, message, args); - } while (i >= size || i == -1); - - flowedText = newtReflowText(buf, 50, 5, 5, &width, &height); - if (height > 6) { - free(flowedText); - flowedText = newtReflowText(buf, 60, 5, 5, &width, &height); - } - free(buf); - - if (height > 12) { - height = 12; - scroll = NEWT_FLAG_SCROLL; - } - t = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP | scroll); - newtTextboxSetText(t, flowedText); - free(flowedText); - - if (button3) { - buttonGrid = newtButtonBar(button1, &b1, button2, &b2, - button3, &b3, NULL); - } else if (button2) { - buttonGrid = newtButtonBar(button1, &b1, button2, &b2, NULL); - } else { - buttonGrid = newtButtonBar(button1, &b1, NULL); - } - - newtGridSetField(buttonGrid, 0, 0, NEWT_GRID_COMPONENT, b1, - 0, 0, button2 ? 1 : 0, 0, 0, 0); - - grid = newtCreateGrid(1, 2); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, t, 0, 0, 0, 0, 0, 0); - newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, buttonGrid, - 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX); - newtGridWrappedWindow(grid, title); - - f = newtForm(NULL, NULL, 0); - newtFormAddComponents(f, t, b1, NULL); - - if (button2) - newtFormAddComponent(f, b2); - if (button3) - newtFormAddComponent(f, b3); - - answer = newtRunForm(f); - newtGridFree(grid, 1); - - newtFormDestroy(f); - newtPopWindow(); - - if (answer == f) - return NULL; - else if (answer == b1) - return button1; - else if (answer == b2) - return button2; - - return button3; -} - -int newtWinChoice(char * title, char * button1, char * button2, - char * message, ...) { - va_list args; - void * rc; - - va_start(args, message); - rc = newtvwindow(title, button1, button2, NULL, message, args); - va_end(args); - - if (rc == button1) - return 1; - else if (rc == button2) - return 2; - - return 0; -} - -void newtWinMessage(char * title, char * buttonText, char * text, ...) { - va_list args; - - va_start(args, text); - newtvwindow(title, buttonText, NULL, NULL, text, args); - va_end(args); -} - -void newtWinMessagev(char * title, char * buttonText, char * text, - va_list argv) { - newtvwindow(title, buttonText, NULL, NULL, text, argv); -} - -int newtWinTernary(char * title, char * button1, char * button2, - char * button3, char * message, ...) { - va_list args; - void * rc; - - va_start(args, message); - rc = newtvwindow(title, button1, button2, button3, message, args); - va_end(args); - - if (rc == button1) - return 1; - else if (rc == button2) - return 2; - else if (rc == button3) - return 3; - - return 0; -} - -/* only supports up to 50 buttons -- shucks! */ -int newtWinMenu(char * title, char * text, int suggestedWidth, int flexDown, - int flexUp, int maxListHeight, char ** items, int * listItem, - char * button1, ...) { - newtComponent textbox, listbox, result, form; - va_list args; - newtComponent buttons[50]; - newtGrid grid, buttonBar; - int numButtons; - int i, rc; - int needScroll; - char * buttonName; - - textbox = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown, - flexUp, 0); - - for (i = 0; items[i]; i++) ; - if (i < maxListHeight) maxListHeight = i; - needScroll = i > maxListHeight; - - listbox = newtListbox(-1, -1, maxListHeight, - (needScroll ? NEWT_FLAG_SCROLL : 0) | NEWT_FLAG_RETURNEXIT); - for (i = 0; items[i]; i++) { - newtListboxAddEntry(listbox, items[i], (void *) (long)i); - } - - newtListboxSetCurrent(listbox, *listItem); - - buttonName = button1, numButtons = 0; - va_start(args, button1); - while (buttonName) { - buttons[numButtons] = newtButton(-1, -1, buttonName); - numButtons++; - buttonName = va_arg(args, char *); - } - - va_end(args); - - buttonBar = newtCreateGrid(numButtons, 1); - for (i = 0; i < numButtons; i++) { - newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT, - buttons[i], - i ? 1 : 0, 0, 0, 0, 0, 0); - } - - grid = newtGridSimpleWindow(textbox, listbox, buttonBar); - newtGridWrappedWindow(grid, title); - - form = newtForm(NULL, 0, 0); - newtGridAddComponentsToForm(grid, form, 1); - newtGridFree(grid, 1); - - result = newtRunForm(form); - - *listItem = ((long) newtListboxGetCurrent(listbox)); - - for (rc = 0; result != buttons[rc] && rc < numButtons; rc++); - if (rc == numButtons) - rc = 0; /* F12 or return-on-exit (which are the same for us) */ - else - rc++; - - newtFormDestroy(form); - newtPopWindow(); - - return rc; -} - -/* only supports up to 50 buttons and entries -- shucks! */ -int newtWinEntries(char * title, char * text, int suggestedWidth, int flexDown, - int flexUp, int dataWidth, - struct newtWinEntry * items, char * button1, ...) { - newtComponent buttons[50], result, form, textw; - newtGrid grid, buttonBar, subgrid; - int numItems; - int rc, i; - int numButtons; - char * buttonName; - va_list args; - - textw = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown, - flexUp, 0); - - for (numItems = 0; items[numItems].text; numItems++); - - buttonName = button1, numButtons = 0; - va_start(args, button1); - while (buttonName) { - buttons[numButtons] = newtButton(-1, -1, buttonName); - numButtons++; - buttonName = va_arg(args, char *); - } - - va_end(args); - - buttonBar = newtCreateGrid(numButtons, 1); - for (i = 0; i < numButtons; i++) { - newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT, - buttons[i], - i ? 1 : 0, 0, 0, 0, 0, 0); - } - - subgrid = newtCreateGrid(2, numItems); - for (i = 0; i < numItems; i++) { - newtGridSetField(subgrid, 0, i, NEWT_GRID_COMPONENT, - newtLabel(-1, -1, items[i].text), - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(subgrid, 1, i, NEWT_GRID_COMPONENT, - newtEntry(-1, -1, items[i].value ? - *items[i].value : NULL, dataWidth, - items[i].value, items[i].flags), - 1, 0, 0, 0, 0, 0); - } - - grid = newtCreateGrid(1, 3); - form = newtForm(NULL, 0, 0); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, textw, - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, subgrid, - 0, 1, 0, 0, 0, 0); - newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttonBar, - 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX); - newtGridAddComponentsToForm(grid, form, 1); - newtGridWrappedWindow(grid, title); - newtGridFree(grid, 1); - - result = newtRunForm(form); - - for (rc = 0; rc < numItems; rc++) - *items[rc].value = strdup(*items[rc].value); - - for (rc = 0; result != buttons[rc] && rc < numButtons; rc++); - if (rc == numButtons) - rc = 0; /* F12 */ - else - rc++; - - newtFormDestroy(form); - newtPopWindow(); - - return rc; -} diff --git a/mdk-stage1/nfsmount.c b/mdk-stage1/nfsmount.c deleted file mode 100644 index 032fde60c..000000000 --- a/mdk-stage1/nfsmount.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* this is based on work from redhat, made it lighter (gc) - */ - - -/* MODIFIED for Red Hat Linux installer - * msw@redhat.com - * o always mounts without lockd - * o uses our own host resolution - */ - -/* - * nfsmount.c -- Linux NFS mount - * Copyright (C) 1993 Rick Sladkey - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * Wed Feb 8 12:51:48 1995, biro@yggdrasil.com (Ross Biro): allow all port - * numbers to be specified on the command line. - * - * Fri, 8 Mar 1996 18:01:39, Swen Thuemmler : - * Omit the call to connect() for Linux version 1.3.11 or later. - * - * Wed Oct 1 23:55:28 1997: Dick Streefland - * Implemented the "bg", "fg" and "retry" mount options for NFS. - */ - -/* - * nfsmount.c,v 1.1.1.1 1993/11/18 08:40:51 jrs Exp - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "linux-2.2/nfs.h" -#include "linux-2.2/nfs_mount.h" //#include "mount_constants.h" - -#include "log.h" -#include "dns.h" - -#include "nfsmount.h" - - -bool_t -xdr_fhandle(XDR *xdrs, fhandle objp) -{ - if (!xdr_opaque(xdrs, objp, FHSIZE)) { - return (FALSE); - } - return (TRUE); -} - -bool_t -xdr_fhstatus(XDR *xdrs, fhstatus *objp) -{ - - if (!xdr_u_int(xdrs, &objp->fhs_status)) { - return (FALSE); - } - switch (objp->fhs_status) { - case 0: - if (!xdr_fhandle(xdrs, objp->fhstatus_u.fhs_fhandle)) { - return (FALSE); - } - break; - default: - break; - } - return (TRUE); -} - -bool_t -xdr_dirpath(XDR *xdrs, dirpath *objp) -{ - - if (!xdr_string(xdrs, objp, MNTPATHLEN)) { - return (FALSE); - } - return (TRUE); -} - - -static int nfs_mount_version = 3; /* kernel >= 2.1.32 */ /* *********** TODO for kernel 2.4, nfs-mount version 4 */ - - -int nfsmount_prepare(const char *spec, int *flags, char **mount_opts) -{ - char hostdir[1024]; - CLIENT *mclient; - char *hostname, *dirname; - fhandle root_fhandle; - struct timeval total_timeout; - enum clnt_stat clnt_stat; - static struct nfs_mount_data data; - struct sockaddr_in server_addr; - struct sockaddr_in mount_server_addr; - int msock, fsock; - struct timeval retry_timeout; - struct fhstatus status; - char *s; - int port; - - msock = fsock = -1; - mclient = NULL; - - strncpy(hostdir, spec, sizeof(hostdir)); - if ((s = (strchr(hostdir, ':')))) { - hostname = hostdir; - dirname = s + 1; - *s = '\0'; - } else { - log_message("nfsmount: format not host:dir"); - goto fail; - } - - server_addr.sin_family = AF_INET; - - /* first, try as IP address */ - if (!inet_aton(hostname, &server_addr.sin_addr)) { - /* failure, try as machine name */ - if (mygethostbyname(hostname, &server_addr.sin_addr)) - goto fail; - } - - memcpy (&mount_server_addr, &server_addr, sizeof (mount_server_addr)); - - - - /* Set default options. - * timeo is filled in after we know whether it'll be TCP or UDP. */ - memset(&data, 0, sizeof(data)); - data.retrans = 3; - data.acregmin = 3; - data.acregmax = 60; - data.acdirmin = 30; - data.acdirmax = 60; - data.rsize = 8192; - data.wsize = 8192; - data.bsize = 8192; -#if NFS_MOUNT_VERSION >= 2 - data.namlen = NAME_MAX; -#endif - -#if NFS_MOUNT_VERSION >= 3 - if (nfs_mount_version >= 3) - data.flags |= NFS_MOUNT_NONLM; /* HACK HACK msw */ -#endif - - /* Adjust options if none specified */ - if (!data.timeo) - data.timeo = 7; /* udp */ - - - data.version = nfs_mount_version; - *mount_opts = (char *) &data; - - if (*flags & MS_REMOUNT) - return 0; - - - retry_timeout.tv_sec = 3; - retry_timeout.tv_usec = 0; - total_timeout.tv_sec = 20; - total_timeout.tv_usec = 0; - - - /* contact the mount daemon via TCP */ - mount_server_addr.sin_port = htons(0); - msock = RPC_ANYSOCK; - mclient = clnttcp_create(&mount_server_addr, MOUNTPROG, MOUNTVERS, &msock, 0, 0); - - /* if this fails, contact the mount daemon via UDP */ - if (!mclient) { - mount_server_addr.sin_port = htons(0); - msock = RPC_ANYSOCK; - mclient = clntudp_create(&mount_server_addr, MOUNTPROG, MOUNTVERS, retry_timeout, &msock); - } - if (mclient) { - /* try to mount hostname:dirname */ - mclient->cl_auth = authunix_create_default(); - clnt_stat = clnt_call(mclient, MOUNTPROC_MNT, - (xdrproc_t) xdr_dirpath, (caddr_t) &dirname, - (xdrproc_t) xdr_fhstatus, (caddr_t) &status, - total_timeout); - if (clnt_stat != RPC_SUCCESS) { - if (errno != ECONNREFUSED) { - log_message(clnt_sperror(mclient, "mount")); - goto fail; /* don't retry */ - } - log_message(clnt_sperror(mclient, "mount")); - auth_destroy(mclient->cl_auth); - clnt_destroy(mclient); - mclient = 0; - close(msock); - } - } else - goto fail; - - if (status.fhs_status != 0) { - if (status.fhs_status == 2) - log_message("NFS server says: No such file or directory"); - else if (status.fhs_status == 13) - log_message("NFS server says: Permission denied"); - else - log_message("nfsmount prepare failed, reason given by server: %d", status.fhs_status); - goto fail; - } - - memcpy((char *) &root_fhandle, (char *) status.fhstatus_u.fhs_fhandle, sizeof (root_fhandle)); - - /* create nfs socket for kernel */ - - fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (fsock < 0) { - log_perror("nfs socket"); - goto fail; - } - if (bindresvport(fsock, 0) < 0) { - log_perror("nfs bindresvport"); - goto fail; - } - server_addr.sin_port = PMAPPORT; - port = pmap_getport(&server_addr, NFS_PROGRAM, NFS_VERSION, IPPROTO_UDP); - if (port == 0) - port = NFS_PORT; -#ifdef NFS_MOUNT_DEBUG - else - log_message("used portmapper to find NFS port\n"); - log_message("using port %d for nfs deamon\n", port); -#endif - server_addr.sin_port = htons(port); - - /* prepare data structure for kernel */ - - data.fd = fsock; - memcpy((char *) &data.root, (char *) &root_fhandle, sizeof (root_fhandle)); - memcpy((char *) &data.addr, (char *) &server_addr, sizeof(data.addr)); - strncpy(data.hostname, hostname, sizeof(data.hostname)); - - /* clean up */ - - auth_destroy(mclient->cl_auth); - clnt_destroy(mclient); - close(msock); - return 0; - - /* abort */ - - fail: - if (msock != -1) { - if (mclient) { - auth_destroy(mclient->cl_auth); - clnt_destroy(mclient); - } - close(msock); - } - if (fsock != -1) - close(fsock); - - return -1; -} - diff --git a/mdk-stage1/nfsmount.h b/mdk-stage1/nfsmount.h deleted file mode 100644 index 12ffa69a6..000000000 --- a/mdk-stage1/nfsmount.h +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Please do not edit this file. - * It was generated using rpcgen. - */ - -#ifndef _NFSMOUNT_H_RPCGEN -#define _NFSMOUNT_H_RPCGEN - -#include - -int nfsmount_prepare(const char *spec, int *flags, char **mount_opts); - - -/* - * Sun RPC is a product of Sun Microsystems, Inc. and is provided for - * unrestricted use provided that this legend is included on all tape - * media and as a part of the software program in whole or part. Users - * may copy or modify Sun RPC without charge, but are not authorized - * to license or distribute it to anyone else except as part of a product or - * program developed by the user or with the express written consent of - * Sun Microsystems, Inc. - * - * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE - * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR - * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. - * - * Sun RPC is provided with no support and without any obligation on the - * part of Sun Microsystems, Inc. to assist in its use, correction, - * modification or enhancement. - * - * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE - * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC - * OR ANY PART THEREOF. - * - * In no event will Sun Microsystems, Inc. be liable for any lost revenue - * or profits or other special, indirect and consequential damages, even if - * Sun has been advised of the possibility of such damages. - * - * Sun Microsystems, Inc. - * 2550 Garcia Avenue - * Mountain View, California 94043 - */ -/* - * Copyright (c) 1985, 1990 by Sun Microsystems, Inc. - */ - -/* from @(#)mount.x 1.3 91/03/11 TIRPC 1.0 */ -#ifndef _rpcsvc_mount_h -#define _rpcsvc_mount_h -#define MNTPATHLEN 1024 -#define MNTNAMLEN 255 -#define FHSIZE 32 - -typedef char fhandle[FHSIZE]; -#ifdef __cplusplus -extern "C" bool_t xdr_fhandle(XDR *, fhandle); -#elif __STDC__ -extern bool_t xdr_fhandle(XDR *, fhandle); -#else /* Old Style C */ -bool_t xdr_fhandle(); -#endif /* Old Style C */ - - -struct fhstatus { - u_int fhs_status; - union { - fhandle fhs_fhandle; - } fhstatus_u; -}; -typedef struct fhstatus fhstatus; -#ifdef __cplusplus -extern "C" bool_t xdr_fhstatus(XDR *, fhstatus*); -#elif __STDC__ -extern bool_t xdr_fhstatus(XDR *, fhstatus*); -#else /* Old Style C */ -bool_t xdr_fhstatus(); -#endif /* Old Style C */ - - -typedef char *dirpath; -#ifdef __cplusplus -extern "C" bool_t xdr_dirpath(XDR *, dirpath*); -#elif __STDC__ -extern bool_t xdr_dirpath(XDR *, dirpath*); -#else /* Old Style C */ -bool_t xdr_dirpath(); -#endif /* Old Style C */ - - -typedef char *name; -#ifdef __cplusplus -extern "C" bool_t xdr_name(XDR *, name*); -#elif __STDC__ -extern bool_t xdr_name(XDR *, name*); -#else /* Old Style C */ -bool_t xdr_name(); -#endif /* Old Style C */ - - -typedef struct mountbody *mountlist; -#ifdef __cplusplus -extern "C" bool_t xdr_mountlist(XDR *, mountlist*); -#elif __STDC__ -extern bool_t xdr_mountlist(XDR *, mountlist*); -#else /* Old Style C */ -bool_t xdr_mountlist(); -#endif /* Old Style C */ - - -struct mountbody { - name ml_hostname; - dirpath ml_directory; - mountlist ml_next; -}; -typedef struct mountbody mountbody; -#ifdef __cplusplus -extern "C" bool_t xdr_mountbody(XDR *, mountbody*); -#elif __STDC__ -extern bool_t xdr_mountbody(XDR *, mountbody*); -#else /* Old Style C */ -bool_t xdr_mountbody(); -#endif /* Old Style C */ - - -typedef struct groupnode *groups; -#ifdef __cplusplus -extern "C" bool_t xdr_groups(XDR *, groups*); -#elif __STDC__ -extern bool_t xdr_groups(XDR *, groups*); -#else /* Old Style C */ -bool_t xdr_groups(); -#endif /* Old Style C */ - - -struct groupnode { - name gr_name; - groups gr_next; -}; -typedef struct groupnode groupnode; -#ifdef __cplusplus -extern "C" bool_t xdr_groupnode(XDR *, groupnode*); -#elif __STDC__ -extern bool_t xdr_groupnode(XDR *, groupnode*); -#else /* Old Style C */ -bool_t xdr_groupnode(); -#endif /* Old Style C */ - - -typedef struct exportnode *exports; -#ifdef __cplusplus -extern "C" bool_t xdr_exports(XDR *, exports*); -#elif __STDC__ -extern bool_t xdr_exports(XDR *, exports*); -#else /* Old Style C */ -bool_t xdr_exports(); -#endif /* Old Style C */ - - -struct exportnode { - dirpath ex_dir; - groups ex_groups; - exports ex_next; -}; -typedef struct exportnode exportnode; -#ifdef __cplusplus -extern "C" bool_t xdr_exportnode(XDR *, exportnode*); -#elif __STDC__ -extern bool_t xdr_exportnode(XDR *, exportnode*); -#else /* Old Style C */ -bool_t xdr_exportnode(); -#endif /* Old Style C */ - - -struct ppathcnf { - int pc_link_max; - short pc_max_canon; - short pc_max_input; - short pc_name_max; - short pc_path_max; - short pc_pipe_buf; - u_char pc_vdisable; - char pc_xxx; - short pc_mask[2]; -}; -typedef struct ppathcnf ppathcnf; -#ifdef __cplusplus -extern "C" bool_t xdr_ppathcnf(XDR *, ppathcnf*); -#elif __STDC__ -extern bool_t xdr_ppathcnf(XDR *, ppathcnf*); -#else /* Old Style C */ -bool_t xdr_ppathcnf(); -#endif /* Old Style C */ - -#endif /*!_rpcsvc_mount_h*/ - -#define MOUNTPROG ((u_long)100005) -#define MOUNTVERS ((u_long)1) - -#ifdef __cplusplus -#define MOUNTPROC_NULL ((u_long)0) -extern "C" void * mountproc_null_1(void *, CLIENT *); -extern "C" void * mountproc_null_1_svc(void *, struct svc_req *); -#define MOUNTPROC_MNT ((u_long)1) -extern "C" fhstatus * mountproc_mnt_1(dirpath *, CLIENT *); -extern "C" fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_DUMP ((u_long)2) -extern "C" mountlist * mountproc_dump_1(void *, CLIENT *); -extern "C" mountlist * mountproc_dump_1_svc(void *, struct svc_req *); -#define MOUNTPROC_UMNT ((u_long)3) -extern "C" void * mountproc_umnt_1(dirpath *, CLIENT *); -extern "C" void * mountproc_umnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern "C" void * mountproc_umntall_1(void *, CLIENT *); -extern "C" void * mountproc_umntall_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORT ((u_long)5) -extern "C" exports * mountproc_export_1(void *, CLIENT *); -extern "C" exports * mountproc_export_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern "C" exports * mountproc_exportall_1(void *, CLIENT *); -extern "C" exports * mountproc_exportall_1_svc(void *, struct svc_req *); - -#elif __STDC__ -#define MOUNTPROC_NULL ((u_long)0) -extern void * mountproc_null_1(void *, CLIENT *); -extern void * mountproc_null_1_svc(void *, struct svc_req *); -#define MOUNTPROC_MNT ((u_long)1) -extern fhstatus * mountproc_mnt_1(dirpath *, CLIENT *); -extern fhstatus * mountproc_mnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_DUMP ((u_long)2) -extern mountlist * mountproc_dump_1(void *, CLIENT *); -extern mountlist * mountproc_dump_1_svc(void *, struct svc_req *); -#define MOUNTPROC_UMNT ((u_long)3) -extern void * mountproc_umnt_1(dirpath *, CLIENT *); -extern void * mountproc_umnt_1_svc(dirpath *, struct svc_req *); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern void * mountproc_umntall_1(void *, CLIENT *); -extern void * mountproc_umntall_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORT ((u_long)5) -extern exports * mountproc_export_1(void *, CLIENT *); -extern exports * mountproc_export_1_svc(void *, struct svc_req *); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern exports * mountproc_exportall_1(void *, CLIENT *); -extern exports * mountproc_exportall_1_svc(void *, struct svc_req *); - -#else /* Old Style C */ -#define MOUNTPROC_NULL ((u_long)0) -extern void * mountproc_null_1(); -extern void * mountproc_null_1_svc(); -#define MOUNTPROC_MNT ((u_long)1) -extern fhstatus * mountproc_mnt_1(); -extern fhstatus * mountproc_mnt_1_svc(); -#define MOUNTPROC_DUMP ((u_long)2) -extern mountlist * mountproc_dump_1(); -extern mountlist * mountproc_dump_1_svc(); -#define MOUNTPROC_UMNT ((u_long)3) -extern void * mountproc_umnt_1(); -extern void * mountproc_umnt_1_svc(); -#define MOUNTPROC_UMNTALL ((u_long)4) -extern void * mountproc_umntall_1(); -extern void * mountproc_umntall_1_svc(); -#define MOUNTPROC_EXPORT ((u_long)5) -extern exports * mountproc_export_1(); -extern exports * mountproc_export_1_svc(); -#define MOUNTPROC_EXPORTALL ((u_long)6) -extern exports * mountproc_exportall_1(); -extern exports * mountproc_exportall_1_svc(); -#endif /* Old Style C */ -#define MOUNTVERS_POSIX ((u_long)2) - -#ifdef __cplusplus -extern "C" void * mountproc_null_2(void *, CLIENT *); -extern "C" void * mountproc_null_2_svc(void *, struct svc_req *); -extern "C" fhstatus * mountproc_mnt_2(dirpath *, CLIENT *); -extern "C" fhstatus * mountproc_mnt_2_svc(dirpath *, struct svc_req *); -extern "C" mountlist * mountproc_dump_2(void *, CLIENT *); -extern "C" mountlist * mountproc_dump_2_svc(void *, struct svc_req *); -extern "C" void * mountproc_umnt_2(dirpath *, CLIENT *); -extern "C" void * mountproc_umnt_2_svc(dirpath *, struct svc_req *); -extern "C" void * mountproc_umntall_2(void *, CLIENT *); -extern "C" void * mountproc_umntall_2_svc(void *, struct svc_req *); -extern "C" exports * mountproc_export_2(void *, CLIENT *); -extern "C" exports * mountproc_export_2_svc(void *, struct svc_req *); -extern "C" exports * mountproc_exportall_2(void *, CLIENT *); -extern "C" exports * mountproc_exportall_2_svc(void *, struct svc_req *); -#define MOUNTPROC_PATHCONF ((u_long)7) -extern "C" ppathcnf * mountproc_pathconf_2(dirpath *, CLIENT *); -extern "C" ppathcnf * mountproc_pathconf_2_svc(dirpath *, struct svc_req *); - -#elif __STDC__ -extern void * mountproc_null_2(void *, CLIENT *); -extern void * mountproc_null_2_svc(void *, struct svc_req *); -extern fhstatus * mountproc_mnt_2(dirpath *, CLIENT *); -extern fhstatus * mountproc_mnt_2_svc(dirpath *, struct svc_req *); -extern mountlist * mountproc_dump_2(void *, CLIENT *); -extern mountlist * mountproc_dump_2_svc(void *, struct svc_req *); -extern void * mountproc_umnt_2(dirpath *, CLIENT *); -extern void * mountproc_umnt_2_svc(dirpath *, struct svc_req *); -extern void * mountproc_umntall_2(void *, CLIENT *); -extern void * mountproc_umntall_2_svc(void *, struct svc_req *); -extern exports * mountproc_export_2(void *, CLIENT *); -extern exports * mountproc_export_2_svc(void *, struct svc_req *); -extern exports * mountproc_exportall_2(void *, CLIENT *); -extern exports * mountproc_exportall_2_svc(void *, struct svc_req *); -#define MOUNTPROC_PATHCONF ((u_long)7) -extern ppathcnf * mountproc_pathconf_2(dirpath *, CLIENT *); -extern ppathcnf * mountproc_pathconf_2_svc(dirpath *, struct svc_req *); - -#else /* Old Style C */ -extern void * mountproc_null_2(); -extern void * mountproc_null_2_svc(); -extern fhstatus * mountproc_mnt_2(); -extern fhstatus * mountproc_mnt_2_svc(); -extern mountlist * mountproc_dump_2(); -extern mountlist * mountproc_dump_2_svc(); -extern void * mountproc_umnt_2(); -extern void * mountproc_umnt_2_svc(); -extern void * mountproc_umntall_2(); -extern void * mountproc_umntall_2_svc(); -extern exports * mountproc_export_2(); -extern exports * mountproc_export_2_svc(); -extern exports * mountproc_exportall_2(); -extern exports * mountproc_exportall_2_svc(); -#define MOUNTPROC_PATHCONF ((u_long)7) -extern ppathcnf * mountproc_pathconf_2(); -extern ppathcnf * mountproc_pathconf_2_svc(); -#endif /* Old Style C */ - -#endif /* !_NFSMOUNT_H_RPCGEN */ diff --git a/mdk-stage1/pci-resource/.cvsignore b/mdk-stage1/pci-resource/.cvsignore deleted file mode 100644 index 4c7b0844b..000000000 --- a/mdk-stage1/pci-resource/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -pci-ids.h diff --git a/mdk-stage1/pci-resource/Makefile b/mdk-stage1/pci-resource/Makefile deleted file mode 100644 index 8627ab03c..000000000 --- a/mdk-stage1/pci-resource/Makefile +++ /dev/null @@ -1,25 +0,0 @@ - #****************************************************************************** - # - # $Id$ - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - #***************************************************************************** - - -all: pci-ids.h - -pci-ids.h: /usr/share/ldetect-lst/pcitable update-pci-ids.pl - perl update-pci-ids.pl > $@ || rm -f $@ - -clean: - rm -f pci-ids.h diff --git a/mdk-stage1/pci-resource/update-pci-ids.pl b/mdk-stage1/pci-resource/update-pci-ids.pl deleted file mode 100755 index 1ea4ffc60..000000000 --- a/mdk-stage1/pci-resource/update-pci-ids.pl +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/perl - -require '/usr/bin/merge2pcitable.pl'; - -my $drivers = read_pcitable("/usr/share/ldetect-lst/pcitable"); - - -print ' -#define PCI_REVISION_ID 0x08 /* Revision ID */ - -struct pci_module_map { - unsigned short vendor; /* PCI vendor id */ - unsigned short device; /* PCI device id */ - const char *name; /* PCI human readable name */ - const char *module; /* module to load */ -}; - -'; - -my %t = (scsi => 'scsi', eth => 'net'); - -my @modulz = sort grep { -d $_ } glob("../../all.modules/*"); -my $selected_mod = pop @modulz; -my ($kern) = $selected_mod =~ /.*\/([^\/]+)/; - -if (-x "../mar/mar" && -f "../../all.modules/$kern/network_modules.mar" && -f "../../all.modules/$kern/hd_modules.mar") { - $modulez{'eth'} = [ `../mar/mar -l ../../all.modules/$kern/network_modules.mar` ]; - $modulez{'scsi'} = [ `../mar/mar -l ../../all.modules/$kern/hd_modules.mar` ]; - $check_marfiles = 1; -} - - -foreach $type (keys %t) { - print "#ifndef DISABLE_NETWORK\n" if ($type eq 'eth'); - print "#ifndef DISABLE_MEDIAS\n" if ($type eq 'scsi'); - - print " -struct pci_module_map ${type}_pci_ids[] = { -"; - my %l; - foreach (glob("../../all.kernels/$kern/lib/modules/*/$t{$type}/*.o"), glob("../../all.kernels/$kern/lib/modules/*/kernel/drivers/$t{$type}/{*/,}*.o")) { - m|([^/]*)\.o$|; - $l{$1} = 1; - } - my %absent; - while (my ($k, $v) = each %$drivers) { - $l{$v->[0]} or next; - $k =~ /^(....)(....)/; - printf qq|\t{0x%s , 0x%s , ( "%s" ), ( "%s" )} ,\n|, - $1, $2, $v->[1], $v->[0]; - if (defined($check_marfiles)) { - ($absent{$v->[0]} = 1) if (!grep(/^\t$v->[0]\.o\s/, @{$modulez{$type}})); - } - } - - if (%absent) { print STDERR "\tmissing for $type: "; foreach (keys %absent) { print STDERR "$_ " } print STDERR "\n"; }; - -print " -}; -int ${type}_num_ids=sizeof(${type}_pci_ids)/sizeof(struct pci_module_map); -"; - - print "#endif\n"; - -} diff --git a/mdk-stage1/pcmcia/Makefile b/mdk-stage1/pcmcia/Makefile deleted file mode 100644 index fb93f10b8..000000000 --- a/mdk-stage1/pcmcia/Makefile +++ /dev/null @@ -1,48 +0,0 @@ - #****************************************************************************** - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -all: libpcmcia.a libpcmcia-DIET.a - -clean: - rm -f *.o libpcmcia.a - -FLAGS = -Wall -Werror -Os -fomit-frame-pointer -pipe -c -I.. - - -OBJS = pcmcia_probe.o cardmgr.o lex_config.o yacc_config.o - -OBJS-DIET = $(subst .o,-DIET.o,$(OBJS)) - - -libpcmcia.a: $(OBJS) - ar -cru $@ $^ - ranlib $@ - -libpcmcia-DIET.a: $(OBJS-DIET) - ar -cru $@ $^ - ranlib $@ - - -$(OBJS): %.o: %.c - gcc $(FLAGS) $(GLIBC_INCLUDES) -c $< -o $@ - -$(OBJS-DIET): %-DIET.o: %.c - gcc $(FLAGS) $(DIETLIBC_INCLUDES) -c $< -o $@ - diff --git a/mdk-stage1/pcmcia/bulkmem.h b/mdk-stage1/pcmcia/bulkmem.h deleted file mode 100644 index 1b0bcbd1e..000000000 --- a/mdk-stage1/pcmcia/bulkmem.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Definitions for bulk memory services - * - * bulkmem.h 1.12 2000/06/12 21:55:41 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - * bulkmem.h 1.3 1995/05/27 04:49:49 - */ - -#ifndef _LINUX_BULKMEM_H -#define _LINUX_BULKMEM_H - -/* For GetFirstRegion and GetNextRegion */ -typedef struct region_info_t { - u_int Attributes; - u_int CardOffset; - u_int RegionSize; - u_int AccessSpeed; - u_int BlockSize; - u_int PartMultiple; - u_char JedecMfr, JedecInfo; - memory_handle_t next; -} region_info_t; - -#define REGION_TYPE 0x0001 -#define REGION_TYPE_CM 0x0000 -#define REGION_TYPE_AM 0x0001 -#define REGION_PREFETCH 0x0008 -#define REGION_CACHEABLE 0x0010 -#define REGION_BAR_MASK 0xe000 -#define REGION_BAR_SHIFT 13 - -/* For OpenMemory */ -typedef struct open_mem_t { - u_int Attributes; - u_int Offset; -} open_mem_t; - -/* Attributes for OpenMemory */ -#define MEMORY_TYPE 0x0001 -#define MEMORY_TYPE_CM 0x0000 -#define MEMORY_TYPE_AM 0x0001 -#define MEMORY_EXCLUSIVE 0x0002 -#define MEMORY_PREFETCH 0x0008 -#define MEMORY_CACHEABLE 0x0010 -#define MEMORY_BAR_MASK 0xe000 -#define MEMORY_BAR_SHIFT 13 - -typedef struct eraseq_entry_t { - memory_handle_t Handle; - u_char State; - u_int Size; - u_int Offset; - void *Optional; -} eraseq_entry_t; - -typedef struct eraseq_hdr_t { - int QueueEntryCnt; - eraseq_entry_t *QueueEntryArray; -} eraseq_hdr_t; - -#define ERASE_QUEUED 0x00 -#define ERASE_IN_PROGRESS(n) (((n) > 0) && ((n) < 0x80)) -#define ERASE_IDLE 0xff -#define ERASE_PASSED 0xe0 -#define ERASE_FAILED 0xe1 - -#define ERASE_MISSING 0x80 -#define ERASE_MEDIA_WRPROT 0x84 -#define ERASE_NOT_ERASABLE 0x85 -#define ERASE_BAD_OFFSET 0xc1 -#define ERASE_BAD_TECH 0xc2 -#define ERASE_BAD_SOCKET 0xc3 -#define ERASE_BAD_VCC 0xc4 -#define ERASE_BAD_VPP 0xc5 -#define ERASE_BAD_SIZE 0xc6 - -/* For CopyMemory */ -typedef struct copy_op_t { - u_int Attributes; - u_int SourceOffset; - u_int DestOffset; - u_int Count; -} copy_op_t; - -/* For ReadMemory and WriteMemory */ -typedef struct mem_op_t { - u_int Attributes; - u_int Offset; - u_int Count; -} mem_op_t; - -#define MEM_OP_BUFFER 0x01 -#define MEM_OP_BUFFER_USER 0x00 -#define MEM_OP_BUFFER_KERNEL 0x01 -#define MEM_OP_DISABLE_ERASE 0x02 -#define MEM_OP_VERIFY 0x04 - -/* For RegisterMTD */ -typedef struct mtd_reg_t { - u_int Attributes; - u_int Offset; - u_long MediaID; -} mtd_reg_t; - -/* - * Definitions for MTD requests - */ - -typedef struct mtd_request_t { - u_int SrcCardOffset; - u_int DestCardOffset; - u_int TransferLength; - u_int Function; - u_long MediaID; - u_int Status; - u_int Timeout; -} mtd_request_t; - -/* Fields in MTD Function */ -#define MTD_REQ_ACTION 0x003 -#define MTD_REQ_ERASE 0x000 -#define MTD_REQ_READ 0x001 -#define MTD_REQ_WRITE 0x002 -#define MTD_REQ_COPY 0x003 -#define MTD_REQ_NOERASE 0x004 -#define MTD_REQ_VERIFY 0x008 -#define MTD_REQ_READY 0x010 -#define MTD_REQ_TIMEOUT 0x020 -#define MTD_REQ_LAST 0x040 -#define MTD_REQ_FIRST 0x080 -#define MTD_REQ_KERNEL 0x100 - -/* Status codes */ -#define MTD_WAITREQ 0x00 -#define MTD_WAITTIMER 0x01 -#define MTD_WAITRDY 0x02 -#define MTD_WAITPOWER 0x03 - -/* - * Definitions for MTD helper functions - */ - -/* For MTDModifyWindow */ -typedef struct mtd_mod_win_t { - u_int Attributes; - u_int AccessSpeed; - u_int CardOffset; -} mtd_mod_win_t; - -/* For MTDSetVpp */ -typedef struct mtd_vpp_req_t { - u_char Vpp1, Vpp2; -} mtd_vpp_req_t; - -/* For MTDRDYMask */ -typedef struct mtd_rdy_req_t { - u_int Mask; -} mtd_rdy_req_t; - -enum mtd_helper { - MTDRequestWindow, MTDModifyWindow, MTDReleaseWindow, - MTDSetVpp, MTDRDYMask -}; - -#ifdef IN_CARD_SERVICES -extern int MTDHelperEntry(int func, void *a1, void *a2); -#else -extern int MTDHelperEntry(int func, ...); -#endif - -#endif /* _LINUX_BULKMEM_H */ diff --git a/mdk-stage1/pcmcia/cardmgr.c b/mdk-stage1/pcmcia/cardmgr.c deleted file mode 100644 index 40b5e6a0f..000000000 --- a/mdk-stage1/pcmcia/cardmgr.c +++ /dev/null @@ -1,805 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* Code comes from /anonymous@projects.sourceforge.net:/pub/pcmcia-cs/pcmcia-cs-3.1.23.tar.bz2 - * - * Licence of this code follows: - - PCMCIA Card Manager daemon - - cardmgr.c 1.150 2000/12/14 17:12:59 - - The contents of this file are subject to the Mozilla Public - License Version 1.1 (the "License"); you may not use this file - except in compliance with the License. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS - IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - implied. See the License for the specific language governing - rights and limitations under the License. - - The initial developer of the original code is David A. Hinds - . Portions created by David A. Hinds - are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - - Alternatively, the contents of this file may be used under the - terms of the GNU Public License version 2 (the "GPL"), in which - case the provisions of the GPL are applicable instead of the - above. If you wish to allow the use of your version of this file - only under the terms of the GPL and not to allow others to use - your version of this file under the MPL, indicate your decision - by deleting the provisions above and replace them with the notice - and other provisions required by the GPL. If you do not delete - the provisions above, a recipient may use your version of this - file under either the MPL or the GPL. - - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "../log.h" -#include "modules.h" - -#include "cardmgr.h" -#include "pcmcia.h" - -/*====================================================================*/ - -typedef struct socket_info_t { - int fd; - int state; - card_info_t *card; - bind_info_t *bind[MAX_BINDINGS]; - mtd_ident_t *mtd[2*CISTPL_MAX_DEVICES]; -} socket_info_t; - -#define SOCKET_PRESENT 0x01 -#define SOCKET_READY 0x02 -#define SOCKET_BOUND 0x04 - -/* Linked list of resource adjustments */ -struct adjust_list_t *root_adjust = NULL; - -/* Linked list of device definitions */ -struct device_info_t *root_device = NULL; - -/* Special pointer to "anonymous" card definition */ -struct card_info_t *blank_card = NULL; - -/* Linked list of card definitions */ -struct card_info_t *root_card = NULL; - -/* Linked list of function definitions */ -struct card_info_t *root_func = NULL; - -/* Linked list of MTD definitions */ -struct mtd_ident_t *root_mtd = NULL; - -/* Default MTD */ -struct mtd_ident_t *default_mtd = NULL; - -static int sockets; -static struct socket_info_t socket[MAX_SOCKS]; - -static char *configpath = "/etc/pcmcia"; - -/* Default path for socket info table */ -static char *stabfile; - -/*====================================================================*/ - -static int major = 0; - -static int lookup_dev(char *name) -{ - FILE *f; - int n; - char s[32], t[32]; - - f = fopen("/proc/devices", "r"); - if (f == NULL) - return -errno; - while (fgets(s, 32, f) != NULL) { - bzero(t, 32); - if (sscanf(s, "%d %s", &n, t) == 2) - if (strcmp(name, t) == 0) - break; - } - fclose(f); - if (strcmp(name, t) == 0) - return n; - else - return -ENODEV; -} - -static int open_dev(dev_t dev, int mode) -{ - char * fn = "/tmp/cardmgr_tmp"; - int fd; - unlink(fn); - if (mknod(fn, mode, dev) != 0) - return -1; - fd = open(fn, (mode&S_IWRITE) ? O_RDWR : O_RDONLY); - if (fd < 0) - fd = open(fn, O_NONBLOCK|((mode&S_IWRITE) ? O_RDWR : O_RDONLY)); - unlink(fn); - return fd; -} - -static int open_sock(int sock, int mode) -{ - dev_t dev = (major<<8) + sock; - return open_dev(dev, mode); -} - -/*====================================================================== - - xlate_scsi_name() is a sort-of-hack used to deduce the minor - device numbers of SCSI devices, from the information available to - the low-level driver. - -======================================================================*/ - - -#include -#include - -static int xlate_scsi_name(bind_info_t *bind) -{ - int i, fd, mode, minor; - u_long arg[2], id1, id2; - - id1 = strtol(bind->name+3, NULL, 16); - if ((bind->major == SCSI_DISK0_MAJOR) || - (bind->major == SCSI_CDROM_MAJOR)) - mode = S_IREAD|S_IFBLK; - else - mode = S_IREAD|S_IFCHR; - - for (i = 0; i < 16; i++) { - minor = (bind->major == SCSI_DISK0_MAJOR) ? (i<<4) : i; - fd = open_dev((bind->major<<8)+minor, mode); - if (fd < 0) - continue; - if (ioctl(fd, SCSI_IOCTL_GET_IDLUN, arg) == 0) { - id2 = (arg[0]&0x0f) + ((arg[0]>>4)&0xf0) + - ((arg[0]>>8)&0xf00) + ((arg[0]>>12)&0xf000); - if (id1 == id2) { - close(fd); - switch (bind->major) { - case SCSI_DISK0_MAJOR: - case SCSI_GENERIC_MAJOR: - sprintf(bind->name+2, "%c", 'a'+i); break; - case SCSI_CDROM_MAJOR: - sprintf(bind->name, "scd%d", i); break; - case SCSI_TAPE_MAJOR: - sprintf(bind->name+2, "%d", i); break; - } - bind->minor = minor; - return 0; - } - } - close(fd); - } - return -1; -} - - -/*====================================================================*/ - -static void write_stab(void) -{ - int i, j, k; - FILE *f; - socket_info_t *s; - bind_info_t *bind; - - f = fopen(stabfile, "w"); - if (f == NULL) { - log_message("CM: fopen(stabfile) failed: %m"); - return; - } - if (flock(fileno(f), LOCK_EX) != 0) { - log_message("CM: flock(stabfile) failed: %m"); - return; - } - for (i = 0; i < sockets; i++) { - s = &socket[i]; - if (!(s->state & SOCKET_PRESENT)) - fprintf(f, "Socket %d: empty\n", i); - else if (!s->card) - fprintf(f, "Socket %d: unsupported card\n", i); - else { - fprintf(f, "Socket %d: %s\n", i, s->card->name); - for (j = 0; j < s->card->bindings; j++) - for (k = 0, bind = s->bind[j]; - bind != NULL; - k++, bind = bind->next) { - char *class = s->card->device[j]->class; - fprintf(f, "%d\t%s\t%s\t%d\t%s", - i, (class ? class : "none"), - bind->dev_info, k, bind->name); - if (bind->major) - fprintf(f, "\t%d\t%d\n", - bind->major, bind->minor); - else - fputc('\n', f); - } - } - } - fflush(f); - fclose(f); -} - -/*====================================================================*/ - -static int get_tuple(int ns, cisdata_t code, ds_ioctl_arg_t *arg) -{ - socket_info_t *s = &socket[ns]; - - arg->tuple.DesiredTuple = code; - arg->tuple.Attributes = 0; - if (ioctl(s->fd, DS_GET_FIRST_TUPLE, arg) != 0) - return -1; - arg->tuple.TupleOffset = 0; - if (ioctl(s->fd, DS_GET_TUPLE_DATA, arg) != 0) { - log_message("CM: error reading CIS data on socket %d: %m", ns); - return -1; - } - if (ioctl(s->fd, DS_PARSE_TUPLE, arg) != 0) { - log_message("CM: error parsing CIS on socket %d: %m", ns); - return -1; - } - return 0; -} - -/*====================================================================*/ - -typedef struct { - u_short vendor, device; -} pci_id_t; - - -static card_info_t *lookup_card(int ns) -{ - socket_info_t *s = &socket[ns]; - card_info_t *card = NULL; - ds_ioctl_arg_t arg; - cistpl_vers_1_t *vers = NULL; - cistpl_manfid_t manfid = { 0, 0 }; - pci_id_t pci_id = { 0, 0 }; - cistpl_funcid_t funcid = { 0xff, 0xff }; - cs_status_t status; - config_info_t config; - int i, ret, match; - int has_cis = 0; - - /* Do we have a CIS structure? */ - ret = ioctl(s->fd, DS_VALIDATE_CIS, &arg); - has_cis = ((ret == 0) && (arg.cisinfo.Chains > 0)); - - /* Try to read VERS_1, MANFID tuples */ - if (has_cis) { - /* rule of thumb: cards with no FUNCID, but with common memory - device geometry information, are probably memory cards */ - if (get_tuple(ns, CISTPL_FUNCID, &arg) == 0) - memcpy(&funcid, &arg.tuple_parse.parse.funcid, - sizeof(funcid)); - else if (get_tuple(ns, CISTPL_DEVICE_GEO, &arg) == 0) - funcid.func = CISTPL_FUNCID_MEMORY; - if (get_tuple(ns, CISTPL_MANFID, &arg) == 0) - memcpy(&manfid, &arg.tuple_parse.parse.manfid, - sizeof(manfid)); - if (get_tuple(ns, CISTPL_VERS_1, &arg) == 0) - vers = &arg.tuple_parse.parse.version_1; - - match = 0; - for (card = root_card; card; card = card->next) { - switch (card->ident_type) { - - case VERS_1_IDENT: - if (vers == NULL) - break; - for (i = 0; i < card->id.vers.ns; i++) { - if (strcmp(card->id.vers.pi[i], "*") == 0) - continue; - if (i >= vers->ns) - break; - if (strcmp(card->id.vers.pi[i], - vers->str+vers->ofs[i]) != 0) - break; - } - if (i < card->id.vers.ns) - break; - match = 1; - break; - - case MANFID_IDENT: - if ((manfid.manf == card->id.manfid.manf) && - (manfid.card == card->id.manfid.card)) - match = 1; - break; - - case TUPLE_IDENT: - arg.tuple.DesiredTuple = card->id.tuple.code; - arg.tuple.Attributes = 0; - ret = ioctl(s->fd, DS_GET_FIRST_TUPLE, &arg); - if (ret != 0) break; - arg.tuple.TupleOffset = card->id.tuple.ofs; - ret = ioctl(s->fd, DS_GET_TUPLE_DATA, &arg); - if (ret != 0) break; - if (strncmp((char *)arg.tuple_parse.data, - card->id.tuple.info, - strlen(card->id.tuple.info)) != 0) - break; - match = 1; - break; - - default: - /* Skip */ - break; - } - if (match) break; - } - } - - /* Check PCI vendor/device info */ - status.Function = config.Function = config.ConfigBase = 0; - if ((ioctl(s->fd, DS_GET_CONFIGURATION_INFO, &config) == 0) && - (config.IntType == INT_CARDBUS)) { - pci_id.vendor = config.ConfigBase & 0xffff; - pci_id.device = config.ConfigBase >> 16; - if (!card) { - for (card = root_card; card; card = card->next) - if ((card->ident_type == PCI_IDENT) && - (pci_id.vendor == card->id.manfid.manf) && - (pci_id.device == card->id.manfid.card)) - break; - } - } - - /* Try for a FUNCID match */ - if (!card && (funcid.func != 0xff)) { - for (card = root_func; card; card = card->next) - if (card->id.func.funcid == funcid.func) - break; - } - - if (card) { - log_message("CM: socket %d: %s", ns, card->name); - return card; - } - - status.Function = 0; - if (!blank_card || (status.CardState & CS_EVENT_CB_DETECT) || - manfid.manf || manfid.card || pci_id.vendor || vers) { - log_message("CM: unsupported card in socket %d", ns); - return NULL; - } else { - card = blank_card; - log_message("CM: socket %d: %s", ns, card->name); - return card; - } -} - - -static void cardmgr_fail(void) -{ - log_message("CM: cardmgr: failed"); -} - -/*====================================================================*/ - -static int load_config(void) -{ - if (chdir(configpath)) { - log_message("CM: chdir to %s failed: %m", configpath); - return -1; - } - - if (parse_configfile("config")) - return -1; - - if (!root_device) - log_message("CM: no device drivers defined"); - - if (!root_card && !root_func) - log_message("CM: no cards defined"); - - return 0; -} - - -/*====================================================================*/ - -static void install_module(char *mod, char *opts) -{ - my_insmod(mod, ANY_DRIVER_TYPE, opts); -} - -/*====================================================================*/ - -static mtd_ident_t *lookup_mtd(region_info_t *region) -{ - mtd_ident_t *mtd; - int match = 0; - - for (mtd = root_mtd; mtd; mtd = mtd->next) { - switch (mtd->mtd_type) { - case JEDEC_MTD: - if ((mtd->jedec_mfr == region->JedecMfr) && - (mtd->jedec_info == region->JedecInfo)) { - match = 1; - break; - } - case DTYPE_MTD: - break; - default: - break; - } - if (match) break; - } - if (mtd) - return mtd; - else - return default_mtd; -} - -/*====================================================================*/ - -static void bind_mtd(int sn) -{ - socket_info_t *s = &socket[sn]; - region_info_t region; - bind_info_t bind; - mtd_info_t mtd_info; - mtd_ident_t *mtd; - int i, attr, ret, nr; - - nr = 0; - for (attr = 0; attr < 2; attr++) { - region.Attributes = attr; - ret = ioctl(s->fd, DS_GET_FIRST_REGION, ®ion); - while (ret == 0) { - mtd = lookup_mtd(®ion); - if (mtd) { - /* Have we seen this MTD before? */ - for (i = 0; i < nr; i++) - if (s->mtd[i] == mtd) break; - if (i == nr) { - install_module(mtd->module, mtd->opts); - s->mtd[nr] = mtd; - mtd->refs++; - nr++; - } - log_message("CM: %s memory region at 0x%lx: %s", - attr ? "Attribute" : "Common", (long unsigned int) region.CardOffset, - mtd->name); - /* Bind MTD to this region */ - strcpy(mtd_info.dev_info, s->mtd[i]->module); - mtd_info.Attributes = region.Attributes; - mtd_info.CardOffset = region.CardOffset; - if (ioctl(s->fd, DS_BIND_MTD, &mtd_info) != 0) { - log_message( "bind MTD '%s' to region at 0x%lx failed: %m", - (char *)mtd_info.dev_info, (long unsigned int) region.CardOffset); - } - } - ret = ioctl(s->fd, DS_GET_NEXT_REGION, ®ion); - } - } - s->mtd[nr] = NULL; - - /* Now bind each unique MTD as a normal client of this socket */ - for (i = 0; i < nr; i++) { - strcpy(bind.dev_info, s->mtd[i]->module); - bind.function = 0; - if (ioctl(s->fd, DS_BIND_REQUEST, &bind) != 0) - log_message("CM: bind MTD '%s' to socket %d failed: %m", - (char *)bind.dev_info, sn); - } -} - -/*====================================================================*/ - -static void update_cis(socket_info_t *s) -{ - cisdump_t cis; - FILE *f = fopen(s->card->cis_file, "r"); - if (f == NULL) - log_message("CM: could not open '%s': %m", s->card->cis_file); - else { - cis.Length = fread(cis.Data, 1, CISTPL_MAX_CIS_SIZE, f); - fclose(f); - if (ioctl(s->fd, DS_REPLACE_CIS, &cis) != 0) - log_message("CM: could not replace CIS: %m"); - } -} - -/*====================================================================*/ - -static void do_insert(int sn) -{ - socket_info_t *s = &socket[sn]; - card_info_t *card; - device_info_t **dev; - bind_info_t *bind, **tail; - int i, j, ret; - - /* Already identified? */ - if (s->card && (s->card != blank_card)) - return; - - log_message("CM: initializing socket %d", sn); - card = lookup_card(sn); - /* Make sure we've learned something new before continuing */ - if (card == s->card) - return; - s->card = card; - card->refs++; - if (card->cis_file) - update_cis(s); - - dev = card->device; - - /* Set up MTD's */ - for (i = 0; i < card->bindings; i++) - if (dev[i]->needs_mtd) - break; - - if (i < card->bindings) - bind_mtd(sn); - - /* Install kernel modules */ - for (i = 0; i < card->bindings; i++) { - dev[i]->refs++; - for (j = 0; j < dev[i]->modules; j++) - install_module(dev[i]->module[j], dev[i]->opts[j]); - } - - /* Bind drivers by their dev_info identifiers */ - for (i = 0; i < card->bindings; i++) { - bind = calloc(1, sizeof(bind_info_t)); - strcpy((char *)bind->dev_info, (char *)dev[i]->dev_info); - if (strcmp(bind->dev_info, "cb_enabler") == 0) - bind->function = BIND_FN_ALL; - else - bind->function = card->dev_fn[i]; - if (ioctl(s->fd, DS_BIND_REQUEST, bind) != 0) { - if (errno == EBUSY) { - log_message("CM: '%s' already bound to socket %d", - (char *)bind->dev_info, sn); - } else { - log_message("CM: bind '%s' to socket %d failed: %m", - (char *)bind->dev_info, sn); - write_stab(); - return; - } - } - - for (ret = j = 0; j < 10; j++) { - ret = ioctl(s->fd, DS_GET_DEVICE_INFO, bind); - if ((ret == 0) || (errno != EAGAIN)) - break; - usleep(100000); - } - if (ret != 0) { - log_message("CM: get dev info on socket %d failed: %m", - sn); - ioctl(s->fd, DS_UNBIND_REQUEST, bind); - write_stab(); - return; - } - tail = &s->bind[i]; - while (ret == 0) { - bind_info_t *old; - if ((strlen(bind->name) > 3) && (bind->name[2] == '#')) - xlate_scsi_name(bind); - old = *tail = bind; tail = (bind_info_t **)&bind->next; - bind = (bind_info_t *)malloc(sizeof(bind_info_t)); - memcpy(bind, old, sizeof(bind_info_t)); - ret = ioctl(s->fd, DS_GET_NEXT_DEVICE, bind); - } - *tail = NULL; free(bind); - write_stab(); - } -} - -/*====================================================================*/ - -static void wait_for_pending(void) -{ - cs_status_t status; - int i; - status.Function = 0; - for (;;) { - usleep(100000); - for (i = 0; i < sockets; i++) - if ((ioctl(socket[i].fd, DS_GET_STATUS, &status) == 0) && (status.CardState & CS_EVENT_CARD_INSERTION)) - break; - if (i == sockets) - break; - } -} - -/*====================================================================*/ - -static void adjust_resources(void) -{ - adjust_list_t *al; - int ret; - char tmp[64]; - int fd = socket[0].fd; - - for (al = root_adjust; al; al = al->next) { - ret = ioctl(fd, DS_ADJUST_RESOURCE_INFO, &al->adj); - if (ret != 0) { - switch (al->adj.Resource) { - case RES_MEMORY_RANGE: - sprintf(tmp, "memory %#lx-%#lx", - al->adj.resource.memory.Base, - al->adj.resource.memory.Base + - al->adj.resource.memory.Size - 1); - break; - case RES_IO_RANGE: - sprintf(tmp, "IO ports %#x-%#x", - al->adj.resource.io.BasePort, - al->adj.resource.io.BasePort + - al->adj.resource.io.NumPorts - 1); - break; - case RES_IRQ: - sprintf(tmp, "irq %u", al->adj.resource.irq.IRQ); - break; - } - log_message("CM: could not adjust resource: %s: %s", tmp, strerror(errno)); - } - } -} - -/*====================================================================*/ - -static int init_sockets(void) -{ - int fd, i; - servinfo_t serv; - - major = lookup_dev("pcmcia"); - if (major < 0) { - if (major == -ENODEV) - log_message("CM: no pcmcia driver in /proc/devices"); - else - log_message("CM: could not open /proc/devices: %m"); - return -1; - } - - for (fd = -1, i = 0; i < MAX_SOCKS; i++) { - fd = open_sock(i, S_IFCHR|S_IREAD|S_IWRITE); - if (fd < 0) - break; - socket[i].fd = fd; - socket[i].state = 0; - } - - if ((fd < 0) && (errno != ENODEV) && (errno != ENOENT)) - log_message("CM: open_sock(socket %d) failed: %m", i); - sockets = i; - if (sockets == 0) { - log_message("CM: no sockets found!"); - return -1; - } else - log_message("CM: found %d sockets", sockets); - - if (ioctl(socket[0].fd, DS_GET_CARD_SERVICES_INFO, &serv) == 0) { - if (serv.Revision != CS_RELEASE_CODE) - log_message("CM: warning, Card Services release does not match kernel"); - } else { - log_message("CM: could not get CS revision info!"); - return -1; - } - adjust_resources(); - return 0; -} - -/*====================================================================*/ - -int cardmgr_call(void) -{ - int i, max_fd, ret, event; - struct timeval tv; - fd_set fds; - - stabfile = "/var/run/stab"; - - log_message("CM: cardmgr/hacked starting, version is " CS_RELEASE); - - if (load_config()) { - cardmgr_fail(); - return -1; - } - - if (init_sockets()) { - cardmgr_fail(); - return -1; - } - - /* If we've gotten this far, then clean up pid and stab at exit */ - write_stab(); - - for (i = max_fd = 0; i < sockets; i++) - max_fd = (socket[i].fd > max_fd) ? socket[i].fd : max_fd; - - /* First select() call: poll, don't wait */ - tv.tv_sec = tv.tv_usec = 0; - - /* Wait for sockets in setup-pending state to settle */ - wait_for_pending(); - - - FD_ZERO(&fds); - for (i = 0; i < sockets; i++) - FD_SET(socket[i].fd, &fds); - - if (select(max_fd+1, &fds, NULL, NULL, &tv) < 0) { - log_perror("CM: select fails"); - return -1; - } - - for (i = 0; i < sockets; i++) { - if (!FD_ISSET(socket[i].fd, &fds)) - continue; - ret = read(socket[i].fd, &event, 4); - if ((ret == -1) && (errno != EAGAIN)) - log_message("CM: read(%d): %m\n", i); - if (ret != 4) - continue; - - switch (event) { - case CS_EVENT_CARD_INSERTION: - case CS_EVENT_INSERTION_REQUEST: - socket[i].state |= SOCKET_PRESENT; - case CS_EVENT_CARD_RESET: - socket[i].state |= SOCKET_READY; - do_insert(i); - break; - case CS_EVENT_RESET_PHYSICAL: - socket[i].state &= ~SOCKET_READY; - break; - } - - } - - return 0; - -} diff --git a/mdk-stage1/pcmcia/cardmgr.h b/mdk-stage1/pcmcia/cardmgr.h deleted file mode 100644 index fe04044e5..000000000 --- a/mdk-stage1/pcmcia/cardmgr.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * cardmgr.h 1.35 2000/06/12 21:33:03 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#define MAX_SOCKS 8 -#define MAX_BINDINGS 4 -#define MAX_MODULES 4 - -typedef struct adjust_list_t { - adjust_t adj; - struct adjust_list_t *next; -} adjust_list_t; - -typedef struct func_ident_t { - u_char funcid; -} func_ident_t; - -typedef struct manfid_ident_t { - u_short manf; - u_short card; -} manfid_ident_t; - -typedef struct vers_ident_t { - int ns; - char *pi[4]; -} vers_ident_t; - -typedef struct tuple_ident_t { - cisdata_t code; - long ofs; - char *info; -} tuple_ident_t; - -typedef struct device_info_t { - dev_info_t dev_info; - int needs_mtd; - int modules; - char *module[MAX_MODULES]; - char *opts[MAX_MODULES]; - char *class; - int refs; - struct device_info_t *next; -} device_info_t; - -typedef struct card_info_t { - char *name; - enum { - VERS_1_IDENT=1, MANFID_IDENT, TUPLE_IDENT, FUNC_IDENT, - BLANK_IDENT, PCI_IDENT - } ident_type; - union { - vers_ident_t vers; - manfid_ident_t manfid; - tuple_ident_t tuple; - func_ident_t func; - } id; - int bindings; - device_info_t *device[MAX_BINDINGS]; - int dev_fn[MAX_BINDINGS]; - char *cis_file; - int refs; - struct card_info_t *next; -} card_info_t; - -typedef struct mtd_ident_t { - char *name; - enum { - JEDEC_MTD=1, DTYPE_MTD, DEFAULT_MTD - } mtd_type; - int dtype, jedec_mfr, jedec_info; - char *module, *opts; - int refs; - struct mtd_ident_t *next; -} mtd_ident_t; - -extern adjust_list_t *root_adjust; -extern device_info_t *root_device; -extern card_info_t *blank_card; -extern card_info_t *root_card, *root_func; -extern mtd_ident_t *root_mtd, *default_mtd; - -int parse_configfile(char *fn); diff --git a/mdk-stage1/pcmcia/cirrus.h b/mdk-stage1/pcmcia/cirrus.h deleted file mode 100644 index b7aad5894..000000000 --- a/mdk-stage1/pcmcia/cirrus.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * cirrus.h 1.9 2000/06/12 21:29:37 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#ifndef _LINUX_CIRRUS_H -#define _LINUX_CIRRUS_H - -#ifndef PCI_VENDOR_ID_CIRRUS -#define PCI_VENDOR_ID_CIRRUS 0x1013 -#endif -#ifndef PCI_DEVICE_ID_CIRRUS_6729 -#define PCI_DEVICE_ID_CIRRUS_6729 0x1100 -#endif -#ifndef PCI_DEVICE_ID_CIRRUS_6832 -#define PCI_DEVICE_ID_CIRRUS_6832 0x1110 -#endif - -#define PD67_MISC_CTL_1 0x16 /* Misc control 1 */ -#define PD67_FIFO_CTL 0x17 /* FIFO control */ -#define PD67_MISC_CTL_2 0x1E /* Misc control 2 */ -#define PD67_CHIP_INFO 0x1f /* Chip information */ -#define PD67_ATA_CTL 0x026 /* 6730: ATA control */ -#define PD67_EXT_INDEX 0x2e /* Extension index */ -#define PD67_EXT_DATA 0x2f /* Extension data */ - -#define pd67_ext_get(s, r) \ - (i365_set(s, PD67_EXT_INDEX, r), i365_get(s, PD67_EXT_DATA)) -#define pd67_ext_set(s, r, v) \ - (i365_set(s, PD67_EXT_INDEX, r), i365_set(s, PD67_EXT_DATA, v)) - -/* PD6722 extension registers -- indexed in PD67_EXT_INDEX */ -#define PD67_DATA_MASK0 0x01 /* Data mask 0 */ -#define PD67_DATA_MASK1 0x02 /* Data mask 1 */ -#define PD67_DMA_CTL 0x03 /* DMA control */ - -/* PD6730 extension registers -- indexed in PD67_EXT_INDEX */ -#define PD67_EXT_CTL_1 0x03 /* Extension control 1 */ -#define PD67_MEM_PAGE(n) ((n)+5) /* PCI window bits 31:24 */ -#define PD67_EXTERN_DATA 0x0a -#define PD67_MISC_CTL_3 0x25 -#define PD67_SMB_PWR_CTL 0x26 - -/* I/O window address offset */ -#define PD67_IO_OFF(w) (0x36+((w)<<1)) - -/* Timing register sets */ -#define PD67_TIME_SETUP(n) (0x3a + 3*(n)) -#define PD67_TIME_CMD(n) (0x3b + 3*(n)) -#define PD67_TIME_RECOV(n) (0x3c + 3*(n)) - -/* Flags for PD67_MISC_CTL_1 */ -#define PD67_MC1_5V_DET 0x01 /* 5v detect */ -#define PD67_MC1_MEDIA_ENA 0x01 /* 6730: Multimedia enable */ -#define PD67_MC1_VCC_3V 0x02 /* 3.3v Vcc */ -#define PD67_MC1_PULSE_MGMT 0x04 -#define PD67_MC1_PULSE_IRQ 0x08 -#define PD67_MC1_SPKR_ENA 0x10 -#define PD67_MC1_INPACK_ENA 0x80 - -/* Flags for PD67_FIFO_CTL */ -#define PD67_FIFO_EMPTY 0x80 - -/* Flags for PD67_MISC_CTL_2 */ -#define PD67_MC2_FREQ_BYPASS 0x01 -#define PD67_MC2_DYNAMIC_MODE 0x02 -#define PD67_MC2_SUSPEND 0x04 -#define PD67_MC2_5V_CORE 0x08 -#define PD67_MC2_LED_ENA 0x10 /* IRQ 12 is LED enable */ -#define PD67_MC2_FAST_PCI 0x10 /* 6729: PCI bus > 25 MHz */ -#define PD67_MC2_3STATE_BIT7 0x20 /* Floppy change bit */ -#define PD67_MC2_DMA_MODE 0x40 -#define PD67_MC2_IRQ15_RI 0x80 /* IRQ 15 is ring enable */ - -/* Flags for PD67_CHIP_INFO */ -#define PD67_INFO_SLOTS 0x20 /* 0 = 1 slot, 1 = 2 slots */ -#define PD67_INFO_CHIP_ID 0xc0 -#define PD67_INFO_REV 0x1c - -/* Fields in PD67_TIME_* registers */ -#define PD67_TIME_SCALE 0xc0 -#define PD67_TIME_SCALE_1 0x00 -#define PD67_TIME_SCALE_16 0x40 -#define PD67_TIME_SCALE_256 0x80 -#define PD67_TIME_SCALE_4096 0xc0 -#define PD67_TIME_MULT 0x3f - -/* Fields in PD67_DMA_CTL */ -#define PD67_DMA_MODE 0xc0 -#define PD67_DMA_OFF 0x00 -#define PD67_DMA_DREQ_INPACK 0x40 -#define PD67_DMA_DREQ_WP 0x80 -#define PD67_DMA_DREQ_BVD2 0xc0 -#define PD67_DMA_PULLUP 0x20 /* Disable socket pullups? */ - -/* Fields in PD67_EXT_CTL_1 */ -#define PD67_EC1_VCC_PWR_LOCK 0x01 -#define PD67_EC1_AUTO_PWR_CLEAR 0x02 -#define PD67_EC1_LED_ENA 0x04 -#define PD67_EC1_INV_CARD_IRQ 0x08 -#define PD67_EC1_INV_MGMT_IRQ 0x10 -#define PD67_EC1_PULLUP_CTL 0x20 - -/* Fields in PD67_EXTERN_DATA */ -#define PD67_EXD_VS1(s) (0x01 << ((s)<<1)) -#define PD67_EXD_VS2(s) (0x02 << ((s)<<1)) - -/* Fields in PD67_MISC_CTL_3 */ -#define PD67_MC3_IRQ_MASK 0x03 -#define PD67_MC3_IRQ_PCPCI 0x00 -#define PD67_MC3_IRQ_EXTERN 0x01 -#define PD67_MC3_IRQ_PCIWAY 0x02 -#define PD67_MC3_IRQ_PCI 0x03 -#define PD67_MC3_PWR_MASK 0x0c -#define PD67_MC3_PWR_SERIAL 0x00 -#define PD67_MC3_PWR_TI2202 0x08 -#define PD67_MC3_PWR_SMB 0x0c - -/* Register definitions for Cirrus PD6832 PCI-to-CardBus bridge */ - -/* PD6832 extension registers -- indexed in PD67_EXT_INDEX */ -#define PD68_EXT_CTL_2 0x0b -#define PD68_PCI_SPACE 0x22 -#define PD68_PCCARD_SPACE 0x23 -#define PD68_WINDOW_TYPE 0x24 -#define PD68_EXT_CSC 0x2e -#define PD68_MISC_CTL_4 0x2f -#define PD68_MISC_CTL_5 0x30 -#define PD68_MISC_CTL_6 0x31 - -/* Extra flags in PD67_MISC_CTL_3 */ -#define PD68_MC3_HW_SUSP 0x10 -#define PD68_MC3_MM_EXPAND 0x40 -#define PD68_MC3_MM_ARM 0x80 - -/* Bridge Control Register */ -#define PD6832_BCR_MGMT_IRQ_ENA 0x0800 - -/* Socket Number Register */ -#define PD6832_SOCKET_NUMBER 0x004c /* 8 bit */ - -/* Data structure for tracking vendor-specific state */ -typedef struct cirrus_state_t { - u_char misc1; /* PD67_MISC_CTL_1 */ - u_char misc2; /* PD67_MISC_CTL_2 */ - u_char ectl1; /* PD67_EXT_CTL_1 */ - u_char timer[6]; /* PD67_TIME_* */ -} cirrus_state_t; - -#define CIRRUS_PCIC_ID \ - IS_PD6729, IS_PD6730, IS_PD6832 - -#define CIRRUS_PCIC_INFO \ - { "Cirrus PD6729", IS_CIRRUS|IS_PCI, ID(CIRRUS, 6729) }, \ - { "Cirrus PD6730", IS_CIRRUS|IS_PCI, PCI_VENDOR_ID_CIRRUS, -1 }, \ - { "Cirrus PD6832", IS_CIRRUS|IS_CARDBUS, ID(CIRRUS, 6832) } - -#endif /* _LINUX_CIRRUS_H */ diff --git a/mdk-stage1/pcmcia/cistpl.h b/mdk-stage1/pcmcia/cistpl.h deleted file mode 100644 index a4b16a6e4..000000000 --- a/mdk-stage1/pcmcia/cistpl.h +++ /dev/null @@ -1,604 +0,0 @@ -/* - * cistpl.h 1.34 2000/06/19 23:18:12 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#ifndef _LINUX_CISTPL_H -#define _LINUX_CISTPL_H - -#define CISTPL_NULL 0x00 -#define CISTPL_DEVICE 0x01 -#define CISTPL_LONGLINK_CB 0x02 -#define CISTPL_INDIRECT 0x03 -#define CISTPL_CONFIG_CB 0x04 -#define CISTPL_CFTABLE_ENTRY_CB 0x05 -#define CISTPL_LONGLINK_MFC 0x06 -#define CISTPL_BAR 0x07 -#define CISTPL_PWR_MGMNT 0x08 -#define CISTPL_EXTDEVICE 0x09 -#define CISTPL_CHECKSUM 0x10 -#define CISTPL_LONGLINK_A 0x11 -#define CISTPL_LONGLINK_C 0x12 -#define CISTPL_LINKTARGET 0x13 -#define CISTPL_NO_LINK 0x14 -#define CISTPL_VERS_1 0x15 -#define CISTPL_ALTSTR 0x16 -#define CISTPL_DEVICE_A 0x17 -#define CISTPL_JEDEC_C 0x18 -#define CISTPL_JEDEC_A 0x19 -#define CISTPL_CONFIG 0x1a -#define CISTPL_CFTABLE_ENTRY 0x1b -#define CISTPL_DEVICE_OC 0x1c -#define CISTPL_DEVICE_OA 0x1d -#define CISTPL_DEVICE_GEO 0x1e -#define CISTPL_DEVICE_GEO_A 0x1f -#define CISTPL_MANFID 0x20 -#define CISTPL_FUNCID 0x21 -#define CISTPL_FUNCE 0x22 -#define CISTPL_SWIL 0x23 -#define CISTPL_END 0xff -/* Layer 2 tuples */ -#define CISTPL_VERS_2 0x40 -#define CISTPL_FORMAT 0x41 -#define CISTPL_GEOMETRY 0x42 -#define CISTPL_BYTEORDER 0x43 -#define CISTPL_DATE 0x44 -#define CISTPL_BATTERY 0x45 -#define CISTPL_FORMAT_A 0x47 -/* Layer 3 tuples */ -#define CISTPL_ORG 0x46 -#define CISTPL_SPCL 0x90 - -typedef struct cistpl_longlink_t { - u_int addr; -} cistpl_longlink_t; - -typedef struct cistpl_checksum_t { - u_short addr; - u_short len; - u_char sum; -} cistpl_checksum_t; - -#define CISTPL_MAX_FUNCTIONS 8 -#define CISTPL_MFC_ATTR 0x00 -#define CISTPL_MFC_COMMON 0x01 - -typedef struct cistpl_longlink_mfc_t { - u_char nfn; - struct { - u_char space; - u_int addr; - } fn[CISTPL_MAX_FUNCTIONS]; -} cistpl_longlink_mfc_t; - -#define CISTPL_MAX_ALTSTR_STRINGS 4 - -typedef struct cistpl_altstr_t { - u_char ns; - u_char ofs[CISTPL_MAX_ALTSTR_STRINGS]; - char str[254]; -} cistpl_altstr_t; - -#define CISTPL_DTYPE_NULL 0x00 -#define CISTPL_DTYPE_ROM 0x01 -#define CISTPL_DTYPE_OTPROM 0x02 -#define CISTPL_DTYPE_EPROM 0x03 -#define CISTPL_DTYPE_EEPROM 0x04 -#define CISTPL_DTYPE_FLASH 0x05 -#define CISTPL_DTYPE_SRAM 0x06 -#define CISTPL_DTYPE_DRAM 0x07 -#define CISTPL_DTYPE_FUNCSPEC 0x0d -#define CISTPL_DTYPE_EXTEND 0x0e - -#define CISTPL_MAX_DEVICES 4 - -typedef struct cistpl_device_t { - u_char ndev; - struct { - u_char type; - u_char wp; - u_int speed; - u_int size; - } dev[CISTPL_MAX_DEVICES]; -} cistpl_device_t; - -#define CISTPL_DEVICE_MWAIT 0x01 -#define CISTPL_DEVICE_3VCC 0x02 - -typedef struct cistpl_device_o_t { - u_char flags; - cistpl_device_t device; -} cistpl_device_o_t; - -#define CISTPL_VERS_1_MAX_PROD_STRINGS 4 - -typedef struct cistpl_vers_1_t { - u_char major; - u_char minor; - u_char ns; - u_char ofs[CISTPL_VERS_1_MAX_PROD_STRINGS]; - char str[254]; -} cistpl_vers_1_t; - -typedef struct cistpl_jedec_t { - u_char nid; - struct { - u_char mfr; - u_char info; - } id[CISTPL_MAX_DEVICES]; -} cistpl_jedec_t; - -typedef struct cistpl_manfid_t { - u_short manf; - u_short card; -} cistpl_manfid_t; - -#define CISTPL_FUNCID_MULTI 0x00 -#define CISTPL_FUNCID_MEMORY 0x01 -#define CISTPL_FUNCID_SERIAL 0x02 -#define CISTPL_FUNCID_PARALLEL 0x03 -#define CISTPL_FUNCID_FIXED 0x04 -#define CISTPL_FUNCID_VIDEO 0x05 -#define CISTPL_FUNCID_NETWORK 0x06 -#define CISTPL_FUNCID_AIMS 0x07 -#define CISTPL_FUNCID_SCSI 0x08 - -#define CISTPL_SYSINIT_POST 0x01 -#define CISTPL_SYSINIT_ROM 0x02 - -typedef struct cistpl_funcid_t { - u_char func; - u_char sysinit; -} cistpl_funcid_t; - -typedef struct cistpl_funce_t { - u_char type; - u_char data[0]; -} cistpl_funce_t; - -/*====================================================================== - - Modem Function Extension Tuples - -======================================================================*/ - -#define CISTPL_FUNCE_SERIAL_IF 0x00 -#define CISTPL_FUNCE_SERIAL_CAP 0x01 -#define CISTPL_FUNCE_SERIAL_SERV_DATA 0x02 -#define CISTPL_FUNCE_SERIAL_SERV_FAX 0x03 -#define CISTPL_FUNCE_SERIAL_SERV_VOICE 0x04 -#define CISTPL_FUNCE_SERIAL_CAP_DATA 0x05 -#define CISTPL_FUNCE_SERIAL_CAP_FAX 0x06 -#define CISTPL_FUNCE_SERIAL_CAP_VOICE 0x07 -#define CISTPL_FUNCE_SERIAL_IF_DATA 0x08 -#define CISTPL_FUNCE_SERIAL_IF_FAX 0x09 -#define CISTPL_FUNCE_SERIAL_IF_VOICE 0x0a - -/* UART identification */ -#define CISTPL_SERIAL_UART_8250 0x00 -#define CISTPL_SERIAL_UART_16450 0x01 -#define CISTPL_SERIAL_UART_16550 0x02 -#define CISTPL_SERIAL_UART_8251 0x03 -#define CISTPL_SERIAL_UART_8530 0x04 -#define CISTPL_SERIAL_UART_85230 0x05 - -/* UART capabilities */ -#define CISTPL_SERIAL_UART_SPACE 0x01 -#define CISTPL_SERIAL_UART_MARK 0x02 -#define CISTPL_SERIAL_UART_ODD 0x04 -#define CISTPL_SERIAL_UART_EVEN 0x08 -#define CISTPL_SERIAL_UART_5BIT 0x01 -#define CISTPL_SERIAL_UART_6BIT 0x02 -#define CISTPL_SERIAL_UART_7BIT 0x04 -#define CISTPL_SERIAL_UART_8BIT 0x08 -#define CISTPL_SERIAL_UART_1STOP 0x10 -#define CISTPL_SERIAL_UART_MSTOP 0x20 -#define CISTPL_SERIAL_UART_2STOP 0x40 - -typedef struct cistpl_serial_t { - u_char uart_type; - u_char uart_cap_0; - u_char uart_cap_1; -} cistpl_serial_t; - -typedef struct cistpl_modem_cap_t { - u_char flow; - u_char cmd_buf; - u_char rcv_buf_0, rcv_buf_1, rcv_buf_2; - u_char xmit_buf_0, xmit_buf_1, xmit_buf_2; -} cistpl_modem_cap_t; - -#define CISTPL_SERIAL_MOD_103 0x01 -#define CISTPL_SERIAL_MOD_V21 0x02 -#define CISTPL_SERIAL_MOD_V23 0x04 -#define CISTPL_SERIAL_MOD_V22 0x08 -#define CISTPL_SERIAL_MOD_212A 0x10 -#define CISTPL_SERIAL_MOD_V22BIS 0x20 -#define CISTPL_SERIAL_MOD_V26 0x40 -#define CISTPL_SERIAL_MOD_V26BIS 0x80 -#define CISTPL_SERIAL_MOD_V27BIS 0x01 -#define CISTPL_SERIAL_MOD_V29 0x02 -#define CISTPL_SERIAL_MOD_V32 0x04 -#define CISTPL_SERIAL_MOD_V32BIS 0x08 -#define CISTPL_SERIAL_MOD_V34 0x10 - -#define CISTPL_SERIAL_ERR_MNP2_4 0x01 -#define CISTPL_SERIAL_ERR_V42_LAPM 0x02 - -#define CISTPL_SERIAL_CMPR_V42BIS 0x01 -#define CISTPL_SERIAL_CMPR_MNP5 0x02 - -#define CISTPL_SERIAL_CMD_AT1 0x01 -#define CISTPL_SERIAL_CMD_AT2 0x02 -#define CISTPL_SERIAL_CMD_AT3 0x04 -#define CISTPL_SERIAL_CMD_MNP_AT 0x08 -#define CISTPL_SERIAL_CMD_V25BIS 0x10 -#define CISTPL_SERIAL_CMD_V25A 0x20 -#define CISTPL_SERIAL_CMD_DMCL 0x40 - -typedef struct cistpl_data_serv_t { - u_char max_data_0; - u_char max_data_1; - u_char modulation_0; - u_char modulation_1; - u_char error_control; - u_char compression; - u_char cmd_protocol; - u_char escape; - u_char encrypt; - u_char misc_features; - u_char ccitt_code[0]; -} cistpl_data_serv_t; - -typedef struct cistpl_fax_serv_t { - u_char max_data_0; - u_char max_data_1; - u_char modulation; - u_char encrypt; - u_char features_0; - u_char features_1; - u_char ccitt_code[0]; -} cistpl_fax_serv_t; - -typedef struct cistpl_voice_serv_t { - u_char max_data_0; - u_char max_data_1; -} cistpl_voice_serv_t; - -/*====================================================================== - - LAN Function Extension Tuples - -======================================================================*/ - -#define CISTPL_FUNCE_LAN_TECH 0x01 -#define CISTPL_FUNCE_LAN_SPEED 0x02 -#define CISTPL_FUNCE_LAN_MEDIA 0x03 -#define CISTPL_FUNCE_LAN_NODE_ID 0x04 -#define CISTPL_FUNCE_LAN_CONNECTOR 0x05 - -/* LAN technologies */ -#define CISTPL_LAN_TECH_ARCNET 0x01 -#define CISTPL_LAN_TECH_ETHERNET 0x02 -#define CISTPL_LAN_TECH_TOKENRING 0x03 -#define CISTPL_LAN_TECH_LOCALTALK 0x04 -#define CISTPL_LAN_TECH_FDDI 0x05 -#define CISTPL_LAN_TECH_ATM 0x06 -#define CISTPL_LAN_TECH_WIRELESS 0x07 - -typedef struct cistpl_lan_tech_t { - u_char tech; -} cistpl_lan_tech_t; - -typedef struct cistpl_lan_speed_t { - u_int speed; -} cistpl_lan_speed_t; - -/* LAN media definitions */ -#define CISTPL_LAN_MEDIA_UTP 0x01 -#define CISTPL_LAN_MEDIA_STP 0x02 -#define CISTPL_LAN_MEDIA_THIN_COAX 0x03 -#define CISTPL_LAN_MEDIA_THICK_COAX 0x04 -#define CISTPL_LAN_MEDIA_FIBER 0x05 -#define CISTPL_LAN_MEDIA_900MHZ 0x06 -#define CISTPL_LAN_MEDIA_2GHZ 0x07 -#define CISTPL_LAN_MEDIA_5GHZ 0x08 -#define CISTPL_LAN_MEDIA_DIFF_IR 0x09 -#define CISTPL_LAN_MEDIA_PTP_IR 0x0a - -typedef struct cistpl_lan_media_t { - u_char media; -} cistpl_lan_media_t; - -typedef struct cistpl_lan_node_id_t { - u_char nb; - u_char id[16]; -} cistpl_lan_node_id_t; - -typedef struct cistpl_lan_connector_t { - u_char code; -} cistpl_lan_connector_t; - -/*====================================================================== - - IDE Function Extension Tuples - -======================================================================*/ - -#define CISTPL_IDE_INTERFACE 0x01 - -typedef struct cistpl_ide_interface_t { - u_char interface; -} cistpl_ide_interface_t; - -/* First feature byte */ -#define CISTPL_IDE_SILICON 0x04 -#define CISTPL_IDE_UNIQUE 0x08 -#define CISTPL_IDE_DUAL 0x10 - -/* Second feature byte */ -#define CISTPL_IDE_HAS_SLEEP 0x01 -#define CISTPL_IDE_HAS_STANDBY 0x02 -#define CISTPL_IDE_HAS_IDLE 0x04 -#define CISTPL_IDE_LOW_POWER 0x08 -#define CISTPL_IDE_REG_INHIBIT 0x10 -#define CISTPL_IDE_HAS_INDEX 0x20 -#define CISTPL_IDE_IOIS16 0x40 - -typedef struct cistpl_ide_feature_t { - u_char feature1; - u_char feature2; -} cistpl_ide_feature_t; - -#define CISTPL_FUNCE_IDE_IFACE 0x01 -#define CISTPL_FUNCE_IDE_MASTER 0x02 -#define CISTPL_FUNCE_IDE_SLAVE 0x03 - -/*====================================================================== - - Configuration Table Entries - -======================================================================*/ - -#define CISTPL_BAR_SPACE 0x07 -#define CISTPL_BAR_SPACE_IO 0x10 -#define CISTPL_BAR_PREFETCH 0x20 -#define CISTPL_BAR_CACHEABLE 0x40 -#define CISTPL_BAR_1MEG_MAP 0x80 - -typedef struct cistpl_bar_t { - u_char attr; - u_int size; -} cistpl_bar_t; - -typedef struct cistpl_config_t { - u_char last_idx; - u_int base; - u_int rmask[4]; - u_char subtuples; -} cistpl_config_t; - -/* These are bits in the 'present' field, and indices in 'param' */ -#define CISTPL_POWER_VNOM 0 -#define CISTPL_POWER_VMIN 1 -#define CISTPL_POWER_VMAX 2 -#define CISTPL_POWER_ISTATIC 3 -#define CISTPL_POWER_IAVG 4 -#define CISTPL_POWER_IPEAK 5 -#define CISTPL_POWER_IDOWN 6 - -#define CISTPL_POWER_HIGHZ_OK 0x01 -#define CISTPL_POWER_HIGHZ_REQ 0x02 - -typedef struct cistpl_power_t { - u_char present; - u_char flags; - u_int param[7]; -} cistpl_power_t; - -typedef struct cistpl_timing_t { - u_int wait, waitscale; - u_int ready, rdyscale; - u_int reserved, rsvscale; -} cistpl_timing_t; - -#define CISTPL_IO_LINES_MASK 0x1f -#define CISTPL_IO_8BIT 0x20 -#define CISTPL_IO_16BIT 0x40 -#define CISTPL_IO_RANGE 0x80 - -#define CISTPL_IO_MAX_WIN 16 - -typedef struct cistpl_io_t { - u_char flags; - u_char nwin; - struct { - u_int base; - u_int len; - } win[CISTPL_IO_MAX_WIN]; -} cistpl_io_t; - -typedef struct cistpl_irq_t { - u_int IRQInfo1; - u_int IRQInfo2; -} cistpl_irq_t; - -#define CISTPL_MEM_MAX_WIN 8 - -typedef struct cistpl_mem_t { - u_char flags; - u_char nwin; - struct { - u_int len; - u_int card_addr; - u_int host_addr; - } win[CISTPL_MEM_MAX_WIN]; -} cistpl_mem_t; - -#define CISTPL_CFTABLE_DEFAULT 0x0001 -#define CISTPL_CFTABLE_BVDS 0x0002 -#define CISTPL_CFTABLE_WP 0x0004 -#define CISTPL_CFTABLE_RDYBSY 0x0008 -#define CISTPL_CFTABLE_MWAIT 0x0010 -#define CISTPL_CFTABLE_AUDIO 0x0800 -#define CISTPL_CFTABLE_READONLY 0x1000 -#define CISTPL_CFTABLE_PWRDOWN 0x2000 - -typedef struct cistpl_cftable_entry_t { - u_char index; - u_short flags; - u_char interface; - cistpl_power_t vcc, vpp1, vpp2; - cistpl_timing_t timing; - cistpl_io_t io; - cistpl_irq_t irq; - cistpl_mem_t mem; - u_char subtuples; -} cistpl_cftable_entry_t; - -#define CISTPL_CFTABLE_MASTER 0x000100 -#define CISTPL_CFTABLE_INVALIDATE 0x000200 -#define CISTPL_CFTABLE_VGA_PALETTE 0x000400 -#define CISTPL_CFTABLE_PARITY 0x000800 -#define CISTPL_CFTABLE_WAIT 0x001000 -#define CISTPL_CFTABLE_SERR 0x002000 -#define CISTPL_CFTABLE_FAST_BACK 0x004000 -#define CISTPL_CFTABLE_BINARY_AUDIO 0x010000 -#define CISTPL_CFTABLE_PWM_AUDIO 0x020000 - -typedef struct cistpl_cftable_entry_cb_t { - u_char index; - u_int flags; - cistpl_power_t vcc, vpp1, vpp2; - u_char io; - cistpl_irq_t irq; - u_char mem; - u_char subtuples; -} cistpl_cftable_entry_cb_t; - -typedef struct cistpl_device_geo_t { - u_char ngeo; - struct { - u_char buswidth; - u_int erase_block; - u_int read_block; - u_int write_block; - u_int partition; - u_int interleave; - } geo[CISTPL_MAX_DEVICES]; -} cistpl_device_geo_t; - -typedef struct cistpl_vers_2_t { - u_char vers; - u_char comply; - u_short dindex; - u_char vspec8, vspec9; - u_char nhdr; - u_char vendor, info; - char str[244]; -} cistpl_vers_2_t; - -typedef struct cistpl_org_t { - u_char data_org; - char desc[30]; -} cistpl_org_t; - -#define CISTPL_ORG_FS 0x00 -#define CISTPL_ORG_APPSPEC 0x01 -#define CISTPL_ORG_XIP 0x02 - -typedef struct cistpl_format_t { - u_char type; - u_char edc; - u_int offset; - u_int length; -} cistpl_format_t; - -#define CISTPL_FORMAT_DISK 0x00 -#define CISTPL_FORMAT_MEM 0x01 - -#define CISTPL_EDC_NONE 0x00 -#define CISTPL_EDC_CKSUM 0x01 -#define CISTPL_EDC_CRC 0x02 -#define CISTPL_EDC_PCC 0x03 - -typedef union cisparse_t { - cistpl_device_t device; - cistpl_checksum_t checksum; - cistpl_longlink_t longlink; - cistpl_longlink_mfc_t longlink_mfc; - cistpl_vers_1_t version_1; - cistpl_altstr_t altstr; - cistpl_jedec_t jedec; - cistpl_manfid_t manfid; - cistpl_funcid_t funcid; - cistpl_funce_t funce; - cistpl_bar_t bar; - cistpl_config_t config; - cistpl_cftable_entry_t cftable_entry; - cistpl_cftable_entry_cb_t cftable_entry_cb; - cistpl_device_geo_t device_geo; - cistpl_vers_2_t vers_2; - cistpl_org_t org; - cistpl_format_t format; -} cisparse_t; - -typedef struct tuple_t { - u_int Attributes; - cisdata_t DesiredTuple; - u_int Flags; /* internal use */ - u_int LinkOffset; /* internal use */ - u_int CISOffset; /* internal use */ - cisdata_t TupleCode; - cisdata_t TupleLink; - cisdata_t TupleOffset; - cisdata_t TupleDataMax; - cisdata_t TupleDataLen; - cisdata_t *TupleData; -} tuple_t; - -/* Special cisdata_t value */ -#define RETURN_FIRST_TUPLE 0xff - -/* Attributes for tuple calls */ -#define TUPLE_RETURN_LINK 0x01 -#define TUPLE_RETURN_COMMON 0x02 - -/* For ValidateCIS */ -typedef struct cisinfo_t { - u_int Chains; -} cisinfo_t; - -#define CISTPL_MAX_CIS_SIZE 0x200 - -/* For ReplaceCIS */ -typedef struct cisdump_t { - u_int Length; - cisdata_t Data[CISTPL_MAX_CIS_SIZE]; -} cisdump_t; - -#endif /* LINUX_CISTPL_H */ diff --git a/mdk-stage1/pcmcia/config.h b/mdk-stage1/pcmcia/config.h deleted file mode 100644 index 4ad8fe81a..000000000 --- a/mdk-stage1/pcmcia/config.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - Automatically generated by 'make config' -- don't edit! -*/ -#ifndef _PCMCIA_CONFIG_H -#define _PCMCIA_CONFIG_H - -#define AUTOCONF_INCLUDED -#define __IN_PCMCIA_PACKAGE__ - -#define LINUX "/home/gc/rpm/BUILD/linux" -#define PREFIX "/home/gc/rpm/tmp/kernel-2.4.0-build" -#define CC "/usr/bin/kgcc" -#define LD "ld" -#define KFLAGS "" -#define UFLAGS "" -#define PCDEBUG "" -#define USE_PM 1 -#define UNSAFE_TOOLS 1 -#define CONFIG_CARDBUS 1 -#undef CONFIG_PNP_BIOS -#define MODDIR "/lib/modules/2.4.0-6mdk" - -/* Options from /home/gc/rpm/BUILD/linux/.config */ -#define CONFIG_MODULES 1 -#undef CONFIG_PCMCIA -#undef CONFIG_SMP -#define CONFIG_PCI 1 -#define CONFIG_PCI_QUIRKS 1 -#define CONFIG_PM 1 -#define CONFIG_SCSI 1 -#define CONFIG_IEEE1394 1 -#define CONFIG_INET 1 -#define CONFIG_NET_PCMCIA_RADIO 1 -#define CONFIG_TR 1 -#undef CONFIG_NET_FASTROUTE -#undef CONFIG_NET_DIVERT -#define CONFIG_MODVERSIONS 1 -#define CONFIG_X86_L1_CACHE_BYTES 32 -#define CONFIG_X86_L1_CACHE_SHIFT 5 -#define CONFIG_PROC_FS 1 -#define ARCH "i386" -#define HOST_ARCH "i386" -#define AFLAGS "" -#define CONFIG_ISA 1 -#define CONFIG_UID16 1 - -#define UTS_RELEASE "2.4.0-6mdk" -#define UTS_VERSION "#1 Wed Jan 24 16:10:16 CET 2001" -#define LINUX_VERSION_CODE 132096 -#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) - -#define HAS_PROC_BUS 1 -#define SYSV_INIT 1 -#define RC_DIR "/etc/rc.d" -#undef HAS_FORMS -#define MANDIR "/usr/share/man" -#define XMANDIR "/usr/X11R6/man" - -#endif /* _PCMCIA_CONFIG_H */ diff --git a/mdk-stage1/pcmcia/cs.h b/mdk-stage1/pcmcia/cs.h deleted file mode 100644 index be6f92d65..000000000 --- a/mdk-stage1/pcmcia/cs.h +++ /dev/null @@ -1,464 +0,0 @@ -/* - * cs.h 1.71 2000/08/29 00:54:20 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#ifndef _LINUX_CS_H -#define _LINUX_CS_H - -/* For AccessConfigurationRegister */ -typedef struct conf_reg_t { - u_char Function; - u_int Action; - off_t Offset; - u_int Value; -} conf_reg_t; - -/* Actions */ -#define CS_READ 1 -#define CS_WRITE 2 - -/* for AdjustResourceInfo */ -typedef struct adjust_t { - u_int Action; - u_int Resource; - u_int Attributes; - union { - struct memory { - u_long Base; - u_long Size; - } memory; - struct io { - ioaddr_t BasePort; - ioaddr_t NumPorts; - u_int IOAddrLines; - } io; - struct irq { - u_int IRQ; - } irq; - } resource; -} adjust_t; - -/* Action field */ -#define REMOVE_MANAGED_RESOURCE 1 -#define ADD_MANAGED_RESOURCE 2 -#define GET_FIRST_MANAGED_RESOURCE 3 -#define GET_NEXT_MANAGED_RESOURCE 4 -/* Resource field */ -#define RES_MEMORY_RANGE 1 -#define RES_IO_RANGE 2 -#define RES_IRQ 3 -/* Attribute field */ -#define RES_IRQ_TYPE 0x03 -#define RES_IRQ_TYPE_EXCLUSIVE 0 -#define RES_IRQ_TYPE_TIME 1 -#define RES_IRQ_TYPE_DYNAMIC 2 -#define RES_IRQ_CSC 0x04 -#define RES_SHARED 0x08 -#define RES_RESERVED 0x10 -#define RES_ALLOCATED 0x20 -#define RES_REMOVED 0x40 - -typedef struct servinfo_t { - char Signature[2]; - u_int Count; - u_int Revision; - u_int CSLevel; - char *VendorString; -} servinfo_t; - -typedef struct event_callback_args_t { - client_handle_t client_handle; - void *info; - void *mtdrequest; - void *buffer; - void *misc; - void *client_data; - struct bus_operations *bus; -} event_callback_args_t; - -/* for GetConfigurationInfo */ -typedef struct config_info_t { - u_char Function; - u_int Attributes; - u_int Vcc, Vpp1, Vpp2; - u_int IntType; - u_int ConfigBase; - u_char Status, Pin, Copy, Option, ExtStatus; - u_int Present; - u_int CardValues; - u_int AssignedIRQ; - u_int IRQAttributes; - ioaddr_t BasePort1; - ioaddr_t NumPorts1; - u_int Attributes1; - ioaddr_t BasePort2; - ioaddr_t NumPorts2; - u_int Attributes2; - u_int IOAddrLines; -} config_info_t; - -/* For CardValues field */ -#define CV_OPTION_VALUE 0x01 -#define CV_STATUS_VALUE 0x02 -#define CV_PIN_REPLACEMENT 0x04 -#define CV_COPY_VALUE 0x08 -#define CV_EXT_STATUS 0x10 - -/* For GetFirst/NextClient */ -typedef struct client_req_t { - socket_t Socket; - u_int Attributes; -} client_req_t; - -#define CLIENT_THIS_SOCKET 0x01 - -/* For RegisterClient */ -typedef struct client_reg_t { - dev_info_t *dev_info; - u_int Attributes; - u_int EventMask; - int (*event_handler)(event_t event, int priority, - event_callback_args_t *); - event_callback_args_t event_callback_args; - u_int Version; -} client_reg_t; - -/* ModifyConfiguration */ -typedef struct modconf_t { - u_int Attributes; - u_int Vcc, Vpp1, Vpp2; -} modconf_t; - -/* Attributes for ModifyConfiguration */ -#define CONF_IRQ_CHANGE_VALID 0x100 -#define CONF_VCC_CHANGE_VALID 0x200 -#define CONF_VPP1_CHANGE_VALID 0x400 -#define CONF_VPP2_CHANGE_VALID 0x800 - -/* For RequestConfiguration */ -typedef struct config_req_t { - u_int Attributes; - u_int Vcc, Vpp1, Vpp2; - u_int IntType; - u_int ConfigBase; - u_char Status, Pin, Copy, ExtStatus; - u_char ConfigIndex; - u_int Present; -} config_req_t; - -/* Attributes for RequestConfiguration */ -#define CONF_ENABLE_IRQ 0x01 -#define CONF_ENABLE_DMA 0x02 -#define CONF_ENABLE_SPKR 0x04 -#define CONF_VALID_CLIENT 0x100 - -/* IntType field */ -#define INT_MEMORY 0x01 -#define INT_MEMORY_AND_IO 0x02 -#define INT_CARDBUS 0x04 - -/* For RequestIO and ReleaseIO */ -typedef struct io_req_t { - ioaddr_t BasePort1; - ioaddr_t NumPorts1; - u_int Attributes1; - ioaddr_t BasePort2; - ioaddr_t NumPorts2; - u_int Attributes2; - u_int IOAddrLines; -} io_req_t; - -/* Attributes for RequestIO and ReleaseIO */ -#define IO_SHARED 0x01 -#define IO_FIRST_SHARED 0x02 -#define IO_FORCE_ALIAS_ACCESS 0x04 -#define IO_DATA_PATH_WIDTH 0x18 -#define IO_DATA_PATH_WIDTH_8 0x00 -#define IO_DATA_PATH_WIDTH_16 0x08 -#define IO_DATA_PATH_WIDTH_AUTO 0x10 - -/* For RequestIRQ and ReleaseIRQ */ -typedef struct irq_req_t { - u_int Attributes; - u_int AssignedIRQ; - u_int IRQInfo1, IRQInfo2; - void *Handler; - void *Instance; -} irq_req_t; - -/* Attributes for RequestIRQ and ReleaseIRQ */ -#define IRQ_TYPE 0x03 -#define IRQ_TYPE_EXCLUSIVE 0x00 -#define IRQ_TYPE_TIME 0x01 -#define IRQ_TYPE_DYNAMIC_SHARING 0x02 -#define IRQ_FORCED_PULSE 0x04 -#define IRQ_FIRST_SHARED 0x08 -#define IRQ_HANDLE_PRESENT 0x10 -#define IRQ_PULSE_ALLOCATED 0x100 - -/* Bits in IRQInfo1 field */ -#define IRQ_MASK 0x0f -#define IRQ_NMI_ID 0x01 -#define IRQ_IOCK_ID 0x02 -#define IRQ_BERR_ID 0x04 -#define IRQ_VEND_ID 0x08 -#define IRQ_INFO2_VALID 0x10 -#define IRQ_LEVEL_ID 0x20 -#define IRQ_PULSE_ID 0x40 -#define IRQ_SHARE_ID 0x80 - -typedef struct eventmask_t { - u_int Attributes; - u_int EventMask; -} eventmask_t; - -#define CONF_EVENT_MASK_VALID 0x01 - -/* Configuration registers present */ -#define PRESENT_OPTION 0x001 -#define PRESENT_STATUS 0x002 -#define PRESENT_PIN_REPLACE 0x004 -#define PRESENT_COPY 0x008 -#define PRESENT_EXT_STATUS 0x010 -#define PRESENT_IOBASE_0 0x020 -#define PRESENT_IOBASE_1 0x040 -#define PRESENT_IOBASE_2 0x080 -#define PRESENT_IOBASE_3 0x100 -#define PRESENT_IOSIZE 0x200 - -/* For GetMemPage, MapMemPage */ -typedef struct memreq_t { - u_int CardOffset; - page_t Page; -} memreq_t; - -/* For ModifyWindow */ -typedef struct modwin_t { - u_int Attributes; - u_int AccessSpeed; -} modwin_t; - -/* For RequestWindow */ -typedef struct win_req_t { - u_int Attributes; - u_long Base; - u_int Size; - u_int AccessSpeed; -} win_req_t; - -/* Attributes for RequestWindow */ -#define WIN_ADDR_SPACE 0x0001 -#define WIN_ADDR_SPACE_MEM 0x0000 -#define WIN_ADDR_SPACE_IO 0x0001 -#define WIN_MEMORY_TYPE 0x0002 -#define WIN_MEMORY_TYPE_CM 0x0000 -#define WIN_MEMORY_TYPE_AM 0x0002 -#define WIN_ENABLE 0x0004 -#define WIN_DATA_WIDTH 0x0018 -#define WIN_DATA_WIDTH_8 0x0000 -#define WIN_DATA_WIDTH_16 0x0008 -#define WIN_DATA_WIDTH_32 0x0010 -#define WIN_PAGED 0x0020 -#define WIN_SHARED 0x0040 -#define WIN_FIRST_SHARED 0x0080 -#define WIN_USE_WAIT 0x0100 -#define WIN_STRICT_ALIGN 0x0200 -#define WIN_MAP_BELOW_1MB 0x0400 -#define WIN_PREFETCH 0x0800 -#define WIN_CACHEABLE 0x1000 -#define WIN_BAR_MASK 0xe000 -#define WIN_BAR_SHIFT 13 - -/* Attributes for RegisterClient */ -#define INFO_MASTER_CLIENT 0x01 -#define INFO_IO_CLIENT 0x02 -#define INFO_MTD_CLIENT 0x04 -#define INFO_MEM_CLIENT 0x08 -#define MAX_NUM_CLIENTS 3 - -#define INFO_CARD_SHARE 0x10 -#define INFO_CARD_EXCL 0x20 - -typedef struct cs_status_t { - u_char Function; - event_t CardState; - event_t SocketState; -} cs_status_t; - -typedef struct error_info_t { - int func; - int retcode; -} error_info_t; - -/* Special stuff for binding drivers to sockets */ -typedef struct bind_req_t { - socket_t Socket; - u_char Function; - dev_info_t *dev_info; -} bind_req_t; - -/* Flag to bind to all functions */ -#define BIND_FN_ALL 0xff - -typedef struct mtd_bind_t { - socket_t Socket; - u_int Attributes; - u_int CardOffset; - dev_info_t *dev_info; -} mtd_bind_t; - -/* Events */ -#define CS_EVENT_PRI_LOW 0 -#define CS_EVENT_PRI_HIGH 1 - -#define CS_EVENT_WRITE_PROTECT 0x000001 -#define CS_EVENT_CARD_LOCK 0x000002 -#define CS_EVENT_CARD_INSERTION 0x000004 -#define CS_EVENT_CARD_REMOVAL 0x000008 -#define CS_EVENT_BATTERY_DEAD 0x000010 -#define CS_EVENT_BATTERY_LOW 0x000020 -#define CS_EVENT_READY_CHANGE 0x000040 -#define CS_EVENT_CARD_DETECT 0x000080 -#define CS_EVENT_RESET_REQUEST 0x000100 -#define CS_EVENT_RESET_PHYSICAL 0x000200 -#define CS_EVENT_CARD_RESET 0x000400 -#define CS_EVENT_REGISTRATION_COMPLETE 0x000800 -#define CS_EVENT_RESET_COMPLETE 0x001000 -#define CS_EVENT_PM_SUSPEND 0x002000 -#define CS_EVENT_PM_RESUME 0x004000 -#define CS_EVENT_INSERTION_REQUEST 0x008000 -#define CS_EVENT_EJECTION_REQUEST 0x010000 -#define CS_EVENT_MTD_REQUEST 0x020000 -#define CS_EVENT_ERASE_COMPLETE 0x040000 -#define CS_EVENT_REQUEST_ATTENTION 0x080000 -#define CS_EVENT_CB_DETECT 0x100000 -#define CS_EVENT_3VCARD 0x200000 -#define CS_EVENT_XVCARD 0x400000 - -/* Return codes */ -#define CS_SUCCESS 0x00 -#define CS_BAD_ADAPTER 0x01 -#define CS_BAD_ATTRIBUTE 0x02 -#define CS_BAD_BASE 0x03 -#define CS_BAD_EDC 0x04 -#define CS_BAD_IRQ 0x06 -#define CS_BAD_OFFSET 0x07 -#define CS_BAD_PAGE 0x08 -#define CS_READ_FAILURE 0x09 -#define CS_BAD_SIZE 0x0a -#define CS_BAD_SOCKET 0x0b -#define CS_BAD_TYPE 0x0d -#define CS_BAD_VCC 0x0e -#define CS_BAD_VPP 0x0f -#define CS_BAD_WINDOW 0x11 -#define CS_WRITE_FAILURE 0x12 -#define CS_NO_CARD 0x14 -#define CS_UNSUPPORTED_FUNCTION 0x15 -#define CS_UNSUPPORTED_MODE 0x16 -#define CS_BAD_SPEED 0x17 -#define CS_BUSY 0x18 -#define CS_GENERAL_FAILURE 0x19 -#define CS_WRITE_PROTECTED 0x1a -#define CS_BAD_ARG_LENGTH 0x1b -#define CS_BAD_ARGS 0x1c -#define CS_CONFIGURATION_LOCKED 0x1d -#define CS_IN_USE 0x1e -#define CS_NO_MORE_ITEMS 0x1f -#define CS_OUT_OF_RESOURCE 0x20 -#define CS_BAD_HANDLE 0x21 - -#define CS_BAD_TUPLE 0x40 - -#ifdef __KERNEL__ - -/* - * Calls to set up low-level "Socket Services" drivers - */ - -typedef int (*ss_entry_t)(u_int sock, u_int cmd, void *arg); -extern int register_ss_entry(int nsock, ss_entry_t entry); -extern void unregister_ss_entry(ss_entry_t entry); - -/* - * The main Card Services entry point - */ - -enum service { - AccessConfigurationRegister, AddSocketServices, - AdjustResourceInfo, CheckEraseQueue, CloseMemory, CopyMemory, - DeregisterClient, DeregisterEraseQueue, GetCardServicesInfo, - GetClientInfo, GetConfigurationInfo, GetEventMask, - GetFirstClient, GetFirstPartion, GetFirstRegion, GetFirstTuple, - GetNextClient, GetNextPartition, GetNextRegion, GetNextTuple, - GetStatus, GetTupleData, MapLogSocket, MapLogWindow, MapMemPage, - MapPhySocket, MapPhyWindow, ModifyConfiguration, ModifyWindow, - OpenMemory, ParseTuple, ReadMemory, RegisterClient, - RegisterEraseQueue, RegisterMTD, RegisterTimer, - ReleaseConfiguration, ReleaseExclusive, ReleaseIO, ReleaseIRQ, - ReleaseSocketMask, ReleaseWindow, ReplaceSocketServices, - RequestConfiguration, RequestExclusive, RequestIO, RequestIRQ, - RequestSocketMask, RequestWindow, ResetCard, ReturnSSEntry, - SetEventMask, SetRegion, ValidateCIS, VendorSpecific, - WriteMemory, BindDevice, BindMTD, ReportError, - SuspendCard, ResumeCard, EjectCard, InsertCard, ReplaceCIS, - GetFirstWindow, GetNextWindow, GetMemPage -}; - -#ifdef IN_CARD_SERVICES -extern int CardServices(int func, void *a1, void *a2, void *a3); -#else -extern int CardServices(int func, ...); -#endif - -#ifdef __BEOS__ -#define SS_MODULE_NAME(s) ("busses/pcmcia/" s "/v1") -#define MTD_MODULE_NAME(s) ("busses/pcmcia/" s "/v1") -#define CS_CLIENT_MODULE_NAME "bus_managers/pcmcia_cs/client/v1" -typedef struct cs_client_module_info { - bus_manager_info binfo; - int (*_CardServices)(int, ...); - int (*_MTDHelperEntry)(int, ...); - void (*_add_timer)(struct timer_list *); - void (*_del_timer)(struct timer_list *); -} cs_client_module_info; -#define CS_SOCKET_MODULE_NAME "bus_managers/pcmcia_cs/socket/v1" -typedef struct cs_socket_module_info { - bus_manager_info binfo; - int (*_register_ss_entry)(int, ss_entry_t); - void (*_unregister_ss_entry)(ss_entry_t); - void (*_add_timer)(struct timer_list *); - void (*_del_timer)(struct timer_list *); - int (*register_resource)(int, u_long, u_long); - int (*release_resource)(int, u_long, u_long); - int (*check_resource)(int, u_long, u_long); -} cs_socket_module_info; -#endif - -#endif /* __KERNEL__ */ - -#endif /* _LINUX_CS_H */ diff --git a/mdk-stage1/pcmcia/cs_types.h b/mdk-stage1/pcmcia/cs_types.h deleted file mode 100644 index 40cf84b51..000000000 --- a/mdk-stage1/pcmcia/cs_types.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * cs_types.h 1.18 2000/06/12 21:55:40 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#ifndef _LINUX_CS_TYPES_H -#define _LINUX_CS_TYPES_H - -#ifdef __linux__ -#ifdef __KERNEL__ -#include -#else -#include -#endif -#endif - -typedef u_short socket_t; -typedef u_short ioaddr_t; -typedef u_int event_t; -typedef u_char cisdata_t; -typedef u_short page_t; - -struct client_t; -typedef struct client_t *client_handle_t; - -struct window_t; -typedef struct window_t *window_handle_t; - -struct region_t; -typedef struct region_t *memory_handle_t; - -struct eraseq_t; -typedef struct eraseq_t *eraseq_handle_t; - -#ifndef DEV_NAME_LEN -#define DEV_NAME_LEN 32 -#endif - -typedef char dev_info_t[DEV_NAME_LEN]; - -#endif /* _LINUX_CS_TYPES_H */ diff --git a/mdk-stage1/pcmcia/driver_ops.h b/mdk-stage1/pcmcia/driver_ops.h deleted file mode 100644 index 00cde3336..000000000 --- a/mdk-stage1/pcmcia/driver_ops.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * driver_ops.h 1.15 2000/06/12 21:55:40 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#ifndef _LINUX_DRIVER_OPS_H -#define _LINUX_DRIVER_OPS_H - -#ifndef DEV_NAME_LEN -#define DEV_NAME_LEN 32 -#endif - -#ifdef __KERNEL__ - -typedef struct dev_node_t { - char dev_name[DEV_NAME_LEN]; - u_short major, minor; - struct dev_node_t *next; -} dev_node_t; - -typedef struct dev_locator_t { - enum { LOC_ISA, LOC_PCI } bus; - union { - struct { - u_short io_base_1, io_base_2; - u_long mem_base; - u_char irq, dma; - } isa; - struct { - u_char bus; - u_char devfn; - } pci; - } b; -} dev_locator_t; - -typedef struct driver_operations { - char *name; - dev_node_t *(*attach) (dev_locator_t *loc); - void (*suspend) (dev_node_t *dev); - void (*resume) (dev_node_t *dev); - void (*detach) (dev_node_t *dev); -} driver_operations; - -int register_driver(struct driver_operations *ops); -void unregister_driver(struct driver_operations *ops); - -#ifdef __BEOS__ -#define CB_ENABLER_MODULE_NAME "bus_managers/cb_enabler/v1" -typedef struct cb_enabler_module_info { - bus_manager_info binfo; - int (*register_driver)(struct driver_operations *ops); - void (*unregister_driver)(struct driver_operations *ops); -} cb_enabler_module_info; -#endif /* __BEOS__ */ - -#endif /* __KERNEL__ */ - -#endif /* _LINUX_DRIVER_OPS_H */ diff --git a/mdk-stage1/pcmcia/ds.h b/mdk-stage1/pcmcia/ds.h deleted file mode 100644 index 975ba596a..000000000 --- a/mdk-stage1/pcmcia/ds.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * ds.h 1.56 2000/06/12 21:55:40 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#ifndef _LINUX_DS_H -#define _LINUX_DS_H - -#include -#include - -typedef struct tuple_parse_t { - tuple_t tuple; - cisdata_t data[255]; - cisparse_t parse; -} tuple_parse_t; - -typedef struct win_info_t { - window_handle_t handle; - win_req_t window; - memreq_t map; -} win_info_t; - -typedef struct bind_info_t { - dev_info_t dev_info; - u_char function; - struct dev_link_t *instance; - char name[DEV_NAME_LEN]; - u_short major, minor; - void *next; -} bind_info_t; - -typedef struct mtd_info_t { - dev_info_t dev_info; - u_int Attributes; - u_int CardOffset; -} mtd_info_t; - -typedef union ds_ioctl_arg_t { - servinfo_t servinfo; - adjust_t adjust; - config_info_t config; - tuple_t tuple; - tuple_parse_t tuple_parse; - client_req_t client_req; - cs_status_t status; - conf_reg_t conf_reg; - cisinfo_t cisinfo; - region_info_t region; - bind_info_t bind_info; - mtd_info_t mtd_info; - win_info_t win_info; - cisdump_t cisdump; -} ds_ioctl_arg_t; - -#define DS_GET_CARD_SERVICES_INFO _IOR ('d', 1, servinfo_t) -#define DS_ADJUST_RESOURCE_INFO _IOWR('d', 2, adjust_t) -#define DS_GET_CONFIGURATION_INFO _IOWR('d', 3, config_info_t) -#define DS_GET_FIRST_TUPLE _IOWR('d', 4, tuple_t) -#define DS_GET_NEXT_TUPLE _IOWR('d', 5, tuple_t) -#define DS_GET_TUPLE_DATA _IOWR('d', 6, tuple_parse_t) -#define DS_PARSE_TUPLE _IOWR('d', 7, tuple_parse_t) -#define DS_RESET_CARD _IO ('d', 8) -#define DS_GET_STATUS _IOWR('d', 9, cs_status_t) -#define DS_ACCESS_CONFIGURATION_REGISTER _IOWR('d', 10, conf_reg_t) -#define DS_VALIDATE_CIS _IOR ('d', 11, cisinfo_t) -#define DS_SUSPEND_CARD _IO ('d', 12) -#define DS_RESUME_CARD _IO ('d', 13) -#define DS_EJECT_CARD _IO ('d', 14) -#define DS_INSERT_CARD _IO ('d', 15) -#define DS_GET_FIRST_REGION _IOWR('d', 16, region_info_t) -#define DS_GET_NEXT_REGION _IOWR('d', 17, region_info_t) -#define DS_REPLACE_CIS _IOWR('d', 18, cisdump_t) -#define DS_GET_FIRST_WINDOW _IOR ('d', 19, win_info_t) -#define DS_GET_NEXT_WINDOW _IOWR('d', 20, win_info_t) -#define DS_GET_MEM_PAGE _IOWR('d', 21, win_info_t) - -#define DS_BIND_REQUEST _IOWR('d', 60, bind_info_t) -#define DS_GET_DEVICE_INFO _IOWR('d', 61, bind_info_t) -#define DS_GET_NEXT_DEVICE _IOWR('d', 62, bind_info_t) -#define DS_UNBIND_REQUEST _IOW ('d', 63, bind_info_t) -#define DS_BIND_MTD _IOWR('d', 64, mtd_info_t) - -#ifdef __KERNEL__ - -typedef struct dev_link_t { - dev_node_t *dev; - u_int state, open; - wait_queue_head_t pending; - struct timer_list release; - client_handle_t handle; - io_req_t io; - irq_req_t irq; - config_req_t conf; - window_handle_t win; - void *priv; - struct dev_link_t *next; -} dev_link_t; - -/* Flags for device state */ -#define DEV_PRESENT 0x01 -#define DEV_CONFIG 0x02 -#define DEV_STALE_CONFIG 0x04 /* release on close */ -#define DEV_STALE_LINK 0x08 /* detach on release */ -#define DEV_CONFIG_PENDING 0x10 -#define DEV_RELEASE_PENDING 0x20 -#define DEV_SUSPEND 0x40 -#define DEV_BUSY 0x80 - -#define DEV_OK(l) \ - ((l) && ((l->state & ~DEV_BUSY) == (DEV_CONFIG|DEV_PRESENT))) - -int register_pccard_driver(dev_info_t *dev_info, - dev_link_t *(*attach)(void), - void (*detach)(dev_link_t *)); - -int unregister_pccard_driver(dev_info_t *dev_info); - -#define register_pcmcia_driver register_pccard_driver -#define unregister_pcmcia_driver unregister_pccard_driver - -#ifdef __BEOS__ -#define DS_MODULE_NAME "bus_managers/pcmcia_ds/v1" -typedef struct ds_module_info { - bus_manager_info binfo; - int (*_register_pccard_driver)(dev_info_t *, - dev_link_t *(*)(void), - void (*)(dev_link_t *)); - int (*_unregister_pccard_driver)(dev_info_t *); - struct driver_info_t **root_driver; - int *sockets; - struct socket_info_t **socket_table; - sem_id *list_sem; -} ds_module_info; -#endif /* __BEOS__ */ - -#endif /* __KERNEL__ */ - -#endif /* _LINUX_DS_H */ diff --git a/mdk-stage1/pcmcia/i82365.h b/mdk-stage1/pcmcia/i82365.h deleted file mode 100644 index 15e8e2540..000000000 --- a/mdk-stage1/pcmcia/i82365.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - * i82365.h 1.20 2000/07/20 23:00:27 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#ifndef _LINUX_I82365_H -#define _LINUX_I82365_H - -/* register definitions for the Intel 82365SL PCMCIA controller */ - -/* Offsets for PCIC registers */ -#define I365_IDENT 0x00 /* Identification and revision */ -#define I365_STATUS 0x01 /* Interface status */ -#define I365_POWER 0x02 /* Power and RESETDRV control */ -#define I365_INTCTL 0x03 /* Interrupt and general control */ -#define I365_CSC 0x04 /* Card status change */ -#define I365_CSCINT 0x05 /* Card status change interrupt control */ -#define I365_ADDRWIN 0x06 /* Address window enable */ -#define I365_IOCTL 0x07 /* I/O control */ -#define I365_GENCTL 0x16 /* Card detect and general control */ -#define I365_GBLCTL 0x1E /* Global control register */ - -/* Offsets for I/O and memory window registers */ -#define I365_IO(map) (0x08+((map)<<2)) -#define I365_MEM(map) (0x10+((map)<<3)) -#define I365_W_START 0 -#define I365_W_STOP 2 -#define I365_W_OFF 4 - -/* Flags for I365_STATUS */ -#define I365_CS_BVD1 0x01 -#define I365_CS_STSCHG 0x01 -#define I365_CS_BVD2 0x02 -#define I365_CS_SPKR 0x02 -#define I365_CS_DETECT 0x0C -#define I365_CS_WRPROT 0x10 -#define I365_CS_READY 0x20 /* Inverted */ -#define I365_CS_POWERON 0x40 -#define I365_CS_GPI 0x80 - -/* Flags for I365_POWER */ -#define I365_PWR_OFF 0x00 /* Turn off the socket */ -#define I365_PWR_OUT 0x80 /* Output enable */ -#define I365_PWR_NORESET 0x40 /* Disable RESETDRV on resume */ -#define I365_PWR_AUTO 0x20 /* Auto pwr switch enable */ -#define I365_VCC_MASK 0x18 /* Mask for turning off Vcc */ -/* There are different layouts for B-step and DF-step chips: the B - step has independent Vpp1/Vpp2 control, and the DF step has only - Vpp1 control, plus 3V control */ -#define I365_VCC_5V 0x10 /* Vcc = 5.0v */ -#define I365_VCC_3V 0x18 /* Vcc = 3.3v */ -#define I365_VPP2_MASK 0x0c /* Mask for turning off Vpp2 */ -#define I365_VPP2_5V 0x04 /* Vpp2 = 5.0v */ -#define I365_VPP2_12V 0x08 /* Vpp2 = 12.0v */ -#define I365_VPP1_MASK 0x03 /* Mask for turning off Vpp1 */ -#define I365_VPP1_5V 0x01 /* Vpp2 = 5.0v */ -#define I365_VPP1_12V 0x02 /* Vpp2 = 12.0v */ - -/* Flags for I365_INTCTL */ -#define I365_RING_ENA 0x80 -#define I365_PC_RESET 0x40 -#define I365_PC_IOCARD 0x20 -#define I365_INTR_ENA 0x10 -#define I365_IRQ_MASK 0x0F - -/* Flags for I365_CSC and I365_CSCINT*/ -#define I365_CSC_BVD1 0x01 -#define I365_CSC_STSCHG 0x01 -#define I365_CSC_BVD2 0x02 -#define I365_CSC_READY 0x04 -#define I365_CSC_DETECT 0x08 -#define I365_CSC_ANY 0x0F -#define I365_CSC_GPI 0x10 - -/* Flags for I365_ADDRWIN */ -#define I365_ADDR_MEMCS16 0x20 -#define I365_ENA_IO(map) (0x40 << (map)) -#define I365_ENA_MEM(map) (0x01 << (map)) - -/* Flags for I365_IOCTL */ -#define I365_IOCTL_MASK(map) (0x0F << (map<<2)) -#define I365_IOCTL_WAIT(map) (0x08 << (map<<2)) -#define I365_IOCTL_0WS(map) (0x04 << (map<<2)) -#define I365_IOCTL_IOCS16(map) (0x02 << (map<<2)) -#define I365_IOCTL_16BIT(map) (0x01 << (map<<2)) - -/* Flags for I365_GENCTL */ -#define I365_CTL_16DELAY 0x01 -#define I365_CTL_RESET 0x02 -#define I365_CTL_GPI_ENA 0x04 -#define I365_CTL_GPI_CTL 0x08 -#define I365_CTL_RESUME 0x10 -#define I365_CTL_SW_IRQ 0x20 - -/* Flags for I365_GBLCTL */ -#define I365_GBL_PWRDOWN 0x01 -#define I365_GBL_CSC_LEV 0x02 -#define I365_GBL_WRBACK 0x04 -#define I365_GBL_IRQ_0_LEV 0x08 -#define I365_GBL_IRQ_1_LEV 0x10 - -/* Flags for memory window registers */ -#define I365_MEM_16BIT 0x8000 /* In memory start high byte */ -#define I365_MEM_0WS 0x4000 -#define I365_MEM_WS1 0x8000 /* In memory stop high byte */ -#define I365_MEM_WS0 0x4000 -#define I365_MEM_WRPROT 0x8000 /* In offset high byte */ -#define I365_MEM_REG 0x4000 - -#define I365_REG(slot, reg) (((slot) << 6) | (reg)) - -/* Default ISA interrupt mask */ -#define I365_ISA_IRQ_MASK 0xdeb8 /* irq's 3-5,7,9-12,14,15 */ - -/* Device ID's for PCI-to-PCMCIA bridges */ - -#ifndef PCI_VENDOR_ID_INTEL -#define PCI_VENDOR_ID_INTEL 0x8086 -#endif -#ifndef PCI_DEVICE_ID_INTEL_82092AA_0 -#define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221 -#endif -#ifndef PCI_VENDOR_ID_OMEGA -#define PCI_VENDOR_ID_OMEGA 0x119b -#endif -#ifndef PCI_DEVICE_ID_OMEGA_82C092G -#define PCI_DEVICE_ID_OMEGA_82C092G 0x1221 -#endif - -#endif /* _LINUX_I82365_H */ diff --git a/mdk-stage1/pcmcia/lex_config.c b/mdk-stage1/pcmcia/lex_config.c deleted file mode 100644 index b374c8bf4..000000000 --- a/mdk-stage1/pcmcia/lex_config.c +++ /dev/null @@ -1,2008 +0,0 @@ -/* A lexical scanner generated by flex */ - -/* Scanner skeleton version: - * $Header$ - */ - -#define FLEX_SCANNER -#define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 - -#include - - -/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ -#ifdef c_plusplus -#ifndef __cplusplus -#define __cplusplus -#endif -#endif - - -#ifdef __cplusplus - -#include -#include - -/* Use prototypes in function declarations. */ -#define YY_USE_PROTOS - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ - -#if __STDC__ - -#define YY_USE_PROTOS -#define YY_USE_CONST - -#endif /* __STDC__ */ -#endif /* ! __cplusplus */ - -#ifdef __TURBOC__ - #pragma warn -rch - #pragma warn -use -#include -#include -#define YY_USE_CONST -#define YY_USE_PROTOS -#endif - -#ifdef YY_USE_CONST -#define yyconst const -#else -#define yyconst -#endif - - -#ifdef YY_USE_PROTOS -#define YY_PROTO(proto) proto -#else -#define YY_PROTO(proto) () -#endif - -/* Returned upon end-of-file. */ -#define YY_NULL 0 - -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. - */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) - -/* Enter a start condition. This macro really ought to take a parameter, - * but we do it the disgusting crufty way forced on us by the ()-less - * definition of BEGIN. - */ -#define BEGIN yy_start = 1 + 2 * - -/* Translate the current start state into a value that can be later handed - * to BEGIN to return to the state. The YYSTATE alias is for lex - * compatibility. - */ -#define YY_START ((yy_start - 1) / 2) -#define YYSTATE YY_START - -/* Action number for EOF rule of a given start state. */ -#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - -/* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart( yyin ) - -#define YY_END_OF_BUFFER_CHAR 0 - -/* Size of default input buffer. */ -#define YY_BUF_SIZE 16384 - -typedef struct yy_buffer_state *YY_BUFFER_STATE; - -extern int yyleng; -extern FILE *yyin, *yyout; - -#define EOB_ACT_CONTINUE_SCAN 0 -#define EOB_ACT_END_OF_FILE 1 -#define EOB_ACT_LAST_MATCH 2 - -/* The funky do-while in the following #define is used to turn the definition - * int a single C statement (which needs a semi-colon terminator). This - * avoids problems with code like: - * - * if ( condition_holds ) - * yyless( 5 ); - * else - * do_something_else(); - * - * Prior to using the do-while the compiler would get upset at the - * "else" because it interpreted the "if" statement as being all - * done when it reached the ';' after the yyless() call. - */ - -/* Return all but the first 'n' matched characters back to the input stream. */ - -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - *yy_cp = yy_hold_char; \ - YY_RESTORE_YY_MORE_OFFSET \ - yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ - YY_DO_BEFORE_ACTION; /* set up yytext again */ \ - } \ - while ( 0 ) - - -/* The following is because we cannot portably get our hands on size_t - * (without autoconf's help, which isn't available because we want - * flex-generated scanners to compile on their own). - */ -typedef unsigned int yy_size_t; - - -struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; -#define YY_BUFFER_NEW 0 -#define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via yyrestart()), so that the user can continue scanning by - * just pointing yyin at a new input file. - */ -#define YY_BUFFER_EOF_PENDING 2 - }; - -static YY_BUFFER_STATE yy_current_buffer = 0; - -/* We provide macros for accessing buffer states in case in the - * future we want to put the buffer states in a more general - * "scanner state". - */ -#define YY_CURRENT_BUFFER yy_current_buffer - - -/* yy_hold_char holds the character lost when yytext is formed. */ -static char yy_hold_char; - -static int yy_n_chars; /* number of characters read into yy_ch_buf */ - - -int yyleng; - -/* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; -static int yy_init = 1; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ - -/* Flag which is used to allow yywrap()'s to do buffer switches - * instead of setting up a fresh yyin. A bit of a hack ... - */ -static int yy_did_buffer_switch_on_eof; - -void yyrestart YY_PROTO(( FILE *input_file )); - -void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); -void yy_load_buffer_state YY_PROTO(( void )); -YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); -void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); -void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); -void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); -#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) - -YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); -YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); -YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); - -static void *yy_flex_alloc YY_PROTO(( yy_size_t )); -static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); -static void yy_flex_free YY_PROTO(( void * )); - -#define yy_new_buffer yy_create_buffer - -#define yy_set_interactive(is_interactive) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_is_interactive = is_interactive; \ - } - -#define yy_set_bol(at_bol) \ - { \ - if ( ! yy_current_buffer ) \ - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ - yy_current_buffer->yy_at_bol = at_bol; \ - } - -#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) - -typedef unsigned char YY_CHAR; -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; -typedef int yy_state_type; -extern char *yytext; -#define yytext_ptr yytext - -static yy_state_type yy_get_previous_state YY_PROTO(( void )); -static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); -static int yy_get_next_buffer YY_PROTO(( void )); -static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); - -/* Done after the current pattern has been matched and before the - * corresponding action - sets up yytext. - */ -#define YY_DO_BEFORE_ACTION \ - yytext_ptr = yy_bp; \ - yyleng = (int) (yy_cp - yy_bp); \ - yy_hold_char = *yy_cp; \ - *yy_cp = '\0'; \ - yy_c_buf_p = yy_cp; - -#define YY_NUM_RULES 45 -#define YY_END_OF_BUFFER 46 -static yyconst short int yy_accept[247] = - { 0, - 5, 5, 2, 2, 46, 44, 5, 4, 5, 44, - 6, 41, 41, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 3, - 2, 45, 5, 5, 6, 0, 43, 0, 6, 41, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, - 0, 0, 3, 2, 0, 43, 0, 42, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 0, 0, 0, 0, 23, 0, 0, 0, - - 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, - 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 11, 0, 0, 14, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 0, 0, 0, 13, 0, - 0, 0, 0, 20, 21, 22, 0, 0, 0, 28, - 0, 0, 0, 1, 0, 0, 0, 0, 12, 15, - 0, 0, 17, 0, 0, 0, 0, 29, 0, 0, - - 32, 0, 0, 0, 0, 16, 0, 0, 0, 0, - 0, 0, 0, 39, 7, 0, 0, 24, 0, 0, - 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, - 33, 0, 0, 0, 34, 0, 0, 0, 40, 0, - 0, 35, 37, 0, 38, 0 - } ; - -static yyconst int yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 4, 1, 5, 6, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 1, 6, 1, - 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 10, 1, 1, 11, 1, 12, 13, 14, 15, - - 16, 17, 18, 1, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst int yy_meta[36] = - { 0, - 1, 2, 3, 2, 1, 1, 4, 4, 4, 1, - 1, 4, 4, 4, 4, 4, 4, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst short int yy_base[253] = - { 0, - 0, 0, 34, 37, 293, 294, 40, 294, 41, 41, - 0, 41, 45, 31, 273, 42, 40, 257, 38, 34, - 274, 47, 273, 262, 53, 271, 57, 35, 60, 0, - 79, 294, 82, 83, 0, 83, 294, 87, 0, 87, - 0, 263, 260, 260, 255, 253, 269, 74, 245, 265, - 244, 253, 262, 248, 259, 249, 249, 256, 255, 80, - 239, 240, 248, 238, 80, 236, 236, 232, 294, 236, - 233, 245, 0, 97, 95, 97, 108, 0, 230, 234, - 242, 241, 294, 226, 242, 234, 226, 229, 234, 235, - 226, 294, 231, 229, 220, 213, 294, 228, 209, 212, - - 228, 294, 209, 219, 221, 217, 216, 206, 211, 203, - 215, 219, 194, 294, 294, 199, 196, 212, 209, 193, - 208, 192, 190, 206, 200, 190, 195, 187, 190, 294, - 192, 294, 188, 184, 200, 198, 195, 192, 188, 181, - 191, 181, 294, 181, 186, 294, 186, 189, 180, 183, - 294, 182, 161, 179, 183, 165, 170, 167, 158, 177, - 166, 171, 294, 161, 174, 172, 158, 152, 294, 165, - 165, 154, 162, 294, 166, 294, 153, 154, 158, 294, - 157, 157, 160, 294, 146, 157, 140, 136, 294, 294, - 147, 141, 294, 150, 133, 151, 139, 294, 148, 133, - - 294, 143, 142, 127, 126, 294, 142, 138, 140, 140, - 124, 124, 136, 294, 294, 126, 118, 294, 130, 118, - 113, 114, 115, 294, 125, 127, 108, 116, 99, 87, - 294, 90, 87, 86, 294, 96, 78, 74, 294, 75, - 64, 294, 294, 46, 294, 294, 118, 122, 126, 130, - 134, 64 - } ; - -static yyconst short int yy_def[253] = - { 0, - 246, 1, 247, 247, 246, 246, 246, 246, 246, 248, - 249, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 250, - 246, 246, 246, 246, 249, 248, 246, 251, 249, 246, - 252, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 250, 246, 248, 248, 251, 252, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 0, 246, 246, 246, 246, - 246, 246 - } ; - -static yyconst short int yy_nxt[330] = - { 0, - 6, 7, 8, 9, 10, 11, 12, 13, 6, 6, - 6, 14, 15, 16, 17, 18, 19, 6, 20, 21, - 6, 6, 22, 23, 24, 25, 6, 26, 27, 28, - 6, 29, 6, 6, 6, 31, 32, 31, 31, 32, - 31, 33, 33, 33, 34, 37, 35, 40, 40, 42, - 38, 40, 40, 45, 43, 48, 51, 53, 56, 69, - 46, 54, 57, 47, 62, 70, 63, 78, 52, 49, - 66, 58, 67, 245, 41, 71, 59, 64, 72, 244, - 74, 68, 74, 33, 33, 33, 34, 37, 35, 36, - 85, 76, 38, 40, 40, 98, 77, 104, 74, 37, - - 74, 37, 243, 242, 38, 86, 38, 241, 105, 99, - 36, 240, 76, 239, 238, 237, 236, 77, 30, 30, - 30, 30, 36, 36, 36, 36, 39, 39, 235, 39, - 73, 234, 233, 73, 75, 75, 75, 75, 232, 231, - 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, - 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, - 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, - 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, - 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, - 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, - - 170, 169, 168, 167, 166, 165, 164, 163, 162, 161, - 160, 159, 158, 157, 156, 155, 154, 153, 152, 151, - 150, 149, 148, 147, 146, 145, 144, 143, 142, 141, - 140, 139, 138, 137, 136, 135, 134, 133, 132, 131, - 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, - 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, - 110, 109, 108, 107, 106, 103, 102, 101, 100, 97, - 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, - 84, 83, 82, 81, 80, 79, 65, 61, 60, 55, - 50, 44, 246, 5, 246, 246, 246, 246, 246, 246, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246 - } ; - -static yyconst short int yy_chk[330] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 3, 4, 4, - 4, 7, 9, 7, 9, 10, 9, 12, 12, 14, - 10, 13, 13, 16, 14, 17, 19, 20, 22, 28, - 16, 20, 22, 16, 25, 28, 25, 252, 19, 17, - 27, 22, 27, 244, 12, 29, 22, 25, 29, 241, - 31, 27, 31, 33, 34, 33, 34, 36, 34, 38, - 48, 38, 36, 40, 40, 60, 38, 65, 74, 75, - - 74, 76, 240, 238, 75, 48, 76, 237, 65, 60, - 77, 236, 77, 234, 233, 232, 230, 77, 247, 247, - 247, 247, 248, 248, 248, 248, 249, 249, 229, 249, - 250, 228, 227, 250, 251, 251, 251, 251, 226, 225, - 223, 222, 221, 220, 219, 217, 216, 213, 212, 211, - 210, 209, 208, 207, 205, 204, 203, 202, 200, 199, - 197, 196, 195, 194, 192, 191, 188, 187, 186, 185, - 183, 182, 181, 179, 178, 177, 175, 173, 172, 171, - 170, 168, 167, 166, 165, 164, 162, 161, 160, 159, - 158, 157, 156, 155, 154, 153, 152, 150, 149, 148, - - 147, 145, 144, 142, 141, 140, 139, 138, 137, 136, - 135, 134, 133, 131, 129, 128, 127, 126, 125, 124, - 123, 122, 121, 120, 119, 118, 117, 116, 113, 112, - 111, 110, 109, 108, 107, 106, 105, 104, 103, 101, - 100, 99, 98, 96, 95, 94, 93, 91, 90, 89, - 88, 87, 86, 85, 84, 82, 81, 80, 79, 72, - 71, 70, 68, 67, 66, 64, 63, 62, 61, 59, - 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, - 47, 46, 45, 44, 43, 42, 26, 24, 23, 21, - 18, 15, 5, 246, 246, 246, 246, 246, 246, 246, - - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 246, 246, 246, 246, 246 - } ; - -static yy_state_type yy_last_accepting_state; -static char *yy_last_accepting_cpos; - -/* The intent behind this definition is that it'll catch - * any uses of REJECT which flex missed. - */ -#define REJECT reject_used_but_not_detected -#define yymore() yymore_used_but_not_detected -#define YY_MORE_ADJ 0 -#define YY_RESTORE_YY_MORE_OFFSET -char *yytext; -#line 1 "lex_config.l" -#define INITIAL 0 -/* Special state for handling include files */ -#define src 1 - -#line 5 "lex_config.l" -/* - * lex_config.l 1.39 2000/06/12 21:33:02 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#undef src -#include -#include -#include -#include -#include -#include -#define src 1 - -#include -#include - -#include "yacc_config.h" - -/* For assembling nice error messages */ -char *current_file; -int current_lineno; - -static int lex_number(char *s); -static int lex_string(char *s); -static void do_source(char *fn); -static int do_eof(void); - - -/* Macros after this point can all be overridden by user definitions in - * section 1. - */ - -#ifndef YY_SKIP_YYWRAP -#ifdef __cplusplus -extern "C" int yywrap YY_PROTO(( void )); -#else -extern int yywrap YY_PROTO(( void )); -#endif -#endif - -#ifndef YY_NO_UNPUT -#endif - -#ifndef yytext_ptr -static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); -#endif - -#ifdef YY_NEED_STRLEN -static int yy_flex_strlen YY_PROTO(( yyconst char * )); -#endif - -#ifndef YY_NO_INPUT -#ifdef __cplusplus -static int yyinput YY_PROTO(( void )); -#else -static int input YY_PROTO(( void )); -#endif -#endif - -#if YY_STACK_USED -static int yy_start_stack_ptr = 0; -static int yy_start_stack_depth = 0; -static int *yy_start_stack = 0; -#ifndef YY_NO_PUSH_STATE -static void yy_push_state YY_PROTO(( int new_state )); -#endif -#ifndef YY_NO_POP_STATE -static void yy_pop_state YY_PROTO(( void )); -#endif -#ifndef YY_NO_TOP_STATE -static int yy_top_state YY_PROTO(( void )); -#endif - -#else -#define YY_NO_PUSH_STATE 1 -#define YY_NO_POP_STATE 1 -#define YY_NO_TOP_STATE 1 -#endif - -#ifdef YY_MALLOC_DECL -YY_MALLOC_DECL -#else -#if __STDC__ -#ifndef __cplusplus -#include -#endif -#else -/* Just try to get by without declaring the routines. This will fail - * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) - * or sizeof(void*) != sizeof(int). - */ -#endif -#endif - -/* Amount of stuff to slurp up with each read. */ -#ifndef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 8192 -#endif - -/* Copy whatever the last rule matched to the standard output. */ - -#ifndef ECHO -/* This used to be an fputs(), but since the string might contain NUL's, - * we now use fwrite(). - */ -#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) -#endif - -/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, - * is returned in "result". - */ -#ifndef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - if ( yy_current_buffer->yy_is_interactive ) \ - { \ - int c = '*', n; \ - for ( n = 0; n < max_size && \ - (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ - buf[n] = (char) c; \ - if ( c == '\n' ) \ - buf[n++] = (char) c; \ - if ( c == EOF && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - result = n; \ - } \ - else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ - && ferror( yyin ) ) \ - YY_FATAL_ERROR( "input in flex scanner failed" ); -#endif - -/* No semi-colon after return; correct usage is to write "yyterminate();" - - * we don't want an extra ';' after the "return" because that will cause - * some compilers to complain about unreachable statements. - */ -#ifndef yyterminate -#define yyterminate() return YY_NULL -#endif - -/* Number of entries by which start-condition stack grows. */ -#ifndef YY_START_STACK_INCR -#define YY_START_STACK_INCR 25 -#endif - -/* Report a fatal error. */ -#ifndef YY_FATAL_ERROR -#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) -#endif - -/* Default declaration of generated scanner - a define so the user can - * easily add parameters. - */ -#ifndef YY_DECL -#define YY_DECL int yylex YY_PROTO(( void )) -#endif - -/* Code executed at the beginning of each rule, after yytext and yyleng - * have been set up. - */ -#ifndef YY_USER_ACTION -#define YY_USER_ACTION -#endif - -/* Code executed at the end of each rule. */ -#ifndef YY_BREAK -#define YY_BREAK break; -#endif - -#define YY_RULE_SETUP \ - YY_USER_ACTION - -YY_DECL - { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - -#line 63 "lex_config.l" - - - - if ( yy_init ) - { - yy_init = 0; - -#ifdef YY_USER_INIT - YY_USER_INIT; -#endif - - if ( ! yy_start ) - yy_start = 1; /* first start state */ - - if ( ! yyin ) - yyin = stdin; - - if ( ! yyout ) - yyout = stdout; - - if ( ! yy_current_buffer ) - yy_current_buffer = - yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_load_buffer_state(); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = yy_c_buf_p; - - /* Support of yytext. */ - *yy_cp = yy_hold_char; - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = yy_start; -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 247 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 294 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - -do_action: /* This label is used only to access EOF actions. */ - - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = yy_hold_char; - yy_cp = yy_last_accepting_cpos; - yy_current_state = yy_last_accepting_state; - goto yy_find_action; - -case 1: -YY_RULE_SETUP -#line 65 "lex_config.l" -BEGIN(src); - YY_BREAK -case 2: -YY_RULE_SETUP -#line 66 "lex_config.l" -/* skip */ ; - YY_BREAK -case 3: -YY_RULE_SETUP -#line 67 "lex_config.l" -do_source(yytext); BEGIN(INITIAL); - YY_BREAK -case YY_STATE_EOF(INITIAL): -case YY_STATE_EOF(src): -#line 68 "lex_config.l" -if (do_eof()) yyterminate(); - YY_BREAK -case 4: -YY_RULE_SETUP -#line 70 "lex_config.l" -current_lineno++; - YY_BREAK -case 5: -YY_RULE_SETUP -#line 71 "lex_config.l" -/* skip */ ; - YY_BREAK -case 6: -YY_RULE_SETUP -#line 72 "lex_config.l" -/* skip */ ; - YY_BREAK -case 7: -YY_RULE_SETUP -#line 74 "lex_config.l" -return ANONYMOUS; - YY_BREAK -case 8: -YY_RULE_SETUP -#line 75 "lex_config.l" -return BIND; - YY_BREAK -case 9: -YY_RULE_SETUP -#line 76 "lex_config.l" -return CIS; - YY_BREAK -case 10: -YY_RULE_SETUP -#line 77 "lex_config.l" -return CARD; - YY_BREAK -case 11: -YY_RULE_SETUP -#line 78 "lex_config.l" -return CLASS; - YY_BREAK -case 12: -YY_RULE_SETUP -#line 79 "lex_config.l" -return DEFAULT; - YY_BREAK -case 13: -YY_RULE_SETUP -#line 80 "lex_config.l" -return DEVICE; - YY_BREAK -case 14: -YY_RULE_SETUP -#line 81 "lex_config.l" -return DTYPE; - YY_BREAK -case 15: -YY_RULE_SETUP -#line 82 "lex_config.l" -return EXCLUDE; - YY_BREAK -case 16: -YY_RULE_SETUP -#line 83 "lex_config.l" -return FUNCTION; - YY_BREAK -case 17: -YY_RULE_SETUP -#line 84 "lex_config.l" -return INCLUDE; - YY_BREAK -case 18: -YY_RULE_SETUP -#line 85 "lex_config.l" -return IRQ_NO; - YY_BREAK -case 19: -YY_RULE_SETUP -#line 86 "lex_config.l" -return JEDEC; - YY_BREAK -case 20: -YY_RULE_SETUP -#line 87 "lex_config.l" -return MANFID; - YY_BREAK -case 21: -YY_RULE_SETUP -#line 88 "lex_config.l" -return MEMORY; - YY_BREAK -case 22: -YY_RULE_SETUP -#line 89 "lex_config.l" -return MODULE; - YY_BREAK -case 23: -YY_RULE_SETUP -#line 90 "lex_config.l" -return MTD; - YY_BREAK -case 24: -YY_RULE_SETUP -#line 91 "lex_config.l" -return NEEDS_MTD; - YY_BREAK -case 25: -YY_RULE_SETUP -#line 92 "lex_config.l" -return OPTS; - YY_BREAK -case 26: -YY_RULE_SETUP -#line 93 "lex_config.l" -return PCI; - YY_BREAK -case 27: -YY_RULE_SETUP -#line 94 "lex_config.l" -return PORT; - YY_BREAK -case 28: -YY_RULE_SETUP -#line 95 "lex_config.l" -return REGION; - YY_BREAK -case 29: -YY_RULE_SETUP -#line 96 "lex_config.l" -return RESERVE; - YY_BREAK -case 30: -YY_RULE_SETUP -#line 97 "lex_config.l" -return TO; - YY_BREAK -case 31: -YY_RULE_SETUP -#line 98 "lex_config.l" -return TUPLE; - YY_BREAK -case 32: -YY_RULE_SETUP -#line 99 "lex_config.l" -return VERSION; - YY_BREAK -case 33: -YY_RULE_SETUP -#line 101 "lex_config.l" -return lex_number("1"); - YY_BREAK -case 34: -YY_RULE_SETUP -#line 102 "lex_config.l" -return lex_number("2"); - YY_BREAK -case 35: -YY_RULE_SETUP -#line 103 "lex_config.l" -return lex_number("3"); - YY_BREAK -case 36: -YY_RULE_SETUP -#line 104 "lex_config.l" -return lex_number("4"); - YY_BREAK -case 37: -YY_RULE_SETUP -#line 105 "lex_config.l" -return lex_number("5"); - YY_BREAK -case 38: -YY_RULE_SETUP -#line 106 "lex_config.l" -return lex_number("6"); - YY_BREAK -case 39: -YY_RULE_SETUP -#line 107 "lex_config.l" -return lex_number("7"); - YY_BREAK -case 40: -YY_RULE_SETUP -#line 108 "lex_config.l" -return lex_number("8"); - YY_BREAK -case 41: -YY_RULE_SETUP -#line 110 "lex_config.l" -return lex_number(yytext); - YY_BREAK -case 42: -YY_RULE_SETUP -#line 112 "lex_config.l" -return lex_number(yytext); - YY_BREAK -case 43: -YY_RULE_SETUP -#line 114 "lex_config.l" -return lex_string(yytext); - YY_BREAK -case 44: -YY_RULE_SETUP -#line 116 "lex_config.l" -return yytext[0]; - YY_BREAK -case 45: -YY_RULE_SETUP -#line 118 "lex_config.l" -ECHO; - YY_BREAK - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = yy_hold_char; - YY_RESTORE_YY_MORE_OFFSET - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed yyin at a new source and called - * yylex(). If so, then we have to assure - * consistency between yy_current_buffer and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - yy_n_chars = yy_current_buffer->yy_n_chars; - yy_current_buffer->yy_input_file = yyin; - yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = yytext_ptr + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++yy_c_buf_p; - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = yy_c_buf_p; - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer() ) - { - case EOB_ACT_END_OF_FILE: - { - yy_did_buffer_switch_on_eof = 0; - - if ( yywrap() ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * yytext, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = - yytext_ptr + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - yy_c_buf_p = - &yy_current_buffer->yy_ch_buf[yy_n_chars]; - - yy_current_state = yy_get_previous_state(); - - yy_cp = yy_c_buf_p; - yy_bp = yytext_ptr + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ - } /* end of yylex */ - - -/* yy_get_next_buffer - try to read in a new buffer - * - * Returns a code representing an action: - * EOB_ACT_LAST_MATCH - - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position - * EOB_ACT_END_OF_FILE - end of file - */ - -static int yy_get_next_buffer() - { - register char *dest = yy_current_buffer->yy_ch_buf; - register char *source = yytext_ptr; - register int number_to_move, i; - int ret_val; - - if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( yy_current_buffer->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - yy_current_buffer->yy_n_chars = yy_n_chars = 0; - - else - { - int num_to_read = - yy_current_buffer->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ -#ifdef YY_USES_REJECT - YY_FATAL_ERROR( -"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); -#else - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = yy_current_buffer; - - int yy_c_buf_p_offset = - (int) (yy_c_buf_p - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - yy_flex_realloc( (void *) b->yy_ch_buf, - b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = yy_current_buffer->yy_buf_size - - number_to_move - 1; -#endif - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), - yy_n_chars, num_to_read ); - - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - if ( yy_n_chars == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - yyrestart( yyin ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - yy_current_buffer->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - yy_n_chars += number_to_move; - yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; - yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; - - yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; - - return ret_val; - } - - -/* yy_get_previous_state - get the state just before the EOB char was reached */ - -static yy_state_type yy_get_previous_state() - { - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = yy_start; - - for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 247 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; - } - - -/* yy_try_NUL_trans - try to make a transition on the NUL character - * - * synopsis - * next_state = yy_try_NUL_trans( current_state ); - */ - -#ifdef YY_USE_PROTOS -static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) -#else -static yy_state_type yy_try_NUL_trans( yy_current_state ) -yy_state_type yy_current_state; -#endif - { - register int yy_is_jam; - register char *yy_cp = yy_c_buf_p; - - register YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - yy_last_accepting_state = yy_current_state; - yy_last_accepting_cpos = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 247 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 246); - - return yy_is_jam ? 0 : yy_current_state; - } - - - - -#ifdef __cplusplus -static int yyinput() -#else -static int input() -#endif - { - int c; - - *yy_c_buf_p = yy_hold_char; - - if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) - /* This was really a NUL. */ - *yy_c_buf_p = '\0'; - - else - { /* need more input */ - int offset = yy_c_buf_p - yytext_ptr; - ++yy_c_buf_p; - - switch ( yy_get_next_buffer() ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - yyrestart( yyin ); - - /* fall through */ - - case EOB_ACT_END_OF_FILE: - { - if ( yywrap() ) - return EOF; - - if ( ! yy_did_buffer_switch_on_eof ) - YY_NEW_FILE; -#ifdef __cplusplus - return yyinput(); -#else - return input(); -#endif - } - - case EOB_ACT_CONTINUE_SCAN: - yy_c_buf_p = yytext_ptr + offset; - break; - } - } - } - - c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ - *yy_c_buf_p = '\0'; /* preserve yytext */ - yy_hold_char = *++yy_c_buf_p; - - - return c; - } - - -#ifdef YY_USE_PROTOS -void yyrestart( FILE *input_file ) -#else -void yyrestart( input_file ) -FILE *input_file; -#endif - { - if ( ! yy_current_buffer ) - yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); - - yy_init_buffer( yy_current_buffer, input_file ); - yy_load_buffer_state(); - } - - -#ifdef YY_USE_PROTOS -void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) -#else -void yy_switch_to_buffer( new_buffer ) -YY_BUFFER_STATE new_buffer; -#endif - { - if ( yy_current_buffer == new_buffer ) - return; - - if ( yy_current_buffer ) - { - /* Flush out information for old buffer. */ - *yy_c_buf_p = yy_hold_char; - yy_current_buffer->yy_buf_pos = yy_c_buf_p; - yy_current_buffer->yy_n_chars = yy_n_chars; - } - - yy_current_buffer = new_buffer; - yy_load_buffer_state(); - - /* We don't actually know whether we did this switch during - * EOF (yywrap()) processing, but the only time this flag - * is looked at is after yywrap() is called, so it's safe - * to go ahead and always set it. - */ - yy_did_buffer_switch_on_eof = 1; - } - - -#ifdef YY_USE_PROTOS -void yy_load_buffer_state( void ) -#else -void yy_load_buffer_state() -#endif - { - yy_n_chars = yy_current_buffer->yy_n_chars; - yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; - yyin = yy_current_buffer->yy_input_file; - yy_hold_char = *yy_c_buf_p; - } - - -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) -#else -YY_BUFFER_STATE yy_create_buffer( file, size ) -FILE *file; -int size; -#endif - { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_buf_size = size; - - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); - - b->yy_is_our_buffer = 1; - - yy_init_buffer( b, file ); - - return b; - } - - -#ifdef YY_USE_PROTOS -void yy_delete_buffer( YY_BUFFER_STATE b ) -#else -void yy_delete_buffer( b ) -YY_BUFFER_STATE b; -#endif - { - if ( ! b ) - return; - - if ( b == yy_current_buffer ) - yy_current_buffer = (YY_BUFFER_STATE) 0; - - if ( b->yy_is_our_buffer ) - yy_flex_free( (void *) b->yy_ch_buf ); - - yy_flex_free( (void *) b ); - } - - -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif - -#ifdef YY_USE_PROTOS -void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) -#else -void yy_init_buffer( b, file ) -YY_BUFFER_STATE b; -FILE *file; -#endif - - - { - yy_flush_buffer( b ); - - b->yy_input_file = file; - b->yy_fill_buffer = 1; - -#if YY_ALWAYS_INTERACTIVE - b->yy_is_interactive = 1; -#else -#if YY_NEVER_INTERACTIVE - b->yy_is_interactive = 0; -#else - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; -#endif -#endif - } - - -#ifdef YY_USE_PROTOS -void yy_flush_buffer( YY_BUFFER_STATE b ) -#else -void yy_flush_buffer( b ) -YY_BUFFER_STATE b; -#endif - - { - if ( ! b ) - return; - - b->yy_n_chars = 0; - - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - - b->yy_buf_pos = &b->yy_ch_buf[0]; - - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; - - if ( b == yy_current_buffer ) - yy_load_buffer_state(); - } - - -#ifndef YY_NO_SCAN_BUFFER -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) -#else -YY_BUFFER_STATE yy_scan_buffer( base, size ) -char *base; -yy_size_t size; -#endif - { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - yy_switch_to_buffer( b ); - - return b; - } -#endif - - -#ifndef YY_NO_SCAN_STRING -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) -#else -YY_BUFFER_STATE yy_scan_string( yy_str ) -yyconst char *yy_str; -#endif - { - int len; - for ( len = 0; yy_str[len]; ++len ) - ; - - return yy_scan_bytes( yy_str, len ); - } -#endif - - -#ifndef YY_NO_SCAN_BYTES -#ifdef YY_USE_PROTOS -YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) -#else -YY_BUFFER_STATE yy_scan_bytes( bytes, len ) -yyconst char *bytes; -int len; -#endif - { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = len + 2; - buf = (char *) yy_flex_alloc( n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); - - for ( i = 0; i < len; ++i ) - buf[i] = bytes[i]; - - buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; - - b = yy_scan_buffer( buf, n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; - } -#endif - - -#ifndef YY_NO_PUSH_STATE -#ifdef YY_USE_PROTOS -static void yy_push_state( int new_state ) -#else -static void yy_push_state( new_state ) -int new_state; -#endif - { - if ( yy_start_stack_ptr >= yy_start_stack_depth ) - { - yy_size_t new_size; - - yy_start_stack_depth += YY_START_STACK_INCR; - new_size = yy_start_stack_depth * sizeof( int ); - - if ( ! yy_start_stack ) - yy_start_stack = (int *) yy_flex_alloc( new_size ); - - else - yy_start_stack = (int *) yy_flex_realloc( - (void *) yy_start_stack, new_size ); - - if ( ! yy_start_stack ) - YY_FATAL_ERROR( - "out of memory expanding start-condition stack" ); - } - - yy_start_stack[yy_start_stack_ptr++] = YY_START; - - BEGIN(new_state); - } -#endif - - -#ifndef YY_NO_POP_STATE -static void yy_pop_state() - { - if ( --yy_start_stack_ptr < 0 ) - YY_FATAL_ERROR( "start-condition stack underflow" ); - - BEGIN(yy_start_stack[yy_start_stack_ptr]); - } -#endif - - -#ifndef YY_NO_TOP_STATE -static int yy_top_state() - { - return yy_start_stack[yy_start_stack_ptr - 1]; - } -#endif - -#ifndef YY_EXIT_FAILURE -#define YY_EXIT_FAILURE 2 -#endif - -#ifdef YY_USE_PROTOS -static void yy_fatal_error( yyconst char msg[] ) -#else -static void yy_fatal_error( msg ) -char msg[]; -#endif - { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); - } - - - -/* Redefine yyless() so it works in section 3 code. */ - -#undef yyless -#define yyless(n) \ - do \ - { \ - /* Undo effects of setting up yytext. */ \ - yytext[yyleng] = yy_hold_char; \ - yy_c_buf_p = yytext + n; \ - yy_hold_char = *yy_c_buf_p; \ - *yy_c_buf_p = '\0'; \ - yyleng = n; \ - } \ - while ( 0 ) - - -/* Internal utility routines. */ - -#ifndef yytext_ptr -#ifdef YY_USE_PROTOS -static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) -#else -static void yy_flex_strncpy( s1, s2, n ) -char *s1; -yyconst char *s2; -int n; -#endif - { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; - } -#endif - -#ifdef YY_NEED_STRLEN -#ifdef YY_USE_PROTOS -static int yy_flex_strlen( yyconst char *s ) -#else -static int yy_flex_strlen( s ) -yyconst char *s; -#endif - { - register int n; - for ( n = 0; s[n]; ++n ) - ; - - return n; - } -#endif - - -#ifdef YY_USE_PROTOS -static void *yy_flex_alloc( yy_size_t size ) -#else -static void *yy_flex_alloc( size ) -yy_size_t size; -#endif - { - return (void *) malloc( size ); - } - -#ifdef YY_USE_PROTOS -static void *yy_flex_realloc( void *ptr, yy_size_t size ) -#else -static void *yy_flex_realloc( ptr, size ) -void *ptr; -yy_size_t size; -#endif - { - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); - } - -#ifdef YY_USE_PROTOS -static void yy_flex_free( void *ptr ) -#else -static void yy_flex_free( ptr ) -void *ptr; -#endif - { - free( ptr ); - } - -#if YY_MAIN -int main() - { - yylex(); - return 0; - } -#endif -#line 118 "lex_config.l" - - -#ifndef yywrap -int yywrap() { return 1; } -#endif - -/*====================================================================== - - Stuff to parse basic data types - -======================================================================*/ - -static int lex_number(char *s) -{ - yylval.num = strtoul(s, NULL, 0); - return NUMBER; -} - -static int lex_string(char *s) -{ - int n = strlen(s); - yylval.str = malloc(n-1); - strncpy(yylval.str, s+1, n-2); - yylval.str[n-2] = '\0'; - return STRING; -} - -/*====================================================================== - - Code to support nesting of configuration files - -======================================================================*/ - -#define MAX_SOURCE_DEPTH 4 -struct source_stack { - YY_BUFFER_STATE buffer; - char *filename; - int lineno, fileno; - FILE *file; - glob_t glob; -} source_stack[MAX_SOURCE_DEPTH]; -static int source_stack_ptr = 0; -static int parse_env = 0; - -static int get_glob(void) -{ - struct source_stack *s = &source_stack[source_stack_ptr]; - while (s->fileno < s->glob.gl_pathc) { - char *fn = s->glob.gl_pathv[s->fileno]; - s->file = fopen(fn, "r"); - if (s->file == NULL) { - if (strpbrk(fn, "?*[") == NULL) - syslog(LOG_INFO, "could not open '%s': %m", fn); - s->fileno++; - } else { - current_lineno = 1; - current_file = strdup(fn); - yy_switch_to_buffer(yy_create_buffer(s->file, YY_BUF_SIZE)); - source_stack_ptr++; - s->fileno++; - return 0; - } - } - return -1; -} - -static void do_source(char *fn) -{ - struct source_stack *s = &source_stack[source_stack_ptr]; - - if (source_stack_ptr >= MAX_SOURCE_DEPTH) { - syslog(LOG_INFO, "source depth limit exceeded"); - return; - } - glob(fn, GLOB_NOCHECK, NULL, &s->glob); - s->fileno = 0; - s->buffer = YY_CURRENT_BUFFER; - s->lineno = current_lineno; - s->filename = current_file; - get_glob(); -} - -static int do_eof(void) -{ - struct source_stack *s = &source_stack[--source_stack_ptr]; - if (source_stack_ptr < 0) { - if (parse_env == 0) { - char *t = getenv("PCMCIA_OPTS"); - if (t == NULL) return -1; - parse_env = 1; - source_stack_ptr = 0; - current_file = "PCMCIA_OPTS"; - current_lineno = 1; - yy_scan_string(t); - return 0; - } else - return -1; - } - fclose(s->file); - free(current_file); - yy_delete_buffer(YY_CURRENT_BUFFER); - if (get_glob() != 0) { - yy_switch_to_buffer(s->buffer); - current_lineno = s->lineno; - current_file = s->filename; - } - return 0; -} - -/*====================================================================== - - The main entry point... returns -1 if the file can't be accessed. - -======================================================================*/ -int yyparse(void); - -int parse_configfile(char *fn) -{ - FILE *f; - - f = fopen(fn, "r"); - if (!f) { - syslog(LOG_INFO, "could not open '%s': %m", fn); - return -1; - } - current_lineno = 1; - current_file = fn; - source_stack_ptr = 0; - yyrestart(f); - yyparse(); - fclose(f); - return 0; -} - diff --git a/mdk-stage1/pcmcia/pcmcia.h b/mdk-stage1/pcmcia/pcmcia.h deleted file mode 100644 index 1967b3497..000000000 --- a/mdk-stage1/pcmcia/pcmcia.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef _PCMCIA_CARDMGR_INTERFACE_H_ -#define _PCMCIA_CARDMGR_INTERFACE_H_ - -char * pcmcia_probe(void); -int cardmgr_call(void); - -#endif diff --git a/mdk-stage1/pcmcia/pcmcia_probe.c b/mdk-stage1/pcmcia/pcmcia_probe.c deleted file mode 100644 index 0d9dd7462..000000000 --- a/mdk-stage1/pcmcia/pcmcia_probe.c +++ /dev/null @@ -1,401 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* Code comes from /anonymous@projects.sourceforge.net:/pub/pcmcia-cs/pcmcia-cs-3.1.23.tar.bz2 - * - * Licence of this code follows: - - PCMCIA controller probe - - probe.c 1.52 2000/06/12 21:33:02 - - The contents of this file are subject to the Mozilla Public - License Version 1.1 (the "License"); you may not use this file - except in compliance with the License. You may obtain a copy of - the License at http://www.mozilla.org/MPL/ - - Software distributed under the License is distributed on an "AS - IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - implied. See the License for the specific language governing - rights and limitations under the License. - - The initial developer of the original code is David A. Hinds - . Portions created by David A. Hinds - are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - - Alternatively, the contents of this file may be used under the - terms of the GNU Public License version 2 (the "GPL"), in which - case the provisions of the GPL are applicable instead of the - above. If you wish to allow the use of your version of this file - only under the terms of the GPL and not to allow others to use - your version of this file under the MPL, indicate your decision - by deleting the provisions above and replace them with the notice - and other provisions required by the GPL. If you do not delete - the provisions above, a recipient may use your version of this - file under either the MPL or the GPL. - -======================================================================*/ - -#include -#include -#include -#include -#include -#include -#include - -#include "log.h" -#include "pcmcia.h" - -/*====================================================================*/ - -typedef struct { - u_short vendor, device; - char *tag; - char *name; -} pci_id_t; - -pci_id_t pci_id[] = { - { 0x1013, 0x1100, "Cirrus Logic CL 6729", "Cirrus PD6729" }, - { 0x1013, 0x1110, "Cirrus Logic PD 6832", "Cirrus PD6832" }, - { 0x10b3, 0xb106, "SMC 34C90", "SMC 34C90" }, - { 0x1180, 0x0465, "Ricoh RL5C465", "Ricoh RL5C465" }, - { 0x1180, 0x0466, "Ricoh RL5C466", "Ricoh RL5C466" }, - { 0x1180, 0x0475, "Ricoh RL5C475", "Ricoh RL5C475" }, - { 0x1180, 0x0476, "Ricoh RL5C476", "Ricoh RL5C476" }, - { 0x1180, 0x0478, "Ricoh RL5C478", "Ricoh RL5C478" }, - { 0x104c, 0xac12, "Texas Instruments PCI1130", "TI 1130" }, - { 0x104c, 0xac13, "Texas Instruments PCI1031", "TI 1031" }, - { 0x104c, 0xac15, "Texas Instruments PCI1131", "TI 1131" }, - { 0x104c, 0xac16, "Texas Instruments PCI1250", "TI 1250A" }, - { 0x104c, 0xac17, "Texas Instruments PCI1220", "TI 1220" }, - { 0x104c, 0xac19, "Texas Instruments PCI1221", "TI 1221" }, - { 0x104c, 0xac1a, "Texas Instruments PCI1210", "TI 1210" }, - { 0x104c, 0xac1d, "Texas Instruments PCI1251A", "TI 1251A" }, - { 0x104c, 0xac1f, "Texas Instruments PCI1251B", "TI 1251B" }, - { 0x104c, 0xac1b, "Texas Instruments PCI1450", "TI 1450" }, - { 0x104c, 0xac1c, "Texas Instruments PCI1225", "TI 1225" }, - { 0x104c, 0xac1e, "Texas Instruments PCI1211", "TI 1211" }, - { 0x104c, 0xac50, "Texas Instruments PCI1410", "TI 1410" }, - { 0x104c, 0xac51, "Texas Instruments PCI1420", "TI 1420" }, - { 0x1217, 0x6729, "O2 Micro 6729", "O2Micro OZ6729" }, - { 0x1217, 0x673a, "O2 Micro 6730", "O2Micro OZ6730" }, - { 0x1217, 0x6832, "O2 Micro 6832/6833", "O2Micro OZ6832/OZ6833" }, - { 0x1217, 0x6836, "O2 Micro 6836/6860", "O2Micro OZ6836/OZ6860" }, - { 0x1217, 0x6872, "O2 Micro 6812", "O2Micro OZ6812" }, - { 0x1179, 0x0603, "Toshiba ToPIC95-A", "Toshiba ToPIC95-A" }, - { 0x1179, 0x060a, "Toshiba ToPIC95-B", "Toshiba ToPIC95-B" }, - { 0x1179, 0x060f, "Toshiba ToPIC97", "Toshiba ToPIC97" }, - { 0x1179, 0x0617, "Toshiba ToPIC100", "Toshiba ToPIC100" }, - { 0x119b, 0x1221, "Omega Micro 82C092G", "Omega Micro 82C092G" }, - { 0x8086, 0x1221, "Intel 82092AA", "Intel 82092AA" } -}; -#define PCI_COUNT (sizeof(pci_id)/sizeof(pci_id_t)) - -static int pci_probe(void) -{ - char s[256], *name = NULL; - u_int device, vendor, i; - FILE *f; - - log_message("PCMCIA: probing PCI bus.."); - - f = fopen("/proc/bus/pci/devices", "r"); - - if (!f) { - log_message("where are you going without /proc/bus/pci/devices ??"); - return -1; - } - - while (fgets(s, 256, f) != NULL) { - u_int n = strtoul(s+5, NULL, 16); - vendor = (n >> 16); device = (n & 0xffff); - for (i = 0; i < PCI_COUNT; i++) - if ((vendor == pci_id[i].vendor) && - (device == pci_id[i].device)) break; - if (i < PCI_COUNT) { - name = pci_id[i].name; - break; - } - } - - fclose(f); - - if (name) { - log_message("\t%s found, 2 sockets.", name); - return 0; - } else { - log_message("\tnot found."); - return -ENODEV; - } -} - -/*====================================================================*/ - -#include -typedef u_short ioaddr_t; - -#include "i82365.h" -#include "cirrus.h" -#include "vg468.h" - -static ioaddr_t i365_base = 0x03e0; - -static u_char i365_get(u_short sock, u_short reg) -{ - u_char val = I365_REG(sock, reg); - outb(val, i365_base); val = inb(i365_base+1); - return val; -} - -static void i365_set(u_short sock, u_short reg, u_char data) -{ - u_char val = I365_REG(sock, reg); - outb(val, i365_base); outb(data, i365_base+1); -} - -static void i365_bset(u_short sock, u_short reg, u_char mask) -{ - u_char d = i365_get(sock, reg); - d |= mask; - i365_set(sock, reg, d); -} - -static void i365_bclr(u_short sock, u_short reg, u_char mask) -{ - u_char d = i365_get(sock, reg); - d &= ~mask; - i365_set(sock, reg, d); -} - -static int i365_probe(void) -{ - int val, sock, done; - char *name = "i82365sl"; - - log_message("PCMCIA: probing for Intel PCIC (ISA).."); - - sock = done = 0; - if (ioperm(i365_base, 4, 1)) { - log_perror("PCMCIA: ioperm"); - return -1; - } - ioperm(0x80, 1, 1); - for (; sock < 2; sock++) { - val = i365_get(sock, I365_IDENT); - switch (val) { - case 0x82: - name = "i82365sl A step"; - break; - case 0x83: - name = "i82365sl B step"; - break; - case 0x84: - name = "VLSI 82C146"; - break; - case 0x88: case 0x89: case 0x8a: - name = "IBM Clone"; - break; - case 0x8b: case 0x8c: - break; - default: - done = 1; - } - if (done) break; - } - - if (sock == 0) { - log_message("\tnot found."); - return -ENODEV; - } - - if ((sock == 2) && (strcmp(name, "VLSI 82C146") == 0)) - name = "i82365sl DF"; - - /* Check for Vadem chips */ - outb(0x0e, i365_base); - outb(0x37, i365_base); - i365_bset(0, VG468_MISC, VG468_MISC_VADEMREV); - val = i365_get(0, I365_IDENT); - if (val & I365_IDENT_VADEM) { - if ((val & 7) < 4) - name = "Vadem VG-468"; - else - name = "Vadem VG-469"; - i365_bclr(0, VG468_MISC, VG468_MISC_VADEMREV); - } - - /* Check for Cirrus CL-PD67xx chips */ - i365_set(0, PD67_CHIP_INFO, 0); - val = i365_get(0, PD67_CHIP_INFO); - if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) { - val = i365_get(0, PD67_CHIP_INFO); - if ((val & PD67_INFO_CHIP_ID) == 0) { - if (val & PD67_INFO_SLOTS) - name = "Cirrus CL-PD672x"; - else { - name = "Cirrus CL-PD6710"; - sock = 1; - } - i365_set(0, PD67_EXT_INDEX, 0xe5); - if (i365_get(0, PD67_EXT_INDEX) != 0xe5) - name = "VIA VT83C469"; - } - } - - log_message("\t%s found, %d sockets.", name, sock); - return 0; - -} /* i365_probe */ - - -/*====================================================================*/ - -#include "tcic.h" - -static u_char tcic_getb(ioaddr_t base, u_char reg) -{ - u_char val = inb(base+reg); - return val; -} - -static void tcic_setb(ioaddr_t base, u_char reg, u_char data) -{ - outb(data, base+reg); -} - -static u_short tcic_getw(ioaddr_t base, u_char reg) -{ - u_short val = inw(base+reg); - return val; -} - -static void tcic_setw(ioaddr_t base, u_char reg, u_short data) -{ - outw(data, base+reg); -} - -static u_short tcic_aux_getw(ioaddr_t base, u_short reg) -{ - u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg; - tcic_setb(base, TCIC_MODE, mode); - return tcic_getw(base, TCIC_AUX); -} - -static void tcic_aux_setw(ioaddr_t base, u_short reg, u_short data) -{ - u_char mode = (tcic_getb(base, TCIC_MODE) & TCIC_MODE_PGMMASK) | reg; - tcic_setb(base, TCIC_MODE, mode); - tcic_setw(base, TCIC_AUX, data); -} - -static int get_tcic_id(ioaddr_t base) -{ - u_short id; - tcic_aux_setw(base, TCIC_AUX_TEST, TCIC_TEST_DIAG); - id = tcic_aux_getw(base, TCIC_AUX_ILOCK); - id = (id & TCIC_ILOCKTEST_ID_MASK) >> TCIC_ILOCKTEST_ID_SH; - tcic_aux_setw(base, TCIC_AUX_TEST, 0); - return id; -} - -static int tcic_probe_at(ioaddr_t base) -{ - int i; - u_short old; - - /* Anything there?? */ - for (i = 0; i < 0x10; i += 2) - if (tcic_getw(base, i) == 0xffff) - return -1; - - log_message("\tat %#3.3x: ", base); - - /* Try to reset the chip */ - tcic_setw(base, TCIC_SCTRL, TCIC_SCTRL_RESET); - tcic_setw(base, TCIC_SCTRL, 0); - - /* Can we set the addr register? */ - old = tcic_getw(base, TCIC_ADDR); - tcic_setw(base, TCIC_ADDR, 0); - if (tcic_getw(base, TCIC_ADDR) != 0) { - tcic_setw(base, TCIC_ADDR, old); - return -2; - } - - tcic_setw(base, TCIC_ADDR, 0xc3a5); - if (tcic_getw(base, TCIC_ADDR) != 0xc3a5) - return -3; - - return 2; -} - -static int tcic_probe(void) -{ - int sock, id; - - log_message("PCMCIA: probing for Databook TCIC-2 (ISA).."); - - if (ioperm(TCIC_BASE, 16, 1)) { - log_perror("PCMCIA: ioperm"); - return -1; - } - - ioperm(0x80, 1, 1); - sock = tcic_probe_at(TCIC_BASE); - - if (sock <= 0) { - log_message("\tnot found."); - return -ENODEV; - } - - id = get_tcic_id(TCIC_BASE); - switch (id) { - case TCIC_ID_DB86082: - log_message("DB86082"); break; - case TCIC_ID_DB86082A: - log_message("DB86082A"); break; - case TCIC_ID_DB86084: - log_message("DB86084"); break; - case TCIC_ID_DB86084A: - log_message("DB86084A"); break; - case TCIC_ID_DB86072: - log_message("DB86072"); break; - case TCIC_ID_DB86184: - log_message("DB86184"); break; - case TCIC_ID_DB86082B: - log_message("DB86082B"); break; - default: - log_message("Unknown TCIC-2 ID 0x%02x", id); - } - log_message("\tfound at %#6x, %d sockets.\n", TCIC_BASE, sock); - - return 0; - -} /* tcic_probe */ - - -/*====================================================================*/ - -char * pcmcia_probe(void) -{ - if (!pci_probe()) - return "i82365"; - else if (!i365_probe()) - return "i82365"; - else if (!tcic_probe()) - return "tcic"; - else - return NULL; -} diff --git a/mdk-stage1/pcmcia/tcic.h b/mdk-stage1/pcmcia/tcic.h deleted file mode 100644 index 92347cef6..000000000 --- a/mdk-stage1/pcmcia/tcic.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - * tcic.h 1.14 2000/06/12 21:29:37 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#ifndef _LINUX_TCIC_H -#define _LINUX_TCIC_H - -#define TCIC_BASE 0x240 - -/* offsets of registers from TCIC_BASE */ -#define TCIC_DATA 0x00 -#define TCIC_ADDR 0x02 -#define TCIC_SCTRL 0x06 -#define TCIC_SSTAT 0x07 -#define TCIC_MODE 0x08 -#define TCIC_PWR 0x09 -#define TCIC_EDC 0x0A -#define TCIC_ICSR 0x0C -#define TCIC_IENA 0x0D -#define TCIC_AUX 0x0E - -#define TCIC_SS_SHFT 12 -#define TCIC_SS_MASK 0x7000 - -/* Flags for TCIC_ADDR */ -#define TCIC_ADR2_REG 0x8000 -#define TCIC_ADR2_INDREG 0x0800 - -#define TCIC_ADDR_REG 0x80000000 -#define TCIC_ADDR_SS_SHFT (TCIC_SS_SHFT+16) -#define TCIC_ADDR_SS_MASK (TCIC_SS_MASK<<16) -#define TCIC_ADDR_INDREG 0x08000000 -#define TCIC_ADDR_IO 0x04000000 -#define TCIC_ADDR_MASK 0x03ffffff - -/* Flags for TCIC_SCTRL */ -#define TCIC_SCTRL_ENA 0x01 -#define TCIC_SCTRL_INCMODE 0x18 -#define TCIC_SCTRL_INCMODE_HOLD 0x00 -#define TCIC_SCTRL_INCMODE_WORD 0x08 -#define TCIC_SCTRL_INCMODE_REG 0x10 -#define TCIC_SCTRL_INCMODE_AUTO 0x18 -#define TCIC_SCTRL_EDCSUM 0x20 -#define TCIC_SCTRL_RESET 0x80 - -/* Flags for TCIC_SSTAT */ -#define TCIC_SSTAT_6US 0x01 -#define TCIC_SSTAT_10US 0x02 -#define TCIC_SSTAT_PROGTIME 0x04 -#define TCIC_SSTAT_LBAT1 0x08 -#define TCIC_SSTAT_LBAT2 0x10 -#define TCIC_SSTAT_RDY 0x20 /* Inverted */ -#define TCIC_SSTAT_WP 0x40 -#define TCIC_SSTAT_CD 0x80 /* Card detect */ - -/* Flags for TCIC_MODE */ -#define TCIC_MODE_PGMMASK 0x1f -#define TCIC_MODE_NORMAL 0x00 -#define TCIC_MODE_PGMWR 0x01 -#define TCIC_MODE_PGMRD 0x02 -#define TCIC_MODE_PGMCE 0x04 -#define TCIC_MODE_PGMDBW 0x08 -#define TCIC_MODE_PGMWORD 0x10 -#define TCIC_MODE_AUXSEL_MASK 0xe0 - -/* Registers accessed through TCIC_AUX, by setting TCIC_MODE */ -#define TCIC_AUX_TCTL (0<<5) -#define TCIC_AUX_PCTL (1<<5) -#define TCIC_AUX_WCTL (2<<5) -#define TCIC_AUX_EXTERN (3<<5) -#define TCIC_AUX_PDATA (4<<5) -#define TCIC_AUX_SYSCFG (5<<5) -#define TCIC_AUX_ILOCK (6<<5) -#define TCIC_AUX_TEST (7<<5) - -/* Flags for TCIC_PWR */ -#define TCIC_PWR_VCC(sock) (0x01<<(sock)) -#define TCIC_PWR_VCC_MASK 0x03 -#define TCIC_PWR_VPP(sock) (0x08<<(sock)) -#define TCIC_PWR_VPP_MASK 0x18 -#define TCIC_PWR_CLIMENA 0x40 -#define TCIC_PWR_CLIMSTAT 0x80 - -/* Flags for TCIC_ICSR */ -#define TCIC_ICSR_CLEAR 0x01 -#define TCIC_ICSR_SET 0x02 -#define TCIC_ICSR_JAM (TCIC_ICSR_CLEAR|TCIC_ICSR_SET) -#define TCIC_ICSR_STOPCPU 0x04 -#define TCIC_ICSR_ILOCK 0x08 -#define TCIC_ICSR_PROGTIME 0x10 -#define TCIC_ICSR_ERR 0x20 -#define TCIC_ICSR_CDCHG 0x40 -#define TCIC_ICSR_IOCHK 0x80 - -/* Flags for TCIC_IENA */ -#define TCIC_IENA_CFG_MASK 0x03 -#define TCIC_IENA_CFG_OFF 0x00 /* disabled */ -#define TCIC_IENA_CFG_OD 0x01 /* active low, open drain */ -#define TCIC_IENA_CFG_LOW 0x02 /* active low, totem pole */ -#define TCIC_IENA_CFG_HIGH 0x03 /* active high, totem pole */ -#define TCIC_IENA_ILOCK 0x08 -#define TCIC_IENA_PROGTIME 0x10 -#define TCIC_IENA_ERR 0x20 /* overcurrent or iochk */ -#define TCIC_IENA_CDCHG 0x40 - -/* Flags for TCIC_AUX_WCTL */ -#define TCIC_WAIT_COUNT_MASK 0x001f -#define TCIC_WAIT_ASYNC 0x0020 -#define TCIC_WAIT_SENSE 0x0040 -#define TCIC_WAIT_SRC 0x0080 -#define TCIC_WCTL_WR 0x0100 -#define TCIC_WCTL_RD 0x0200 -#define TCIC_WCTL_CE 0x0400 -#define TCIC_WCTL_LLBAT1 0x0800 -#define TCIC_WCTL_LLBAT2 0x1000 -#define TCIC_WCTL_LRDY 0x2000 -#define TCIC_WCTL_LWP 0x4000 -#define TCIC_WCTL_LCD 0x8000 - -/* Flags for TCIC_AUX_SYSCFG */ -#define TCIC_SYSCFG_IRQ_MASK 0x000f -#define TCIC_SYSCFG_MCSFULL 0x0010 -#define TCIC_SYSCFG_IO1723 0x0020 -#define TCIC_SYSCFG_MCSXB 0x0040 -#define TCIC_SYSCFG_ICSXB 0x0080 -#define TCIC_SYSCFG_NOPDN 0x0100 -#define TCIC_SYSCFG_MPSEL_SHFT 9 -#define TCIC_SYSCFG_MPSEL_MASK 0x0e00 -#define TCIC_SYSCFG_MPSENSE 0x2000 -#define TCIC_SYSCFG_AUTOBUSY 0x4000 -#define TCIC_SYSCFG_ACC 0x8000 - -#define TCIC_ILOCK_OUT 0x01 -#define TCIC_ILOCK_SENSE 0x02 -#define TCIC_ILOCK_CRESET 0x04 -#define TCIC_ILOCK_CRESENA 0x08 -#define TCIC_ILOCK_CWAIT 0x10 -#define TCIC_ILOCK_CWAITSNS 0x20 -#define TCIC_ILOCK_HOLD_MASK 0xc0 -#define TCIC_ILOCK_HOLD_CCLK 0xc0 - -#define TCIC_ILOCKTEST_ID_SH 8 -#define TCIC_ILOCKTEST_ID_MASK 0x7f00 -#define TCIC_ILOCKTEST_MCIC_1 0x8000 - -#define TCIC_ID_DB86082 0x02 -#define TCIC_ID_DB86082A 0x03 -#define TCIC_ID_DB86084 0x04 -#define TCIC_ID_DB86084A 0x08 -#define TCIC_ID_DB86072 0x15 -#define TCIC_ID_DB86184 0x14 -#define TCIC_ID_DB86082B 0x17 - -#define TCIC_TEST_DIAG 0x8000 - -/* - * Indirectly addressed registers - */ - -#define TCIC_SCF1(sock) ((sock)<<3) -#define TCIC_SCF2(sock) (((sock)<<3)+2) - -/* Flags for SCF1 */ -#define TCIC_SCF1_IRQ_MASK 0x000f -#define TCIC_SCF1_IRQ_OFF 0x0000 -#define TCIC_SCF1_IRQOC 0x0010 -#define TCIC_SCF1_PCVT 0x0020 -#define TCIC_SCF1_IRDY 0x0040 -#define TCIC_SCF1_ATA 0x0080 -#define TCIC_SCF1_DMA_SHIFT 8 -#define TCIC_SCF1_DMA_MASK 0x0700 -#define TCIC_SCF1_DMA_OFF 0 -#define TCIC_SCF1_DREQ2 2 -#define TCIC_SCF1_IOSTS 0x0800 -#define TCIC_SCF1_SPKR 0x1000 -#define TCIC_SCF1_FINPACK 0x2000 -#define TCIC_SCF1_DELWR 0x4000 -#define TCIC_SCF1_HD7IDE 0x8000 - -/* Flags for SCF2 */ -#define TCIC_SCF2_RI 0x0001 -#define TCIC_SCF2_IDBR 0x0002 -#define TCIC_SCF2_MDBR 0x0004 -#define TCIC_SCF2_MLBAT1 0x0008 -#define TCIC_SCF2_MLBAT2 0x0010 -#define TCIC_SCF2_MRDY 0x0020 -#define TCIC_SCF2_MWP 0x0040 -#define TCIC_SCF2_MCD 0x0080 -#define TCIC_SCF2_MALL 0x00f8 - -/* Indirect addresses for memory window registers */ -#define TCIC_MWIN(sock,map) (0x100+(((map)+((sock)<<2))<<3)) -#define TCIC_MBASE_X 2 -#define TCIC_MMAP_X 4 -#define TCIC_MCTL_X 6 - -#define TCIC_MBASE_4K_BIT 0x4000 -#define TCIC_MBASE_HA_SHFT 12 -#define TCIC_MBASE_HA_MASK 0x0fff - -#define TCIC_MMAP_REG 0x8000 -#define TCIC_MMAP_CA_SHFT 12 -#define TCIC_MMAP_CA_MASK 0x3fff - -#define TCIC_MCTL_WSCNT_MASK 0x001f -#define TCIC_MCTL_WCLK 0x0020 -#define TCIC_MCTL_WCLK_CCLK 0x0000 -#define TCIC_MCTL_WCLK_BCLK 0x0020 -#define TCIC_MCTL_QUIET 0x0040 -#define TCIC_MCTL_WP 0x0080 -#define TCIC_MCTL_ACC 0x0100 -#define TCIC_MCTL_KE 0x0200 -#define TCIC_MCTL_EDC 0x0400 -#define TCIC_MCTL_B8 0x0800 -#define TCIC_MCTL_SS_SHFT TCIC_SS_SHFT -#define TCIC_MCTL_SS_MASK TCIC_SS_MASK -#define TCIC_MCTL_ENA 0x8000 - -/* Indirect addresses for I/O window registers */ -#define TCIC_IWIN(sock,map) (0x200+(((map)+((sock)<<1))<<2)) -#define TCIC_IBASE_X 0 -#define TCIC_ICTL_X 2 - -#define TCIC_ICTL_WSCNT_MASK TCIC_MCTL_WSCNT_MASK -#define TCIC_ICTL_QUIET TCIC_MCTL_QUIET -#define TCIC_ICTL_1K 0x0080 -#define TCIC_ICTL_PASS16 0x0100 -#define TCIC_ICTL_ACC TCIC_MCTL_ACC -#define TCIC_ICTL_TINY 0x0200 -#define TCIC_ICTL_B16 0x0400 -#define TCIC_ICTL_B8 TCIC_MCTL_B8 -#define TCIC_ICTL_BW_MASK (TCIC_ICTL_B16|TCIC_ICTL_B8) -#define TCIC_ICTL_BW_DYN 0 -#define TCIC_ICTL_BW_8 TCIC_ICTL_B8 -#define TCIC_ICTL_BW_16 TCIC_ICTL_B16 -#define TCIC_ICTL_BW_ATA (TCIC_ICTL_B16|TCIC_ICTL_B8) -#define TCIC_ICTL_SS_SHFT TCIC_SS_SHFT -#define TCIC_ICTL_SS_MASK TCIC_SS_MASK -#define TCIC_ICTL_ENA TCIC_MCTL_ENA - -#endif /* _LINUX_TCIC_H */ diff --git a/mdk-stage1/pcmcia/version.h b/mdk-stage1/pcmcia/version.h deleted file mode 100644 index 7a567ea2c..000000000 --- a/mdk-stage1/pcmcia/version.h +++ /dev/null @@ -1,4 +0,0 @@ -/* version.h 1.95 2000/11/07 22:55:28 (David Hinds) */ - -#define CS_RELEASE "3.1.23" -#define CS_RELEASE_CODE 0x3117 diff --git a/mdk-stage1/pcmcia/vg468.h b/mdk-stage1/pcmcia/vg468.h deleted file mode 100644 index bb5faae87..000000000 --- a/mdk-stage1/pcmcia/vg468.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * vg468.h 1.13 2000/06/12 21:29:37 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#ifndef _LINUX_VG468_H -#define _LINUX_VG468_H - -/* Special bit in I365_IDENT used for Vadem chip detection */ -#define I365_IDENT_VADEM 0x08 - -/* Special definitions in I365_POWER */ -#define VG468_VPP2_MASK 0x0c -#define VG468_VPP2_5V 0x04 -#define VG468_VPP2_12V 0x08 - -/* Unique Vadem registers */ -#define VG469_VSENSE 0x1f /* Card voltage sense */ -#define VG469_VSELECT 0x2f /* Card voltage select */ -#define VG468_CTL 0x38 /* Control register */ -#define VG468_TIMER 0x39 /* Timer control */ -#define VG468_MISC 0x3a /* Miscellaneous */ -#define VG468_GPIO_CFG 0x3b /* GPIO configuration */ -#define VG469_EXT_MODE 0x3c /* Extended mode register */ -#define VG468_SELECT 0x3d /* Programmable chip select */ -#define VG468_SELECT_CFG 0x3e /* Chip select configuration */ -#define VG468_ATA 0x3f /* ATA control */ - -/* Flags for VG469_VSENSE */ -#define VG469_VSENSE_A_VS1 0x01 -#define VG469_VSENSE_A_VS2 0x02 -#define VG469_VSENSE_B_VS1 0x04 -#define VG469_VSENSE_B_VS2 0x08 - -/* Flags for VG469_VSELECT */ -#define VG469_VSEL_VCC 0x03 -#define VG469_VSEL_5V 0x00 -#define VG469_VSEL_3V 0x03 -#define VG469_VSEL_MAX 0x0c -#define VG469_VSEL_EXT_STAT 0x10 -#define VG469_VSEL_EXT_BUS 0x20 -#define VG469_VSEL_MIXED 0x40 -#define VG469_VSEL_ISA 0x80 - -/* Flags for VG468_CTL */ -#define VG468_CTL_SLOW 0x01 /* 600ns memory timing */ -#define VG468_CTL_ASYNC 0x02 /* Asynchronous bus clocking */ -#define VG468_CTL_TSSI 0x08 /* Tri-state some outputs */ -#define VG468_CTL_DELAY 0x10 /* Card detect debounce */ -#define VG468_CTL_INPACK 0x20 /* Obey INPACK signal? */ -#define VG468_CTL_POLARITY 0x40 /* VCCEN polarity */ -#define VG468_CTL_COMPAT 0x80 /* Compatibility stuff */ - -#define VG469_CTL_WS_COMPAT 0x04 /* Wait state compatibility */ -#define VG469_CTL_STRETCH 0x10 /* LED stretch */ - -/* Flags for VG468_TIMER */ -#define VG468_TIMER_ZEROPWR 0x10 /* Zero power control */ -#define VG468_TIMER_SIGEN 0x20 /* Power up */ -#define VG468_TIMER_STATUS 0x40 /* Activity timer status */ -#define VG468_TIMER_RES 0x80 /* Timer resolution */ -#define VG468_TIMER_MASK 0x0f /* Activity timer timeout */ - -/* Flags for VG468_MISC */ -#define VG468_MISC_GPIO 0x04 /* General-purpose IO */ -#define VG468_MISC_DMAWSB 0x08 /* DMA wait state control */ -#define VG469_MISC_LEDENA 0x10 /* LED enable */ -#define VG468_MISC_VADEMREV 0x40 /* Vadem revision control */ -#define VG468_MISC_UNLOCK 0x80 /* Unique register lock */ - -/* Flags for VG469_EXT_MODE_A */ -#define VG469_MODE_VPPST 0x03 /* Vpp steering control */ -#define VG469_MODE_INT_SENSE 0x04 /* Internal voltage sense */ -#define VG469_MODE_CABLE 0x08 -#define VG469_MODE_COMPAT 0x10 /* i82365sl B or DF step */ -#define VG469_MODE_TEST 0x20 -#define VG469_MODE_RIO 0x40 /* Steer RIO to INTR? */ - -/* Flags for VG469_EXT_MODE_B */ -#define VG469_MODE_B_3V 0x01 /* 3.3v for socket B */ - -/* Data structure for tracking vendor-specific state */ -typedef struct vg46x_state_t { - u_char ctl; /* VG468_CTL */ - u_char ema; /* VG468_EXT_MODE_A */ -} vg46x_state_t; - -#endif /* _LINUX_VG468_H */ diff --git a/mdk-stage1/pcmcia/yacc_config.c b/mdk-stage1/pcmcia/yacc_config.c deleted file mode 100644 index e68e17cb3..000000000 --- a/mdk-stage1/pcmcia/yacc_config.c +++ /dev/null @@ -1,1017 +0,0 @@ -#define YYBYACC 1 -#define YYMAJOR 1 -#define YYMINOR 9 -#define yyclearin (yychar=(-1)) -#define yyerrok (yyerrflag=0) -#define YYRECOVERING (yyerrflag!=0) -#define YYPREFIX "yy" -#line 2 "yacc_config.y" -/* - * yacc_config.y 1.51 2000/06/12 21:33:02 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License - * at http://www.mozilla.org/MPL/ - * - * Software distributed under the License is distributed on an "AS IS" - * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See - * the License for the specific language governing rights and - * limitations under the License. - * - * The initial developer of the original code is David A. Hinds - * . Portions created by David A. Hinds - * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. - * - * Alternatively, the contents of this file may be used under the - * terms of the GNU Public License version 2 (the "GPL"), in which - * case the provisions of the GPL are applicable instead of the - * above. If you wish to allow the use of your version of this file - * only under the terms of the GPL and not to allow others to use - * your version of this file under the MPL, indicate your decision by - * deleting the provisions above and replace them with the notice and - * other provisions required by the GPL. If you do not delete the - * provisions above, a recipient may use your version of this file - * under either the MPL or the GPL. - */ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "cardmgr.h" - -/* If bison: generate nicer error messages */ -#define YYERROR_VERBOSE 1 - -/* from lex_config, for nice error messages */ -extern char *current_file; -extern int current_lineno; - -void yyerror(char *msg, ...); - -static int add_binding(card_info_t *card, char *name, int fn); -static int add_module(device_info_t *card, char *name); - -#line 65 "yacc_config.y" -typedef union { - char *str; - u_long num; - struct device_info_t *device; - struct card_info_t *card; - struct mtd_ident_t *mtd; - struct adjust_list_t *adjust; -} YYSTYPE; -#line 77 "y.tab.c" -#define DEVICE 257 -#define CARD 258 -#define ANONYMOUS 259 -#define TUPLE 260 -#define MANFID 261 -#define VERSION 262 -#define FUNCTION 263 -#define PCI 264 -#define BIND 265 -#define CIS 266 -#define TO 267 -#define NEEDS_MTD 268 -#define MODULE 269 -#define OPTS 270 -#define CLASS 271 -#define REGION 272 -#define JEDEC 273 -#define DTYPE 274 -#define DEFAULT 275 -#define MTD 276 -#define INCLUDE 277 -#define EXCLUDE 278 -#define RESERVE 279 -#define IRQ_NO 280 -#define PORT 281 -#define MEMORY 282 -#define STRING 283 -#define NUMBER 284 -#define YYERRCODE 256 -short yylhs[] = { -1, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 2, 2, 2, 3, 3, 3, 3, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, - 10, 11, 12, 12, 13, 15, 14, 14, 14, 14, - 4, 21, 5, 5, 5, 6, 16, 16, 16, 16, - 18, 17, 19, 20, 20, 22, -}; -short yylen[] = { 2, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 2, 4, 4, 2, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 7, - 5, 5, 3, 3, 3, 3, 3, 5, 3, 5, - 2, 4, 3, 3, 3, 3, 2, 1, 1, 1, - 3, 4, 2, 3, 3, 4, -}; -short yydefred[] = { 1, - 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 19, 0, 21, 22, 23, 24, - 0, 26, 0, 28, 0, 49, 48, 50, 0, 6, - 7, 16, 20, 0, 47, 0, 0, 0, 0, 9, - 10, 11, 0, 41, 0, 0, 0, 0, 29, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 0, 0, 13, 0, 0, 12, 43, - 46, 44, 45, 0, 0, 33, 35, 0, 0, 36, - 34, 0, 0, 51, 54, 55, 42, 56, 0, 0, - 0, 0, 0, 0, 0, 52, 14, 15, 0, 31, - 32, 38, 40, 0, 30, -}; -short yydgoto[] = { 1, - 11, 40, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 30, 31, -}; -short yysindex[] = { 0, - -250, 0, -279, -278, -274, -265, -259, -242, -242, -242, - -10, -248, 0, -44, 0, -249, 0, 0, 0, 0, - -9, 0, -3, 0, -243, 0, 0, 0, -233, 0, - 0, 0, 0, -228, 0, -227, -240, -238, -237, 0, - 0, 0, -242, 0, -235, -232, -231, -230, 0, -234, - -229, -226, -225, -224, -222, -221, -220, -219, -218, -217, - 0, -215, -213, -212, -211, 0, 9, 11, 0, 0, - 0, 0, 0, 14, 21, 0, 0, 30, -192, 0, - 0, -191, -207, 0, 0, 0, 0, 0, -206, -205, - -204, -203, -202, -201, -200, 0, 0, 0, 41, 0, - 0, 0, 0, -197, 0, -}; -short yyrindex[] = { 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 107, 149, 0, 90, 0, 124, 0, 0, 0, 0, - 49, 0, 73, 0, 0, 0, 0, 0, 141, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -}; -short yygindex[] = { 0, - 0, -7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, -}; -#define YYTABLESIZE 428 -short yytable[] = { 48, - 37, 41, 42, 32, 33, 2, 3, 4, 34, 49, - 50, 51, 52, 53, 54, 55, 56, 35, 5, 44, - 45, 6, 46, 36, 39, 7, 8, 9, 10, 59, - 60, 61, 62, 43, 57, 69, 63, 37, 38, 39, - 58, 64, 65, 66, 37, 67, 68, 70, 25, 74, - 71, 72, 73, 89, 75, 90, 76, 91, 77, 78, - 79, 80, 81, 82, 92, 83, 84, 85, 39, 86, - 87, 88, 27, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 0, 0, 0, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 0, 0, 37, - 0, 0, 37, 0, 0, 0, 37, 37, 37, 37, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 0, 0, 39, 0, 0, 39, 0, 0, 0, - 39, 39, 39, 39, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 0, 0, 25, 0, 0, - 25, 0, 0, 0, 25, 25, 25, 25, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, - 0, 27, 0, 0, 27, 18, 18, 18, 27, 27, - 27, 27, 0, 0, 0, 0, 0, 18, 18, 0, - 18, 18, 2, 2, 2, 18, 18, 18, 18, 0, - 0, 0, 0, 0, 0, 2, 0, 0, 2, 5, - 5, 5, 2, 2, 2, 2, 0, 0, 0, 0, - 0, 0, 5, 0, 0, 5, 4, 4, 4, 5, - 5, 5, 5, 0, 3, 3, 3, 0, 0, 4, - 0, 0, 4, 0, 0, 0, 4, 4, 4, 4, - 3, 0, 0, 0, 3, 3, 3, 3, -}; -short yycheck[] = { 44, - 0, 9, 10, 283, 283, 256, 257, 258, 283, 259, - 260, 261, 262, 263, 264, 265, 266, 283, 269, 268, - 269, 272, 271, 283, 0, 276, 277, 278, 279, 273, - 274, 275, 276, 44, 44, 43, 270, 280, 281, 282, - 44, 270, 270, 284, 44, 284, 284, 283, 0, 284, - 283, 283, 283, 45, 284, 45, 283, 44, 284, 284, - 283, 283, 283, 283, 44, 284, 284, 283, 44, 283, - 283, 283, 0, 44, 267, 267, 284, 284, 284, 284, - 284, 284, 284, 284, 44, 283, -1, -1, -1, 0, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 270, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, -1, -1, 269, - -1, -1, 272, -1, -1, -1, 276, 277, 278, 279, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, -1, -1, 269, -1, -1, 272, -1, -1, -1, - 276, 277, 278, 279, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, -1, -1, 269, -1, -1, - 272, -1, -1, -1, 276, 277, 278, 279, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, -1, - -1, 269, -1, -1, 272, 256, 257, 258, 276, 277, - 278, 279, -1, -1, -1, -1, -1, 268, 269, -1, - 271, 272, 256, 257, 258, 276, 277, 278, 279, -1, - -1, -1, -1, -1, -1, 269, -1, -1, 272, 256, - 257, 258, 276, 277, 278, 279, -1, -1, -1, -1, - -1, -1, 269, -1, -1, 272, 256, 257, 258, 276, - 277, 278, 279, -1, 256, 257, 258, -1, -1, 269, - -1, -1, 272, -1, -1, -1, 276, 277, 278, 279, - 272, -1, -1, -1, 276, 277, 278, 279, -}; -#define YYFINAL 1 -#ifndef YYDEBUG -#define YYDEBUG 0 -#endif -#define YYMAXTOKEN 284 -#if YYDEBUG -char *yyname[] = { -"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,"','","'-'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"DEVICE","CARD", -"ANONYMOUS","TUPLE","MANFID","VERSION","FUNCTION","PCI","BIND","CIS","TO", -"NEEDS_MTD","MODULE","OPTS","CLASS","REGION","JEDEC","DTYPE","DEFAULT","MTD", -"INCLUDE","EXCLUDE","RESERVE","IRQ_NO","PORT","MEMORY","STRING","NUMBER", -}; -char *yyrule[] = { -"$accept : list", -"list :", -"list : list adjust", -"list : list device", -"list : list mtd", -"list : list card", -"list : list opts", -"list : list mtd_opts", -"list : list error", -"adjust : INCLUDE resource", -"adjust : EXCLUDE resource", -"adjust : RESERVE resource", -"adjust : adjust ',' resource", -"resource : IRQ_NO NUMBER", -"resource : PORT NUMBER '-' NUMBER", -"resource : MEMORY NUMBER '-' NUMBER", -"device : DEVICE STRING", -"device : needs_mtd", -"device : module", -"device : class", -"card : CARD STRING", -"card : anonymous", -"card : tuple", -"card : manfid", -"card : pci", -"card : version", -"card : function", -"card : bind", -"card : cis", -"anonymous : card ANONYMOUS", -"tuple : card TUPLE NUMBER ',' NUMBER ',' STRING", -"manfid : card MANFID NUMBER ',' NUMBER", -"pci : card PCI NUMBER ',' NUMBER", -"version : card VERSION STRING", -"version : version ',' STRING", -"function : card FUNCTION NUMBER", -"cis : card CIS STRING", -"bind : card BIND STRING", -"bind : card BIND STRING TO NUMBER", -"bind : bind ',' STRING", -"bind : bind ',' STRING TO NUMBER", -"needs_mtd : device NEEDS_MTD", -"opts : MODULE STRING OPTS STRING", -"module : device MODULE STRING", -"module : module OPTS STRING", -"module : module ',' STRING", -"class : device CLASS STRING", -"region : REGION STRING", -"region : dtype", -"region : jedec", -"region : default", -"dtype : region DTYPE NUMBER", -"jedec : region JEDEC NUMBER NUMBER", -"default : region DEFAULT", -"mtd : region MTD STRING", -"mtd : mtd OPTS STRING", -"mtd_opts : MTD STRING OPTS STRING", -}; -#endif -#ifdef YYSTACKSIZE -#undef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE -#else -#ifdef YYMAXDEPTH -#define YYSTACKSIZE YYMAXDEPTH -#else -#define YYSTACKSIZE 500 -#define YYMAXDEPTH 500 -#endif -#endif -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short yyss[YYSTACKSIZE]; -YYSTYPE yyvs[YYSTACKSIZE]; -#define yystacksize YYSTACKSIZE -#line 468 "yacc_config.y" -void yyerror(char *msg, ...) -{ - va_list ap; - char str[256]; - - va_start(ap, msg); - sprintf(str, "config error, file '%s' line %d: ", - current_file, current_lineno); - vsprintf(str+strlen(str), msg, ap); -#if YYDEBUG - fprintf(stderr, "%s\n", str); -#else - syslog(LOG_ERR, "%s", str); -#endif - va_end(ap); -} - -static int add_binding(card_info_t *card, char *name, int fn) -{ - device_info_t *dev = root_device; - if (card->bindings == MAX_BINDINGS) { - yyerror("too many bindings\n"); - return -1; - } - for (; dev; dev = dev->next) - if (strcmp((char *)dev->dev_info, name) == 0) break; - if (dev == NULL) { - yyerror("unknown device: %s", name); - return -1; - } - card->device[card->bindings] = dev; - card->dev_fn[card->bindings] = fn; - card->bindings++; - free(name); - return 0; -} - -static int add_module(device_info_t *dev, char *name) -{ - if (dev->modules == MAX_MODULES) { - yyerror("too many modules"); - return -1; - } - dev->module[dev->modules] = name; - dev->opts[dev->modules] = NULL; - dev->modules++; - return 0; -} - -int yylex(void); - -#if YYDEBUG -adjust_list_t *root_adjust = NULL; -device_info_t *root_device = NULL; -card_info_t *root_card = NULL, *blank_card = NULL, *root_func = NULL; -mtd_ident_t *root_mtd = NULL, *default_mtd = NULL; - - -void main(int argc, char *argv[]) -{ - yydebug = 1; - if (argc > 1) - parse_configfile(argv[1]); -} -#endif -#line 426 "y.tab.c" -#define YYABORT goto yyabort -#define YYREJECT goto yyabort -#define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab -int -yyparse(void) -{ - register int yym, yyn, yystate; -#if YYDEBUG - register char *yys; - extern char *getenv(); - - if (yys = getenv("YYDEBUG")) - { - yyn = *yys; - if (yyn >= '0' && yyn <= '9') - yydebug = yyn - '0'; - } -#endif - - yynerrs = 0; - yyerrflag = 0; - yychar = (-1); - - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; - -yyloop: - if ((yyn = yydefred[yystate])) goto yyreduce; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - } - if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, shifting to state %d\n", - YYPREFIX, yystate, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = (-1); - if (yyerrflag > 0) --yyerrflag; - goto yyloop; - } - if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { - yyn = yytable[yyn]; - goto yyreduce; - } - if (yyerrflag) goto yyinrecovery; - yyerror("syntax error"); -#ifdef lint - goto yyerrlab; -#endif -yyerrlab: - ++yynerrs; -yyinrecovery: - if (yyerrflag < 3) - { - yyerrflag = 3; - for (;;) - { - if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, error recovery shifting\ - to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - goto yyloop; - } - else - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: error recovery discarding state %d\n", - YYPREFIX, *yyssp); -#endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; - } - } - } - else - { - if (yychar == 0) goto yyabort; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, error recovery discards token %d (%s)\n", - YYPREFIX, yystate, yychar, yys); - } -#endif - yychar = (-1); - goto yyloop; - } -yyreduce: -#if YYDEBUG - if (yydebug) - printf("%sdebug: state %d, reducing by rule %d (%s)\n", - YYPREFIX, yystate, yyn, yyrule[yyn]); -#endif - yym = yylen[yyn]; - yyval = yyvsp[1-yym]; - switch (yyn) - { -case 2: -#line 84 "yacc_config.y" -{ - adjust_list_t **tail = &root_adjust; - while (*tail != NULL) tail = &(*tail)->next; - *tail = yyvsp[0].adjust; - } -break; -case 3: -#line 90 "yacc_config.y" -{ - yyvsp[0].device->next = root_device; - root_device = yyvsp[0].device; - } -break; -case 4: -#line 95 "yacc_config.y" -{ - if (yyvsp[0].mtd->mtd_type == 0) { - yyerror("no ID method for this card"); - YYERROR; - } - if (yyvsp[0].mtd->module == NULL) { - yyerror("no MTD module specified"); - YYERROR; - } - yyvsp[0].mtd->next = root_mtd; - root_mtd = yyvsp[0].mtd; - } -break; -case 5: -#line 108 "yacc_config.y" -{ - if (yyvsp[0].card->ident_type == 0) { - yyerror("no ID method for this card"); - YYERROR; - } - if (yyvsp[0].card->bindings == 0) { - yyerror("no function bindings"); - YYERROR; - } - if (yyvsp[0].card->ident_type == FUNC_IDENT) { - yyvsp[0].card->next = root_func; - root_func = yyvsp[0].card; - } else { - yyvsp[0].card->next = root_card; - root_card = yyvsp[0].card; - } - } -break; -case 9: -#line 131 "yacc_config.y" -{ - yyvsp[0].adjust->adj.Action = ADD_MANAGED_RESOURCE; - yyval.adjust = yyvsp[0].adjust; - } -break; -case 10: -#line 136 "yacc_config.y" -{ - yyvsp[0].adjust->adj.Action = REMOVE_MANAGED_RESOURCE; - yyval.adjust = yyvsp[0].adjust; - } -break; -case 11: -#line 141 "yacc_config.y" -{ - yyvsp[0].adjust->adj.Action = ADD_MANAGED_RESOURCE; - yyvsp[0].adjust->adj.Attributes |= RES_RESERVED; - yyval.adjust = yyvsp[0].adjust; - } -break; -case 12: -#line 147 "yacc_config.y" -{ - yyvsp[0].adjust->adj.Action = yyvsp[-2].adjust->adj.Action; - yyvsp[0].adjust->adj.Attributes = yyvsp[-2].adjust->adj.Attributes; - yyvsp[0].adjust->next = yyvsp[-2].adjust; - yyval.adjust = yyvsp[0].adjust; - } -break; -case 13: -#line 156 "yacc_config.y" -{ - yyval.adjust = calloc(sizeof(adjust_list_t), 1); - yyval.adjust->adj.Resource = RES_IRQ; - yyval.adjust->adj.resource.irq.IRQ = yyvsp[0].num; - } -break; -case 14: -#line 162 "yacc_config.y" -{ - if ((yyvsp[0].num < yyvsp[-2].num) || (yyvsp[0].num > 0xffff)) { - yyerror("invalid port range"); - YYERROR; - } - yyval.adjust = calloc(sizeof(adjust_list_t), 1); - yyval.adjust->adj.Resource = RES_IO_RANGE; - yyval.adjust->adj.resource.io.BasePort = yyvsp[-2].num; - yyval.adjust->adj.resource.io.NumPorts = yyvsp[0].num - yyvsp[-2].num + 1; - } -break; -case 15: -#line 173 "yacc_config.y" -{ - if (yyvsp[0].num < yyvsp[-2].num) { - yyerror("invalid address range"); - YYERROR; - } - yyval.adjust = calloc(sizeof(adjust_list_t), 1); - yyval.adjust->adj.Resource = RES_MEMORY_RANGE; - yyval.adjust->adj.resource.memory.Base = yyvsp[-2].num; - yyval.adjust->adj.resource.memory.Size = yyvsp[0].num - yyvsp[-2].num + 1; - } -break; -case 16: -#line 186 "yacc_config.y" -{ - yyval.device = calloc(sizeof(device_info_t), 1); - yyval.device->refs = 1; - strcpy(yyval.device->dev_info, yyvsp[0].str); - free(yyvsp[0].str); - } -break; -case 20: -#line 198 "yacc_config.y" -{ - yyval.card = calloc(sizeof(card_info_t), 1); - yyval.card->refs = 1; - yyval.card->name = yyvsp[0].str; - } -break; -case 29: -#line 214 "yacc_config.y" -{ - if (yyvsp[-1].card->ident_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - if (blank_card) { - yyerror("Anonymous card already defined"); - YYERROR; - } - yyvsp[-1].card->ident_type = BLANK_IDENT; - blank_card = yyvsp[-1].card; - } -break; -case 30: -#line 229 "yacc_config.y" -{ - if (yyvsp[-6].card->ident_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-6].card->ident_type = TUPLE_IDENT; - yyvsp[-6].card->id.tuple.code = yyvsp[-4].num; - yyvsp[-6].card->id.tuple.ofs = yyvsp[-2].num; - yyvsp[-6].card->id.tuple.info = yyvsp[0].str; - } -break; -case 31: -#line 242 "yacc_config.y" -{ - if (yyvsp[-4].card->ident_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-4].card->ident_type = MANFID_IDENT; - yyvsp[-4].card->id.manfid.manf = yyvsp[-2].num; - yyvsp[-4].card->id.manfid.card = yyvsp[0].num; - } -break; -case 32: -#line 253 "yacc_config.y" -{ - if (yyvsp[-4].card->ident_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-4].card->ident_type = PCI_IDENT; - yyvsp[-4].card->id.manfid.manf = yyvsp[-2].num; - yyvsp[-4].card->id.manfid.card = yyvsp[0].num; - } -break; -case 33: -#line 264 "yacc_config.y" -{ - if (yyvsp[-2].card->ident_type != 0) { - yyerror("ID method already defined\n"); - YYERROR; - } - yyvsp[-2].card->ident_type = VERS_1_IDENT; - yyvsp[-2].card->id.vers.ns = 1; - yyvsp[-2].card->id.vers.pi[0] = yyvsp[0].str; - } -break; -case 34: -#line 274 "yacc_config.y" -{ - if (yyvsp[-2].card->id.vers.ns == 4) { - yyerror("too many version strings"); - YYERROR; - } - yyvsp[-2].card->id.vers.pi[yyvsp[-2].card->id.vers.ns] = yyvsp[0].str; - yyvsp[-2].card->id.vers.ns++; - } -break; -case 35: -#line 285 "yacc_config.y" -{ - if (yyvsp[-2].card->ident_type != 0) { - yyerror("ID method already defined\n"); - YYERROR; - } - yyvsp[-2].card->ident_type = FUNC_IDENT; - yyvsp[-2].card->id.func.funcid = yyvsp[0].num; - } -break; -case 36: -#line 296 "yacc_config.y" -{ yyvsp[-2].card->cis_file = strdup(yyvsp[0].str); } -break; -case 37: -#line 300 "yacc_config.y" -{ - if (add_binding(yyvsp[-2].card, yyvsp[0].str, 0) != 0) - YYERROR; - } -break; -case 38: -#line 305 "yacc_config.y" -{ - if (add_binding(yyvsp[-4].card, yyvsp[-2].str, yyvsp[0].num) != 0) - YYERROR; - } -break; -case 39: -#line 310 "yacc_config.y" -{ - if (add_binding(yyvsp[-2].card, yyvsp[0].str, 0) != 0) - YYERROR; - } -break; -case 40: -#line 315 "yacc_config.y" -{ - if (add_binding(yyvsp[-4].card, yyvsp[-2].str, yyvsp[0].num) != 0) - YYERROR; - } -break; -case 41: -#line 322 "yacc_config.y" -{ - yyvsp[-1].device->needs_mtd = 1; - } -break; -case 42: -#line 328 "yacc_config.y" -{ - device_info_t *d; - int i, found = 0; - for (d = root_device; d; d = d->next) { - for (i = 0; i < d->modules; i++) - if (strcmp(yyvsp[-2].str, d->module[i]) == 0) break; - if (i < d->modules) { - if (d->opts[i]) - free(d->opts[i]); - d->opts[i] = strdup(yyvsp[0].str); - found = 1; - } - } - free(yyvsp[-2].str); free(yyvsp[0].str); - if (!found) { - yyerror("module name not found!"); - YYERROR; - } - } -break; -case 43: -#line 350 "yacc_config.y" -{ - if (add_module(yyvsp[-2].device, yyvsp[0].str) != 0) - YYERROR; - } -break; -case 44: -#line 355 "yacc_config.y" -{ - if (yyvsp[-2].device->opts[yyvsp[-2].device->modules-1] == NULL) { - yyvsp[-2].device->opts[yyvsp[-2].device->modules-1] = yyvsp[0].str; - } else { - yyerror("too many options"); - YYERROR; - } - } -break; -case 45: -#line 364 "yacc_config.y" -{ - if (add_module(yyvsp[-2].device, yyvsp[0].str) != 0) - YYERROR; - } -break; -case 46: -#line 371 "yacc_config.y" -{ - if (yyvsp[-2].device->class != NULL) { - yyerror("extra class string"); - YYERROR; - } - yyvsp[-2].device->class = yyvsp[0].str; - } -break; -case 47: -#line 381 "yacc_config.y" -{ - yyval.mtd = calloc(sizeof(mtd_ident_t), 1); - yyval.mtd->refs = 1; - yyval.mtd->name = yyvsp[0].str; - } -break; -case 51: -#line 392 "yacc_config.y" -{ - if (yyvsp[-2].mtd->mtd_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-2].mtd->mtd_type = DTYPE_MTD; - yyvsp[-2].mtd->dtype = yyvsp[0].num; - } -break; -case 52: -#line 403 "yacc_config.y" -{ - if (yyvsp[-3].mtd->mtd_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - yyvsp[-3].mtd->mtd_type = JEDEC_MTD; - yyvsp[-3].mtd->jedec_mfr = yyvsp[-1].num; - yyvsp[-3].mtd->jedec_info = yyvsp[0].num; - } -break; -case 53: -#line 415 "yacc_config.y" -{ - if (yyvsp[-1].mtd->mtd_type != 0) { - yyerror("ID method already defined"); - YYERROR; - } - if (default_mtd) { - yyerror("Default MTD already defined"); - YYERROR; - } - yyvsp[-1].mtd->mtd_type = DEFAULT_MTD; - default_mtd = yyvsp[-1].mtd; - } -break; -case 54: -#line 430 "yacc_config.y" -{ - if (yyvsp[-2].mtd->module != NULL) { - yyerror("extra MTD entry"); - YYERROR; - } - yyvsp[-2].mtd->module = yyvsp[0].str; - } -break; -case 55: -#line 438 "yacc_config.y" -{ - if (yyvsp[-2].mtd->opts == NULL) { - yyvsp[-2].mtd->opts = yyvsp[0].str; - } else { - yyerror("too many options"); - YYERROR; - } - } -break; -case 56: -#line 449 "yacc_config.y" -{ - mtd_ident_t *m; - int found = 0; - for (m = root_mtd; m; m = m->next) - if (strcmp(yyvsp[-2].str, m->module) == 0) break; - if (m) { - if (m->opts) free(m->opts); - m->opts = strdup(yyvsp[0].str); - found = 1; - } - free(yyvsp[-2].str); free(yyvsp[0].str); - if (!found) { - yyerror("MTD name not found!"); - YYERROR; - } - } -break; -#line 966 "y.tab.c" - } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; - yym = yylhs[yyn]; - if (yystate == 0 && yym == 0) - { -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state 0 to\ - state %d\n", YYPREFIX, YYFINAL); -#endif - yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("%sdebug: state %d, reading %d (%s)\n", - YYPREFIX, YYFINAL, yychar, yys); - } -#endif - } - if (yychar == 0) goto yyaccept; - goto yyloop; - } - if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yystate) - yystate = yytable[yyn]; - else - yystate = yydgoto[yym]; -#if YYDEBUG - if (yydebug) - printf("%sdebug: after reduction, shifting from state %d \ -to state %d\n", YYPREFIX, *yyssp, yystate); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate; - *++yyvsp = yyval; - goto yyloop; -yyoverflow: - yyerror("yacc stack overflow"); -yyabort: - return (1); -yyaccept: - return (0); -} diff --git a/mdk-stage1/pcmcia/yacc_config.h b/mdk-stage1/pcmcia/yacc_config.h deleted file mode 100644 index b4902c8e6..000000000 --- a/mdk-stage1/pcmcia/yacc_config.h +++ /dev/null @@ -1,37 +0,0 @@ -#define DEVICE 257 -#define CARD 258 -#define ANONYMOUS 259 -#define TUPLE 260 -#define MANFID 261 -#define VERSION 262 -#define FUNCTION 263 -#define PCI 264 -#define BIND 265 -#define CIS 266 -#define TO 267 -#define NEEDS_MTD 268 -#define MODULE 269 -#define OPTS 270 -#define CLASS 271 -#define REGION 272 -#define JEDEC 273 -#define DTYPE 274 -#define DEFAULT 275 -#define MTD 276 -#define INCLUDE 277 -#define EXCLUDE 278 -#define RESERVE 279 -#define IRQ_NO 280 -#define PORT 281 -#define MEMORY 282 -#define STRING 283 -#define NUMBER 284 -typedef union { - char *str; - u_long num; - struct device_info_t *device; - struct card_info_t *card; - struct mtd_ident_t *mtd; - struct adjust_list_t *adjust; -} YYSTYPE; -extern YYSTYPE yylval; diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c deleted file mode 100644 index dc8340ea8..000000000 --- a/mdk-stage1/probing.c +++ /dev/null @@ -1,498 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - - -/* - * This contains stuff related to probing: - * (1) any (actually SCSI and NET only) devices (autoprobe for PCI) - * (2) IDE media - * (3) SCSI media - * (4) ETH devices - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "stage1.h" - -#include "log.h" -#include "frontend.h" -#include "modules.h" -#include "pci-resource/pci-ids.h" - -#include "probing.h" - - -enum bus_type { IDE, SCSI }; - -struct media_info { - char * name; - char * model; - enum media_type type; - enum bus_type bus; -}; - - -static void warning_insmod_failed(enum insmod_return r) -{ - if (r != INSMOD_OK - && !(IS_AUTOMATIC && r == INSMOD_FAILED_FILE_NOT_FOUND)) - stg1_error_message("Warning, installation of driver failed. (please include msg from for bugreports)"); -} - -#ifndef DISABLE_NETWORK -struct net_description_elem -{ - char * intf_name; - char * intf_description; -}; -static struct net_description_elem net_descriptions[50]; -static int net_descr_number = 0; -static char * intf_descr_for_discover = NULL; -static char * net_intf_too_early_name[50]; /* for modules providing more than one net intf */ -static int net_intf_too_early_number = 0; -static int net_intf_too_early_ptr = 0; - -void prepare_intf_descr(const char * intf_descr) -{ - intf_descr_for_discover = strdup(intf_descr); -} - -void net_discovered_interface(char * intf_name) -{ - if (!intf_descr_for_discover) { - net_intf_too_early_name[net_intf_too_early_number++] = strdup(intf_name); - return; - } - if (!intf_name) { - if (net_intf_too_early_ptr >= net_intf_too_early_number) { - log_message("NET: was expecting another network interface (broken net module?)"); - return; - } - net_descriptions[net_descr_number].intf_name = net_intf_too_early_name[net_intf_too_early_ptr++]; - } - else - net_descriptions[net_descr_number].intf_name = strdup(intf_name); - net_descriptions[net_descr_number].intf_description = strdup(intf_descr_for_discover); - intf_descr_for_discover = NULL; - net_descr_number++; -} - -char * get_net_intf_description(char * intf_name) -{ - int i; - for (i = 0; i < net_descr_number ; i++) - if (!strcmp(net_descriptions[i].intf_name, intf_name)) - return net_descriptions[i].intf_description; - return strdup("unknown"); -} -#endif - -static void probe_that_type(enum driver_type type) -{ - if (IS_EXPERT) - ask_insmod(type); - else { - /* ---- PCI probe */ - FILE * f; - int len = 0; - char buf[200]; - struct pci_module_map * pcidb = NULL; - - f = fopen("/proc/bus/pci/devices", "rb"); - - if (!f) { - log_message("PCI: could not open proc file"); - return; - } - - switch (type) { - case SCSI_ADAPTERS: -#ifndef DISABLE_MEDIAS - pcidb = scsi_pci_ids; - len = scsi_num_ids; -#endif - break; - case NETWORK_DEVICES: -#ifndef DISABLE_NETWORK - pcidb = eth_pci_ids; - len = eth_num_ids; -#endif - break; - default: - return; - } - - while (1) { - int i, garb, vendor, device; - - if (!fgets(buf, sizeof(buf), f)) break; - - sscanf(buf, "%x %x", &garb, &vendor); - device = vendor & 0xFFFF; /* because scanf from dietlibc does not support %4f */ - vendor = (vendor >> 16) & 0xFFFF; - - for (i = 0; i < len; i++) { - if (pcidb[i].vendor == vendor && pcidb[i].device == device) { - log_message("PCI: device %04x %04x is \"%s\" (%s)", vendor, device, pcidb[i].name, pcidb[i].module); -#ifndef DISABLE_MEDIAS - if (type == SCSI_ADAPTERS) { - int wait_msg = 0; - enum insmod_return failed; - if (IS_AUTOMATIC) { - wait_message("Loading driver for SCSI adapter:\n \n%s", pcidb[i].name); - wait_msg = 1; - } else - stg1_info_message("About to load driver for SCSI adapter:\n \n%s", pcidb[i].name); - failed = my_insmod(pcidb[i].module, SCSI_ADAPTERS, NULL); - if (wait_msg) - remove_wait_message(); - warning_insmod_failed(failed); - - } -#endif -#ifndef DISABLE_NETWORK - if (type == NETWORK_DEVICES) { - stg1_info_message("About to load driver for network device:\n \n%s", pcidb[i].name); - prepare_intf_descr(pcidb[i].name); - warning_insmod_failed(my_insmod(pcidb[i].module, NETWORK_DEVICES, NULL)); - if (intf_descr_for_discover) /* for modules providing more than one net intf */ - net_discovered_interface(NULL); - } -#endif - } - } - } - - fclose(f); - } -} - - -#ifndef DISABLE_MEDIAS -static struct media_info * medias = NULL; - -static void find_media(void) -{ - char b[50]; - char buf[5000]; - struct media_info tmp[50]; - int count; - int fd; - - if (!medias) - probe_that_type(SCSI_ADAPTERS); - else - free(medias); /* that does not free the strings, by the way */ - - /* ----------------------------------------------- */ - log_message("looking for ide media"); - - count = 0; - strcpy(b, "/proc/ide/hd"); - for (b[12] = 'a'; b[12] <= 'h'; b[12]++) { - int i; - char ide_disk[] = "disk"; - char ide_cdrom[] = "cdrom"; - char ide_tape[] = "tape"; - char ide_floppy[] = "floppy"; - - /* first, test if file exists (will tell if attached medium exists) */ - b[13] = '\0'; - if (access(b, R_OK)) - continue; - - tmp[count].name = strdup("hda"); - tmp[count].name[2] = b[12]; - - /* media type */ - strcpy(b + 13, "/media"); - fd = open(b, O_RDONLY); - if (fd == -1) { - log_message("failed to open %s for reading", b); - continue; - } - - i = read(fd, buf, sizeof(buf)); - if (i == -1) { - log_message("failed to read %s", b); - continue; - } - buf[i] = '\0'; - close(fd); - - if (ptr_begins_static_str(buf, ide_disk)) - tmp[count].type = DISK; - else if (ptr_begins_static_str(buf, ide_cdrom)) - tmp[count].type = CDROM; - else if (ptr_begins_static_str(buf, ide_tape)) - tmp[count].type = TAPE; - else if (ptr_begins_static_str(buf, ide_floppy)) - tmp[count].type = FLOPPY; - else - tmp[count].type = UNKNOWN_MEDIA; - - /* media model */ - strcpy(b + 13, "/model"); - fd = open(b, O_RDONLY); - if (fd == -1) { - log_message("failed to open %s for reading", b); - continue; - } - - i = read(fd, buf, sizeof(buf)); - if (i <= 0) { - log_message("failed to read %s", b); - tmp[count].model = strdup("(none)"); - } - else { - buf[i-1] = '\0'; /* eat the \n */ - tmp[count].model = strdup(buf); - } - close(fd); - - log_message("IDE/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model); - tmp[count].bus = IDE; - count++; - } - - - /* ----------------------------------------------- */ - log_message("looking for scsi media"); - - - fd = open("/proc/scsi/scsi", O_RDONLY); - if (fd != -1) { - enum { SCSI_TOP, SCSI_HOST, SCSI_VENDOR, SCSI_TYPE } state = SCSI_TOP; - char * start, * chptr, * next, * end; - char scsi_disk_count = 'a'; - char scsi_cdrom_count = '0'; - char scsi_tape_count = '0'; - - char scsi_no_devices[] = "Attached devices: none"; - char scsi_some_devices[] = "Attached devices: "; - char scsi_host[] = "Host: "; - char scsi_vendor[] = " Vendor: "; - - int i = read(fd, &buf, sizeof(buf)-1); - if (i < 1) { - close(fd); - goto end_scsi; - } - close(fd); - buf[i] = '\0'; - - if (ptr_begins_static_str(buf, scsi_no_devices)) - goto end_scsi; - - start = buf; - while (*start) { - char tmp_model[50]; - char tmp_name[10]; - - chptr = start; - while (*chptr != '\n') chptr++; - *chptr = '\0'; - next = chptr + 1; - - switch (state) { - case SCSI_TOP: - if (!ptr_begins_static_str(start, scsi_some_devices)) - goto end_scsi; - state = SCSI_HOST; - break; - - case SCSI_HOST: - if (!ptr_begins_static_str(start, scsi_host)) - goto end_scsi; - state = SCSI_VENDOR; - break; - - case SCSI_VENDOR: - if (!ptr_begins_static_str(start, scsi_vendor)) - goto end_scsi; - - /* (1) Grab Vendor info */ - start += 10; - end = chptr = strstr(start, "Model:"); - if (!chptr) - goto end_scsi; - - chptr--; - while (*chptr == ' ') - chptr--; - if (*chptr == ':') { - chptr++; - *(chptr + 1) = '\0'; - strcpy(tmp_model,"(unknown)"); - } else { - *(chptr + 1) = '\0'; - strcpy(tmp_model, start); - } - - /* (2) Grab Model info */ - start = end; - start += 7; - - chptr = strstr(start, "Rev:"); - if (!chptr) - goto end_scsi; - - chptr--; - while (*chptr == ' ') chptr--; - *(chptr + 1) = '\0'; - - strcat(tmp_model, " "); - strcat(tmp_model, start); - - tmp[count].model = strdup(tmp_model); - - state = SCSI_TYPE; - - break; - - case SCSI_TYPE: - if (strncmp(" Type:", start, 7)) - goto end_scsi; - *tmp_name = '\0'; - - if (strstr(start, "Direct-Access")) { - sprintf(tmp_name, "sd%c", scsi_disk_count++); - tmp[count].type = DISK; - } else if (strstr(start, "Sequential-Access")) { - sprintf(tmp_name, "st%c", scsi_tape_count++); - tmp[count].type = TAPE; - } else if (strstr(start, "CD-ROM")) { - sprintf(tmp_name, "scd%c", scsi_cdrom_count++); - tmp[count].type = CDROM; - } - - if (*tmp_name) { - tmp[count].name = strdup(tmp_name); - log_message("SCSI/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model); - tmp[count].bus = SCSI; - count++; - } - - state = SCSI_HOST; - } - - start = next; - } - - end_scsi: - } - - /* ----------------------------------------------- */ - tmp[count].name = NULL; - count++; - - medias = memdup(tmp, sizeof(struct media_info) * count); -} - - -/* Finds by media */ -void get_medias(enum media_type media, char *** names, char *** models) -{ - struct media_info * m; - char * tmp_names[50]; - char * tmp_models[50]; - int count; - - find_media(); - - m = medias; - - count = 0; - while (m && m->name) { - if (m->type == media) { - tmp_names[count] = strdup(m->name); - tmp_models[count++] = strdup(m->model); - } - m++; - } - tmp_names[count] = NULL; - tmp_models[count++] = NULL; - - *names = memdup(tmp_names, sizeof(char *) * count); - *models = memdup(tmp_models, sizeof(char *) * count); -} -#endif /* DISABLE_MEDIAS */ - - -#ifndef DISABLE_NETWORK -int net_device_available(char * device) { - struct ifreq req; - int s; - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - log_perror(device); - return 0; - } - strcpy(req.ifr_name, device); - if (ioctl(s, SIOCGIFFLAGS, &req)) { - /* if we can't get the flags, the networking device isn't available */ - close(s); - return 0; - } - close(s); - return 1; -} - - -char ** get_net_devices(void) -{ - char * devices[] = { - "eth0", "eth1", "eth2", "eth3", - "tr0", - "plip0", "plip1", "plip2", - "fddi0", - NULL - }; - char ** ptr = devices; - char * tmp[50]; - int i = 0; - static int already_probed = 0; - - if (!already_probed) { - already_probed = 1; /* cut off loop brought by: probe_that_type => my_insmod => get_net_devices */ - probe_that_type(NETWORK_DEVICES); - } - - while (ptr && *ptr) { - if (net_device_available(*ptr)) - tmp[i++] = strdup(*ptr); - ptr++; - } - tmp[i++] = NULL; - - return memdup(tmp, sizeof(char *) * i); -} -#endif /* DISABLE_NETWORK */ diff --git a/mdk-stage1/probing.h b/mdk-stage1/probing.h deleted file mode 100644 index ea618b7b1..000000000 --- a/mdk-stage1/probing.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#ifndef _PROBING_H_ -#define _PROBING_H_ - -enum media_type { CDROM, DISK, FLOPPY, TAPE, UNKNOWN_MEDIA }; - -enum driver_type { SCSI_ADAPTERS, NETWORK_DEVICES, ANY_DRIVER_TYPE }; - -void get_medias(enum media_type media, char *** names, char *** models); -char ** get_net_devices(void); -void net_discovered_interface(char * intf_name); -char * get_net_intf_description(char * intf_name); -void prepare_intf_descr(const char * intf_descr); - - -#endif diff --git a/mdk-stage1/slang/Makefile b/mdk-stage1/slang/Makefile deleted file mode 100644 index 4cd1dc6bb..000000000 --- a/mdk-stage1/slang/Makefile +++ /dev/null @@ -1,56 +0,0 @@ - #****************************************************************************** - # - # Guillaume Cottenceau (gc@mandrakesoft.com) - # - # Copyright 2000 MandrakeSoft - # - # This software may be freely redistributed under the terms of the GNU - # public license. - # - # You should have received a copy of the GNU General Public License - # along with this program; if not, write to the Free Software - # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - # - #***************************************************************************** - -top_dir = .. - -include $(top_dir)/Makefile.common - - -LIBNAME = libslang - -OBJS = sltermin.o sldisply.o slutty.o slang.o slarray.o slclass.o slcmd.o slerr.o slgetkey.o slkeymap.o slmalloc.o slmath.o slmemchr.o slmemcmp.o slmemcpy.o slmemset.o slmisc.o slparse.o slprepr.o slregexp.o slrline.o slsearch.o slsmg.o slstd.o sltoken.o sltypes.o slxstrng.o slcurses.o slscroll.o slsignal.o slkeypad.o slerrno.o slstring.o slstruct.o slcmplex.o slarrfun.o slimport.o slpath.o slarith.o slassoc.o slcompat.o slposdir.o slstdio.o slproc.o sltime.o slstrops.o slbstr.o slpack.o slintall.o slistruc.o slposio.o slnspace.o slarrmis.o slospath.o slscanf.o - -DEFS = -Dunix -DSLANG - -INCS = - - -TARGETS = $(LIBNAME).a - -ifeq (DIETLIBC, $(L)) -TARGETS += $(LIBNAME)-DIET.a -endif - -all: $(TARGETS) - -clean: - rm -f *.o *.a - -OBJS-DIET = $(subst .o,-DIET.o,$(OBJS)) - -$(LIBNAME).a: $(OBJS) - ar -cru $@ $^ - ranlib $@ - -$(LIBNAME)-DIET.a: $(OBJS-DIET) - ar -cru $@ $^ - ranlib $@ - -$(OBJS): %.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(GLIBC_INCLUDES) -c $< -o $@ - -$(OBJS-DIET): %-DIET.o: %.c - gcc $(CFLAGS) $(DEFS) $(INCS) $(DIETLIBC_INCLUDES) -c $< -o $@ - diff --git a/mdk-stage1/slang/_slang.h b/mdk-stage1/slang/_slang.h deleted file mode 100644 index 02ee13505..000000000 --- a/mdk-stage1/slang/_slang.h +++ /dev/null @@ -1,743 +0,0 @@ -#ifndef _PRIVATE_SLANG_H_ -#define _PRIVATE_SLANG_H_ -/* header file for S-Lang internal structures that users do not (should not) - need. Use slang.h for that purpose. */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -/* #include "config.h" */ -#include "jdmacros.h" -#include "sllimits.h" - -#ifdef VMS -# define SLANG_SYSTEM_NAME "_VMS" -#else -# if defined (IBMPC_SYSTEM) -# define SLANG_SYSTEM_NAME "_IBMPC" -# else -# define SLANG_SYSTEM_NAME "_UNIX" -# endif -#endif /* VMS */ - -/* These quantities are main_types for byte-compiled code. They are used - * by the inner_interp routine. The _BC_ means byte-code. - */ - -#define _SLANG_BC_LVARIABLE SLANG_LVARIABLE /* 0x01 */ -#define _SLANG_BC_GVARIABLE SLANG_GVARIABLE /* 0x02 */ -#define _SLANG_BC_IVARIABLE SLANG_IVARIABLE /* 0x03 */ -#define _SLANG_BC_RVARIABLE SLANG_RVARIABLE /* 0x04 */ -#define _SLANG_BC_INTRINSIC SLANG_INTRINSIC /* 0x05 */ -#define _SLANG_BC_FUNCTION SLANG_FUNCTION /* 0x06 */ -#define _SLANG_BC_MATH_UNARY SLANG_MATH_UNARY /* 0x07 */ -#define _SLANG_BC_APP_UNARY SLANG_APP_UNARY /* 0x08 */ -#define _SLANG_BC_ICONST SLANG_ICONSTANT /* 0x09 */ -#define _SLANG_BC_DCONST SLANG_DCONSTANT /* 0x0A */ -#define _SLANG_BC_PVARIABLE SLANG_PVARIABLE /* 0x0B */ -#define _SLANG_BC_PFUNCTION SLANG_PFUNCTION /* 0x0C */ - -#define _SLANG_BC_BINARY 0x10 -#define _SLANG_BC_LITERAL 0x11 /* constant objects */ -#define _SLANG_BC_LITERAL_INT 0x12 -#define _SLANG_BC_LITERAL_STR 0x13 -#define _SLANG_BC_BLOCK 0x14 - -/* These 3 MUST be in this order too ! */ -#define _SLANG_BC_RETURN 0x15 -#define _SLANG_BC_BREAK 0x16 -#define _SLANG_BC_CONTINUE 0x17 - -#define _SLANG_BC_EXCH 0x18 -#define _SLANG_BC_LABEL 0x19 -#define _SLANG_BC_LOBJPTR 0x1A -#define _SLANG_BC_GOBJPTR 0x1B -#define _SLANG_BC_X_ERROR 0x1C -/* These must be in this order */ -#define _SLANG_BC_X_USER0 0x1D -#define _SLANG_BC_X_USER1 0x1E -#define _SLANG_BC_X_USER2 0x1F -#define _SLANG_BC_X_USER3 0x20 -#define _SLANG_BC_X_USER4 0x21 - -#define _SLANG_BC_CALL_DIRECT 0x24 -#define _SLANG_BC_CALL_DIRECT_FRAME 0x25 -#define _SLANG_BC_UNARY 0x26 -#define _SLANG_BC_UNARY_FUNC 0x27 - -#define _SLANG_BC_DEREF_ASSIGN 0x30 -#define _SLANG_BC_SET_LOCAL_LVALUE 0x31 -#define _SLANG_BC_SET_GLOBAL_LVALUE 0x32 -#define _SLANG_BC_SET_INTRIN_LVALUE 0x33 -#define _SLANG_BC_SET_STRUCT_LVALUE 0x34 -#define _SLANG_BC_FIELD 0x35 -#define _SLANG_BC_SET_ARRAY_LVALUE 0x36 - -#define _SLANG_BC_LINE_NUM 0x40 - -#define _SLANG_BC_TMP 0x50 -#define _SLANG_BC_LVARIABLE_AGET 0x60 -#define _SLANG_BC_LVARIABLE_APUT 0x61 -#define _SLANG_BC_INTEGER_PLUS 0x62 -#define _SLANG_BC_INTEGER_MINUS 0x63 -#define _SLANG_BC_ARG_LVARIABLE 0x64 -#define _SLANG_BC_EARG_LVARIABLE 0x65 - -#define _SLANG_BC_CALL_DIRECT_INTRINSIC 0x80 -#define _SLANG_BC_INTRINSIC_CALL_DIRECT 0x81 -#define _SLANG_BC_CALL_DIRECT_LSTR 0x82 -#define _SLANG_BC_CALL_DIRECT_SLFUN 0x83 -#define _SLANG_BC_CALL_DIRECT_INTRSTOP 0x84 -#define _SLANG_BC_INTRINSIC_STOP 0x85 -#define _SLANG_BC_CALL_DIRECT_EARG_LVAR 0x86 -#define _SLANG_BC_CALL_DIRECT_LINT 0x87 -#define _SLANG_BC_CALL_DIRECT_LVAR 0x88 - - -/* Byte-Code Sub Types (_BCST_) */ - -/* These are sub_types of _SLANG_BC_BLOCK */ -#define _SLANG_BCST_ERROR_BLOCK 0x01 -#define _SLANG_BCST_EXIT_BLOCK 0x02 -#define _SLANG_BCST_USER_BLOCK0 0x03 -#define _SLANG_BCST_USER_BLOCK1 0x04 -#define _SLANG_BCST_USER_BLOCK2 0x05 -#define _SLANG_BCST_USER_BLOCK3 0x06 -#define _SLANG_BCST_USER_BLOCK4 0x07 -/* The user blocks MUST be in the above order */ -#define _SLANG_BCST_LOOP 0x10 -#define _SLANG_BCST_WHILE 0x11 -#define _SLANG_BCST_FOR 0x12 -#define _SLANG_BCST_FOREVER 0x13 -#define _SLANG_BCST_CFOR 0x14 -#define _SLANG_BCST_DOWHILE 0x15 -#define _SLANG_BCST_FOREACH 0x16 - -#define _SLANG_BCST_IF 0x20 -#define _SLANG_BCST_IFNOT 0x21 -#define _SLANG_BCST_ELSE 0x22 -#define _SLANG_BCST_ANDELSE 0x23 -#define _SLANG_BCST_ORELSE 0x24 -#define _SLANG_BCST_SWITCH 0x25 -#define _SLANG_BCST_NOTELSE 0x26 - -/* assignment (_SLANG_BC_SET_*_LVALUE) subtypes. The order MUST correspond - * to the assignment token order with the ASSIGN_TOKEN as the first! - */ -#define _SLANG_BCST_ASSIGN 0x01 -#define _SLANG_BCST_PLUSEQS 0x02 -#define _SLANG_BCST_MINUSEQS 0x03 -#define _SLANG_BCST_TIMESEQS 0x04 -#define _SLANG_BCST_DIVEQS 0x05 -#define _SLANG_BCST_BOREQS 0x06 -#define _SLANG_BCST_BANDEQS 0x07 -#define _SLANG_BCST_PLUSPLUS 0x08 -#define _SLANG_BCST_POST_PLUSPLUS 0x09 -#define _SLANG_BCST_MINUSMINUS 0x0A -#define _SLANG_BCST_POST_MINUSMINUS 0x0B - -/* These use SLANG_PLUS, SLANG_MINUS, SLANG_PLUSPLUS, etc... */ - -typedef union -{ -#if SLANG_HAS_FLOAT - double double_val; - float float_val; -#endif - long long_val; - unsigned long ulong_val; - VOID_STAR ptr_val; - char *s_val; - int int_val; - unsigned int uint_val; - SLang_MMT_Type *ref; - SLang_Name_Type *n_val; - struct _SLang_Struct_Type *struct_val; - struct _SLang_Array_Type *array_val; - short short_val; - unsigned short ushort_val; - char char_val; - unsigned char uchar_val; -} -_SL_Object_Union_Type; - -typedef struct _SLang_Object_Type -{ - unsigned char data_type; /* SLANG_INT_TYPE, ... */ - _SL_Object_Union_Type v; -} -SLang_Object_Type; - -struct _SLang_MMT_Type -{ - unsigned char data_type; /* int, string, etc... */ - VOID_STAR user_data; /* address of user structure */ - unsigned int count; /* number of references */ -}; - -extern int _SLang_pop_object_of_type (unsigned char, SLang_Object_Type *, int); - -typedef struct -{ - char *name; /* slstring */ - SLang_Object_Type obj; -} -_SLstruct_Field_Type; - -typedef struct _SLang_Struct_Type -{ - _SLstruct_Field_Type *fields; - unsigned int nfields; /* number used */ - unsigned int num_refs; -} -_SLang_Struct_Type; - -extern void _SLstruct_delete_struct (_SLang_Struct_Type *); -extern int _SLang_push_struct (_SLang_Struct_Type *); -extern int _SLang_pop_struct (_SLang_Struct_Type **); -extern int _SLstruct_init (void); -/* extern int _SLstruct_get_field (char *); */ -extern int _SLstruct_define_struct (void); -extern int _SLstruct_define_typedef (void); - -extern int _SLang_pop_datatype (unsigned char *); -extern int _SLang_push_datatype (unsigned char); - -struct _SLang_Ref_Type -{ - int is_global; - union - { - SLang_Name_Type *nt; - SLang_Object_Type *local_obj; - } - v; -}; - -extern int _SLang_dereference_ref (SLang_Ref_Type *); -extern int _SLang_deref_assign (SLang_Ref_Type *); -extern int _SLang_push_ref (int, VOID_STAR); - -extern int _SL_increment_frame_pointer (void); -extern int _SL_decrement_frame_pointer (void); - -extern int SLang_pop(SLang_Object_Type *); -extern void SLang_free_object (SLang_Object_Type *); -extern int _SLanytype_typecast (unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR); -extern void _SLstring_intrinsic (void); - - -/* These functions are used to create slstrings of a fixed length. Be - * very careful how they are used. In particular, if len bytes are allocated, - * then the string must be len characters long, no more and no less. - */ -extern char *_SLallocate_slstring (unsigned int); -extern char *_SLcreate_via_alloced_slstring (char *, unsigned int); -extern void _SLunallocate_slstring (char *, unsigned int); -extern int _SLpush_alloced_slstring (char *, unsigned int); - -typedef struct -{ - char **buf; - unsigned int max_num; - unsigned int num; - unsigned int delta_num; -} -_SLString_List_Type; -extern int _SLstring_list_append (_SLString_List_Type *, char *); -extern int _SLstring_list_init (_SLString_List_Type *, unsigned int, unsigned int); -extern void _SLstring_list_delete (_SLString_List_Type *); -extern int _SLstring_list_push (_SLString_List_Type *); - -/* This function assumes that s is an slstring. */ -extern char *_SLstring_dup_slstring (char *); -extern int _SLang_dup_and_push_slstring (char *); - - -extern int _SLang_init_import (void); - -/* This function checks to see if the referenced object is initialized */ -extern int _SLang_is_ref_initialized (SLang_Ref_Type *); -extern int _SLcheck_identifier_syntax (char *); -extern int _SLang_uninitialize_ref (SLang_Ref_Type *); - -extern int _SLpush_slang_obj (SLang_Object_Type *); - -extern char *_SLexpand_escaped_char(char *, char *); -extern void _SLexpand_escaped_string (char *, char *, char *); - -/* returns a pointer to an SLstring string-- use SLang_free_slstring */ -extern char *_SLstringize_object (SLang_Object_Type *); -extern int _SLdump_objects (char *, SLang_Object_Type *, unsigned int, int); - -extern SLang_Object_Type *_SLRun_Stack; -extern SLang_Object_Type *_SLStack_Pointer; - -struct _SLang_NameSpace_Type -{ - struct _SLang_NameSpace_Type *next; - char *name; /* this is the load_type name */ - char *namespace_name; /* this name is assigned by implements */ - unsigned int table_size; - SLang_Name_Type **table; -}; -extern SLang_NameSpace_Type *_SLns_allocate_namespace (char *, unsigned int); -extern SLang_NameSpace_Type *_SLns_find_namespace (char *); -extern int _SLns_set_namespace_name (SLang_NameSpace_Type *, char *); -extern SLang_Array_Type *_SLnspace_apropos (SLang_NameSpace_Type *, char *, unsigned int); -extern void _SLang_use_namespace_intrinsic (char *name); -extern char *_SLang_cur_namespace_intrinsic (void); -extern SLang_Array_Type *_SLang_apropos (char *, char *, unsigned int); -extern void _SLang_implements_intrinsic (char *); - -extern int _SLang_Trace; -extern int _SLstack_depth(void); -extern char *_SLang_Current_Function_Name; - -extern int _SLang_trace_fun(char *); -extern int _SLang_Compile_Line_Num_Info; - -extern char *_SLstring_dup_hashed_string (char *, unsigned long); -extern unsigned long _SLcompute_string_hash (char *); -extern char *_SLstring_make_hashed_string (char *, unsigned int, unsigned long *); -extern void _SLfree_hashed_string (char *, unsigned int, unsigned long); -unsigned long _SLstring_hash (unsigned char *, unsigned char *); -extern int _SLinit_slcomplex (void); - -extern int _SLang_init_slstrops (void); -extern int _SLstrops_do_sprintf_n (int); -extern int _SLang_sscanf (void); -extern double _SLang_atof (char *); -extern int _SLang_init_bstring (void); -extern int _SLang_init_sltime (void); -extern void _SLpack (void); -extern void _SLunpack (char *, SLang_BString_Type *); -extern void _SLpack_pad_format (char *); -extern unsigned int _SLpack_compute_size (char *); -extern int _SLusleep (unsigned long); - -/* frees upon error. NULL __NOT__ ok. */ -extern int _SLang_push_slstring (char *); - -extern unsigned char _SLarith_promote_type (unsigned char); -extern int _SLarith_get_precedence (unsigned char); -extern int _SLarith_typecast (unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR); - -extern int SLang_push(SLang_Object_Type *); -extern int SLadd_global_variable (char *); -extern void _SLang_clear_error (void); - -extern int _SLdo_pop (void); -extern unsigned int _SLsys_getkey (void); -extern int _SLsys_input_pending (int); -#ifdef IBMPC_SYSTEM -extern unsigned int _SLpc_convert_scancode (unsigned int, unsigned int, int); -#define _SLTT_KEY_SHIFT 1 -#define _SLTT_KEY_CTRL 2 -#define _SLTT_KEY_ALT 4 -#endif - -typedef struct _SLterminfo_Type SLterminfo_Type; -extern SLterminfo_Type *_SLtt_tigetent (char *); -extern char *_SLtt_tigetstr (SLterminfo_Type *, char *); -extern int _SLtt_tigetnum (SLterminfo_Type *, char *); -extern int _SLtt_tigetflag (SLterminfo_Type *, char *); - -#if SLTT_HAS_NON_BCE_SUPPORT -extern int _SLtt_get_bce_color_offset (void); -#endif -extern void (*_SLtt_color_changed_hook)(void); - -extern unsigned char SLang_Input_Buffer [SL_MAX_INPUT_BUFFER_LEN]; - -extern int _SLregister_types (void); -extern SLang_Class_Type *_SLclass_get_class (unsigned char); -extern VOID_STAR _SLclass_get_ptr_to_value (SLang_Class_Type *, SLang_Object_Type *); -extern void _SLclass_type_mismatch_error (unsigned char, unsigned char); -extern int _SLclass_init (void); -extern int _SLclass_copy_class (unsigned char, unsigned char); - -extern unsigned char _SLclass_Class_Type [256]; - -extern int (*_SLclass_get_typecast (unsigned char, unsigned char, int)) -(unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR); - -extern int (*_SLclass_get_binary_fun (int, SLang_Class_Type *, SLang_Class_Type *, SLang_Class_Type **, int)) -(int, - unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR); - -extern int (*_SLclass_get_unary_fun (int, SLang_Class_Type *, SLang_Class_Type **, int)) -(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR); - -extern int _SLarith_register_types (void); -extern unsigned char _SLarith_Arith_Types []; -extern unsigned char _SLarith_Is_Arith_Type [256]; -extern int _SLarith_bin_op (SLang_Object_Type *, SLang_Object_Type *, int); - -extern int _SLarray_add_bin_op (unsigned char); - -extern int _SLang_call_funptr (SLang_Name_Type *); -extern void _SLset_double_format (char *); -extern SLang_Name_Type *_SLlocate_global_name (char *); -extern SLang_Name_Type *_SLlocate_name (char *); - -extern char *_SLdefines[]; - -#define SL_ERRNO_NOT_IMPLEMENTED 0x7FFF -extern int _SLerrno_errno; -extern int _SLerrno_init (void); - -extern int _SLstdio_fdopen (char *, int, char *); - -extern void _SLstruct_pop_args (int *); -extern void _SLstruct_push_args (SLang_Array_Type *); - -extern int _SLarray_aput (void); -extern int _SLarray_aget (void); -extern int _SLarray_inline_implicit_array (void); -extern int _SLarray_inline_array (void); -extern int _SLarray_wildcard_array (void); - -extern int -_SLarray_typecast (unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR, int); - -extern int _SLarray_aput_transfer_elem (SLang_Array_Type *, int *, - VOID_STAR, unsigned int, int); -extern int _SLarray_aget_transfer_elem (SLang_Array_Type *, int *, - VOID_STAR, unsigned int, int); -extern void _SLarray_free_array_elements (SLang_Class_Type *, VOID_STAR, unsigned int); - -extern SLang_Foreach_Context_Type * -_SLarray_cl_foreach_open (unsigned char, unsigned int); -extern void _SLarray_cl_foreach_close (unsigned char, SLang_Foreach_Context_Type *); -extern int _SLarray_cl_foreach (unsigned char, SLang_Foreach_Context_Type *); - -extern int _SLarray_matrix_multiply (void); -extern void (*_SLang_Matrix_Multiply)(void); - -extern int _SLarray_init_slarray (void); -extern SLang_Array_Type * -SLang_create_array1 (unsigned char, int, VOID_STAR, int *, unsigned int, int); - -extern int _SLcompile_push_context (SLang_Load_Type *); -extern int _SLcompile_pop_context (void); -extern int _SLang_Auto_Declare_Globals; - -typedef struct -{ - union - { - long long_val; - char *s_val; /* Used for IDENT_TOKEN, FLOAT, etc... */ - SLang_BString_Type *b_val; - } v; - int free_sval_flag; - unsigned int num_refs; - unsigned long hash; -#if _SLANG_HAS_DEBUG_CODE - int line_number; -#endif - unsigned char type; -} -_SLang_Token_Type; - -extern void _SLcompile (_SLang_Token_Type *); -extern void (*_SLcompile_ptr)(_SLang_Token_Type *); - -/* *** TOKENS *** */ - -/* Note that that tokens corresponding to ^J, ^M, and ^Z should not be used. - * This is because a file that contains any of these characters will - * have an OS dependent interpretation, e.g., ^Z is EOF on MSDOS. - */ - -/* Special tokens */ -#define EOF_TOKEN 0x01 -#define RPN_TOKEN 0x02 -#define NL_TOKEN 0x03 -#define NOP_TOKEN 0x05 -#define FARG_TOKEN 0x06 -#define TMP_TOKEN 0x07 - -#define RESERVED1_TOKEN 0x0A /* \n */ -#define RESERVED2_TOKEN 0x0D /* \r */ - -/* Literal tokens */ -#define CHAR_TOKEN 0x10 -#define UCHAR_TOKEN 0x11 -#define SHORT_TOKEN 0x12 -#define USHORT_TOKEN 0x13 -#define INT_TOKEN 0x14 -#define UINT_TOKEN 0x15 -#define LONG_TOKEN 0x16 -#define ULONG_TOKEN 0x17 -#define IS_INTEGER_TOKEN(x) ((x >= CHAR_TOKEN) && (x <= ULONG_TOKEN)) -#define FLOAT_TOKEN 0x18 -#define DOUBLE_TOKEN 0x19 -#define RESERVED3_TOKEN 0x1A /* ^Z */ -#define COMPLEX_TOKEN 0x1B -#define STRING_TOKEN 0x1C -#define BSTRING_TOKEN 0x1D -#define _BSTRING_TOKEN 0x1E /* byte-compiled BSTRING */ -#define ESC_STRING_TOKEN 0x1F - -/* Tokens that can be LVALUES */ -#define IDENT_TOKEN 0x20 -#define ARRAY_TOKEN 0x21 -#define DOT_TOKEN 0x22 -#define IS_LVALUE_TOKEN (((t) <= DOT_TOKEN) && ((t) >= IDENT_TOKEN)) - -/* do not use these values */ -#define RESERVED4_TOKEN 0x23 /* # */ -#define RESERVED5_TOKEN 0x25 /* % */ - -/* Flags for struct fields */ -#define STATIC_TOKEN 0x26 -#define READONLY_TOKEN 0x27 -#define PRIVATE_TOKEN 0x28 -#define PUBLIC_TOKEN 0x29 - -/* Punctuation tokens */ -#define OBRACKET_TOKEN 0x2a -#define CBRACKET_TOKEN 0x2b -#define OPAREN_TOKEN 0x2c -#define CPAREN_TOKEN 0x2d -#define OBRACE_TOKEN 0x2e -#define CBRACE_TOKEN 0x2f - -#define COMMA_TOKEN 0x31 -#define SEMICOLON_TOKEN 0x32 -#define COLON_TOKEN 0x33 -#define NAMESPACE_TOKEN 0x34 - -/* Operators */ -#define POW_TOKEN 0x38 - -/* The order here must match the order in the Binop_Level table in slparse.c */ -#define FIRST_BINARY_OP 0x39 -#define ADD_TOKEN 0x39 -#define SUB_TOKEN 0x3a -#define TIMES_TOKEN 0x3b -#define DIV_TOKEN 0x3c -#define LT_TOKEN 0x3d -#define LE_TOKEN 0x3e -#define GT_TOKEN 0x3f -#define GE_TOKEN 0x40 -#define EQ_TOKEN 0x41 -#define NE_TOKEN 0x42 -#define AND_TOKEN 0x43 -#define OR_TOKEN 0x44 -#define MOD_TOKEN 0x45 -#define BAND_TOKEN 0x46 -#define SHL_TOKEN 0x47 -#define SHR_TOKEN 0x48 -#define BXOR_TOKEN 0x49 -#define BOR_TOKEN 0x4a -#define POUND_TOKEN 0x4b /* matrix multiplication */ - -#define LAST_BINARY_OP 0x4b -#define IS_BINARY_OP(t) ((t >= FIRST_BINARY_OP) && (t <= LAST_BINARY_OP)) - -/* unary tokens -- but not all of them (see grammar) */ -#define DEREF_TOKEN 0x4d -#define NOT_TOKEN 0x4e -#define BNOT_TOKEN 0x4f - -#define IS_INTERNAL_FUNC(t) ((t >= 0x50) && (t <= 0x56)) -#define POP_TOKEN 0x50 -#define CHS_TOKEN 0x51 -#define SIGN_TOKEN 0x52 -#define ABS_TOKEN 0x53 -#define SQR_TOKEN 0x54 -#define MUL2_TOKEN 0x55 -#define EXCH_TOKEN 0x56 - -/* Assignment tokens. Note: these must appear with sequential values. - * The order here must match the specific lvalue assignments below. - * These tokens are used by rpn routines in slang.c. slparse.c maps them - * onto the specific lvalue tokens while parsing infix. - * Also the assignment _SLANG_BCST_ assumes this order - */ -#define ASSIGN_TOKEN 0x57 -#define PLUSEQS_TOKEN 0x58 -#define MINUSEQS_TOKEN 0x59 -#define TIMESEQS_TOKEN 0x5A -#define DIVEQS_TOKEN 0x5B -#define BOREQS_TOKEN 0x5C -#define BANDEQS_TOKEN 0x5D -#define PLUSPLUS_TOKEN 0x5E -#define POST_PLUSPLUS_TOKEN 0x5F -#define MINUSMINUS_TOKEN 0x60 -#define POST_MINUSMINUS_TOKEN 0x61 - -/* Directives */ -#define FIRST_DIRECTIVE_TOKEN 0x62 -#define IFNOT_TOKEN 0x62 -#define IF_TOKEN 0x63 -#define ELSE_TOKEN 0x64 -#define FOREVER_TOKEN 0x65 -#define WHILE_TOKEN 0x66 -#define FOR_TOKEN 0x67 -#define _FOR_TOKEN 0x68 -#define LOOP_TOKEN 0x69 -#define SWITCH_TOKEN 0x6A -#define DOWHILE_TOKEN 0x6B -#define ANDELSE_TOKEN 0x6C -#define ORELSE_TOKEN 0x6D -#define ERRBLK_TOKEN 0x6E -#define EXITBLK_TOKEN 0x6F -/* These must be sequential */ -#define USRBLK0_TOKEN 0x70 -#define USRBLK1_TOKEN 0x71 -#define USRBLK2_TOKEN 0x72 -#define USRBLK3_TOKEN 0x73 -#define USRBLK4_TOKEN 0x74 - -#define CONT_TOKEN 0x75 -#define BREAK_TOKEN 0x76 -#define RETURN_TOKEN 0x77 - -#define CASE_TOKEN 0x78 -#define DEFINE_TOKEN 0x79 -#define DO_TOKEN 0x7a -#define VARIABLE_TOKEN 0x7b -#define GVARIABLE_TOKEN 0x7c -#define _REF_TOKEN 0x7d -#define PUSH_TOKEN 0x7e -#define STRUCT_TOKEN 0x7f -#define TYPEDEF_TOKEN 0x80 -#define NOTELSE_TOKEN 0x81 -#define DEFINE_STATIC_TOKEN 0x82 -#define FOREACH_TOKEN 0x83 -#define USING_TOKEN 0x84 -#define DEFINE_PRIVATE_TOKEN 0x85 -#define DEFINE_PUBLIC_TOKEN 0x86 - -/* Note: the order here must match the order of the generic assignment tokens. - * Also, the first token of each group must be the ?_ASSIGN_TOKEN. - * slparse.c exploits this order, as well as slang.h. - */ -#define FIRST_ASSIGN_TOKEN 0x90 -#define _STRUCT_ASSIGN_TOKEN 0x90 -#define _STRUCT_PLUSEQS_TOKEN 0x91 -#define _STRUCT_MINUSEQS_TOKEN 0x92 -#define _STRUCT_TIMESEQS_TOKEN 0x93 -#define _STRUCT_DIVEQS_TOKEN 0x94 -#define _STRUCT_BOREQS_TOKEN 0x95 -#define _STRUCT_BANDEQS_TOKEN 0x96 -#define _STRUCT_PLUSPLUS_TOKEN 0x97 -#define _STRUCT_POST_PLUSPLUS_TOKEN 0x98 -#define _STRUCT_MINUSMINUS_TOKEN 0x99 -#define _STRUCT_POST_MINUSMINUS_TOKEN 0x9A - -#define _ARRAY_ASSIGN_TOKEN 0xA0 -#define _ARRAY_PLUSEQS_TOKEN 0xA1 -#define _ARRAY_MINUSEQS_TOKEN 0xA2 -#define _ARRAY_TIMESEQS_TOKEN 0xA3 -#define _ARRAY_DIVEQS_TOKEN 0xA4 -#define _ARRAY_BOREQS_TOKEN 0xA5 -#define _ARRAY_BANDEQS_TOKEN 0xA6 -#define _ARRAY_PLUSPLUS_TOKEN 0xA7 -#define _ARRAY_POST_PLUSPLUS_TOKEN 0xA8 -#define _ARRAY_MINUSMINUS_TOKEN 0xA9 -#define _ARRAY_POST_MINUSMINUS_TOKEN 0xAA - -#define _SCALAR_ASSIGN_TOKEN 0xB0 -#define _SCALAR_PLUSEQS_TOKEN 0xB1 -#define _SCALAR_MINUSEQS_TOKEN 0xB2 -#define _SCALAR_TIMESEQS_TOKEN 0xB3 -#define _SCALAR_DIVEQS_TOKEN 0xB4 -#define _SCALAR_BOREQS_TOKEN 0xB5 -#define _SCALAR_BANDEQS_TOKEN 0xB6 -#define _SCALAR_PLUSPLUS_TOKEN 0xB7 -#define _SCALAR_POST_PLUSPLUS_TOKEN 0xB8 -#define _SCALAR_MINUSMINUS_TOKEN 0xB9 -#define _SCALAR_POST_MINUSMINUS_TOKEN 0xBA - -#define _DEREF_ASSIGN_TOKEN 0xC0 -#define _DEREF_PLUSEQS_TOKEN 0xC1 -#define _DEREF_MINUSEQS_TOKEN 0xC2 -#define _DEREF_TIMESEQS_TOKEN 0xC3 -#define _DEREF_DIVEQS_TOKEN 0xC4 -#define _DEREF_BOREQS_TOKEN 0xC5 -#define _DEREF_BANDEQS_TOKEN 0xC6 -#define _DEREF_PLUSPLUS_TOKEN 0xC7 -#define _DEREF_POST_PLUSPLUS_TOKEN 0xC8 -#define _DEREF_MINUSMINUS_TOKEN 0xC9 -#define _DEREF_POST_MINUSMINUS_TOKEN 0xCA - -#define LAST_ASSIGN_TOKEN 0xCA -#define IS_ASSIGN_TOKEN(t) (((t)>=FIRST_ASSIGN_TOKEN)&&((t)<=LAST_ASSIGN_TOKEN)) - -#define _INLINE_ARRAY_TOKEN 0xE0 -#define _INLINE_IMPLICIT_ARRAY_TOKEN 0xE1 -#define _NULL_TOKEN 0xE2 -#define _INLINE_WILDCARD_ARRAY_TOKEN 0xE3 - -#define LINE_NUM_TOKEN 0xFC -#define ARG_TOKEN 0xFD -#define EARG_TOKEN 0xFE -#define NO_OP_LITERAL 0xFF - -typedef struct -{ - /* sltoken.c */ - /* SLang_eval_object */ - SLang_Load_Type *llt; - SLPreprocess_Type *this_slpp; - /* prep_get_char() */ - char *input_line; - char cchar; - /* get_token() */ - int want_nl_token; - - /* slparse.c */ - _SLang_Token_Type ctok; - int block_depth; - int assignment_expression; - - /* slang.c : SLcompile() */ - _SLang_Token_Type save_token; - _SLang_Token_Type next_token; - void (*slcompile_ptr)(_SLang_Token_Type *); -} -_SLEval_Context; - -extern int _SLget_token (_SLang_Token_Type *); -extern void _SLparse_error (char *, _SLang_Token_Type *, int); -extern void _SLparse_start (SLang_Load_Type *); -extern int _SLget_rpn_token (_SLang_Token_Type *); -extern void _SLcompile_byte_compiled (void); - -extern int (*_SLprep_eval_hook) (char *); - -#ifdef HAVE_VSNPRINTF -#define _SLvsnprintf vsnprintf -#else -extern int _SLvsnprintf (char *, unsigned int, char *, va_list); -#endif - -#ifdef HAVE_SNPRINTF -# define _SLsnprintf snprintf -#else -extern int _SLsnprintf (char *, unsigned int, char *, ...); -#endif - -#undef _INLINE_ -#if defined(__GNUC__) && _SLANG_USE_INLINE_CODE -# define _INLINE_ __inline__ -#else -# define _INLINE_ -#endif - - -#endif /* _PRIVATE_SLANG_H_ */ diff --git a/mdk-stage1/slang/config.h b/mdk-stage1/slang/config.h deleted file mode 100644 index a5ab3273c..000000000 --- a/mdk-stage1/slang/config.h +++ /dev/null @@ -1,163 +0,0 @@ -/* src/sysconf.h. Generated automatically by configure. */ -/* -*- c -*- */ -/* Note: this is for unix only. */ - -#ifndef SL_CONFIG_H -#define SL_CONFIG_H - -/* define if you have stdlib.h */ -#define HAVE_STDLIB_H 1 - -/* define if you have unistd.h */ -#define HAVE_UNISTD_H 1 - -/* define if you have termios.h */ -#define HAVE_TERMIOS_H 1 - -/* define if you have memory.h */ -#define HAVE_MEMORY_H 1 - -/* define if you have malloc.h */ -#define HAVE_MALLOC_H 1 - -/* define if you have memset */ -#define HAVE_MEMSET 1 - -/* define if you have memcpy */ -#define HAVE_MEMCPY 1 - -//#define HAVE_SETLOCALE 1 -//#define HAVE_LOCALE_H 1 - -#define HAVE_VFSCANF 1 - -/* define if you have fcntl.h */ -#define HAVE_FCNTL_H 1 - -/* Define if you have the vsnprintf, snprintf functions and they return - * EOF upon failure. - */ -#define HAVE_VSNPRINTF 1 -#define HAVE_SNPRINTF 1 - -/* define if you have sys/fcntl.h */ -#define HAVE_SYS_FCNTL_H 1 - -#define HAVE_SYS_TYPES_H 1 -#define HAVE_SYS_WAIT_H 1 -#define HAVE_SYS_TIMES_H 1 - -/* Set these to the appropriate values */ -#define SIZEOF_SHORT 2 -#define SIZEOF_INT 4 -#define SIZEOF_LONG 4 -#define SIZEOF_FLOAT 4 -#define SIZEOF_DOUBLE 8 - -/* define if you have these. */ -#define HAVE_ATEXIT 1 -#define HAVE_ON_EXIT 1 -#define HAVE_PUTENV 1 -#define HAVE_GETCWD 1 -#define HAVE_TCGETATTR 1 -#define HAVE_TCSETATTR 1 -#define HAVE_CFGETOSPEED 1 -#define HAVE_LSTAT 1 -#define HAVE_KILL 1 -#define HAVE_CHOWN 1 -#define HAVE_VSNPRINTF 1 -#define HAVE_POPEN 1 -#define HAVE_UMASK 1 -#define HAVE_READLINK 1 -#define HAVE_TIMES 1 -#define HAVE_GMTIME 1 -#define HAVE_MKFIFO 1 - -#define HAVE_GETPPID 1 -#define HAVE_GETGID 1 -#define HAVE_GETEGID 1 -#define HAVE_GETEUID 1 -/* #undef HAVE_GETUID */ - -#define HAVE_SETGID 1 -#define HAVE_SETPGID 1 -#define HAVE_SETUID 1 - -#define HAVE_ACOSH 1 -#define HAVE_ASINH 1 -#define HAVE_ATANH 1 - -#define HAVE_DIRENT_H 1 -/* #undef HAVE_SYS_NDIR_H */ -/* #undef HAVE_SYS_DIR_H */ -/* #undef HAVE_NDIR_H */ - -#define HAVE_DLFCN_H 1 - -#define HAVE_SYS_UTSNAME_H 1 -#define HAVE_UNAME 1 - -/* These two are needed on DOS-like systems. Unix does not require them. - * They are included here for consistency. - * -#define HAVE_IO_H -#define HAVE_PROCESS_H - */ - -/* #undef USE_TERMCAP */ - -/* #undef mode_t */ -/* #undef uid_t */ -/* #undef pid_t */ -/* #undef gid_t */ - -/* Do we have posix signals? */ -#define HAVE_SIGACTION 1 -#define HAVE_SIGPROCMASK 1 -#define HAVE_SIGEMPTYSET 1 -#define HAVE_SIGADDSET 1 - -#if defined(HAVE_SIGADDSET) && defined(HAVE_SIGEMPTYSET) -# if defined(HAVE_SIGACTION) && defined(HAVE_SIGPROCMASK) -# define SLANG_POSIX_SIGNALS -# endif -#endif - -/* Define if you need to in order for stat and other things to work. */ -/* #undef _POSIX_SOURCE */ - -#ifdef _AIX -# ifndef _POSIX_SOURCE -# define _POSIX_SOURCE 1 -# endif -# ifndef _ALL_SOURCE -# define _ALL_SOURCE -# endif -/* This may generate warnings but the fact is that without it, xlc will - * INCORRECTLY inline many str* functions. */ -/* # undef __STR__ */ -#endif - -/* define USE_TERMCAP if you want to use it instead of terminfo. */ -#if defined(sequent) || defined(NeXT) -# ifndef USE_TERMCAP -# define USE_TERMCAP -# endif -#endif - -#if defined(ultrix) && !defined(__GNUC__) -# ifndef NO_PROTOTYPES -# define NO_PROTOTYPES -# endif -#endif - -#ifndef unix -# define unix 1 -#endif - -#ifndef __unix__ -# define __unix__ 1 -#endif - -#define _SLANG_SOURCE_ 1 -#endif /* SL_CONFIG_H */ diff --git a/mdk-stage1/slang/jdmacros.h b/mdk-stage1/slang/jdmacros.h deleted file mode 100644 index 70d491b78..000000000 --- a/mdk-stage1/slang/jdmacros.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef _JD_MACROS_H_ -#define _JD_MACROS_H_ - -#ifndef SLMEMSET -# ifdef HAVE_MEMSET -# define SLMEMSET memset -# else -# define SLMEMSET SLmemset -# endif -#endif - -#ifndef SLMEMCHR -# ifdef HAVE_MEMCHR -# define SLMEMCHR memchr -# else -# define SLMEMCHR SLmemchr -# endif -#endif - -#ifndef SLMEMCPY -# ifdef HAVE_MEMCPY -# define SLMEMCPY memcpy -# else -# define SLMEMCPY SLmemcpy -# endif -#endif - -/* Note: HAVE_MEMCMP requires an unsigned memory comparison!!! */ -#ifndef SLMEMCMP -# ifdef HAVE_MEMCMP -# define SLMEMCMP memcmp -# else -# define SLMEMCMP SLmemcmp -# endif -#endif - -#ifndef SLFREE -# define SLFREE free -#endif - -#ifndef SLMALLOC -# define SLMALLOC malloc -#endif - -#ifndef SLCALLOC -# define SLCALLOC calloc -#endif - -#ifndef SLREALLOC -# define SLREALLOC realloc -#endif - -#endif /* _JD_MACROS_H_ */ diff --git a/mdk-stage1/slang/keywhash.c b/mdk-stage1/slang/keywhash.c deleted file mode 100644 index 17d94d5a3..000000000 --- a/mdk-stage1/slang/keywhash.c +++ /dev/null @@ -1,190 +0,0 @@ -/* Perfect hash generated by command line: - * ./a.out 1 - */ -#define MIN_HASH_VALUE 2 -#define MAX_HASH_VALUE 118 -#define MIN_KEYWORD_LEN 2 -#define MAX_KEYWORD_LEN 11 - -static unsigned char Keyword_Hash_Table [256] = -{ - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 1, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 9, 7, 1, 8, 2, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 0, 0, 119, 0, 119, 119, 119, 7, 119, 0, 0, 119, 119, 0, - 119, 119, 0, 0, 0, 0, 119, 119, 0, 119, 119, 119, 119, 119, 119, 2, - 119, 41, 1, 1, 9, 0, 55, 8, 0, 0, 119, 0, 27, 0, 0, 0, - 7, 2, 0, 21, 0, 0, 0, 3, 2, 0, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119 -}; - -static unsigned char keyword_hash (char *s, unsigned int len) -{ - unsigned int sum; - - sum = len; - while (len) - { - len--; - sum += (unsigned int) Keyword_Hash_Table [(unsigned char)s[len]]; - } - return sum; -} - -typedef struct -{ - char *name; - unsigned int type; -} -Keyword_Table_Type; - -static Keyword_Table_Type Keyword_Table [/* 117 */] = -{ - {"or", OR_TOKEN}, - {"not", NOT_TOKEN}, - {NULL,0}, - {"xor", BXOR_TOKEN}, - {"return", RETURN_TOKEN}, - {"exch", EXCH_TOKEN}, - {NULL,0}, - {"continue", CONT_TOKEN}, - {NULL,0}, - {"do", DO_TOKEN}, - {"mod", MOD_TOKEN}, - {"ERROR_BLOCK", ERRBLK_TOKEN}, - {"USER_BLOCK2", USRBLK2_TOKEN}, - {"USER_BLOCK4", USRBLK4_TOKEN}, - {"__tmp", TMP_TOKEN}, - {"pop", POP_TOKEN}, - {NULL,0}, - {"EXIT_BLOCK", EXITBLK_TOKEN}, - {"USER_BLOCK1", USRBLK1_TOKEN}, - {"USER_BLOCK3", USRBLK3_TOKEN}, - {"USER_BLOCK0", USRBLK0_TOKEN}, - {NULL,0}, - {"shr", SHR_TOKEN}, - {"chs", CHS_TOKEN}, - {"sqr", SQR_TOKEN}, - {NULL,0}, - {"struct", STRUCT_TOKEN}, - {NULL,0}, - {NULL,0}, - {"switch", SWITCH_TOKEN}, - {"mul2", MUL2_TOKEN}, - {"sign", SIGN_TOKEN}, - {"using", USING_TOKEN}, - {"while", WHILE_TOKEN}, - {NULL,0}, - {NULL,0}, - {"loop", LOOP_TOKEN}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {"public", PUBLIC_TOKEN}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {"break", BREAK_TOKEN}, - {NULL,0}, - {"do_while", DOWHILE_TOKEN}, - {NULL,0}, - {"shl", SHL_TOKEN}, - {"else", ELSE_TOKEN}, - {"and", AND_TOKEN}, - {"orelse", ORELSE_TOKEN}, - {"private", PRIVATE_TOKEN}, - {NULL,0}, - {"if", IF_TOKEN}, - {"for", FOR_TOKEN}, - {"!if", IFNOT_TOKEN}, - {NULL,0}, - {"_for", _FOR_TOKEN}, - {"forever", FOREVER_TOKEN}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {"abs", ABS_TOKEN}, - {"case", CASE_TOKEN}, - {NULL,0}, - {"static", STATIC_TOKEN}, - {"define", DEFINE_TOKEN}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {"typedef", TYPEDEF_TOKEN}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {"foreach", FOREACH_TOKEN}, - {"andelse", ANDELSE_TOKEN}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {NULL,0}, - {"variable", VARIABLE_TOKEN}, -}; - -static Keyword_Table_Type *is_keyword (char *str, unsigned int len) -{ - unsigned int hash; - char *name; - Keyword_Table_Type *kw; - - if ((len < MIN_KEYWORD_LEN) - || (len > MAX_KEYWORD_LEN)) - return NULL; - - hash = keyword_hash (str, len); - if ((hash > MAX_HASH_VALUE) || (hash < MIN_HASH_VALUE)) - return NULL; - - kw = &Keyword_Table[hash - MIN_HASH_VALUE]; - if ((NULL != (name = kw->name)) - && (*str == *name) - && (0 == strcmp (str, name))) - return kw; - return NULL; -} diff --git a/mdk-stage1/slang/sl-feat.h b/mdk-stage1/slang/sl-feat.h deleted file mode 100644 index 511d72451..000000000 --- a/mdk-stage1/slang/sl-feat.h +++ /dev/null @@ -1,60 +0,0 @@ -/* Setting this to 1 enables automatic support for associative arrays. - * If this is set to 0, an application must explicitly enable associative - * array support via SLang_init_slassoc. - */ -#define SLANG_HAS_ASSOC_ARRAYS 1 - -#define SLANG_HAS_COMPLEX 1 -#define SLANG_HAS_FLOAT 1 - -/* This is the old space-speed trade off. To reduce memory usage and code - * size, set this to zero. - */ -#define _SLANG_OPTIMIZE_FOR_SPEED 2 - -#define _SLANG_USE_INLINE_CODE 1 - -/* This is experimental. It adds extra information for tracking down - * errors. - */ -#define _SLANG_HAS_DEBUG_CODE 1 - -/* Allow optimizations based upon the __tmp operator. */ -#define _SLANG_USE_TMP_OPTIMIZATION 1 - -/* Setting this to one will map 8 bit vtxxx terminals to 7 bit. Terminals - * such as the vt320 can be set up to output the two-character escape sequence - * encoded as 'ESC [' as single character. Setting this variable to 1 will - * insert code to map such characters to the 7 bit equivalent. - * This affects just input characters in the range 128-160 on non PC - * systems. - */ -#if defined(VMS) || defined(AMIGA) -# define _SLANG_MAP_VTXXX_8BIT 1 -#else -# define _SLANG_MAP_VTXXX_8BIT 0 -#endif - -/* Add support for color terminals that cannot do background color erases - * Such terminals are poorly designed and are slowly disappearing but they - * are still quite common. For example, screen is one of them! - * - * This is experimental. In particular, it is not known to work if - * KANJI suupport is enabled. - */ -#if !defined(IBMPC_SYSTEM) -# define SLTT_HAS_NON_BCE_SUPPORT 1 -#else -# define SLTT_HAS_NON_BCE_SUPPORT 0 -#endif - -/* If you want slang to assume that an xterm always has the background color - * erase feature, then set this to 1. Otherwise, it will check the terminfo - * database. This may or may not be a good idea since most good color xterms - * support bce but many terminfo systems do not support it. - */ -#define SLTT_XTERM_ALWAYS_BCE 0 - -/* Set this to 1 to enable Kanji support. See above comment. */ -#define SLANG_HAS_KANJI_SUPPORT 0 - diff --git a/mdk-stage1/slang/slang.c b/mdk-stage1/slang/slang.c deleted file mode 100644 index 6edc7df37..000000000 --- a/mdk-stage1/slang/slang.c +++ /dev/null @@ -1,5547 +0,0 @@ -/* -*- mode: C; mode: fold; -*- */ -/* slang.c --- guts of S-Lang interpreter */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#if SLANG_HAS_FLOAT -# include -#endif - -#include "slang.h" -#include "_slang.h" - -#define USE_COMBINED_BYTECODES 0 - -struct _SLBlock_Type; - -typedef struct -{ - struct _SLBlock_Type *body; - unsigned int num_refs; -} -_SLBlock_Header_Type; - -typedef struct -{ - char *name; - SLang_Name_Type *next; - char name_type; - - union - { - _SLBlock_Header_Type *header; /* body of function */ - char *autoload_filename; - } - v; -#if _SLANG_HAS_DEBUG_CODE - char *file; -#endif -#define SLANG_MAX_LOCAL_VARIABLES 254 -#define AUTOLOAD_NUM_LOCALS (SLANG_MAX_LOCAL_VARIABLES + 1) - unsigned char nlocals; /* number of local variables */ - unsigned char nargs; /* number of arguments */ -} -_SLang_Function_Type; - -typedef struct -{ - char *name; - SLang_Name_Type *next; - char name_type; - - SLang_Object_Type obj; -} -SLang_Global_Var_Type; - -typedef struct -{ - char *name; - SLang_Name_Type *next; - char name_type; - - int local_var_number; -} -SLang_Local_Var_Type; - -typedef struct _SLBlock_Type -{ - unsigned char bc_main_type; - unsigned char bc_sub_type; - union - { - struct _SLBlock_Type *blk; - int i_blk; - - SLang_Name_Type *nt_blk; - SLang_App_Unary_Type *nt_unary_blk; - SLang_Intrin_Var_Type *nt_ivar_blk; - SLang_Intrin_Fun_Type *nt_ifun_blk; - SLang_Global_Var_Type *nt_gvar_blk; - SLang_IConstant_Type *iconst_blk; - SLang_DConstant_Type *dconst_blk; - _SLang_Function_Type *nt_fun_blk; - - VOID_STAR ptr_blk; - char *s_blk; - SLang_BString_Type *bs_blk; - -#if SLANG_HAS_FLOAT - double *double_blk; /*literal double is a pointer */ -#endif - float float_blk; - long l_blk; - struct _SLang_Struct_Type *struct_blk; - int (*call_function)(void); - } - b; -} -SLBlock_Type; - -/* Debugging and tracing variables */ - -void (*SLang_Enter_Function)(char *) = NULL; -void (*SLang_Exit_Function)(char *) = NULL; -/* If non null, these call C functions before and after a slang function. */ - -int _SLang_Trace = 0; -/* If _SLang_Trace = -1, do not trace intrinsics */ -static int Trace_Mode = 0; - -static char *Trace_Function; /* function to be traced */ -int SLang_Traceback = 0; -/* non zero means do traceback. If less than 0, do not show local variables */ - -/* These variables handle _NARGS processing by the parser */ -int SLang_Num_Function_Args; -static int *Num_Args_Stack; -static unsigned int Recursion_Depth; -static SLang_Object_Type *Frame_Pointer; -static int Next_Function_Num_Args; -static unsigned int Frame_Pointer_Depth; -static unsigned int *Frame_Pointer_Stack; - -static int Lang_Break_Condition = 0; -/* true if any one below is true. This keeps us from testing 3 variables. - * I know this can be perfomed with a bitmapped variable, but... - */ -static int Lang_Break = 0; -static int Lang_Return = 0; -/* static int Lang_Continue = 0; */ - -SLang_Object_Type *_SLRun_Stack; -SLang_Object_Type *_SLStack_Pointer; -static SLang_Object_Type *_SLStack_Pointer_Max; - -/* Might want to increase this. */ -static SLang_Object_Type Local_Variable_Stack[SLANG_MAX_LOCAL_STACK]; -static SLang_Object_Type *Local_Variable_Frame = Local_Variable_Stack; - -static void free_function_header (_SLBlock_Header_Type *); - -void (*SLang_Dump_Routine)(char *); - -static void call_dump_routine (char *fmt, ...) -{ - char buf[1024]; - va_list ap; - - va_start (ap, fmt); - if (SLang_Dump_Routine != NULL) - { - (void) _SLvsnprintf (buf, sizeof (buf), fmt, ap); - (*SLang_Dump_Routine) (buf); - } - else - { - vfprintf (stderr, fmt, ap); - fflush (stderr); - } - va_end (ap); -} - -static void do_traceback (char *, unsigned int, char *); -static int init_interpreter (void); - -/*{{{ push/pop/etc stack manipulation functions */ - -/* This routine is assumed to work even in the presence of a SLang_Error. */ -_INLINE_ -int SLang_pop (SLang_Object_Type *x) -{ - register SLang_Object_Type *y; - - y = _SLStack_Pointer; - if (y == _SLRun_Stack) - { - if (SLang_Error == 0) SLang_Error = SL_STACK_UNDERFLOW; - x->data_type = 0; - return -1; - } - y--; - *x = *y; - - _SLStack_Pointer = y; - return 0; -} - -static int pop_ctrl_integer (int *i) -{ - int type; - SLang_Class_Type *cl; -#if _SLANG_OPTIMIZE_FOR_SPEED - register SLang_Object_Type *y; - - /* Most of the time, either an integer or a char will be on the stack. - * Optimize these cases. - */ - y = _SLStack_Pointer; - if (y == _SLRun_Stack) - { - if (SLang_Error == 0) SLang_Error = SL_STACK_UNDERFLOW; - return -1; - } - y--; - - type = y->data_type; - if (type == SLANG_INT_TYPE) - { - _SLStack_Pointer = y; - *i = y->v.int_val; - return 0; - } - if (type == SLANG_CHAR_TYPE) - { - _SLStack_Pointer = y; - *i = y->v.char_val; - return 0; - } -#else - if (-1 == (type = SLang_peek_at_stack ())) - return -1; -#endif - - cl = _SLclass_get_class ((unsigned char) type); - if (cl->cl_to_bool == NULL) - { - SLang_verror (SL_TYPE_MISMATCH, - "%s cannot be used in a boolean context", - cl->cl_name); - return -1; - } - return cl->cl_to_bool ((unsigned char) type, i); -} - -_INLINE_ -int SLang_peek_at_stack (void) -{ - if (_SLStack_Pointer == _SLRun_Stack) - { - if (SLang_Error == 0) - SLang_Error = SL_STACK_UNDERFLOW; - return -1; - } - - return (_SLStack_Pointer - 1)->data_type; -} - -int SLang_peek_at_stack1 (void) -{ - int type; - - type = SLang_peek_at_stack (); - if (type == SLANG_ARRAY_TYPE) - type = (_SLStack_Pointer - 1)->v.array_val->data_type; - - return type; -} - -_INLINE_ -void SLang_free_object (SLang_Object_Type *obj) -{ - unsigned char data_type; - SLang_Class_Type *cl; - - if (obj == NULL) return; - data_type = obj->data_type; -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [data_type]) - return; - if (data_type == SLANG_STRING_TYPE) - { - SLang_free_slstring (obj->v.s_val); - return; - } -#endif - cl = _SLclass_get_class (data_type); -#if !_SLANG_OPTIMIZE_FOR_SPEED - if (cl->cl_class_type != SLANG_CLASS_TYPE_SCALAR) -#endif - (*cl->cl_destroy) (data_type, (VOID_STAR) &obj->v); -} - -_INLINE_ -int SLang_push (SLang_Object_Type *x) -{ - register SLang_Object_Type *y; - y = _SLStack_Pointer; - - /* if there is a SLang_Error, probably not much harm will be done - if it is ignored here */ - /* if (SLang_Error) return; */ - - /* flag it now */ - if (y >= _SLStack_Pointer_Max) - { - if (!SLang_Error) SLang_Error = SL_STACK_OVERFLOW; - return -1; - } - - *y = *x; - _SLStack_Pointer = y + 1; - return 0; -} - -/* _INLINE_ */ -int SLclass_push_ptr_obj (unsigned char type, VOID_STAR pval) -{ - register SLang_Object_Type *y; - y = _SLStack_Pointer; - - if (y >= _SLStack_Pointer_Max) - { - if (!SLang_Error) SLang_Error = SL_STACK_OVERFLOW; - return -1; - } - - y->data_type = type; - y->v.ptr_val = pval; - - _SLStack_Pointer = y + 1; - return 0; -} - -_INLINE_ -int SLclass_push_int_obj (unsigned char type, int x) -{ - register SLang_Object_Type *y; - y = _SLStack_Pointer; - - if (y >= _SLStack_Pointer_Max) - { - if (!SLang_Error) SLang_Error = SL_STACK_OVERFLOW; - return -1; - } - - y->data_type = type; - y->v.int_val = x; - - _SLStack_Pointer = y + 1; - return 0; -} - -_INLINE_ -int _SLang_pop_object_of_type (unsigned char type, SLang_Object_Type *obj, - int allow_arrays) -{ - register SLang_Object_Type *y; - - y = _SLStack_Pointer; - if (y == _SLRun_Stack) - return SLang_pop (obj); - y--; - if (y->data_type != type) - { -#if _SLANG_OPTIMIZE_FOR_SPEED - /* This is an implicit typecast. We do not want to typecast - * floats to ints implicitly. - */ - if (_SLarith_Is_Arith_Type [type] - && _SLarith_Is_Arith_Type [y->data_type] - && (_SLarith_Is_Arith_Type [type] >= _SLarith_Is_Arith_Type[y->data_type])) - { - /* This should not fail */ - (void) _SLarith_typecast (y->data_type, (VOID_STAR)&y->v, 1, - type, (VOID_STAR)&obj->v); - obj->data_type = type; - _SLStack_Pointer = y; - return 0; - } -#endif - - if ((allow_arrays == 0) - || (y->data_type != SLANG_ARRAY_TYPE) - || (y->v.array_val->data_type != type)) - if (-1 == SLclass_typecast (type, 1, 0)) - return -1; - } - *obj = *y; - _SLStack_Pointer = y; - return 0; -} - -/* This function reverses the top n items on the stack and returns a - * an offset from the start of the stack to the last item. - */ -int SLreverse_stack (int n) -{ - SLang_Object_Type *otop, *obot, tmp; - - otop = _SLStack_Pointer; - if ((n > otop - _SLRun_Stack) || (n < 0)) - { - SLang_Error = SL_STACK_UNDERFLOW; - return -1; - } - obot = otop - n; - otop--; - while (otop > obot) - { - tmp = *obot; - *obot = *otop; - *otop = tmp; - otop--; - obot++; - } - return (int) ((_SLStack_Pointer - n) - _SLRun_Stack); -} - -_INLINE_ -int SLroll_stack (int np) -{ - int n, i; - SLang_Object_Type *otop, *obot, tmp; - - if ((n = abs(np)) <= 1) return 0; /* identity */ - - obot = otop = _SLStack_Pointer; - i = n; - while (i != 0) - { - if (obot <= _SLRun_Stack) - { - SLang_Error = SL_STACK_UNDERFLOW; - return -1; - } - obot--; - i--; - } - otop--; - - if (np > 0) - { - /* Put top on bottom and roll rest up. */ - tmp = *otop; - while (otop > obot) - { - *otop = *(otop - 1); - otop--; - } - *otop = tmp; - } - else - { - /* Put bottom on top and roll rest down. */ - tmp = *obot; - while (obot < otop) - { - *obot = *(obot + 1); - obot++; - } - *obot = tmp; - } - return 0; -} - -int _SLstack_depth (void) -{ - return (int) (_SLStack_Pointer - _SLRun_Stack); -} - -int SLdup_n (int n) -{ - SLang_Object_Type *bot, *top; - - if (n <= 0) - return 0; - - top = _SLStack_Pointer; - if (top < _SLRun_Stack + n) - { - if (SLang_Error == 0) - SLang_Error = SL_STACK_UNDERFLOW; - return -1; - } - if (top + n > _SLStack_Pointer_Max) - { - if (SLang_Error == 0) - SLang_Error = SL_STACK_OVERFLOW; - return -1; - } - bot = top - n; - - while (bot < top) - { - SLang_Class_Type *cl; - unsigned char data_type = bot->data_type; - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [data_type]) - { - *_SLStack_Pointer++ = *bot++; - continue; - } -#endif - cl = _SLclass_get_class (data_type); - if (-1 == (*cl->cl_push) (data_type, (VOID_STAR) &bot->v)) - return -1; - bot++; - } - return 0; -} - -/*}}}*/ - -/*{{{ inner interpreter and support functions */ - -_INLINE_ -int _SL_increment_frame_pointer (void) -{ - if (Recursion_Depth >= SLANG_MAX_RECURSIVE_DEPTH) - { - SLang_verror (SL_STACK_OVERFLOW, "Num Args Stack Overflow"); - return -1; - } - Num_Args_Stack [Recursion_Depth] = SLang_Num_Function_Args; - - SLang_Num_Function_Args = Next_Function_Num_Args; - Next_Function_Num_Args = 0; - Recursion_Depth++; - return 0; -} - -_INLINE_ -int _SL_decrement_frame_pointer (void) -{ - if (Recursion_Depth == 0) - { - SLang_verror (SL_STACK_UNDERFLOW, "Num Args Stack Underflow"); - return -1; - } - - Recursion_Depth--; - if (Recursion_Depth < SLANG_MAX_RECURSIVE_DEPTH) - SLang_Num_Function_Args = Num_Args_Stack [Recursion_Depth]; - - return 0; -} - -_INLINE_ -int SLang_start_arg_list (void) -{ - if (Frame_Pointer_Depth < SLANG_MAX_RECURSIVE_DEPTH) - { - Frame_Pointer_Stack [Frame_Pointer_Depth] = (unsigned int) (Frame_Pointer - _SLRun_Stack); - Frame_Pointer = _SLStack_Pointer; - Frame_Pointer_Depth++; - Next_Function_Num_Args = 0; - return 0; - } - - SLang_verror (SL_STACK_OVERFLOW, "Frame Stack Overflow"); - return -1; -} - -_INLINE_ -int SLang_end_arg_list (void) -{ - if (Frame_Pointer_Depth == 0) - { - SLang_verror (SL_STACK_UNDERFLOW, "Frame Stack Underflow"); - return -1; - } - Frame_Pointer_Depth--; - if (Frame_Pointer_Depth < SLANG_MAX_RECURSIVE_DEPTH) - { - Next_Function_Num_Args = (int) (_SLStack_Pointer - Frame_Pointer); - Frame_Pointer = _SLRun_Stack + Frame_Pointer_Stack [Frame_Pointer_Depth]; - } - return 0; -} - -_INLINE_ -static int do_bc_call_direct_frame (int (*f)(void)) -{ - if ((0 == SLang_end_arg_list ()) - && (0 == _SL_increment_frame_pointer ())) - { - (void) (*f) (); - _SL_decrement_frame_pointer (); - } - if (SLang_Error) - return -1; - return 0; -} - -static int do_name_type_error (SLang_Name_Type *nt) -{ - char buf[256]; - if (nt != NULL) - { - (void) _SLsnprintf (buf, sizeof (buf), "(Error occurred processing %s)", nt->name); - do_traceback (buf, 0, NULL); - } - return -1; -} - -/* local and global variable assignments */ - -static int do_binary_ab (int op, SLang_Object_Type *obja, SLang_Object_Type *objb) -{ - SLang_Class_Type *a_cl, *b_cl, *c_cl; - unsigned char b_data_type, a_data_type, c_data_type; - int (*binary_fun) (int, - unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR); - VOID_STAR pa; - VOID_STAR pb; - VOID_STAR pc; - int ret; - - b_data_type = objb->data_type; - a_data_type = obja->data_type; - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (_SLarith_Is_Arith_Type[a_data_type] - && _SLarith_Is_Arith_Type[b_data_type]) - { - int status; - status = _SLarith_bin_op (obja, objb, op); - if (status != 1) - return status; - /* drop and try it the hard way */ - } -#endif - - a_cl = _SLclass_get_class (a_data_type); - if (a_data_type == b_data_type) - b_cl = a_cl; - else - b_cl = _SLclass_get_class (b_data_type); - - if (NULL == (binary_fun = _SLclass_get_binary_fun (op, a_cl, b_cl, &c_cl, 1))) - return -1; - - c_data_type = c_cl->cl_data_type; - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [a_data_type]) - pa = (VOID_STAR) &obja->v; - else -#endif - pa = _SLclass_get_ptr_to_value (a_cl, obja); - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [b_data_type]) - pb = (VOID_STAR) &objb->v; - else -#endif - pb = _SLclass_get_ptr_to_value (b_cl, objb); - - pc = c_cl->cl_transfer_buf; - - if (1 != (*binary_fun) (op, - a_data_type, pa, 1, - b_data_type, pb, 1, - pc)) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "Binary operation between %s and %s failed", - a_cl->cl_name, b_cl->cl_name); - - return -1; - } - - /* apush will create a copy, so make sure we free after the push */ - ret = (*c_cl->cl_apush)(c_data_type, pc); -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [c_data_type]) -#endif - (*c_cl->cl_adestroy)(c_data_type, pc); - - return ret; -} - -_INLINE_ -static void do_binary (int op) -{ - SLang_Object_Type obja, objb; - - if (SLang_pop (&objb)) return; - if (0 == SLang_pop (&obja)) - { - (void) do_binary_ab (op, &obja, &objb); -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [obja.data_type]) -#endif - SLang_free_object (&obja); - } -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [objb.data_type]) -#endif - SLang_free_object (&objb); -} - -static int do_unary_op (int op, SLang_Object_Type *obj, int unary_type) -{ - int (*f) (int, unsigned char, VOID_STAR, unsigned int, VOID_STAR); - VOID_STAR pa; - VOID_STAR pb; - SLang_Class_Type *a_cl, *b_cl; - unsigned char a_type, b_type; - int ret; - - a_type = obj->data_type; - a_cl = _SLclass_get_class (a_type); - - if (NULL == (f = _SLclass_get_unary_fun (op, a_cl, &b_cl, unary_type))) - return -1; - - b_type = b_cl->cl_data_type; - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type [a_type]) - pa = (VOID_STAR) &obj->v; - else -#endif - pa = _SLclass_get_ptr_to_value (a_cl, obj); - - pb = b_cl->cl_transfer_buf; - - if (1 != (*f) (op, a_type, pa, 1, pb)) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "Unary operation for %s failed", a_cl->cl_name); - return -1; - } - - ret = (*b_cl->cl_apush)(b_type, pb); - /* cl_apush creates a copy, so make sure we call cl_adestroy */ -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [b_type]) -#endif - (*b_cl->cl_adestroy)(b_type, pb); - - return ret; -} - -_INLINE_ -static int do_unary (int op, int unary_type) -{ - SLang_Object_Type obj; - int ret; - - if (-1 == SLang_pop (&obj)) return -1; - ret = do_unary_op (op, &obj, unary_type); -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [obj.data_type]) -#endif - SLang_free_object (&obj); - return ret; -} - -static int do_assignment_binary (int op, SLang_Object_Type *obja_ptr) -{ - SLang_Object_Type objb; - int ret; - - if (SLang_pop (&objb)) - return -1; - - ret = do_binary_ab (op, obja_ptr, &objb); -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [objb.data_type]) -#endif - SLang_free_object (&objb); - return ret; -} - -/* The order of these is assumed to match the binary operators - * defined in slang.h - */ -static int -map_assignment_op_to_binary (unsigned char op_type, int *op, int *is_unary) -{ - *is_unary = 0; - switch (op_type) - { - case _SLANG_BCST_PLUSEQS: - case _SLANG_BCST_MINUSEQS: - case _SLANG_BCST_TIMESEQS: - case _SLANG_BCST_DIVEQS: - *op = SLANG_PLUS + (op_type - _SLANG_BCST_PLUSEQS); - break; - - case _SLANG_BCST_BOREQS: - *op = SLANG_BOR; - break; - - case _SLANG_BCST_BANDEQS: - *op = SLANG_BAND; - break; - - case _SLANG_BCST_POST_MINUSMINUS: - case _SLANG_BCST_MINUSMINUS: - *op = SLANG_MINUS; - *is_unary = 1; - break; - - case _SLANG_BCST_PLUSPLUS: - case _SLANG_BCST_POST_PLUSPLUS: - *op = SLANG_PLUS; - *is_unary = 1; - break; - - default: - SLang_verror (SL_NOT_IMPLEMENTED, "Assignment operator not implemented"); - return -1; - } - return 0; -} - -static int -perform_lvalue_operation (unsigned char op_type, SLang_Object_Type *obja_ptr) -{ - switch (op_type) - { - case _SLANG_BCST_ASSIGN: - break; - - /* The order of these is assumed to match the binary operators - * defined in slang.h - */ - case _SLANG_BCST_PLUSEQS: - case _SLANG_BCST_MINUSEQS: - case _SLANG_BCST_TIMESEQS: - case _SLANG_BCST_DIVEQS: - if (-1 == do_assignment_binary (SLANG_PLUS + (op_type - _SLANG_BCST_PLUSEQS), obja_ptr)) - return -1; - break; - - case _SLANG_BCST_BOREQS: - if (-1 == do_assignment_binary (SLANG_BOR, obja_ptr)) - return -1; - break; - - case _SLANG_BCST_BANDEQS: - if (-1 == do_assignment_binary (SLANG_BAND, obja_ptr)) - return -1; - break; - - case _SLANG_BCST_PLUSPLUS: - case _SLANG_BCST_POST_PLUSPLUS: -#if _SLANG_OPTIMIZE_FOR_SPEED - if (obja_ptr->data_type == SLANG_INT_TYPE) - return SLclass_push_int_obj (SLANG_INT_TYPE, obja_ptr->v.int_val + 1); -#endif - if (-1 == do_unary_op (SLANG_PLUSPLUS, obja_ptr, _SLANG_BC_UNARY)) - return -1; - break; - - case _SLANG_BCST_MINUSMINUS: - case _SLANG_BCST_POST_MINUSMINUS: -#if _SLANG_OPTIMIZE_FOR_SPEED - if (obja_ptr->data_type == SLANG_INT_TYPE) - return SLclass_push_int_obj (SLANG_INT_TYPE, obja_ptr->v.int_val - 1); -#endif - if (-1 == do_unary_op (SLANG_MINUSMINUS, obja_ptr, _SLANG_BC_UNARY)) - return -1; - break; - - default: - SLang_Error = SL_INTERNAL_ERROR; - return -1; - } - return 0; -} - -_INLINE_ -static int -set_lvalue_obj (unsigned char op_type, SLang_Object_Type *obja_ptr) -{ - if (op_type != _SLANG_BCST_ASSIGN) - { - if (-1 == perform_lvalue_operation (op_type, obja_ptr)) - return -1; - } -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [obja_ptr->data_type]) -#endif - SLang_free_object (obja_ptr); - - return SLang_pop(obja_ptr); -} - -static int -set_struct_lvalue (SLBlock_Type *bc_blk) -{ - int type; - SLang_Class_Type *cl; - char *name; - int op; - - if (-1 == (type = SLang_peek_at_stack ())) - return -1; - - cl = _SLclass_get_class (type); - if ((cl->cl_sput == NULL) - || (cl->cl_sget == NULL)) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "%s does not support structure access", - cl->cl_name); - SLdo_pop_n (2); /* object plus what was to be assigned */ - return -1; - } - name = bc_blk->b.s_blk; - op = bc_blk->bc_sub_type; - - if (op != _SLANG_BCST_ASSIGN) - { - /* We have something like (A.x += b) or (A.x++). In either case, - * we need A.x. - */ - SLang_Object_Type obj_A; - SLang_Object_Type obj; - - if (-1 == SLang_pop (&obj_A)) - return -1; - - if ((-1 == _SLpush_slang_obj (&obj_A)) - || (-1 == cl->cl_sget ((unsigned char) type, name)) - || (-1 == SLang_pop (&obj))) - { - SLang_free_object (&obj_A); - return -1; - } - /* Now the value of A.x is in obj. */ - if (-1 == perform_lvalue_operation (op, &obj)) - { - SLang_free_object (&obj); - SLang_free_object (&obj_A); - return -1; - } - SLang_free_object (&obj); - /* The result of the operation is now on the stack. - * Perform assignment */ - if (-1 == SLang_push (&obj_A)) - { - SLang_free_object (&obj_A); - return -1; - } - } - - return (*cl->cl_sput) ((unsigned char) type, name); -} - -static int make_unit_object (SLang_Object_Type *a, SLang_Object_Type *u) -{ - unsigned char type; - - type = a->data_type; - if (type == SLANG_ARRAY_TYPE) - type = a->v.array_val->data_type; - - u->data_type = type; - switch (type) - { - case SLANG_UCHAR_TYPE: - case SLANG_CHAR_TYPE: - u->v.char_val = 1; - break; - - case SLANG_SHORT_TYPE: - case SLANG_USHORT_TYPE: - u->v.short_val = 1; - break; - - case SLANG_LONG_TYPE: - case SLANG_ULONG_TYPE: - u->v.long_val = 1; - break; - -#if SLANG_HAS_FLOAT - case SLANG_FLOAT_TYPE: - u->v.float_val = 1; - break; - - case SLANG_COMPLEX_TYPE: - u->data_type = SLANG_DOUBLE_TYPE; - case SLANG_DOUBLE_TYPE: - u->v.double_val = 1; - break; -#endif - default: - u->data_type = SLANG_INT_TYPE; - u->v.int_val = 1; - } - return 0; -} - - -/* We want to convert 'A[i] op X' to 'A[i] = A[i] op X'. The code that - * has been generated is: X __args i A __aput-op - * where __aput-op represents this function. We need to generate: - * __args i A __eargs __aget X op __args i A __eargs __aput - * Here, __eargs implies a call to do_bc_call_direct_frame with either - * the aput or aget function. In addition, __args represents a call to - * SLang_start_arg_list. Of course, i represents a set of indices. - * - * Note: If op is an unary operation (e.g., ++ or --), then X will not - * b present an will have to be taken to be 1. - * - * Implementation note: For efficiency, calls to setup the frame, start - * arg list will be omitted and SLang_Num_Function_Args will be set. - * This is ugly but the alternative is much less efficient rendering these - * assignment operators useless. So, the plan is to roll the stack to get X, - * then duplicate the next N values, call __aget followed by op X, finally - * calling __aput. Hence, the sequence is: - * - * start: X i .. j A - * dupN: X i .. j A i .. j A - * __aget: X i .. j A Y - * roll: i .. j A Y X - * op: i .. j A Z - * roll: Z i .. j A - * __aput: - */ -static int -set_array_lvalue (int op) -{ - SLang_Object_Type x, y; - int num_args, is_unary; - - if (-1 == map_assignment_op_to_binary (op, &op, &is_unary)) - return -1; - - /* Grab the indices and the array. Do not start a new frame. */ - if (-1 == SLang_end_arg_list ()) - return -1; - num_args = Next_Function_Num_Args; - Next_Function_Num_Args = 0; - - if (-1 == SLdup_n (num_args)) - return -1; - - SLang_Num_Function_Args = num_args; - if (-1 == _SLarray_aget ()) - return -1; - - if (-1 == SLang_pop (&y)) - return -1; - - if (is_unary == 0) - { - if ((-1 == SLroll_stack (-(num_args + 1))) - || (-1 == SLang_pop (&x))) - { - SLang_free_object (&y); - return -1; - } - } - else if (-1 == make_unit_object (&y, &x)) - { - SLang_free_object (&y); - return -1; - } - - if (-1 == do_binary_ab (op, &y, &x)) - { - SLang_free_object (&y); - SLang_free_object (&x); - return -1; - } -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [y.data_type]) -#endif - SLang_free_object (&y); - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [x.data_type]) -#endif - SLang_free_object (&x); - - if (-1 == SLroll_stack (num_args + 1)) - return -1; - - SLang_Num_Function_Args = num_args; - return _SLarray_aput (); -} - - -static int -set_intrin_lvalue (SLBlock_Type *bc_blk) -{ - unsigned char op_type; - SLang_Object_Type obja; - SLang_Class_Type *cl; - SLang_Intrin_Var_Type *ivar; - VOID_STAR intrinsic_addr; - unsigned char intrinsic_type; - - ivar = bc_blk->b.nt_ivar_blk; - - intrinsic_type = ivar->type; - intrinsic_addr = ivar->addr; - - op_type = bc_blk->bc_sub_type; - - cl = _SLclass_get_class (intrinsic_type); - - if (op_type != _SLANG_BCST_ASSIGN) - { - /* We want to get the current value into obja. This is the - * easiest way. - */ - if ((-1 == (*cl->cl_push) (intrinsic_type, intrinsic_addr)) - || (-1 == SLang_pop (&obja))) - return -1; - - (void) perform_lvalue_operation (op_type, &obja); - SLang_free_object (&obja); - - if (SLang_Error) - return -1; - } - - return (*cl->cl_pop) (intrinsic_type, intrinsic_addr); -} - -int _SLang_deref_assign (SLang_Ref_Type *ref) -{ - SLang_Object_Type *objp; - SLang_Name_Type *nt; - SLBlock_Type blk; - - if (ref->is_global == 0) - { - objp = ref->v.local_obj; - if (objp > Local_Variable_Frame) - { - SLang_verror (SL_UNDEFINED_NAME, "Local variable reference is out of scope"); - return -1; - } - return set_lvalue_obj (_SLANG_BCST_ASSIGN, objp); - } - - nt = ref->v.nt; - switch (nt->name_type) - { - case SLANG_GVARIABLE: - case SLANG_PVARIABLE: - if (-1 == set_lvalue_obj (_SLANG_BCST_ASSIGN, - &((SLang_Global_Var_Type *)nt)->obj)) - { - do_name_type_error (nt); - return -1; - } - break; - - case SLANG_IVARIABLE: - blk.b.nt_blk = nt; - blk.bc_sub_type = _SLANG_BCST_ASSIGN; - if (-1 == set_intrin_lvalue (&blk)) - { - do_name_type_error (nt); - return -1; - } - break; - - case SLANG_LVARIABLE: - SLang_Error = SL_INTERNAL_ERROR; - /* set_intrin_lvalue (&blk); */ - return -1; - - case SLANG_RVARIABLE: - default: - SLang_verror (SL_READONLY_ERROR, "deref assignment to %s not allowed", nt->name); - return -1; - } - - return 0; -} - -static void set_deref_lvalue (SLBlock_Type *bc_blk) -{ - SLang_Object_Type *objp; - SLang_Ref_Type *ref; - - switch (bc_blk->bc_sub_type) - { - case SLANG_LVARIABLE: - objp = (Local_Variable_Frame - bc_blk->b.i_blk); - break; - case SLANG_GVARIABLE: - case SLANG_PVARIABLE: - objp = &bc_blk->b.nt_gvar_blk->obj; - break; - default: - SLang_Error = SL_INTERNAL_ERROR; - return; - } - - if (-1 == _SLpush_slang_obj (objp)) - return; - - if (-1 == SLang_pop_ref (&ref)) - return; - (void) _SLang_deref_assign (ref); - SLang_free_ref (ref); -} - -static int push_struct_field (char *name) -{ - int type; - SLang_Class_Type *cl; - - if (-1 == (type = SLang_peek_at_stack ())) - return -1; - - cl = _SLclass_get_class ((unsigned char) type); - if (cl->cl_sget == NULL) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "%s does not permit structure access", - cl->cl_name); - SLdo_pop_n (2); - return -1; - } - - return (*cl->cl_sget) ((unsigned char) type, name); -} - -static void trace_dump (char *format, char *name, SLang_Object_Type *objs, int n, int dir) -{ - unsigned int len; - char prefix [52]; - - len = Trace_Mode - 1; - if (len + 2 >= sizeof (prefix)) - len = sizeof (prefix) - 2; - - SLMEMSET (prefix, ' ', len); - prefix[len] = 0; - - call_dump_routine (prefix); - call_dump_routine (format, name, n); - - if (n > 0) - { - prefix[len] = ' '; - len++; - prefix[len] = 0; - - _SLdump_objects (prefix, objs, n, dir); - } -} - -/* Pop a data item from the stack and return a pointer to it. - * Strings are not freed from stack so use another routine to do it. - */ -static VOID_STAR pop_pointer (SLang_Object_Type *obj, unsigned char type) -{ -#ifndef _SLANG_OPTIMIZE_FOR_SPEED - SLang_Class_Type *cl; -#endif - - SLang_Array_Type *at; - - /* Arrays are special. Allow scalars to automatically convert to arrays. - */ - if (type == SLANG_ARRAY_TYPE) - { - if (-1 == SLang_pop_array (&at, 1)) - return NULL; - obj->data_type = SLANG_ARRAY_TYPE; - return obj->v.ptr_val = (VOID_STAR) at; - } - - if (type == 0) - { - /* This happens when an intrinsic is declared without any information - * regarding parameter types. - */ - if (-1 == SLang_pop (obj)) - return NULL; - type = obj->data_type; - } - else if (-1 == _SLang_pop_object_of_type (type, obj, 0)) - return NULL; - -#if _SLANG_OPTIMIZE_FOR_SPEED - type = _SLclass_Class_Type [type]; -#else - type = _SLclass_get_class (type)->cl_class_type; -#endif - - if (type == SLANG_CLASS_TYPE_SCALAR) - return (VOID_STAR) &obj->v; - else if (type == SLANG_CLASS_TYPE_MMT) - return SLang_object_from_mmt (obj->v.ref); - else - return obj->v.ptr_val; -} - -/* This is ugly. Does anyone have a advice for a cleaner way of doing - * this?? - */ -typedef void (*VF0_Type)(void); -typedef void (*VF1_Type)(VOID_STAR); -typedef void (*VF2_Type)(VOID_STAR, VOID_STAR); -typedef void (*VF3_Type)(VOID_STAR, VOID_STAR, VOID_STAR); -typedef void (*VF4_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef void (*VF5_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef void (*VF6_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef void (*VF7_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef long (*LF0_Type)(void); -typedef long (*LF1_Type)(VOID_STAR); -typedef long (*LF2_Type)(VOID_STAR, VOID_STAR); -typedef long (*LF3_Type)(VOID_STAR, VOID_STAR, VOID_STAR); -typedef long (*LF4_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef long (*LF5_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef long (*LF6_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef long (*LF7_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -#if SLANG_HAS_FLOAT -typedef double (*FF0_Type)(void); -typedef double (*FF1_Type)(VOID_STAR); -typedef double (*FF2_Type)(VOID_STAR, VOID_STAR); -typedef double (*FF3_Type)(VOID_STAR, VOID_STAR, VOID_STAR); -typedef double (*FF4_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef double (*FF5_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef double (*FF6_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -typedef double (*FF7_Type)(VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR, VOID_STAR); -#endif - -static int execute_intrinsic_fun (SLang_Intrin_Fun_Type *objf) -{ -#if SLANG_HAS_FLOAT - double xf; -#endif - VOID_STAR p[SLANG_MAX_INTRIN_ARGS]; - SLang_Object_Type objs[SLANG_MAX_INTRIN_ARGS]; - long ret; - unsigned char type; - unsigned int argc; - unsigned int i; - FVOID_STAR fptr; - unsigned char *arg_types; - int stk_depth; - - fptr = objf->i_fun; - argc = objf->num_args; - type = objf->return_type; - arg_types = objf->arg_types; - - if (argc > SLANG_MAX_INTRIN_ARGS) - { - SLang_verror(SL_APPLICATION_ERROR, - "Intrinsic function %s requires too many parameters", objf->name); - return -1; - } - - if (-1 == _SL_increment_frame_pointer ()) - return -1; - - stk_depth = -1; - if (Trace_Mode && (_SLang_Trace > 0)) - { - int nargs; - - stk_depth = _SLstack_depth (); - - nargs = SLang_Num_Function_Args; - if (nargs == 0) - nargs = (int)argc; - - stk_depth -= nargs; - - if (stk_depth >= 0) - trace_dump (">>%s (%d args)\n", - objf->name, - _SLStack_Pointer - nargs, - nargs, - 1); - } - - i = argc; - while (i != 0) - { - i--; - if (NULL == (p[i] = pop_pointer (objs + i, arg_types[i]))) - { - i++; - goto free_and_return; - } - } - - ret = 0; -#if SLANG_HAS_FLOAT - xf = 0.0; -#endif - - switch (argc) - { - case 0: - if (type == SLANG_VOID_TYPE) ((VF0_Type) fptr) (); -#if SLANG_HAS_FLOAT - else if (type == SLANG_DOUBLE_TYPE) xf = ((FF0_Type) fptr)(); -#endif - else ret = ((LF0_Type) fptr)(); - break; - - case 1: - if (type == SLANG_VOID_TYPE) ((VF1_Type) fptr)(p[0]); -#if SLANG_HAS_FLOAT - else if (type == SLANG_DOUBLE_TYPE) xf = ((FF1_Type) fptr)(p[0]); -#endif - else ret = ((LF1_Type) fptr)(p[0]); - break; - - case 2: - if (type == SLANG_VOID_TYPE) ((VF2_Type) fptr)(p[0], p[1]); -#if SLANG_HAS_FLOAT - else if (type == SLANG_DOUBLE_TYPE) xf = ((FF2_Type) fptr)(p[0], p[1]); -#endif - else ret = ((LF2_Type) fptr)(p[0], p[1]); - break; - - case 3: - if (type == SLANG_VOID_TYPE) ((VF3_Type) fptr)(p[0], p[1], p[2]); -#if SLANG_HAS_FLOAT - else if (type == SLANG_DOUBLE_TYPE) xf = ((FF3_Type) fptr)(p[0], p[1], p[2]); -#endif - else ret = ((LF3_Type) fptr)(p[0], p[1], p[2]); - break; - - case 4: - if (type == SLANG_VOID_TYPE) ((VF4_Type) fptr)(p[0], p[1], p[2], p[3]); -#if SLANG_HAS_FLOAT - else if (type == SLANG_DOUBLE_TYPE) xf = ((FF4_Type) fptr)(p[0], p[1], p[2], p[3]); -#endif - else ret = ((LF4_Type) fptr)(p[0], p[1], p[2], p[3]); - break; - - case 5: - if (type == SLANG_VOID_TYPE) ((VF5_Type) fptr)(p[0], p[1], p[2], p[3], p[4]); -#if SLANG_HAS_FLOAT - else if (type == SLANG_DOUBLE_TYPE) xf = ((FF5_Type) fptr)(p[0], p[1], p[2], p[3], p[4]); -#endif - else ret = ((LF5_Type) fptr)(p[0], p[1], p[2], p[3], p[4]); - break; - - case 6: - if (type == SLANG_VOID_TYPE) ((VF6_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5]); -#if SLANG_HAS_FLOAT - else if (type == SLANG_DOUBLE_TYPE) xf = ((FF6_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5]); -#endif - else ret = ((LF6_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5]); - break; - - case 7: - if (type == SLANG_VOID_TYPE) ((VF7_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5], p[6]); -#if SLANG_HAS_FLOAT - else if (type == SLANG_DOUBLE_TYPE) xf = ((FF7_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5], p[6]); -#endif - else ret = ((LF7_Type) fptr)(p[0], p[1], p[2], p[3], p[4], p[5], p[6]); - break; - } - - switch (type) - { - case SLANG_VOID_TYPE: - break; - -#if SLANG_HAS_FLOAT - case SLANG_DOUBLE_TYPE: - (void) SLang_push_double (xf); - break; -#endif - case SLANG_UINT_TYPE: - case SLANG_INT_TYPE: (void) SLclass_push_int_obj (type, (int) ret); - break; - - case SLANG_CHAR_TYPE: - case SLANG_UCHAR_TYPE: (void) SLclass_push_char_obj (type, (char) ret); - break; - - case SLANG_SHORT_TYPE: - case SLANG_USHORT_TYPE: (void) SLclass_push_short_obj (type, (short) ret); - break; - - case SLANG_LONG_TYPE: - case SLANG_ULONG_TYPE: (void) SLclass_push_long_obj (type, ret); - break; - - case SLANG_STRING_TYPE: - if (NULL == (char *)ret) - { - if (SLang_Error == 0) SLang_Error = SL_INTRINSIC_ERROR; - } - else (void) SLang_push_string ((char *)ret); - break; - - default: - SLang_verror (SL_NOT_IMPLEMENTED, - "Support for intrinsic functions returning %s is not provided", - SLclass_get_datatype_name (type)); - } - - if (stk_depth >= 0) - { - stk_depth = _SLstack_depth () - stk_depth; - - trace_dump ("<<%s (returning %d values)\n", - objf->name, - _SLStack_Pointer - stk_depth, - stk_depth, - 1); - } - - free_and_return: - while (i < argc) - { - SLang_free_object (objs + i); - i++; - } - - return _SL_decrement_frame_pointer (); -} - -static int inner_interp(register SLBlock_Type *); - -/* Switch_Obj_Ptr points to the NEXT available free switch object */ -static SLang_Object_Type Switch_Objects[SLANG_MAX_NESTED_SWITCH]; -static SLang_Object_Type *Switch_Obj_Ptr = Switch_Objects; -static SLang_Object_Type *Switch_Obj_Max = Switch_Objects + SLANG_MAX_NESTED_SWITCH; - -static void -lang_do_loops (unsigned char stype, SLBlock_Type *block, unsigned int num_blocks) -{ - int i, ctrl; - int first, last; - SLBlock_Type *blks[4]; - char *loop_name; - SLang_Foreach_Context_Type *foreach_context; - SLang_Class_Type *cl; - int type; - unsigned int j; - - j = 0; - for (i = 0; i < (int) num_blocks; i++) - { - if (block[i].bc_main_type != _SLANG_BC_BLOCK) - { - if (block[i].bc_main_type == _SLANG_BC_LINE_NUM) - continue; - - SLang_verror (SL_SYNTAX_ERROR, "Bytecode is not a looping block"); - return; - } - blks[j] = block[i].b.blk; - j++; - } - - num_blocks = j; - block = blks[0]; - - switch (stype) - { - case _SLANG_BCST_FOREACH: - loop_name = "foreach"; - if (num_blocks != 1) - goto wrong_num_blocks_error; - - /* We should find Next_Function_Num_Args + 1 items on the stack. - * The first Next_Function_Num_Args items represent the arguments to - * to USING. The last item (deepest in stack) is the object to loop - * over. So, roll the stack up and grab it. - */ - if ((-1 == SLroll_stack (-(Next_Function_Num_Args + 1))) - || (-1 == (type = SLang_peek_at_stack ()))) - goto return_error; - - cl = _SLclass_get_class ((unsigned char) type); - if ((cl->cl_foreach == NULL) - || (cl->cl_foreach_open == NULL) - || (cl->cl_foreach_close == NULL)) - { - SLang_verror (SL_NOT_IMPLEMENTED, "%s does not permit foreach", cl->cl_name); - SLdo_pop_n (Next_Function_Num_Args + 1); - goto return_error; - } - - if (NULL == (foreach_context = (*cl->cl_foreach_open) ((unsigned char)type, Next_Function_Num_Args))) - goto return_error; - - while (1) - { - int status; - - if (SLang_Error) - { - (*cl->cl_foreach_close) ((unsigned char) type, foreach_context); - goto return_error; - } - - status = (*cl->cl_foreach) ((unsigned char) type, foreach_context); - if (status <= 0) - { - if (status == 0) - break; - - (*cl->cl_foreach_close) ((unsigned char) type, foreach_context); - goto return_error; - } - - inner_interp (block); - if (Lang_Break) break; - Lang_Break_Condition = /* Lang_Continue = */ 0; - } - (*cl->cl_foreach_close) ((unsigned char) type, foreach_context); - break; - - case _SLANG_BCST_WHILE: - loop_name = "while"; - - if (num_blocks != 2) - goto wrong_num_blocks_error; - - type = blks[1]->bc_main_type; - while (1) - { - if (SLang_Error) - goto return_error; - - inner_interp (block); - if (Lang_Break) break; - - if (-1 == pop_ctrl_integer (&ctrl)) - goto return_error; - - if (ctrl == 0) break; - - if (type) - { - inner_interp (blks[1]); - if (Lang_Break) break; - Lang_Break_Condition = /* Lang_Continue = */ 0; - } - } - break; - - case _SLANG_BCST_DOWHILE: - loop_name = "do...while"; - - if (num_blocks != 2) - goto wrong_num_blocks_error; - - while (1) - { - if (SLang_Error) - goto return_error; - - Lang_Break_Condition = /* Lang_Continue = */ 0; - inner_interp (block); - if (Lang_Break) break; - Lang_Break_Condition = /* Lang_Continue = */ 0; - inner_interp (blks[1]); - if (-1 == pop_ctrl_integer (&ctrl)) - goto return_error; - - if (ctrl == 0) break; - } - break; - - case _SLANG_BCST_CFOR: - loop_name = "for"; - - /* we need 4 blocks: first 3 control, the last is code */ - if (num_blocks != 4) goto wrong_num_blocks_error; - - inner_interp (block); - while (1) - { - if (SLang_Error) - goto return_error; - - inner_interp(blks[1]); /* test */ - if (-1 == pop_ctrl_integer (&ctrl)) - goto return_error; - - if (ctrl == 0) break; - inner_interp(blks[3]); /* code */ - if (Lang_Break) break; - inner_interp(blks[2]); /* bump */ - Lang_Break_Condition = /* Lang_Continue = */ 0; - } - break; - - case _SLANG_BCST_FOR: - loop_name = "_for"; - - if (num_blocks != 1) - goto wrong_num_blocks_error; - - /* 3 elements: first, last, step */ - if ((-1 == SLang_pop_integer (&ctrl)) - || (-1 == SLang_pop_integer (&last)) - || (-1 == SLang_pop_integer (&first))) - goto return_error; - - i = first; - while (1) - { - /* It is ugly to have this test here but I do not know of a - * simple way to do this without using two while loops. - */ - if (ctrl >= 0) - { - if (i > last) break; - } - else if (i < last) break; - - if (SLang_Error) goto return_error; - - SLclass_push_int_obj (SLANG_INT_TYPE, i); - inner_interp (block); - if (Lang_Break) break; - Lang_Break_Condition = /* Lang_Continue = */ 0; - - i += ctrl; - } - break; - - case _SLANG_BCST_LOOP: - loop_name = "loop"; - if (num_blocks != 1) - goto wrong_num_blocks_error; - - if (-1 == SLang_pop_integer (&ctrl)) - goto return_error; - while (ctrl > 0) - { - ctrl--; - - if (SLang_Error) - goto return_error; - - inner_interp (block); - if (Lang_Break) break; - Lang_Break_Condition = /* Lang_Continue = */ 0; - } - break; - - case _SLANG_BCST_FOREVER: - loop_name = "forever"; - - if (num_blocks != 1) - goto wrong_num_blocks_error; - - while (1) - { - if (SLang_Error) - goto return_error; - - inner_interp (block); - if (Lang_Break) break; - Lang_Break_Condition = /* Lang_Continue = */ 0; - } - break; - - default: SLang_verror(SL_INTERNAL_ERROR, "Unknown loop type"); - return; - } - Lang_Break = /* Lang_Continue = */ 0; - Lang_Break_Condition = Lang_Return; - return; - - wrong_num_blocks_error: - SLang_verror (SL_SYNTAX_ERROR, "Wrong number of blocks for '%s' construct", loop_name); - - /* drop */ - return_error: - do_traceback (loop_name, 0, NULL); -} - -static void lang_do_and_orelse (unsigned char stype, SLBlock_Type *addr, SLBlock_Type *addr_max) -{ - int test = 0; - int is_or; - - is_or = (stype == _SLANG_BCST_ORELSE); - - while (addr <= addr_max) - { - if (addr->bc_main_type == _SLANG_BC_LINE_NUM) - { - addr++; - continue; - } - - inner_interp (addr->b.blk); - if (SLang_Error - || Lang_Break_Condition - || (-1 == pop_ctrl_integer (&test))) - return; - - if (is_or == (test != 0)) - break; - - /* if (((stype == _SLANG_BCST_ANDELSE) && (test == 0)) - * || ((stype == _SLANG_BCST_ORELSE) && test)) - * break; - */ - - addr++; - } - SLclass_push_int_obj (SLANG_INT_TYPE, test); -} - -static void do_else_if (SLBlock_Type *zero_block, SLBlock_Type *non_zero_block) -{ - int test; - - if (-1 == pop_ctrl_integer (&test)) - return; - - if (test == 0) - non_zero_block = zero_block; - - if (non_zero_block != NULL) - inner_interp (non_zero_block->b.blk); -} - -int _SLang_trace_fun (char *f) -{ - if (NULL == (f = SLang_create_slstring (f))) - return -1; - - SLang_free_slstring (Trace_Function); - Trace_Function = f; - _SLang_Trace = 1; - return 0; -} - -int _SLdump_objects (char *prefix, SLang_Object_Type *x, unsigned int n, int dir) -{ - char *s; - SLang_Class_Type *cl; - - while (n) - { - cl = _SLclass_get_class (x->data_type); - - if (NULL == (s = _SLstringize_object (x))) - s = "??"; - - call_dump_routine ("%s[%s]:%s\n", prefix, cl->cl_name, s); - - SLang_free_slstring (s); - - x += dir; - n--; - } - return 0; -} - -static SLBlock_Type *Exit_Block_Ptr; -static SLBlock_Type *Global_User_Block[5]; -static SLBlock_Type **User_Block_Ptr = Global_User_Block; -char *_SLang_Current_Function_Name = NULL; - -static int execute_slang_fun (_SLang_Function_Type *fun) -{ - register unsigned int i; - register SLang_Object_Type *frame, *lvf; - register unsigned int n_locals; - _SLBlock_Header_Type *header; - /* SLBlock_Type *val; */ - SLBlock_Type *exit_block_save; - SLBlock_Type **user_block_save; - SLBlock_Type *user_blocks[5]; - char *save_fname; - - exit_block_save = Exit_Block_Ptr; - user_block_save = User_Block_Ptr; - User_Block_Ptr = user_blocks; - *(user_blocks) = NULL; - *(user_blocks + 1) = NULL; - *(user_blocks + 2) = NULL; - *(user_blocks + 3) = NULL; - *(user_blocks + 4) = NULL; - - Exit_Block_Ptr = NULL; - - save_fname = _SLang_Current_Function_Name; - _SLang_Current_Function_Name = fun->name; - - _SL_increment_frame_pointer (); - - /* need loaded? */ - if (fun->nlocals == AUTOLOAD_NUM_LOCALS) - { - header = NULL; - if (-1 == SLang_load_file(fun->v.autoload_filename)) - goto the_return; - - if (fun->nlocals == AUTOLOAD_NUM_LOCALS) - { - SLang_verror (SL_UNDEFINED_NAME, "%s: Function did not autoload", - _SLang_Current_Function_Name); - goto the_return; - } - } - - n_locals = fun->nlocals; - - /* let the error propagate through since it will do no harm - and allow us to restore stack. */ - - /* set new stack frame */ - lvf = frame = Local_Variable_Frame; - i = n_locals; - if ((lvf + i) > Local_Variable_Stack + SLANG_MAX_LOCAL_STACK) - { - SLang_verror(SL_STACK_OVERFLOW, "%s: Local Variable Stack Overflow", - _SLang_Current_Function_Name); - goto the_return; - } - - /* Make sure we do not allow this header to get destroyed by something - * like: define crash () { eval ("define crash ();") } - */ - header = fun->v.header; - header->num_refs++; - - while (i--) - { - lvf++; - lvf->data_type = SLANG_UNDEFINED_TYPE; - } - Local_Variable_Frame = lvf; - - /* read values of function arguments */ - i = fun->nargs; - while (i > 0) - { - i--; - (void) SLang_pop (Local_Variable_Frame - i); - } - - if (SLang_Enter_Function != NULL) (*SLang_Enter_Function)(_SLang_Current_Function_Name); - - if (_SLang_Trace) - { - int stack_depth; - - stack_depth = _SLstack_depth (); - - if ((Trace_Function != NULL) - && (0 == strcmp (Trace_Function, _SLang_Current_Function_Name)) - && (Trace_Mode == 0)) - Trace_Mode = 1; - - if (Trace_Mode) - { - /* The local variable frame grows backwards */ - trace_dump (">>%s (%d args)\n", - _SLang_Current_Function_Name, - Local_Variable_Frame, - (int) fun->nargs, - -1); - Trace_Mode++; - } - - inner_interp (header->body); - Lang_Break_Condition = Lang_Return = Lang_Break = 0; - if (Exit_Block_Ptr != NULL) inner_interp(Exit_Block_Ptr); - - if (Trace_Mode) - { - Trace_Mode--; - stack_depth = _SLstack_depth () - stack_depth; - - trace_dump ("<<%s (returning %d values)\n", - _SLang_Current_Function_Name, - _SLStack_Pointer - stack_depth, - stack_depth, - 1); - - if (Trace_Mode == 1) - Trace_Mode = 0; - } - } - else - { - inner_interp (header->body); - Lang_Break_Condition = Lang_Return = Lang_Break = 0; - if (Exit_Block_Ptr != NULL) inner_interp(Exit_Block_Ptr); - } - - if (SLang_Exit_Function != NULL) (*SLang_Exit_Function)(_SLang_Current_Function_Name); - - if (SLang_Error) - do_traceback(fun->name, n_locals, -#if _SLANG_HAS_DEBUG_CODE - fun->file -#else - NULL -#endif - ); - - /* free local variables.... */ - lvf = Local_Variable_Frame; - while (lvf > frame) - { -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR != _SLclass_Class_Type [lvf->data_type]) -#endif - SLang_free_object (lvf); - lvf--; - } - Local_Variable_Frame = lvf; - - if (header->num_refs == 1) - free_function_header (header); - else - header->num_refs--; - - the_return: - - Lang_Break_Condition = Lang_Return = Lang_Break = 0; - Exit_Block_Ptr = exit_block_save; - User_Block_Ptr = user_block_save; - _SLang_Current_Function_Name = save_fname; - _SL_decrement_frame_pointer (); - - if (SLang_Error) - return -1; - - return 0; -} - -static void do_traceback (char *name, unsigned int locals, char *file) -{ - char *s; - unsigned int i; - SLang_Object_Type *objp; - unsigned short stype; - - /* FIXME: Priority=low - * I need to make this configurable!!! That is, let the - * application decide whether or not a usage error should result in a - * traceback. - */ - if (SLang_Error == SL_USAGE_ERROR) - return; - - if (SLang_Traceback == 0) - return; - - call_dump_routine ("S-Lang Traceback: %s\n", name); - if (SLang_Traceback < 0) - return; - - if (file != NULL) - call_dump_routine ("File: %s\n", file); - - if (locals == 0) - return; - - call_dump_routine (" Local Variables:\n"); - - for (i = 0; i < locals; i++) - { - SLang_Class_Type *cl; - char *class_name; - - objp = Local_Variable_Frame - i; - stype = objp->data_type; - - s = _SLstringize_object (objp); - cl = _SLclass_get_class (stype); - class_name = cl->cl_name; - - call_dump_routine ("\t$%d: Type: %s,\tValue:\t", i, class_name); - - if (s == NULL) call_dump_routine("??\n"); - else - { - char *q = ""; -#ifndef HAVE_VSNPRINTF - char buf[256]; - if (strlen (s) >= sizeof (buf)) - { - strncpy (buf, s, sizeof(buf)); - s = buf; - s[sizeof(buf) - 1] = 0; - } -#endif - if (SLANG_STRING_TYPE == stype) q = "\""; - call_dump_routine ("%s%s%s\n", q, s, q); - } - } -} - -static void do_app_unary (SLang_App_Unary_Type *nt) -{ - if (-1 == do_unary (nt->unary_op, nt->name_type)) - do_traceback (nt->name, 0, NULL); -} - -static int inner_interp_nametype (SLang_Name_Type *nt) -{ - SLBlock_Type bc_blks[2]; - - bc_blks[0].b.nt_blk = nt; - bc_blks[0].bc_main_type = nt->name_type; - bc_blks[1].bc_main_type = 0; - return inner_interp(bc_blks); -} - -int _SLang_dereference_ref (SLang_Ref_Type *ref) -{ - if (ref == NULL) - { - SLang_Error = SL_INTERNAL_ERROR; - return -1; - } - - if (ref->is_global == 0) - { - SLang_Object_Type *obj = ref->v.local_obj; - if (obj > Local_Variable_Frame) - { - SLang_verror (SL_UNDEFINED_NAME, "Local variable deref is out of scope"); - return -1; - } - return _SLpush_slang_obj (ref->v.local_obj); - } - - (void) inner_interp_nametype (ref->v.nt); - return 0; -} - -int _SLang_is_ref_initialized (SLang_Ref_Type *ref) -{ - unsigned char type; - - if (ref == NULL) - { - SLang_Error = SL_INTERNAL_ERROR; - return -1; - } - - if (ref->is_global == 0) - { - SLang_Object_Type *obj = ref->v.local_obj; - if (obj > Local_Variable_Frame) - { - SLang_verror (SL_UNDEFINED_NAME, "Local variable deref is out of scope"); - return -1; - } - type = ref->v.local_obj->data_type; - } - else - { - SLang_Name_Type *nt = ref->v.nt; - if ((nt->name_type != SLANG_GVARIABLE) - && (nt->name_type != SLANG_PVARIABLE)) - return 1; - type = ((SLang_Global_Var_Type *)nt)->obj.data_type; - } - return type != SLANG_UNDEFINED_TYPE; -} - -int _SLang_uninitialize_ref (SLang_Ref_Type *ref) -{ - SLang_Object_Type *obj; - - if (ref == NULL) - { - SLang_Error = SL_INTERNAL_ERROR; - return -1; - } - - if (ref->is_global == 0) - { - obj = ref->v.local_obj; - if (obj > Local_Variable_Frame) - { - SLang_verror (SL_UNDEFINED_NAME, "Local variable deref is out of scope"); - return -1; - } - obj = ref->v.local_obj; - } - else - { - SLang_Name_Type *nt = ref->v.nt; - if ((nt->name_type != SLANG_GVARIABLE) - && (nt->name_type != SLANG_PVARIABLE)) - return -1; - obj = &((SLang_Global_Var_Type *)nt)->obj; - } - SLang_free_object (obj); - obj->data_type = SLANG_UNDEFINED_TYPE; - obj->v.ptr_val = NULL; - return 0; -} - -void (*SLang_Interrupt)(void); -static int Last_Error; -void (*SLang_User_Clear_Error)(void); -void _SLang_clear_error (void) -{ - if (Last_Error <= 0) - { - Last_Error = 0; - return; - } - Last_Error--; - if (SLang_User_Clear_Error != NULL) (*SLang_User_Clear_Error)(); -} - -int _SLpush_slang_obj (SLang_Object_Type *obj) -{ - unsigned char subtype; - SLang_Class_Type *cl; - - if (obj == NULL) return SLang_push_null (); - - subtype = obj->data_type; - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type[subtype]) - return SLang_push (obj); -#endif - - cl = _SLclass_get_class (subtype); - return (*cl->cl_push) (subtype, (VOID_STAR) &obj->v); -} - -_INLINE_ -static int push_local_variable (int i) -{ - SLang_Class_Type *cl; - SLang_Object_Type *obj; - unsigned char subtype; - - obj = Local_Variable_Frame - i; - subtype = obj->data_type; - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type[subtype]) - return SLang_push (obj); - if (subtype == SLANG_STRING_TYPE) - return _SLang_dup_and_push_slstring (obj->v.s_val); -#endif - - cl = _SLclass_get_class (subtype); - return (*cl->cl_push) (subtype, (VOID_STAR) &obj->v); -} - -static int push_intrinsic_variable (SLang_Intrin_Var_Type *ivar) -{ - SLang_Class_Type *cl; - unsigned char stype; - - stype = ivar->type; - cl = _SLclass_get_class (stype); - - if (-1 == (*cl->cl_push_intrinsic) (stype, ivar->addr)) - { - do_name_type_error ((SLang_Name_Type *) ivar); - return -1; - } - return 0; -} - -static int dereference_object (void) -{ - SLang_Object_Type obj; - SLang_Class_Type *cl; - unsigned char type; - int ret; - - if (-1 == SLang_pop (&obj)) - return -1; - - type = obj.data_type; - - cl = _SLclass_get_class (type); - ret = (*cl->cl_dereference)(type, (VOID_STAR) &obj.v); - - SLang_free_object (&obj); - return ret; -} - -static int case_function (void) -{ - unsigned char type; - SLang_Object_Type obj; - SLang_Object_Type *swobjptr; - - swobjptr = Switch_Obj_Ptr - 1; - - if ((swobjptr < Switch_Objects) - || (0 == (type = swobjptr->data_type))) - { - SLang_verror (SL_SYNTAX_ERROR, "Misplaced 'case' keyword"); - return -1; - } - - if (-1 == SLang_pop (&obj)) - return -1; - - if (obj.data_type != type) - { - SLang_Class_Type *a_cl, *b_cl; - - a_cl = _SLclass_get_class (obj.data_type); - b_cl = _SLclass_get_class (type); - - if (NULL == _SLclass_get_binary_fun (SLANG_EQ, a_cl, b_cl, &a_cl, 0)) - { - (void) SLclass_push_int_obj (SLANG_INT_TYPE, 0); - SLang_free_object (&obj); - return 0; - } - } - - (void) do_binary_ab (SLANG_EQ, swobjptr, &obj); - SLang_free_object (&obj); - return 0; -} - -static void tmp_variable_function (SLBlock_Type *addr) -{ - SLang_Object_Type *obj; - - switch (addr->bc_sub_type) - { - case SLANG_GVARIABLE: - case SLANG_PVARIABLE: - obj = &addr->b.nt_gvar_blk->obj; - break; - - case SLANG_LVARIABLE: - obj = Local_Variable_Frame - addr->b.i_blk; - break; - - default: - SLang_Error = SL_INTERNAL_ERROR; - return; - } - - /* There is no need to go through higher level routines since we are - * not creating or destroying extra copies. - */ - if (-1 == SLang_push (obj)) - return; - - obj->data_type = SLANG_UNDEFINED_TYPE; - obj->v.ptr_val = NULL; -} - - -static int -do_inner_interp_error (SLBlock_Type *err_block, - SLBlock_Type *addr_start, - SLBlock_Type *addr) -{ - int save_err, slerr; - - /* Someday I can use the these variable to provide extra information - * about what went wrong. - */ - (void) addr_start; - (void) addr; - - if (err_block == NULL) - goto return_error; - - if (SLang_Error < 0) /* errors less than 0 are severe */ - goto return_error; - - save_err = Last_Error++; - slerr = SLang_Error; - SLang_Error = 0; - inner_interp (err_block->b.blk); - - if (Last_Error <= save_err) - { - /* Caught error and cleared it */ - Last_Error = save_err; - if ((Lang_Break_Condition == 0) - /* An error may have cleared the error and then caused the - * function to return. We will allow that but let's not allow - * 'break' nor 'continue' statements until later. - */ - || Lang_Return) - return 0; - - /* drop--- either a break or continue was called */ - } - - Last_Error = save_err; - SLang_Error = slerr; - - return_error: -#if _SLANG_HAS_DEBUG_CODE - while (addr >= addr_start) - { - if (addr->bc_main_type == _SLANG_BC_LINE_NUM) - { - char buf[256]; - sprintf (buf, "(Error occurred on line %lu)", addr->b.l_blk); - do_traceback (buf, 0, NULL); - break; - } - /* Special hack for 16 bit systems to prevent pointer wrapping. */ -#if defined(__16_BIT_SYSTEM__) - if (addr == addr_start) - break; -#endif - addr--; - } -#endif - return -1; -} - - -#define GATHER_STATISTICS 0 -#if GATHER_STATISTICS -static unsigned int Bytecodes[0xFFFF]; - -static void print_stats (void) -{ - unsigned int i; - unsigned long total; - FILE *fp = fopen ("stats.txt", "w"); - if (fp == NULL) - return; - - total = 0; - for (i = 0; i < 0xFFFF; i++) - total += Bytecodes[i]; - - if (total == 0) - total = 1; - - for (i = 0; i < 0xFFFF; i++) - { - if (Bytecodes[i]) - fprintf (fp, "0x%04X %9u %e\n", i, Bytecodes[i], Bytecodes[i]/(double) total); - } - fclose (fp); -} - -static void add_to_statistics (SLBlock_Type *b) -{ - unsigned short x, y; - - x = b->bc_main_type; - if (x == 0) - { - Bytecodes[0] += 1; - return; - } - b++; - y = b->bc_main_type; - - Bytecodes[(x << 8) | y] += 1; -} - -#endif - -/* inner interpreter */ -/* The return value from this function is only meaningful when it is used - * to process blocks for the switch statement. If it returns 0, the calling - * routine should pass the next block to it. Otherwise it will - * return non-zero, with or without error. - */ -static int inner_interp (SLBlock_Type *addr_start) -{ - SLBlock_Type *block, *err_block, *addr; -#if GATHER_STATISTICS - static int inited = 0; - - if (inited == 0) - { - (void) SLang_add_cleanup_function (print_stats); - inited = 1; - } -#endif - - /* for systems that have no real interrupt facility (e.g. go32 on dos) */ - if (SLang_Interrupt != NULL) (*SLang_Interrupt)(); - - block = err_block = NULL; - addr = addr_start; - -#if GATHER_STATISTICS - add_to_statistics (addr); -#endif - while (1) - { - switch (addr->bc_main_type) - { - case 0: - return 1; - case _SLANG_BC_LVARIABLE: - push_local_variable (addr->b.i_blk); - break; - case _SLANG_BC_GVARIABLE: - if (-1 == _SLpush_slang_obj (&addr->b.nt_gvar_blk->obj)) - do_name_type_error (addr->b.nt_blk); - break; - - case _SLANG_BC_IVARIABLE: - case _SLANG_BC_RVARIABLE: - push_intrinsic_variable (addr->b.nt_ivar_blk); - break; - - case _SLANG_BC_INTRINSIC: - execute_intrinsic_fun (addr->b.nt_ifun_blk); - if (SLang_Error) - do_traceback(addr->b.nt_ifun_blk->name, 0, NULL); - break; - - case _SLANG_BC_FUNCTION: - execute_slang_fun (addr->b.nt_fun_blk); - if (Lang_Break_Condition) goto handle_break_condition; - break; - - case _SLANG_BC_MATH_UNARY: - case _SLANG_BC_APP_UNARY: - /* Make sure we treat these like function calls since the - * parser took sin(x) to be a function call. - */ - if (0 == _SL_increment_frame_pointer ()) - { - do_app_unary (addr->b.nt_unary_blk); - (void) _SL_decrement_frame_pointer (); - } - break; - - case _SLANG_BC_ICONST: - SLclass_push_int_obj (SLANG_INT_TYPE, addr->b.iconst_blk->i); - break; - -#if SLANG_HAS_FLOAT - case _SLANG_BC_DCONST: - SLang_push_double (addr->b.dconst_blk->d); - break; -#endif - - case _SLANG_BC_PVARIABLE: - if (-1 == _SLpush_slang_obj (&addr->b.nt_gvar_blk->obj)) - do_name_type_error (addr->b.nt_blk); - break; - - case _SLANG_BC_PFUNCTION: - execute_slang_fun (addr->b.nt_fun_blk); - if (Lang_Break_Condition) goto handle_break_condition; - break; - - case _SLANG_BC_BINARY: - do_binary (addr->b.i_blk); - break; - - case _SLANG_BC_LITERAL: -#if !_SLANG_OPTIMIZE_FOR_SPEED - case _SLANG_BC_LITERAL_INT: - case _SLANG_BC_LITERAL_STR: -#endif - { - SLang_Class_Type *cl = _SLclass_get_class (addr->bc_sub_type); - (*cl->cl_push_literal) (addr->bc_sub_type, (VOID_STAR) &addr->b.ptr_blk); - } - break; -#if _SLANG_OPTIMIZE_FOR_SPEED - case _SLANG_BC_LITERAL_INT: - SLclass_push_int_obj (addr->bc_sub_type, (int) addr->b.l_blk); - break; - - case _SLANG_BC_LITERAL_STR: - _SLang_dup_and_push_slstring (addr->b.s_blk); - break; -#endif - case _SLANG_BC_BLOCK: - switch (addr->bc_sub_type) - { - case _SLANG_BCST_ERROR_BLOCK: - err_block = addr; - break; - - case _SLANG_BCST_EXIT_BLOCK: - Exit_Block_Ptr = addr->b.blk; - break; - - case _SLANG_BCST_USER_BLOCK0: - case _SLANG_BCST_USER_BLOCK1: - case _SLANG_BCST_USER_BLOCK2: - case _SLANG_BCST_USER_BLOCK3: - case _SLANG_BCST_USER_BLOCK4: - User_Block_Ptr[addr->bc_sub_type - _SLANG_BCST_USER_BLOCK0] = addr->b.blk; - break; - - case _SLANG_BCST_LOOP: - case _SLANG_BCST_WHILE: - case _SLANG_BCST_FOR: - case _SLANG_BCST_FOREVER: - case _SLANG_BCST_CFOR: - case _SLANG_BCST_DOWHILE: - case _SLANG_BCST_FOREACH: - if (block == NULL) block = addr; - lang_do_loops(addr->bc_sub_type, block, 1 + (unsigned int) (addr - block)); - block = NULL; - break; - - case _SLANG_BCST_IFNOT: -#if _SLANG_OPTIMIZE_FOR_SPEED - { - int i; - - if ((0 == pop_ctrl_integer (&i)) && (i == 0)) - inner_interp (addr->b.blk); - } -#else - do_else_if (addr, NULL); -#endif - break; - - case _SLANG_BCST_IF: -#if _SLANG_OPTIMIZE_FOR_SPEED - { - int i; - - if ((0 == pop_ctrl_integer (&i)) && i) - inner_interp (addr->b.blk); - } -#else - do_else_if (NULL, addr); -#endif - break; - - case _SLANG_BCST_NOTELSE: - do_else_if (block, addr); - block = NULL; - break; - - case _SLANG_BCST_ELSE: - do_else_if (addr, block); - block = NULL; - break; - - case _SLANG_BCST_SWITCH: - if (Switch_Obj_Ptr == Switch_Obj_Max) - { - SLang_doerror("switch nesting too deep"); - break; - } - (void) SLang_pop (Switch_Obj_Ptr); - Switch_Obj_Ptr++; - - if (block == NULL) block = addr; - while ((SLang_Error == 0) - && (block <= addr) - && (Lang_Break_Condition == 0) - && (0 == inner_interp (block->b.blk))) - block++; - Switch_Obj_Ptr--; - SLang_free_object (Switch_Obj_Ptr); - Switch_Obj_Ptr->data_type = 0; - block = NULL; - break; - - case _SLANG_BCST_ANDELSE: - case _SLANG_BCST_ORELSE: - if (block == NULL) block = addr; - lang_do_and_orelse (addr->bc_sub_type, block, addr); - block = NULL; - break; - - default: - if (block == NULL) block = addr; - break; - } - if (Lang_Break_Condition) goto handle_break_condition; - break; - - case _SLANG_BC_RETURN: - Lang_Break_Condition = Lang_Return = Lang_Break = 1; return 1; - case _SLANG_BC_BREAK: - Lang_Break_Condition = Lang_Break = 1; return 1; - case _SLANG_BC_CONTINUE: - Lang_Break_Condition = /* Lang_Continue = */ 1; return 1; - - case _SLANG_BC_EXCH: - (void) SLreverse_stack (2); - break; - - case _SLANG_BC_LABEL: - { - int test; - if ((0 == SLang_pop_integer (&test)) - && (test == 0)) - return 0; - } - break; - - case _SLANG_BC_LOBJPTR: - (void)_SLang_push_ref (0, (VOID_STAR)(Local_Variable_Frame - addr->b.i_blk)); - break; - - case _SLANG_BC_GOBJPTR: - (void)_SLang_push_ref (1, (VOID_STAR)addr->b.nt_blk); - break; - - case _SLANG_BC_X_ERROR: - if (err_block != NULL) - { - inner_interp(err_block->b.blk); - if (SLang_Error) err_block = NULL; - } - else SLang_verror(SL_SYNTAX_ERROR, "No ERROR_BLOCK"); - if (Lang_Break_Condition) goto handle_break_condition; - break; - - case _SLANG_BC_X_USER0: - case _SLANG_BC_X_USER1: - case _SLANG_BC_X_USER2: - case _SLANG_BC_X_USER3: - case _SLANG_BC_X_USER4: - if (User_Block_Ptr[addr->bc_main_type - _SLANG_BC_X_USER0] != NULL) - { - inner_interp(User_Block_Ptr[addr->bc_main_type - _SLANG_BC_X_USER0]); - } - else SLang_verror(SL_SYNTAX_ERROR, "No block for X_USERBLOCK"); - if (Lang_Break_Condition) goto handle_break_condition; - break; - - case _SLANG_BC_CALL_DIRECT: - (*addr->b.call_function) (); - break; - - case _SLANG_BC_CALL_DIRECT_FRAME: - do_bc_call_direct_frame (addr->b.call_function); - break; - - case _SLANG_BC_UNARY: - do_unary (addr->b.i_blk, _SLANG_BC_UNARY); - break; - - case _SLANG_BC_UNARY_FUNC: - /* Make sure we treat these like function calls since the - * parser took abs(x) to be a function call. - */ - if (0 == _SL_increment_frame_pointer ()) - { - do_unary (addr->b.i_blk, _SLANG_BC_UNARY); - (void) _SL_decrement_frame_pointer (); - } - break; - - case _SLANG_BC_DEREF_ASSIGN: - set_deref_lvalue (addr); - break; - case _SLANG_BC_SET_LOCAL_LVALUE: - set_lvalue_obj (addr->bc_sub_type, Local_Variable_Frame - addr->b.i_blk); - break; - case _SLANG_BC_SET_GLOBAL_LVALUE: - if (-1 == set_lvalue_obj (addr->bc_sub_type, &addr->b.nt_gvar_blk->obj)) - do_name_type_error (addr->b.nt_blk); - break; - case _SLANG_BC_SET_INTRIN_LVALUE: - set_intrin_lvalue (addr); - break; - case _SLANG_BC_SET_STRUCT_LVALUE: - set_struct_lvalue (addr); - break; - - case _SLANG_BC_FIELD: - (void) push_struct_field (addr->b.s_blk); - break; - - case _SLANG_BC_SET_ARRAY_LVALUE: - set_array_lvalue (addr->bc_sub_type); - break; - -#if _SLANG_HAS_DEBUG_CODE - case _SLANG_BC_LINE_NUM: - break; -#endif - - case _SLANG_BC_TMP: - tmp_variable_function (addr); - break; - -#if _SLANG_OPTIMIZE_FOR_SPEED - case _SLANG_BC_LVARIABLE_AGET: - if (0 == push_local_variable (addr->b.i_blk)) - do_bc_call_direct_frame (_SLarray_aget); - break; - - case _SLANG_BC_LVARIABLE_APUT: - if (0 == push_local_variable (addr->b.i_blk)) - do_bc_call_direct_frame (_SLarray_aput); - break; - case _SLANG_BC_INTEGER_PLUS: - if (0 == SLclass_push_int_obj (addr->bc_sub_type, (int) addr->b.l_blk)) - do_binary (SLANG_PLUS); - break; - - case _SLANG_BC_INTEGER_MINUS: - if (0 == SLclass_push_int_obj (addr->bc_sub_type, (int) addr->b.l_blk)) - do_binary (SLANG_MINUS); - break; -#endif -#if 0 - case _SLANG_BC_ARG_LVARIABLE: - (void) SLang_start_arg_list (); - push_local_variable (addr->b.i_blk); - break; -#endif - case _SLANG_BC_EARG_LVARIABLE: - push_local_variable (addr->b.i_blk); - (void) SLang_end_arg_list (); - break; - -#if USE_COMBINED_BYTECODES - case _SLANG_BC_CALL_DIRECT_INTRINSIC: - (*addr->b.call_function) (); - addr++; - execute_intrinsic_fun (addr->b.nt_ifun_blk); - if (SLang_Error) - do_traceback(addr->b.nt_ifun_blk->name, 0, NULL); - break; - - case _SLANG_BC_INTRINSIC_CALL_DIRECT: - execute_intrinsic_fun (addr->b.nt_ifun_blk); - if (SLang_Error) - { - do_traceback(addr->b.nt_ifun_blk->name, 0, NULL); - break; - } - addr++; - (*addr->b.call_function) (); - break; - - case _SLANG_BC_CALL_DIRECT_LSTR: - (*addr->b.call_function) (); - addr++; - _SLang_dup_and_push_slstring (addr->b.s_blk); - break; - - case _SLANG_BC_CALL_DIRECT_SLFUN: - (*addr->b.call_function) (); - addr++; - execute_slang_fun (addr->b.nt_fun_blk); - if (Lang_Break_Condition) goto handle_break_condition; - break; - - case _SLANG_BC_CALL_DIRECT_INTRSTOP: - (*addr->b.call_function) (); - addr++; - /* drop */ - case _SLANG_BC_INTRINSIC_STOP: - execute_intrinsic_fun (addr->b.nt_ifun_blk); - if (SLang_Error == 0) - return 1; - do_traceback(addr->b.nt_ifun_blk->name, 0, NULL); - break; - - case _SLANG_BC_CALL_DIRECT_EARG_LVAR: - (*addr->b.call_function) (); - addr++; - push_local_variable (addr->b.i_blk); - (void) SLang_end_arg_list (); - break; - - case _SLANG_BC_CALL_DIRECT_LINT: - (*addr->b.call_function) (); - addr++; - SLclass_push_int_obj (addr->bc_sub_type, (int) addr->b.l_blk); - break; - - case _SLANG_BC_CALL_DIRECT_LVAR: - (*addr->b.call_function) (); - addr++; - push_local_variable (addr->b.i_blk); - break; -#endif /* USE_COMBINED_BYTECODES */ - - default: - SLang_verror (SL_INTERNAL_ERROR, "Byte-Code 0x%X is not valid", addr->bc_main_type); - } - - /* Someday I plan to add a 'signal' intrinsic function. Then when a - * signal is caught, a variable will be set to one and that value of - * that variable will need to be monitored here, e.g., - * if (Handle_Signal) handle_signal (); - * It would be nice to check only one variable instead of Handle_Signal - * and SLang_Error. Perhaps I should phase out SLang_Error = xxx - * and used something like: SLang_set_error (code); Then, I could - * use: - * if (Handle_Condition) - * { - * Handle_Condition = 0; - * if (SLang_Error) .... - * else if (Handle_Signal) handle_signal (); - * else.... - * } - */ - if (SLang_Error) - { - if (-1 == do_inner_interp_error (err_block, addr_start, addr)) - return 1; - if (SLang_Error) - return 1; - - /* Otherwise, error cleared. Continue onto next bytecode. - * Someday I need to add something to indicate where the - * next statement begins since continuing on the next - * bytecode is not really what is desired. - */ - if (Lang_Break_Condition) goto handle_break_condition; - } - addr++; - } - - handle_break_condition: - /* Get here if Lang_Break_Condition != 0, which implies that either - * Lang_Return, Lang_Break, or Lang_Continue is non zero - */ - if (Lang_Return) - Lang_Break = 1; - - return 1; -} - -/*}}}*/ - -/* The functions below this point are used to implement the parsed token - * to byte-compiled code. - */ -/* static SLang_Name_Type **Static_Hash_Table; */ - -static SLang_Name_Type **Locals_Hash_Table; -static int Local_Variable_Number; -static unsigned int Function_Args_Number; -int _SLang_Auto_Declare_Globals = 0; -int (*SLang_Auto_Declare_Var_Hook) (char *); - -static SLang_NameSpace_Type *This_Static_NameSpace; -static SLang_NameSpace_Type *Global_NameSpace; - -#if _SLANG_HAS_DEBUG_CODE -static char *This_Compile_Filename; -#endif -static SLBlock_Type SLShort_Blocks[6]; -/* These are initialized in add_table below. I cannot init a Union!! */ - -static int Lang_Defining_Function; -static void (*Default_Variable_Mode) (_SLang_Token_Type *); -static void (*Default_Define_Function) (char *, unsigned long); - -static int push_compile_context (char *); -static int pop_compile_context (void); - -typedef struct -{ - int block_type; - SLBlock_Type *block; /* beginning of block definition */ - SLBlock_Type *block_ptr; /* current location */ - SLBlock_Type *block_max; /* end of definition */ - SLang_NameSpace_Type *static_namespace; -} -Block_Context_Type; - -static Block_Context_Type Block_Context_Stack [SLANG_MAX_BLOCK_STACK_LEN]; -static unsigned int Block_Context_Stack_Len; - -static SLBlock_Type *Compile_ByteCode_Ptr; -static SLBlock_Type *This_Compile_Block; -static SLBlock_Type *This_Compile_Block_Max; -static int This_Compile_Block_Type; -#define COMPILE_BLOCK_TYPE_FUNCTION 1 -#define COMPILE_BLOCK_TYPE_BLOCK 2 -#define COMPILE_BLOCK_TYPE_TOP_LEVEL 3 - -/* If it returns 0, DO NOT FREE p */ -static int lang_free_branch (SLBlock_Type *p) -{ - /* Note: we look at 0,2,4, since these blocks are 0 terminated */ - if ((p == SLShort_Blocks) - || (p == SLShort_Blocks + 2) - || (p == SLShort_Blocks + 4) - ) - return 0; - - while (1) - { - SLang_Class_Type *cl; - - switch (p->bc_main_type) - { - case _SLANG_BC_BLOCK: - if (lang_free_branch(p->b.blk)) - SLfree((char *)p->b.blk); - break; - - case _SLANG_BC_LITERAL: - case _SLANG_BC_LITERAL_STR: - /* No user types should be here. */ - cl = _SLclass_get_class (p->bc_sub_type); - (*cl->cl_byte_code_destroy) (p->bc_sub_type, (VOID_STAR) &p->b.ptr_blk); - break; - - case _SLANG_BC_FIELD: - case _SLANG_BC_SET_STRUCT_LVALUE: - SLang_free_slstring (p->b.s_blk); - break; - - default: - break; - - case 0: - return 1; - } - p++; - } -} - -static void free_function_header (_SLBlock_Header_Type *h) -{ - if (h->num_refs > 1) - { - h->num_refs--; - return; - } - - if (h->body != NULL) - { - if (lang_free_branch (h->body)) - SLfree ((char *) h->body); - } - - SLfree ((char *) h); -} - -static int push_block_context (int type) -{ - Block_Context_Type *c; - unsigned int num; - SLBlock_Type *b; - - if (Block_Context_Stack_Len == SLANG_MAX_BLOCK_STACK_LEN) - { - SLang_verror (SL_STACK_OVERFLOW, "Block stack overflow"); - return -1; - } - - num = 5; /* 40 bytes */ - if (NULL == (b = (SLBlock_Type *) SLcalloc (num, sizeof (SLBlock_Type)))) - return -1; - - c = Block_Context_Stack + Block_Context_Stack_Len; - c->block = This_Compile_Block; - c->block_ptr = Compile_ByteCode_Ptr; - c->block_max = This_Compile_Block_Max; - c->block_type = This_Compile_Block_Type; - c->static_namespace = This_Static_NameSpace; - - Compile_ByteCode_Ptr = This_Compile_Block = b; - This_Compile_Block_Max = b + num; - This_Compile_Block_Type = type; - - Block_Context_Stack_Len += 1; - return 0; -} - -static int pop_block_context (void) -{ - Block_Context_Type *c; - - if (Block_Context_Stack_Len == 0) - return -1; - - Block_Context_Stack_Len -= 1; - c = Block_Context_Stack + Block_Context_Stack_Len; - - This_Compile_Block = c->block; - This_Compile_Block_Max = c->block_max; - This_Compile_Block_Type = c->block_type; - Compile_ByteCode_Ptr = c->block_ptr; - This_Static_NameSpace = c->static_namespace; - - return 0; -} - -int _SLcompile_push_context (SLang_Load_Type *load_object) -{ - if (-1 == push_compile_context (load_object->name)) - return -1; - - if (NULL == (This_Static_NameSpace = _SLns_allocate_namespace (load_object->name, SLSTATIC_HASH_TABLE_SIZE))) - { - pop_compile_context (); - return -1; - } - - if (-1 == push_block_context (COMPILE_BLOCK_TYPE_TOP_LEVEL)) - { - pop_compile_context (); - return -1; - } - - return 0; -} - -int _SLcompile_pop_context (void) -{ - if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_TOP_LEVEL) - { - Compile_ByteCode_Ptr->bc_main_type = 0; - if (lang_free_branch (This_Compile_Block)) - SLfree ((char *) This_Compile_Block); - } - - (void) pop_block_context (); - (void) pop_compile_context (); - - if (This_Compile_Block == NULL) - return 0; - -#if 0 - if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL) - { - SLang_verror (SL_INTERNAL_ERROR, "Not at top-level"); - return -1; - } -#endif - - return 0; -} - -/*{{{ Hash and Name Table Functions */ - -static SLang_Name_Type *locate_name_in_table (char *name, unsigned long hash, - SLang_Name_Type **table, unsigned int table_size) -{ - SLang_Name_Type *t; - char ch; - - t = table [(unsigned int) (hash % table_size)]; - ch = *name++; - - while (t != NULL) - { - if ((ch == t->name[0]) - && (0 == strcmp (t->name + 1, name))) - break; - - t = t->next; - } - - return t; -} - -static SLang_Name_Type *locate_namespace_encoded_name (char *name, int err_on_bad_ns) -{ - char *ns, *ns1; - SLang_NameSpace_Type *table; - SLang_Name_Type *nt; - - ns = name; - name = strchr (name, '-'); - if ((name == NULL) || (name [1] != '>')) - name = ns; - - ns1 = SLang_create_nslstring (ns, (unsigned int) (name - ns)); - if (ns1 == NULL) - return NULL; - if (ns != name) - name += 2; - ns = ns1; - - if (*ns == 0) - { - /* Use Global Namespace */ - SLang_free_slstring (ns); - return locate_name_in_table (name, _SLcompute_string_hash (name), - Global_NameSpace->table, Global_NameSpace->table_size); - } - - if (NULL == (table = _SLns_find_namespace (ns))) - { - if (err_on_bad_ns) - SLang_verror (SL_SYNTAX_ERROR, "Unable to find namespace called %s", ns); - SLang_free_slstring (ns); - return NULL; - } - SLang_free_slstring (ns); - - /* FIXME: the hash table size should be stored in the hash table itself */ - nt = locate_name_in_table (name, _SLcompute_string_hash (name), - table->table, table->table_size); - if (nt == NULL) - return NULL; - - switch (nt->name_type) - { - /* These are private and cannot be accessed through the namespace. */ - case SLANG_PVARIABLE: - case SLANG_PFUNCTION: - return NULL; - } - return nt; -} - -static SLang_Name_Type *locate_hashed_name (char *name, unsigned long hash) -{ - SLang_Name_Type *t; - - if (Lang_Defining_Function) - { - t = locate_name_in_table (name, hash, Locals_Hash_Table, SLLOCALS_HASH_TABLE_SIZE); - if (t != NULL) - return t; - } - - if ((This_Static_NameSpace != NULL) - && (NULL != (t = locate_name_in_table (name, hash, This_Static_NameSpace->table, This_Static_NameSpace->table_size)))) - return t; - - t = locate_name_in_table (name, hash, Global_NameSpace->table, Global_NameSpace->table_size); - if (NULL != t) - return t; - - return locate_namespace_encoded_name (name, 1); -} - -SLang_Name_Type *_SLlocate_name (char *name) -{ - return locate_hashed_name (name, _SLcompute_string_hash (name)); -} - -static SLang_Name_Type * -add_name_to_hash_table (char *name, unsigned long hash, - unsigned int sizeof_obj, unsigned char name_type, - SLang_Name_Type **table, unsigned int table_size, - int check_existing) -{ - SLang_Name_Type *t; - - if (check_existing) - { - t = locate_name_in_table (name, hash, table, table_size); - if (t != NULL) - return t; - } - - if (-1 == _SLcheck_identifier_syntax (name)) - return NULL; - - t = (SLang_Name_Type *) SLmalloc (sizeof_obj); - if (t == NULL) - return t; - - memset ((char *) t, 0, sizeof_obj); - if (NULL == (t->name = _SLstring_dup_hashed_string (name, hash))) - { - SLfree ((char *) t); - return NULL; - } - t->name_type = name_type; - - hash = hash % table_size; - t->next = table [(unsigned int)hash]; - table [(unsigned int) hash] = t; - - return t; -} - -static SLang_Name_Type * -add_global_name (char *name, unsigned long hash, - unsigned char name_type, unsigned int sizeof_obj, - SLang_NameSpace_Type *ns) -{ - SLang_Name_Type *nt; - SLang_Name_Type **table; - unsigned int table_size; - - table = ns->table; - table_size = ns->table_size; - - nt = locate_name_in_table (name, hash, table, table_size); - if (nt != NULL) - { - if (nt->name_type == name_type) - return nt; - - SLang_verror (SL_DUPLICATE_DEFINITION, "%s cannot be re-defined", name); - return NULL; - } - - return add_name_to_hash_table (name, hash, sizeof_obj, name_type, - table, table_size, 0); -} - -static int add_intrinsic_function (SLang_NameSpace_Type *ns, - char *name, FVOID_STAR addr, unsigned char ret_type, - unsigned int nargs, va_list ap) -{ - SLang_Intrin_Fun_Type *f; - unsigned int i; - - if (-1 == init_interpreter ()) - return -1; - - if (ns == NULL) ns = Global_NameSpace; - - if (nargs > SLANG_MAX_INTRIN_ARGS) - { - SLang_verror (SL_APPLICATION_ERROR, "Function %s requires too many arguments", name); - return -1; - } - - if (ret_type == SLANG_FLOAT_TYPE) - { - SLang_verror (SL_NOT_IMPLEMENTED, "Function %s is not permitted to return float", name); - return -1; - } - - f = (SLang_Intrin_Fun_Type *) add_global_name (name, _SLcompute_string_hash (name), - SLANG_INTRINSIC, sizeof (SLang_Intrin_Fun_Type), - ns); - - if (f == NULL) - return -1; - - f->i_fun = addr; - f->num_args = nargs; - f->return_type = ret_type; - - for (i = 0; i < nargs; i++) - f->arg_types [i] = va_arg (ap, unsigned int); - - return 0; -} - -int SLadd_intrinsic_function (char *name, FVOID_STAR addr, unsigned char ret_type, - unsigned int nargs, ...) -{ - va_list ap; - int status; - - va_start (ap, nargs); - status = add_intrinsic_function (NULL, name, addr, ret_type, nargs, ap); - va_end (ap); - - return status; -} - -int SLns_add_intrinsic_function (SLang_NameSpace_Type *ns, - char *name, FVOID_STAR addr, unsigned char ret_type, - unsigned int nargs, ...) -{ - va_list ap; - int status; - - va_start (ap, nargs); - status = add_intrinsic_function (ns, name, addr, ret_type, nargs, ap); - va_end (ap); - - return status; -} - -int SLns_add_intrinsic_variable (SLang_NameSpace_Type *ns, - char *name, VOID_STAR addr, unsigned char data_type, int ro) -{ - SLang_Intrin_Var_Type *v; - - if (-1 == init_interpreter ()) - return -1; - - if (ns == NULL) ns = Global_NameSpace; - - v = (SLang_Intrin_Var_Type *)add_global_name (name, - _SLcompute_string_hash (name), - (ro ? SLANG_RVARIABLE : SLANG_IVARIABLE), - sizeof (SLang_Intrin_Var_Type), - ns); - if (v == NULL) - return -1; - - v->addr = addr; - v->type = data_type; - return 0; -} - -int SLadd_intrinsic_variable (char *name, VOID_STAR addr, unsigned char data_type, int ro) -{ - return SLns_add_intrinsic_variable (NULL, name, addr, data_type, ro); -} - -static int -add_slang_function (char *name, unsigned char type, unsigned long hash, - unsigned int num_args, unsigned int num_locals, -#if _SLANG_HAS_DEBUG_CODE - char *file, -#endif - _SLBlock_Header_Type *h, - SLang_NameSpace_Type *ns) -{ - _SLang_Function_Type *f; - -#if _SLANG_HAS_DEBUG_CODE - if ((file != NULL) - && (NULL == (file = SLang_create_slstring (file)))) - return -1; -#endif - - f = (_SLang_Function_Type *)add_global_name (name, hash, - type, - sizeof (_SLang_Function_Type), - ns); - if (f == NULL) - { -#if _SLANG_HAS_DEBUG_CODE - SLang_free_slstring (file); /* NULL ok */ -#endif - return -1; - } - - if (f->v.header != NULL) - { - if (f->nlocals == AUTOLOAD_NUM_LOCALS) - SLang_free_slstring ((char *)f->v.autoload_filename); /* autoloaded filename */ - else - free_function_header (f->v.header); - } - -#if _SLANG_HAS_DEBUG_CODE - if (f->file != NULL) SLang_free_slstring (f->file); - f->file = file; -#endif - f->v.header = h; - f->nlocals = num_locals; - f->nargs = num_args; - - return 0; -} - -int SLang_autoload (char *name, char *file) -{ - _SLang_Function_Type *f; - unsigned long hash; - - hash = _SLcompute_string_hash (name); - f = (_SLang_Function_Type *)locate_name_in_table (name, hash, Global_NameSpace->table, Global_NameSpace->table_size); - - if ((f != NULL) - && (f->name_type == SLANG_FUNCTION) - && (f->v.header != NULL) - && (f->nlocals != AUTOLOAD_NUM_LOCALS)) - { - /* already loaded */ - return 0; - } - - file = SLang_create_slstring (file); - if (-1 == add_slang_function (name, SLANG_FUNCTION, hash, 0, AUTOLOAD_NUM_LOCALS, -#if _SLANG_HAS_DEBUG_CODE - file, -#endif - (_SLBlock_Header_Type *) file, - Global_NameSpace)) - { - SLang_free_slstring (file); - return -1; - } - - return 0; -} - -SLang_Name_Type *_SLlocate_global_name (char *name) -{ - unsigned long hash; - - hash = _SLcompute_string_hash (name); - return locate_name_in_table (name, hash, Global_NameSpace->table, - Global_NameSpace->table_size); -} - -/*}}}*/ - -static void free_local_variable_table (void) -{ - unsigned int i; - SLang_Name_Type *t, *t1; - - for (i = 0; i < SLLOCALS_HASH_TABLE_SIZE; i++) - { - t = Locals_Hash_Table [i]; - while (t != NULL) - { - SLang_free_slstring (t->name); - t1 = t->next; - SLfree ((char *) t); - t = t1; - } - Locals_Hash_Table [i] = NULL; - } - Local_Variable_Number = 0; -} - -/* call inner interpreter or return for more */ -static void lang_try_now(void) -{ - Compile_ByteCode_Ptr++; - if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL) - return; - - Compile_ByteCode_Ptr->bc_main_type = 0; /* so next command stops after this */ - - /* now do it */ - inner_interp (This_Compile_Block); - (void) lang_free_branch (This_Compile_Block); - Compile_ByteCode_Ptr = This_Compile_Block; -} - -SLang_Name_Type *SLang_get_fun_from_ref (SLang_Ref_Type *ref) -{ - if (ref->is_global) - { - SLang_Name_Type *nt = ref->v.nt; - - switch (nt->name_type) - { - case SLANG_PFUNCTION: - case SLANG_FUNCTION: - case SLANG_INTRINSIC: - case SLANG_MATH_UNARY: - case SLANG_APP_UNARY: - return nt; - } - SLang_verror (SL_TYPE_MISMATCH, - "Reference to a function expected. Found &%s", - nt->name); - } - - SLang_verror (SL_TYPE_MISMATCH, - "Reference to a function expected"); - return NULL; -} - -int SLexecute_function (SLang_Name_Type *nt) -{ - unsigned char type; - char *name; - - if (SLang_Error) - return -1; - - type = nt->name_type; - name = nt->name; - - switch (type) - { - case SLANG_PFUNCTION: - case SLANG_FUNCTION: - execute_slang_fun ((_SLang_Function_Type *) nt); - break; - - case SLANG_INTRINSIC: - execute_intrinsic_fun ((SLang_Intrin_Fun_Type *) nt); - break; - - case SLANG_MATH_UNARY: - case SLANG_APP_UNARY: - inner_interp_nametype (nt); - break; - - default: - SLang_verror (SL_TYPE_MISMATCH, "%s is not a function", name); - return -1; - } - - if (SLang_Error) - { - SLang_verror (SLang_Error, "Error while executing %s", name); - return -1; - } - - return 1; -} - -int SLang_execute_function (char *name) -{ - SLang_Name_Type *entry; - - if (NULL == (entry = SLang_get_function (name))) - return 0; - - return SLexecute_function (entry); -} - -/* return S-Lang function or NULL */ -SLang_Name_Type *SLang_get_function (char *name) -{ - SLang_Name_Type *entry; - - if (NULL == (entry = locate_namespace_encoded_name (name, 0))) - return NULL; - - if ((entry->name_type == SLANG_FUNCTION) - || (entry->name_type == SLANG_INTRINSIC)) - return entry; - - return NULL; -} - -static void lang_begin_function (void) -{ - if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL) - { - SLang_verror (SL_SYNTAX_ERROR, "Function nesting is illegal"); - return; - } - Lang_Defining_Function = 1; - (void) push_block_context (COMPILE_BLOCK_TYPE_FUNCTION); -} - -#if USE_COMBINED_BYTECODES -static void optimize_block (SLBlock_Type *b) -{ - while (1) - { - switch (b->bc_main_type) - { - case 0: - return; - - default: - b++; - break; - - case _SLANG_BC_CALL_DIRECT: - b++; - switch (b->bc_main_type) - { - case 0: - return; - case _SLANG_BC_INTRINSIC: - if ((b+1)->bc_main_type == 0) - { - (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_INTRSTOP; - return; - } - (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_INTRINSIC; - b++; - break; - case _SLANG_BC_LITERAL_STR: - (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_LSTR; - b++; - break; - case _SLANG_BC_FUNCTION: - case _SLANG_BC_PFUNCTION: - (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_SLFUN; - b++; - break; - case _SLANG_BC_EARG_LVARIABLE: - (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_EARG_LVAR; - b++; - break; - case _SLANG_BC_LITERAL_INT: - (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_LINT; - b++; - break; - case _SLANG_BC_LVARIABLE: - (b-1)->bc_main_type = _SLANG_BC_CALL_DIRECT_LVAR; - b++; - break; - } - break; - - case _SLANG_BC_INTRINSIC: - b++; - switch (b->bc_main_type) - { - case _SLANG_BC_CALL_DIRECT: - (b-1)->bc_main_type = _SLANG_BC_INTRINSIC_CALL_DIRECT; - b++; - break; -#if 0 - case _SLANG_BC_BLOCK: - (b-1)->bc_main_type = _SLANG_BC_INTRINSIC_BLOCK; - b++; - break; -#endif - - case 0: - (b-1)->bc_main_type = _SLANG_BC_INTRINSIC_STOP; - return; - } - break; - } - } -} - -#endif - - -/* name will be NULL if the object is to simply terminate the function - * definition. See SLang_restart. - */ -static int lang_define_function (char *name, unsigned char type, unsigned long hash, - SLang_NameSpace_Type *ns) -{ - if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_FUNCTION) - { - SLang_verror (SL_SYNTAX_ERROR, "Premature end of function"); - return -1; - } - - /* terminate function */ - Compile_ByteCode_Ptr->bc_main_type = 0; - - if (name != NULL) - { - _SLBlock_Header_Type *h; - - h = (_SLBlock_Header_Type *)SLmalloc (sizeof (_SLBlock_Header_Type)); - if (h != NULL) - { - h->num_refs = 1; - h->body = This_Compile_Block; - -#if USE_COMBINED_BYTECODES - optimize_block (h->body); -#endif - - if (-1 == add_slang_function (name, type, hash, - Function_Args_Number, - Local_Variable_Number, -#if _SLANG_HAS_DEBUG_CODE - This_Compile_Filename, -#endif - h, ns)) - SLfree ((char *) h); - } - /* Drop through for clean-up */ - } - - free_local_variable_table (); - - Function_Args_Number = 0; - Lang_Defining_Function = 0; - - if (SLang_Error) return -1; - /* SLang_restart will finish this if there is a slang error. */ - - pop_block_context (); - - /* A function is only defined at top-level */ - if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL) - { - SLang_verror (SL_INTERNAL_ERROR, "Not at top-level"); - return -1; - } - Compile_ByteCode_Ptr = This_Compile_Block; - return 0; -} - -static void define_static_function (char *name, unsigned long hash) -{ - (void) lang_define_function (name, SLANG_FUNCTION, hash, This_Static_NameSpace); -} - -static void define_private_function (char *name, unsigned long hash) -{ - (void) lang_define_function (name, SLANG_PFUNCTION, hash, This_Static_NameSpace); -} - -static void define_public_function (char *name, unsigned long hash) -{ - (void) lang_define_function (name, SLANG_FUNCTION, hash, Global_NameSpace); -} - -static void lang_end_block (void) -{ - SLBlock_Type *node, *branch; - unsigned char mtype; - - if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_BLOCK) - { - SLang_verror (SL_SYNTAX_ERROR, "Not defining a block"); - return; - } - - /* terminate the block */ - Compile_ByteCode_Ptr->bc_main_type = 0; - branch = This_Compile_Block; - - /* Try to save some space by using the cached blocks. */ - if (Compile_ByteCode_Ptr == branch + 1) - { - mtype = branch->bc_main_type; - if (((mtype == _SLANG_BC_BREAK) - || (mtype == _SLANG_BC_CONTINUE) - || (mtype == _SLANG_BC_RETURN)) - && (SLang_Error == 0)) - { - SLfree ((char *)branch); - branch = SLShort_Blocks + 2 * (int) (mtype - _SLANG_BC_RETURN); - } - } - -#if USE_COMBINED_BYTECODES - optimize_block (branch); -#endif - - pop_block_context (); - node = Compile_ByteCode_Ptr++; - - node->bc_main_type = _SLANG_BC_BLOCK; - node->bc_sub_type = 0; - node->b.blk = branch; -} - -static int lang_begin_block (void) -{ - return push_block_context (COMPILE_BLOCK_TYPE_BLOCK); -} - -static int lang_check_space (void) -{ - unsigned int n; - SLBlock_Type *p; - - if (NULL == (p = This_Compile_Block)) - { - SLang_verror (SL_INTERNAL_ERROR, "Top-level block not present"); - return -1; - } - - /* Allow 1 extra for terminator */ - if (Compile_ByteCode_Ptr + 1 < This_Compile_Block_Max) - return 0; - - n = (unsigned int) (This_Compile_Block_Max - p); - - /* enlarge the space by 2 objects */ - n += 2; - - if (NULL == (p = (SLBlock_Type *) SLrealloc((char *)p, n * sizeof(SLBlock_Type)))) - return -1; - - This_Compile_Block_Max = p + n; - n = (unsigned int) (Compile_ByteCode_Ptr - This_Compile_Block); - This_Compile_Block = p; - Compile_ByteCode_Ptr = p + n; - - return 0; -} - -/* returns positive number if name is a function or negative number if it - is a variable. If it is intrinsic, it returns magnitude of 1, else 2 */ -int SLang_is_defined(char *name) -{ - SLang_Name_Type *t; - - if (-1 == init_interpreter ()) - return -1; - - t = locate_namespace_encoded_name (name, 0); - if (t == NULL) - return 0; - - switch (t->name_type) - { - case SLANG_FUNCTION: - /* case SLANG_PFUNCTION: */ - return 2; - case SLANG_GVARIABLE: - /* case SLANG_PVARIABLE: */ - return -2; - - case SLANG_ICONSTANT: - case SLANG_DCONSTANT: - case SLANG_RVARIABLE: - case SLANG_IVARIABLE: - return -1; - - case SLANG_INTRINSIC: - default: - return 1; - } -} - -static int add_global_variable (char *name, char name_type, unsigned long hash, - SLang_NameSpace_Type *ns) -{ - SLang_Name_Type *g; - - /* Note the importance of checking if it is already defined or not. For example, - * suppose X is defined as an intrinsic variable. Then S-Lang code like: - * !if (is_defined("X")) { variable X; } - * will not result in a global variable X. On the other hand, this would - * not be an issue if 'variable' statements always were not processed - * immediately. That is, as it is now, 'if (0) {variable ZZZZ;}' will result - * in the variable ZZZZ being defined because of the immediate processing. - * The current solution is to do: if (0) { eval("variable ZZZZ;"); } - */ - /* hash = _SLcompute_string_hash (name); */ - g = locate_name_in_table (name, hash, ns->table, ns->table_size); - - if (g != NULL) - { - if (g->name_type == name_type) - return 0; - } - - if (NULL == add_global_name (name, hash, name_type, - sizeof (SLang_Global_Var_Type), ns)) - return -1; - - return 0; -} - -int SLadd_global_variable (char *name) -{ - if (-1 == init_interpreter ()) - return -1; - - return add_global_variable (name, SLANG_GVARIABLE, - _SLcompute_string_hash (name), - Global_NameSpace); -} - -static int add_local_variable (char *name, unsigned long hash) -{ - SLang_Local_Var_Type *t; - - /* local variable */ - if (Local_Variable_Number >= SLANG_MAX_LOCAL_VARIABLES) - { - SLang_verror (SL_SYNTAX_ERROR, "Too many local variables"); - return -1; - } - - if (NULL != locate_name_in_table (name, hash, Locals_Hash_Table, SLLOCALS_HASH_TABLE_SIZE)) - { - SLang_verror (SL_SYNTAX_ERROR, "Local variable %s has already been defined", name); - return -1; - } - - t = (SLang_Local_Var_Type *) - add_name_to_hash_table (name, hash, - sizeof (SLang_Local_Var_Type), SLANG_LVARIABLE, - Locals_Hash_Table, SLLOCALS_HASH_TABLE_SIZE, 0); - if (t == NULL) - return -1; - - t->local_var_number = Local_Variable_Number; - Local_Variable_Number++; - return 0; -} - -static void (*Compile_Mode_Function) (_SLang_Token_Type *); -static void compile_basic_token_mode (_SLang_Token_Type *); - -/* if an error occurs, discard current object, block, function, etc... */ -void SLang_restart (int localv) -{ - int save = SLang_Error; - - SLang_Error = SL_UNKNOWN_ERROR; - - _SLcompile_ptr = _SLcompile; - Compile_Mode_Function = compile_basic_token_mode; - - Lang_Break = /* Lang_Continue = */ Lang_Return = 0; - Trace_Mode = 0; - - while (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_BLOCK) - lang_end_block(); - - if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_FUNCTION) - { - /* Terminate function definition and free variables */ - lang_define_function (NULL, SLANG_FUNCTION, 0, Global_NameSpace); - if (lang_free_branch (This_Compile_Block)) - SLfree((char *)This_Compile_Block); - } - Lang_Defining_Function = 0; - - SLang_Error = save; - - if (SLang_Error == SL_STACK_OVERFLOW) - { - /* This loop guarantees that the stack is properly cleaned. */ - while (_SLStack_Pointer != _SLRun_Stack) - { - SLdo_pop (); - } - } - - while ((This_Compile_Block_Type != COMPILE_BLOCK_TYPE_TOP_LEVEL) - && (0 == pop_block_context ())) - ; - - if (localv) - { - Next_Function_Num_Args = SLang_Num_Function_Args = 0; - Local_Variable_Frame = Local_Variable_Stack; - Recursion_Depth = 0; - Frame_Pointer = _SLStack_Pointer; - Frame_Pointer_Depth = 0; - Switch_Obj_Ptr = Switch_Objects; - while (Switch_Obj_Ptr < Switch_Obj_Max) - { - SLang_free_object (Switch_Obj_Ptr); - Switch_Obj_Ptr++; - } - Switch_Obj_Ptr = Switch_Objects; - } -} - -static void compile_directive (unsigned char sub_type) -{ - /* This function is called only from compile_directive_mode which is - * only possible when a block is available. - */ - - /* use BLOCK */ - Compile_ByteCode_Ptr--; - Compile_ByteCode_Ptr->bc_sub_type = sub_type; - - lang_try_now (); -} - -static void compile_unary (int op, unsigned char mt) -{ - Compile_ByteCode_Ptr->bc_main_type = mt; - Compile_ByteCode_Ptr->b.i_blk = op; - Compile_ByteCode_Ptr->bc_sub_type = 0; - - lang_try_now (); -} - - -static void compile_binary (int op) -{ - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_BINARY; - Compile_ByteCode_Ptr->b.i_blk = op; - Compile_ByteCode_Ptr->bc_sub_type = 0; - - lang_try_now (); -} - -#if _SLANG_OPTIMIZE_FOR_SPEED -static int try_compressed_bytecode (unsigned char last_bc, unsigned char bc) -{ - if (Compile_ByteCode_Ptr != This_Compile_Block) - { - SLBlock_Type *b; - b = Compile_ByteCode_Ptr - 1; - if (b->bc_main_type == last_bc) - { - Compile_ByteCode_Ptr = b; - b->bc_main_type = bc; - lang_try_now (); - return 0; - } - } - return -1; -} -#endif - -static void compile_fast_binary (int op, unsigned char bc) -{ -#if _SLANG_OPTIMIZE_FOR_SPEED - if (0 == try_compressed_bytecode (_SLANG_BC_LITERAL_INT, bc)) - return; -#else - (void) bc; -#endif - compile_binary (op); -} - -/* This is a hack */ -typedef struct _Special_NameTable_Type -{ - char *name; - int (*fun) (struct _Special_NameTable_Type *, _SLang_Token_Type *); - VOID_STAR blk_data; - unsigned char main_type; -} -Special_NameTable_Type; - -static int handle_special (Special_NameTable_Type *nt, _SLang_Token_Type *tok) -{ - (void) tok; - Compile_ByteCode_Ptr->bc_main_type = nt->main_type; - Compile_ByteCode_Ptr->b.ptr_blk = nt->blk_data; - return 0; -} - -static int handle_special_file (Special_NameTable_Type *nt, _SLang_Token_Type *tok) -{ - char *name; - - (void) nt; (void) tok; - - if (This_Static_NameSpace == NULL) name = "***Unknown***"; - else - name = This_Static_NameSpace->name; - - name = SLang_create_slstring (name); - if (name == NULL) - return -1; - - Compile_ByteCode_Ptr->b.s_blk = name; - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL_STR; - Compile_ByteCode_Ptr->bc_sub_type = SLANG_STRING_TYPE; - return 0; -} - -static int handle_special_line (Special_NameTable_Type *nt, _SLang_Token_Type *tok) -{ - (void) nt; - -#if _SLANG_HAS_DEBUG_CODE - Compile_ByteCode_Ptr->b.l_blk = (long) tok->line_number; -#endif - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL; - Compile_ByteCode_Ptr->bc_sub_type = SLANG_UINT_TYPE; - - return 0; -} - -static Special_NameTable_Type Special_Name_Table [] = -{ - {"EXECUTE_ERROR_BLOCK", handle_special, NULL, _SLANG_BC_X_ERROR}, - {"X_USER_BLOCK0", handle_special, NULL, _SLANG_BC_X_USER0}, - {"X_USER_BLOCK1", handle_special, NULL, _SLANG_BC_X_USER1}, - {"X_USER_BLOCK2", handle_special, NULL, _SLANG_BC_X_USER2}, - {"X_USER_BLOCK3", handle_special, NULL, _SLANG_BC_X_USER3}, - {"X_USER_BLOCK4", handle_special, NULL, _SLANG_BC_X_USER4}, - {"__FILE__", handle_special_file, NULL, 0}, - {"__LINE__", handle_special_line, NULL, 0}, -#if 0 - {"__NAMESPACE__", handle_special_namespace, NULL, 0}, -#endif - {NULL, NULL, NULL, 0} -}; - -static void compile_hashed_identifier (char *name, unsigned long hash, _SLang_Token_Type *tok) -{ - SLang_Name_Type *entry; - unsigned char name_type; - - entry = locate_hashed_name (name, hash); - - if (entry == NULL) - { - Special_NameTable_Type *nt = Special_Name_Table; - - while (nt->name != NULL) - { - if (strcmp (name, nt->name)) - { - nt++; - continue; - } - - if (0 == (*nt->fun)(nt, tok)) - lang_try_now (); - return; - } - - SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name); - return; - } - - name_type = entry->name_type; - Compile_ByteCode_Ptr->bc_main_type = name_type; - - if (name_type == SLANG_LVARIABLE) - Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *) entry)->local_var_number; - else - Compile_ByteCode_Ptr->b.nt_blk = entry; - - lang_try_now (); -} - -static void compile_tmp_variable (char *name, unsigned long hash) -{ - SLang_Name_Type *entry; - unsigned char name_type; - - if (NULL == (entry = locate_hashed_name (name, hash))) - { - SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name); - return; - } - - name_type = entry->name_type; - switch (name_type) - { - case SLANG_LVARIABLE: - Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *) entry)->local_var_number; - break; - - case SLANG_GVARIABLE: - case SLANG_PVARIABLE: - Compile_ByteCode_Ptr->b.nt_blk = entry; - break; - - default: - SLang_verror (SL_SYNTAX_ERROR, "__tmp(%s) does not specifiy a variable", name); - return; - } - - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_TMP; - Compile_ByteCode_Ptr->bc_sub_type = name_type; - - lang_try_now (); -} - -static void compile_simple (unsigned char main_type) -{ - Compile_ByteCode_Ptr->bc_main_type = main_type; - Compile_ByteCode_Ptr->bc_sub_type = 0; - Compile_ByteCode_Ptr->b.blk = NULL; - lang_try_now (); -} - -static void compile_identifier (char *name, _SLang_Token_Type *tok) -{ - compile_hashed_identifier (name, _SLcompute_string_hash (name), tok); -} - -static void compile_call_direct (int (*f) (void), unsigned char byte_code) -{ - Compile_ByteCode_Ptr->b.call_function = f; - Compile_ByteCode_Ptr->bc_main_type = byte_code; - Compile_ByteCode_Ptr->bc_sub_type = 0; - lang_try_now (); -} - -static void compile_lvar_call_direct (int (*f)(void), unsigned char bc, - unsigned char frame_op) -{ -#if _SLANG_OPTIMIZE_FOR_SPEED - if (0 == try_compressed_bytecode (_SLANG_BC_LVARIABLE, bc)) - return; -#else - (void) bc; -#endif - - compile_call_direct (f, frame_op); -} - -static void compile_integer (long i, unsigned char bc_main_type, unsigned char bc_sub_type) -{ - Compile_ByteCode_Ptr->b.l_blk = i; - Compile_ByteCode_Ptr->bc_main_type = bc_main_type; - Compile_ByteCode_Ptr->bc_sub_type = bc_sub_type; - - lang_try_now (); -} - -#if SLANG_HAS_FLOAT -static void compile_double (char *str, unsigned char type) -{ - double d; - unsigned int factor = 1; - double *ptr; - -#if 1 - d = _SLang_atof (str); -#else - if (1 != sscanf (str, "%lf", &d)) - { - SLang_verror (SL_SYNTAX_ERROR, "Unable to convert %s to double", str); - return; - } -#endif - -#if SLANG_HAS_COMPLEX - if (type == SLANG_COMPLEX_TYPE) factor = 2; -#endif - if (NULL == (ptr = (double *) SLmalloc(factor * sizeof(double)))) - return; - - Compile_ByteCode_Ptr->b.double_blk = ptr; -#if SLANG_HAS_COMPLEX - if (type == SLANG_COMPLEX_TYPE) - *ptr++ = 0; -#endif - *ptr = d; - - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL; - Compile_ByteCode_Ptr->bc_sub_type = type; - lang_try_now (); -} - -static void compile_float (char *s) -{ - float x; - -#if 1 - x = (float) _SLang_atof (s); -#else - if (1 != sscanf (s, "%f", &x)) - { - SLang_verror (SL_SYNTAX_ERROR, "Unable to convert %s to float", s); - return; - } -#endif - Compile_ByteCode_Ptr->b.float_blk = x; - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL; - Compile_ByteCode_Ptr->bc_sub_type = SLANG_FLOAT_TYPE; - lang_try_now (); -} - -#endif - -static void compile_string (char *s, unsigned long hash) -{ - if (NULL == (Compile_ByteCode_Ptr->b.s_blk = _SLstring_dup_hashed_string (s, hash))) - return; - - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL_STR; - Compile_ByteCode_Ptr->bc_sub_type = SLANG_STRING_TYPE; - - lang_try_now (); -} - -static void compile_bstring (SLang_BString_Type *s) -{ - if (NULL == (Compile_ByteCode_Ptr->b.bs_blk = SLbstring_dup (s))) - return; - - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LITERAL; - Compile_ByteCode_Ptr->bc_sub_type = SLANG_BSTRING_TYPE; - - lang_try_now (); -} - -/* assign_type is one of _SLANG_BCST_ASSIGN, ... values */ -static void compile_assign (unsigned char assign_type, - char *name, unsigned long hash) -{ - SLang_Name_Type *v; - unsigned char main_type; - SLang_Class_Type *cl; - - v = locate_hashed_name (name, hash); - if (v == NULL) - { - if ((_SLang_Auto_Declare_Globals == 0) - || (NULL != strchr (name, '-')) /* namespace->name form */ - || Lang_Defining_Function - || (assign_type != _SLANG_BCST_ASSIGN) - || (This_Static_NameSpace == NULL)) - { - SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name); - return; - } - /* Note that function local variables are not at top level */ - - /* Variables that are automatically declared are given static - * scope. - */ - if ((NULL != SLang_Auto_Declare_Var_Hook) - && (-1 == (*SLang_Auto_Declare_Var_Hook) (name))) - return; - - if ((-1 == add_global_variable (name, SLANG_GVARIABLE, hash, This_Static_NameSpace)) - || (NULL == (v = locate_hashed_name (name, hash)))) - return; - } - - switch (v->name_type) - { - case SLANG_LVARIABLE: - main_type = _SLANG_BC_SET_LOCAL_LVALUE; - Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *) v)->local_var_number; - break; - - case SLANG_GVARIABLE: - case SLANG_PVARIABLE: - main_type = _SLANG_BC_SET_GLOBAL_LVALUE; - Compile_ByteCode_Ptr->b.nt_blk = v; - break; - - case SLANG_IVARIABLE: - cl = _SLclass_get_class (((SLang_Intrin_Var_Type *)v)->type); - if (cl->cl_class_type != SLANG_CLASS_TYPE_SCALAR) - { - SLang_verror (SL_SYNTAX_ERROR, "Assignment to %s is not allowed", name); - return; - } - main_type = _SLANG_BC_SET_INTRIN_LVALUE; - Compile_ByteCode_Ptr->b.nt_blk = v; - break; - - case SLANG_RVARIABLE: - SLang_verror (SL_READONLY_ERROR, "%s is read-only", name); - return; - - default: - SLang_verror (SL_DUPLICATE_DEFINITION, "%s may not be used as an lvalue", name); - return; - } - - Compile_ByteCode_Ptr->bc_sub_type = assign_type; - Compile_ByteCode_Ptr->bc_main_type = main_type; - - lang_try_now (); -} - -static void compile_deref_assign (char *name, unsigned long hash) -{ - SLang_Name_Type *v; - - v = locate_hashed_name (name, hash); - - if (v == NULL) - { - SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name); - return; - } - - switch (v->name_type) - { - case SLANG_LVARIABLE: - Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *) v)->local_var_number; - break; - - case SLANG_GVARIABLE: - case SLANG_PVARIABLE: - Compile_ByteCode_Ptr->b.nt_blk = v; - break; - - default: - /* FIXME: Priority=low - * This could be made to work. It is not a priority because - * I cannot imagine application intrinsics which are references. - */ - SLang_verror (SL_NOT_IMPLEMENTED, "Deref assignment to %s is not allowed", name); - return; - } - - Compile_ByteCode_Ptr->bc_sub_type = v->name_type; - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_DEREF_ASSIGN; - - lang_try_now (); -} - -static void -compile_struct_assign (_SLang_Token_Type *t) -{ - Compile_ByteCode_Ptr->bc_sub_type = _SLANG_BCST_ASSIGN + (t->type - _STRUCT_ASSIGN_TOKEN); - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_SET_STRUCT_LVALUE; - Compile_ByteCode_Ptr->b.s_blk = _SLstring_dup_hashed_string (t->v.s_val, t->hash); - lang_try_now (); -} - -static void -compile_array_assign (_SLang_Token_Type *t) -{ - Compile_ByteCode_Ptr->bc_sub_type = _SLANG_BCST_ASSIGN + (t->type - _ARRAY_ASSIGN_TOKEN); - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_SET_ARRAY_LVALUE; - Compile_ByteCode_Ptr->b.s_blk = NULL; - lang_try_now (); -} - -static void compile_dot(_SLang_Token_Type *t) -{ - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_FIELD; - Compile_ByteCode_Ptr->b.s_blk = _SLstring_dup_hashed_string(t->v.s_val, t->hash); - lang_try_now (); -} - -static void compile_ref (char *name, unsigned long hash) -{ - SLang_Name_Type *entry; - unsigned char main_type; - - if (NULL == (entry = locate_hashed_name (name, hash))) - { - SLang_verror (SL_UNDEFINED_NAME, "%s is undefined", name); - return; - } - - main_type = entry->name_type; - - if (main_type == SLANG_LVARIABLE) - { - main_type = _SLANG_BC_LOBJPTR; - Compile_ByteCode_Ptr->b.i_blk = ((SLang_Local_Var_Type *)entry)->local_var_number; - } - else - { - main_type = _SLANG_BC_GOBJPTR; - Compile_ByteCode_Ptr->b.nt_blk = entry; - } - - Compile_ByteCode_Ptr->bc_main_type = main_type; - lang_try_now (); -} - -static void compile_break (unsigned char break_type, - int requires_block, int requires_fun, - char *str) -{ - if ((requires_fun - && (Lang_Defining_Function == 0)) - || (requires_block - && (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_BLOCK))) - { - SLang_verror (SL_SYNTAX_ERROR, "misplaced %s", str); - return; - } - - Compile_ByteCode_Ptr->bc_main_type = break_type; - Compile_ByteCode_Ptr->bc_sub_type = 0; - - lang_try_now (); -} - -static void compile_public_variable_mode (_SLang_Token_Type *t) -{ - if (t->type == IDENT_TOKEN) - { - /* If the variable is already defined in the static hash table, - * generate an error. - */ - if ((This_Static_NameSpace != NULL) - && (NULL != locate_name_in_table (t->v.s_val, t->hash, This_Static_NameSpace->table, This_Static_NameSpace->table_size))) - { - SLang_verror (SL_DUPLICATE_DEFINITION, - "%s already has static or private linkage in this unit", - t->v.s_val); - return; - } - add_global_variable (t->v.s_val, SLANG_GVARIABLE, t->hash, Global_NameSpace); - } - else if (t->type == CBRACKET_TOKEN) - Compile_Mode_Function = compile_basic_token_mode; - else - SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list"); -} - -static void compile_local_variable_mode (_SLang_Token_Type *t) -{ - if (t->type == IDENT_TOKEN) - add_local_variable (t->v.s_val, t->hash); - else if (t->type == CBRACKET_TOKEN) - Compile_Mode_Function = compile_basic_token_mode; - else - SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list"); -} - -static void compile_static_variable_mode (_SLang_Token_Type *t) -{ - if (t->type == IDENT_TOKEN) - add_global_variable (t->v.s_val, SLANG_GVARIABLE, t->hash, This_Static_NameSpace); - else if (t->type == CBRACKET_TOKEN) - Compile_Mode_Function = compile_basic_token_mode; - else - SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list"); -} - -static void compile_private_variable_mode (_SLang_Token_Type *t) -{ - if (t->type == IDENT_TOKEN) - add_global_variable (t->v.s_val, SLANG_PVARIABLE, t->hash, This_Static_NameSpace); - else if (t->type == CBRACKET_TOKEN) - Compile_Mode_Function = compile_basic_token_mode; - else - SLang_verror (SL_SYNTAX_ERROR, "Misplaced token in variable list"); -} - -static void compile_function_mode (_SLang_Token_Type *t) -{ - if (-1 == lang_check_space ()) - return; - - if (t->type != IDENT_TOKEN) - SLang_verror (SL_SYNTAX_ERROR, "Expecting function name"); - else - lang_define_function (t->v.s_val, SLANG_FUNCTION, t->hash, Global_NameSpace); - - Compile_Mode_Function = compile_basic_token_mode; -} - -/* An error block is not permitted to contain continue or break statements. - * This restriction may be removed later but for now reject them. - */ -static int check_error_block (void) -{ - SLBlock_Type *p; - unsigned char t; - - /* Back up to the block and then scan it. */ - p = (Compile_ByteCode_Ptr - 1)->b.blk; - - while (0 != (t = p->bc_main_type)) - { - if ((t == _SLANG_BC_BREAK) - || (t == _SLANG_BC_CONTINUE)) - { - SLang_verror (SL_SYNTAX_ERROR, - "An ERROR_BLOCK is not permitted to contain continue or break statements"); - return -1; - } - p++; - } - return 0; -} - -/* The only allowed tokens are the directives and another block start. - * The mode is only active if a block is available. The inner_interp routine - * expects such safety checks. - */ -static void compile_directive_mode (_SLang_Token_Type *t) -{ - int bc_sub_type; - - if (-1 == lang_check_space ()) - return; - - bc_sub_type = -1; - - switch (t->type) - { - case FOREVER_TOKEN: - bc_sub_type = _SLANG_BCST_FOREVER; - break; - - case IFNOT_TOKEN: - bc_sub_type = _SLANG_BCST_IFNOT; - break; - - case IF_TOKEN: - bc_sub_type = _SLANG_BCST_IF; - break; - - case ANDELSE_TOKEN: - bc_sub_type = _SLANG_BCST_ANDELSE; - break; - - case SWITCH_TOKEN: - bc_sub_type = _SLANG_BCST_SWITCH; - break; - - case EXITBLK_TOKEN: - if (Lang_Defining_Function == 0) - { - SLang_verror (SL_SYNTAX_ERROR, "misplaced EXIT_BLOCK"); - break; - } - bc_sub_type = _SLANG_BCST_EXIT_BLOCK; - break; - - case ERRBLK_TOKEN: - if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_TOP_LEVEL) - { - SLang_verror (SL_SYNTAX_ERROR, "misplaced ERROR_BLOCK"); - break; - } - if (0 == check_error_block ()) - bc_sub_type = _SLANG_BCST_ERROR_BLOCK; - break; - - case USRBLK0_TOKEN: - case USRBLK1_TOKEN: - case USRBLK2_TOKEN: - case USRBLK3_TOKEN: - case USRBLK4_TOKEN: - if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_TOP_LEVEL) - { - SLang_verror (SL_SYNTAX_ERROR, "misplaced USER_BLOCK"); - break; - } - bc_sub_type = _SLANG_BCST_USER_BLOCK0 + (t->type - USRBLK0_TOKEN); - break; - - case NOTELSE_TOKEN: - bc_sub_type = _SLANG_BCST_NOTELSE; - break; - - case ELSE_TOKEN: - bc_sub_type = _SLANG_BCST_ELSE; - break; - - case LOOP_TOKEN: - bc_sub_type = _SLANG_BCST_LOOP; - break; - - case DOWHILE_TOKEN: - bc_sub_type = _SLANG_BCST_DOWHILE; - break; - - case WHILE_TOKEN: - bc_sub_type = _SLANG_BCST_WHILE; - break; - - case ORELSE_TOKEN: - bc_sub_type = _SLANG_BCST_ORELSE; - break; - - case _FOR_TOKEN: - bc_sub_type = _SLANG_BCST_FOR; - break; - - case FOR_TOKEN: - bc_sub_type = _SLANG_BCST_CFOR; - break; - - case FOREACH_TOKEN: - bc_sub_type = _SLANG_BCST_FOREACH; - break; - - case OBRACE_TOKEN: - lang_begin_block (); - break; - - default: - SLang_verror (SL_SYNTAX_ERROR, "Expecting directive token. Found 0x%X", t->type); - break; - } - - /* Reset this pointer first because compile_directive may cause a - * file to be loaded. - */ - Compile_Mode_Function = compile_basic_token_mode; - - if (bc_sub_type != -1) - compile_directive (bc_sub_type); -} - -static unsigned int Assign_Mode_Type; -static void compile_assign_mode (_SLang_Token_Type *t) -{ - if (t->type != IDENT_TOKEN) - { - SLang_verror (SL_SYNTAX_ERROR, "Expecting identifier for assignment"); - return; - } - - compile_assign (Assign_Mode_Type, t->v.s_val, t->hash); - Compile_Mode_Function = compile_basic_token_mode; -} - -static void compile_basic_token_mode (_SLang_Token_Type *t) -{ - if (-1 == lang_check_space ()) - return; - - switch (t->type) - { - case PUSH_TOKEN: - case NOP_TOKEN: - case EOF_TOKEN: - case READONLY_TOKEN: - case DO_TOKEN: - case VARIABLE_TOKEN: - case SEMICOLON_TOKEN: - default: - SLang_verror (SL_SYNTAX_ERROR, "Unknown or unsupported token type 0x%X", t->type); - break; - - case DEREF_TOKEN: - compile_call_direct (dereference_object, _SLANG_BC_CALL_DIRECT); - break; - - case STRUCT_TOKEN: - compile_call_direct (_SLstruct_define_struct, _SLANG_BC_CALL_DIRECT); - break; - - case TYPEDEF_TOKEN: - compile_call_direct (_SLstruct_define_typedef, _SLANG_BC_CALL_DIRECT); - break; - - case TMP_TOKEN: - compile_tmp_variable (t->v.s_val, t->hash); - break; - - case DOT_TOKEN: /* X . field */ - compile_dot (t); - break; - - case COMMA_TOKEN: - break; /* do nothing */ - - case IDENT_TOKEN: - compile_hashed_identifier (t->v.s_val, t->hash, t); - break; - - case _REF_TOKEN: - compile_ref (t->v.s_val, t->hash); - break; - - case ARG_TOKEN: - compile_call_direct (SLang_start_arg_list, _SLANG_BC_CALL_DIRECT); - break; - - case EARG_TOKEN: - compile_lvar_call_direct (SLang_end_arg_list, _SLANG_BC_EARG_LVARIABLE, _SLANG_BC_CALL_DIRECT); - break; - - case COLON_TOKEN: - if (This_Compile_Block_Type == COMPILE_BLOCK_TYPE_BLOCK) - compile_simple (_SLANG_BC_LABEL); - else SLang_Error = SL_SYNTAX_ERROR; - break; - - case POP_TOKEN: - compile_call_direct (SLdo_pop, _SLANG_BC_CALL_DIRECT); - break; - - case CASE_TOKEN: - if (This_Compile_Block_Type != COMPILE_BLOCK_TYPE_BLOCK) - SLang_verror (SL_SYNTAX_ERROR, "Misplaced 'case'"); - else - compile_call_direct (case_function, _SLANG_BC_CALL_DIRECT); - break; - - case CHAR_TOKEN: - compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_CHAR_TYPE); - break; - case SHORT_TOKEN: - compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_SHORT_TYPE); - break; - case INT_TOKEN: - compile_integer (t->v.long_val, _SLANG_BC_LITERAL_INT, SLANG_INT_TYPE); - break; - case UCHAR_TOKEN: - compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_UCHAR_TYPE); - break; - case USHORT_TOKEN: - compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_USHORT_TYPE); - break; - case UINT_TOKEN: - compile_integer (t->v.long_val, _SLANG_BC_LITERAL_INT, SLANG_UINT_TYPE); - break; - case LONG_TOKEN: - compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_LONG_TYPE); - break; - case ULONG_TOKEN: - compile_integer (t->v.long_val, _SLANG_BC_LITERAL, SLANG_ULONG_TYPE); - break; - -#if SLANG_HAS_FLOAT - case FLOAT_TOKEN: - compile_float (t->v.s_val); - break; - - case DOUBLE_TOKEN: - compile_double (t->v.s_val, SLANG_DOUBLE_TYPE); - break; -#endif -#if SLANG_HAS_COMPLEX - case COMPLEX_TOKEN: - compile_double (t->v.s_val, SLANG_COMPLEX_TYPE); - break; -#endif - - case STRING_TOKEN: - compile_string (t->v.s_val, t->hash); - break; - - case _BSTRING_TOKEN: - compile_bstring (SLbstring_create ((unsigned char *)t->v.s_val, (unsigned int) t->hash)); - break; - - case BSTRING_TOKEN: - compile_bstring (t->v.b_val); - break; - - case _NULL_TOKEN: - compile_identifier ("NULL", t); - break; - - case _INLINE_WILDCARD_ARRAY_TOKEN: - compile_call_direct (_SLarray_wildcard_array, _SLANG_BC_CALL_DIRECT); - break; - - case _INLINE_ARRAY_TOKEN: - compile_call_direct (_SLarray_inline_array, _SLANG_BC_CALL_DIRECT_FRAME); - break; - - case _INLINE_IMPLICIT_ARRAY_TOKEN: - compile_call_direct (_SLarray_inline_implicit_array, _SLANG_BC_CALL_DIRECT_FRAME); - break; - - case ARRAY_TOKEN: - compile_lvar_call_direct (_SLarray_aget, _SLANG_BC_LVARIABLE_AGET, _SLANG_BC_CALL_DIRECT_FRAME); - break; - - /* Note: I need to add the other _ARRAY assign tokens. */ - case _ARRAY_PLUSEQS_TOKEN: - case _ARRAY_MINUSEQS_TOKEN: - case _ARRAY_TIMESEQS_TOKEN: - case _ARRAY_DIVEQS_TOKEN: - case _ARRAY_BOREQS_TOKEN: - case _ARRAY_BANDEQS_TOKEN: - case _ARRAY_POST_MINUSMINUS_TOKEN: - case _ARRAY_MINUSMINUS_TOKEN: - case _ARRAY_POST_PLUSPLUS_TOKEN: - case _ARRAY_PLUSPLUS_TOKEN: - compile_array_assign (t); - break; - - case _ARRAY_ASSIGN_TOKEN: - compile_lvar_call_direct (_SLarray_aput, _SLANG_BC_LVARIABLE_APUT, _SLANG_BC_CALL_DIRECT_FRAME); - break; - - case _STRUCT_ASSIGN_TOKEN: - case _STRUCT_PLUSEQS_TOKEN: - case _STRUCT_MINUSEQS_TOKEN: - case _STRUCT_TIMESEQS_TOKEN: - case _STRUCT_DIVEQS_TOKEN: - case _STRUCT_BOREQS_TOKEN: - case _STRUCT_BANDEQS_TOKEN: - case _STRUCT_POST_MINUSMINUS_TOKEN: - case _STRUCT_MINUSMINUS_TOKEN: - case _STRUCT_POST_PLUSPLUS_TOKEN: - case _STRUCT_PLUSPLUS_TOKEN: - compile_struct_assign (t); - break; - - case _SCALAR_ASSIGN_TOKEN: - case _SCALAR_PLUSEQS_TOKEN: - case _SCALAR_MINUSEQS_TOKEN: - case _SCALAR_TIMESEQS_TOKEN: - case _SCALAR_DIVEQS_TOKEN: - case _SCALAR_BOREQS_TOKEN: - case _SCALAR_BANDEQS_TOKEN: - case _SCALAR_POST_MINUSMINUS_TOKEN: - case _SCALAR_MINUSMINUS_TOKEN: - case _SCALAR_POST_PLUSPLUS_TOKEN: - case _SCALAR_PLUSPLUS_TOKEN: - compile_assign (_SLANG_BCST_ASSIGN + (t->type - _SCALAR_ASSIGN_TOKEN), - t->v.s_val, t->hash); - break; - - case _DEREF_ASSIGN_TOKEN: - compile_deref_assign (t->v.s_val, t->hash); - break; - - /* For processing RPN tokens */ - case ASSIGN_TOKEN: - case PLUSEQS_TOKEN: - case MINUSEQS_TOKEN: - case TIMESEQS_TOKEN: - case DIVEQS_TOKEN: - case BOREQS_TOKEN: - case BANDEQS_TOKEN: - case POST_MINUSMINUS_TOKEN: - case MINUSMINUS_TOKEN: - case POST_PLUSPLUS_TOKEN: - case PLUSPLUS_TOKEN: - Compile_Mode_Function = compile_assign_mode; - Assign_Mode_Type = _SLANG_BCST_ASSIGN + (t->type - ASSIGN_TOKEN); - break; - - case LT_TOKEN: - compile_binary (SLANG_LT); - break; - - case LE_TOKEN: - compile_binary (SLANG_LE); - break; - - case GT_TOKEN: - compile_binary (SLANG_GT); - break; - - case GE_TOKEN: - compile_binary (SLANG_GE); - break; - - case EQ_TOKEN: - compile_binary (SLANG_EQ); - break; - - case NE_TOKEN: - compile_binary (SLANG_NE); - break; - - case AND_TOKEN: - compile_binary (SLANG_AND); - break; - - case ADD_TOKEN: - compile_fast_binary (SLANG_PLUS, _SLANG_BC_INTEGER_PLUS); - break; - - case SUB_TOKEN: - compile_fast_binary (SLANG_MINUS, _SLANG_BC_INTEGER_MINUS); - break; - - case TIMES_TOKEN: - compile_binary (SLANG_TIMES); - break; - - case DIV_TOKEN: - compile_binary (SLANG_DIVIDE); - break; - - case POW_TOKEN: - compile_binary (SLANG_POW); - break; - - case BXOR_TOKEN: - compile_binary (SLANG_BXOR); - break; - - case BAND_TOKEN: - compile_binary (SLANG_BAND); - break; - - case BOR_TOKEN: - compile_binary (SLANG_BOR); - break; - - case SHR_TOKEN: - compile_binary (SLANG_SHR); - break; - - case SHL_TOKEN: - compile_binary (SLANG_SHL); - break; - - case MOD_TOKEN: - compile_binary (SLANG_MOD); - break; - - case OR_TOKEN: - compile_binary (SLANG_OR); - break; - - case NOT_TOKEN: - compile_unary (SLANG_NOT, _SLANG_BC_UNARY); - break; - - case BNOT_TOKEN: - compile_unary (SLANG_BNOT, _SLANG_BC_UNARY); - break; - - case MUL2_TOKEN: - compile_unary (SLANG_MUL2, _SLANG_BC_UNARY_FUNC); - break; - - case CHS_TOKEN: - compile_unary (SLANG_CHS, _SLANG_BC_UNARY_FUNC); - break; - - case ABS_TOKEN: - compile_unary (SLANG_ABS, _SLANG_BC_UNARY_FUNC); - break; - - case SQR_TOKEN: - compile_unary (SLANG_SQR, _SLANG_BC_UNARY_FUNC); - break; - - case SIGN_TOKEN: - compile_unary (SLANG_SIGN, _SLANG_BC_UNARY_FUNC); - break; - - case BREAK_TOKEN: - compile_break (_SLANG_BC_BREAK, 1, 0, "break"); - break; - - case RETURN_TOKEN: - compile_break (_SLANG_BC_RETURN, 0, 1, "return"); - break; - - case CONT_TOKEN: - compile_break (_SLANG_BC_CONTINUE, 1, 0, "continue"); - break; - - case EXCH_TOKEN: - compile_break (_SLANG_BC_EXCH, 0, 0, ""); /* FIXME: Priority=low */ - break; - - case STATIC_TOKEN: - if (Lang_Defining_Function == 0) - Compile_Mode_Function = compile_static_variable_mode; - else - SLang_verror (SL_NOT_IMPLEMENTED, "static variables not permitted in functions"); - break; - - case PRIVATE_TOKEN: - if (Lang_Defining_Function == 0) - Compile_Mode_Function = compile_private_variable_mode; - else - SLang_verror (SL_NOT_IMPLEMENTED, "private variables not permitted in functions"); - break; - - case PUBLIC_TOKEN: - if (Lang_Defining_Function == 0) - Compile_Mode_Function = compile_public_variable_mode; - else - SLang_verror (SL_NOT_IMPLEMENTED, "public variables not permitted in functions"); - break; - - case OBRACKET_TOKEN: - if (Lang_Defining_Function == 0) - Compile_Mode_Function = Default_Variable_Mode; - else - Compile_Mode_Function = compile_local_variable_mode; - break; - - case OPAREN_TOKEN: - lang_begin_function (); - break; - - case DEFINE_STATIC_TOKEN: - if (Lang_Defining_Function) - define_static_function (t->v.s_val, t->hash); - else SLang_Error = SL_SYNTAX_ERROR; - break; - - case DEFINE_PRIVATE_TOKEN: - if (Lang_Defining_Function) - define_private_function (t->v.s_val, t->hash); - else SLang_Error = SL_SYNTAX_ERROR; - break; - - case DEFINE_PUBLIC_TOKEN: - if (Lang_Defining_Function) - define_public_function (t->v.s_val, t->hash); - else SLang_Error = SL_SYNTAX_ERROR; - break; - - case DEFINE_TOKEN: - if (Lang_Defining_Function) - (*Default_Define_Function) (t->v.s_val, t->hash); - else - SLang_Error = SL_SYNTAX_ERROR; - break; - - case CPAREN_TOKEN: - if (Lang_Defining_Function) - Compile_Mode_Function = compile_function_mode; - else SLang_Error = SL_SYNTAX_ERROR; - break; - - case CBRACE_TOKEN: - lang_end_block (); - Compile_Mode_Function = compile_directive_mode; - break; - - case OBRACE_TOKEN: - lang_begin_block (); - break; - - case FARG_TOKEN: - Function_Args_Number = Local_Variable_Number; - break; - -#if _SLANG_HAS_DEBUG_CODE - case LINE_NUM_TOKEN: - Compile_ByteCode_Ptr->bc_main_type = _SLANG_BC_LINE_NUM; - Compile_ByteCode_Ptr->b.l_blk = t->v.long_val; - lang_try_now (); - break; -#endif - case POUND_TOKEN: - compile_call_direct (_SLarray_matrix_multiply, _SLANG_BC_CALL_DIRECT); - break; - } -} - -void _SLcompile (_SLang_Token_Type *t) -{ - if (SLang_Error == 0) - { - if (Compile_Mode_Function != compile_basic_token_mode) - { - if (Compile_Mode_Function == NULL) - Compile_Mode_Function = compile_basic_token_mode; -#if _SLANG_HAS_DEBUG_CODE - if (t->type == LINE_NUM_TOKEN) - { - compile_basic_token_mode (t); - return; - } -#endif - } - - (*Compile_Mode_Function) (t); - } - - if (SLang_Error) - { - Compile_Mode_Function = compile_basic_token_mode; - SLang_restart (0); - } -} - -void (*_SLcompile_ptr)(_SLang_Token_Type *) = _SLcompile; - -typedef struct _Compile_Context_Type -{ - struct _Compile_Context_Type *next; - SLang_NameSpace_Type *static_namespace; - void (*compile_variable_mode) (_SLang_Token_Type *); - void (*define_function) (char *, unsigned long); - int lang_defining_function; - int local_variable_number; - unsigned int function_args_number; - SLang_Name_Type **locals_hash_table; - void (*compile_mode_function)(_SLang_Token_Type *); -#if _SLANG_HAS_DEBUG_CODE - char *compile_filename; -#endif -} -Compile_Context_Type; - -static Compile_Context_Type *Compile_Context_Stack; - -/* The only way the push/pop_context functions can get called is via - * an eval type function. That can only happen when executed from a - * top level block. This means that Compile_ByteCode_Ptr can always be - * rest back to the beginning of a block. - */ - -static int pop_compile_context (void) -{ - Compile_Context_Type *cc; - - if (NULL == (cc = Compile_Context_Stack)) - return -1; - - This_Static_NameSpace = cc->static_namespace; - Compile_Context_Stack = cc->next; - Default_Variable_Mode = cc->compile_variable_mode; - Default_Define_Function = cc->define_function; - Compile_Mode_Function = cc->compile_mode_function; - - Lang_Defining_Function = cc->lang_defining_function; - Local_Variable_Number = cc->local_variable_number; - Function_Args_Number = cc->function_args_number; - -#if _SLANG_HAS_DEBUG_CODE - SLang_free_slstring (This_Compile_Filename); - This_Compile_Filename = cc->compile_filename; -#endif - - SLfree ((char *) Locals_Hash_Table); - Locals_Hash_Table = cc->locals_hash_table; - - SLfree ((char *) cc); - - return 0; -} - -static int push_compile_context (char *name) -{ - Compile_Context_Type *cc; - SLang_Name_Type **lns; - - cc = (Compile_Context_Type *)SLmalloc (sizeof (Compile_Context_Type)); - if (cc == NULL) - return -1; - memset ((char *) cc, 0, sizeof (Compile_Context_Type)); - - lns = (SLang_Name_Type **) SLcalloc (sizeof (SLang_Name_Type *), SLLOCALS_HASH_TABLE_SIZE); - if (lns == NULL) - { - SLfree ((char *) cc); - return -1; - } - -#if _SLANG_HAS_DEBUG_CODE - if ((name != NULL) - && (NULL == (name = SLang_create_slstring (name)))) - { - SLfree ((char *) cc); - SLfree ((char *) lns); - return -1; - } - - cc->compile_filename = This_Compile_Filename; - This_Compile_Filename = name; -#endif - - cc->static_namespace = This_Static_NameSpace; - cc->compile_variable_mode = Default_Variable_Mode; - cc->define_function = Default_Define_Function; - cc->locals_hash_table = Locals_Hash_Table; - - cc->lang_defining_function = Lang_Defining_Function; - cc->local_variable_number = Local_Variable_Number; - cc->function_args_number = Function_Args_Number; - cc->locals_hash_table = Locals_Hash_Table; - cc->compile_mode_function = Compile_Mode_Function; - - cc->next = Compile_Context_Stack; - Compile_Context_Stack = cc; - - Compile_Mode_Function = compile_basic_token_mode; - Default_Variable_Mode = compile_public_variable_mode; - Default_Define_Function = define_public_function; - Lang_Defining_Function = 0; - Local_Variable_Number = 0; - Function_Args_Number = 0; - Locals_Hash_Table = lns; - return 0; -} - -static int init_interpreter (void) -{ - SLang_NameSpace_Type *ns; - - if (Global_NameSpace != NULL) - return 0; - - if (NULL == (ns = _SLns_allocate_namespace ("***GLOBAL***", SLGLOBALS_HASH_TABLE_SIZE))) - return -1; - if (-1 == _SLns_set_namespace_name (ns, "Global")) - return -1; - Global_NameSpace = ns; - - _SLRun_Stack = (SLang_Object_Type *) SLcalloc (SLANG_MAX_STACK_LEN, - sizeof (SLang_Object_Type)); - if (_SLRun_Stack == NULL) - return -1; - - _SLStack_Pointer = _SLRun_Stack; - _SLStack_Pointer_Max = _SLRun_Stack + SLANG_MAX_STACK_LEN; - - SLShort_Blocks[0].bc_main_type = _SLANG_BC_RETURN; - SLShort_Blocks[2].bc_main_type = _SLANG_BC_BREAK; - SLShort_Blocks[4].bc_main_type = _SLANG_BC_CONTINUE; - - Num_Args_Stack = (int *) SLmalloc (sizeof (int) * SLANG_MAX_RECURSIVE_DEPTH); - if (Num_Args_Stack == NULL) - { - SLfree ((char *) _SLRun_Stack); - return -1; - } - Recursion_Depth = 0; - Frame_Pointer_Stack = (unsigned int *) SLmalloc (sizeof (unsigned int) * SLANG_MAX_RECURSIVE_DEPTH); - if (Frame_Pointer_Stack == NULL) - { - SLfree ((char *) _SLRun_Stack); - SLfree ((char *)Num_Args_Stack); - return -1; - } - Frame_Pointer_Depth = 0; - Frame_Pointer = _SLRun_Stack; - - Default_Variable_Mode = compile_public_variable_mode; - Default_Define_Function = define_public_function; - return 0; -} - -static int add_generic_table (SLang_NameSpace_Type *ns, - SLang_Name_Type *table, char *pp_name, - unsigned int entry_len) -{ - SLang_Name_Type *t, **ns_table; - char *name; - unsigned int table_size; - - if (-1 == init_interpreter ()) - return -1; - - if (ns == NULL) - ns = Global_NameSpace; - - ns_table = ns->table; - table_size = ns->table_size; - - if ((pp_name != NULL) - && (-1 == SLdefine_for_ifdef (pp_name))) - return -1; - - t = table; - while (NULL != (name = t->name)) - { - unsigned long hash; - - /* Backward compatibility: '.' WAS used as hash marker */ - if (*name == '.') - { - name++; - t->name = name; - } - - if (NULL == (name = SLang_create_slstring (name))) - return -1; - - t->name = name; - - hash = _SLcompute_string_hash (name); - hash = hash % table_size; - - t->next = ns_table [(unsigned int) hash]; - ns_table [(unsigned int) hash] = t; - - t = (SLang_Name_Type *) ((char *)t + entry_len); - } - - return 0; -} - -int SLadd_intrin_fun_table (SLang_Intrin_Fun_Type *tbl, char *pp) -{ - return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Fun_Type)); -} - -int SLadd_intrin_var_table (SLang_Intrin_Var_Type *tbl, char *pp) -{ - return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Var_Type)); -} - -int SLadd_app_unary_table (SLang_App_Unary_Type *tbl, char *pp) -{ - return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_App_Unary_Type)); -} - -int SLadd_math_unary_table (SLang_Math_Unary_Type *tbl, char *pp) -{ - return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Math_Unary_Type)); -} - -int SLadd_iconstant_table (SLang_IConstant_Type *tbl, char *pp) -{ - return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_IConstant_Type)); -} - -#if SLANG_HAS_FLOAT -int SLadd_dconstant_table (SLang_DConstant_Type *tbl, char *pp) -{ - return add_generic_table (NULL, (SLang_Name_Type *) tbl, pp, sizeof (SLang_DConstant_Type)); -} -#endif - -/* ----------- */ -int SLns_add_intrin_fun_table (SLang_NameSpace_Type *ns, SLang_Intrin_Fun_Type *tbl, char *pp) -{ - return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Fun_Type)); -} - -int SLns_add_intrin_var_table (SLang_NameSpace_Type *ns, SLang_Intrin_Var_Type *tbl, char *pp) -{ - return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Intrin_Var_Type)); -} - -int SLns_add_app_unary_table (SLang_NameSpace_Type *ns, SLang_App_Unary_Type *tbl, char *pp) -{ - return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_App_Unary_Type)); -} - -int SLns_add_math_unary_table (SLang_NameSpace_Type *ns, SLang_Math_Unary_Type *tbl, char *pp) -{ - return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_Math_Unary_Type)); -} - -int SLns_add_iconstant_table (SLang_NameSpace_Type *ns, SLang_IConstant_Type *tbl, char *pp) -{ - return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_IConstant_Type)); -} - -#if SLANG_HAS_FLOAT -int SLns_add_dconstant_table (SLang_NameSpace_Type *ns, SLang_DConstant_Type *tbl, char *pp) -{ - return add_generic_table (ns, (SLang_Name_Type *) tbl, pp, sizeof (SLang_DConstant_Type)); -} -#endif - -/* what is a bitmapped value: - * 1 intrin fun - * 2 user fun - * 4 intrin var - * 8 user defined var - */ -SLang_Array_Type *_SLang_apropos (char *namespace_name, char *pat, unsigned int what) -{ - SLang_NameSpace_Type *ns; - - if (namespace_name == NULL) - namespace_name = "Global"; - - if (*namespace_name == 0) - ns = This_Static_NameSpace; - else ns = _SLns_find_namespace (namespace_name); - - return _SLnspace_apropos (ns, pat, what); -} - -void _SLang_implements_intrinsic (char *name) -{ - if (This_Static_NameSpace == NULL) - { - SLang_verror (SL_INTRINSIC_ERROR, "No namespace available"); - return; - } - - (void) _SLns_set_namespace_name (This_Static_NameSpace, name); - - Default_Define_Function = define_static_function; - Default_Variable_Mode = compile_static_variable_mode; -} - -void _SLang_use_namespace_intrinsic (char *name) -{ - SLang_NameSpace_Type *ns; - - if (NULL == (ns = _SLns_find_namespace (name))) - { - SLang_verror (SL_INTRINSIC_ERROR, "Namespace %s does not exist", name); - return; - } - This_Static_NameSpace = ns; - if (Global_NameSpace == ns) - { - Default_Define_Function = define_public_function; - Default_Variable_Mode = compile_public_variable_mode; - } - else - { - Default_Define_Function = define_static_function; - Default_Variable_Mode = compile_static_variable_mode; - } -} - - -char *_SLang_cur_namespace_intrinsic (void) -{ - if (This_Static_NameSpace == NULL) - return "Global"; - - if (This_Static_NameSpace->namespace_name == NULL) - return ""; - - return This_Static_NameSpace->namespace_name; -} diff --git a/mdk-stage1/slang/slang.h b/mdk-stage1/slang/slang.h deleted file mode 100644 index 900b14043..000000000 --- a/mdk-stage1/slang/slang.h +++ /dev/null @@ -1,1930 +0,0 @@ -#ifndef DAVIS_SLANG_H_ -#define DAVIS_SLANG_H_ -/* -*- mode: C; mode: fold; -*- */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#define SLANG_VERSION 10404 -#define SLANG_VERSION_STRING "1.4.4" - -/*{{{ System Dependent Macros and Typedefs */ - -#if defined(__WATCOMC__) && defined(DOS) -# ifndef __MSDOS__ -# define __MSDOS__ -# endif -# ifndef DOS386 -# define DOS386 -# endif -# ifndef IBMPC_SYSTEM -# define IBMPC_SYSTEM -# endif -#endif /* __watcomc__ */ - -#if defined(unix) || defined(__unix) -# ifndef __unix__ -# define __unix__ 1 -# endif -#endif - -#if !defined(__GO32__) -# ifdef __unix__ -# define REAL_UNIX_SYSTEM -# endif -#endif - -/* Set of the various defines for pc systems. This includes OS/2 */ -#ifdef __GO32__ -# ifndef __DJGPP__ -# define __DJGPP__ 1 -# endif -# ifndef IBMPC_SYSTEM -# define IBMPC_SYSTEM -# endif -#endif - -#ifdef __BORLANDC__ -# ifndef IBMPC_SYSTEM -# define IBMPC_SYSTEM -# endif -#endif - -#ifdef __MSDOS__ -# ifndef IBMPC_SYSTEM -# define IBMPC_SYSTEM -# endif -#endif - -#if defined(OS2) || defined(__os2__) -# ifndef IBMPC_SYSTEM -# define IBMPC_SYSTEM -# endif -# ifndef __os2__ -# define __os2__ -# endif -#endif - -#if defined(__NT__) || defined(__MINGW32__) || defined(__CYGWIN32__) -# ifndef IBMPC_SYSTEM -# define IBMPC_SYSTEM -# endif -#endif - -#if defined(IBMPC_SYSTEM) || defined(VMS) -# ifdef REAL_UNIX_SYSTEM -# undef REAL_UNIX_SYSTEM -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif -#if 0 -} -#endif - -#include -#include -#if defined(__STDC__) || defined(__BORLANDC__) || defined(__cplusplus) -# include /* for offsetof */ -#endif - -/* ---------------------------- Generic Macros ----------------------------- */ - -/* __SC__ is defined for Symantec C++ - DOS386 is defined for -mx memory model, 32 bit DOS extender. */ - -#if defined(__SC__) && !defined(DOS386) -# include -#endif - -#if defined(__BORLANDC__) -# include -#endif - -#if defined (__cplusplus) || defined(__STDC__) || defined(IBMPC_SYSTEM) - typedef void *VOID_STAR; -#else - typedef unsigned char *VOID_STAR; -#endif - -typedef int (*FVOID_STAR)(void); - -#if defined(__MSDOS_) && defined(__BORLANDC__) -# define SLFREE(buf) farfree((void far *)(buf)) -# define SLMALLOC(x) farmalloc((unsigned long) (x)) -# define SLREALLOC(buf, n) farrealloc((void far *) (buf), (unsigned long) (n)) -# define SLCALLOC(n, m) farcalloc((unsigned long) (n), (unsigned long) (m)) -#else -# if defined(VMS) && !defined(__DECC) -# define SLFREE VAXC$FREE_OPT -# define SLMALLOC VAXC$MALLOC_OPT -# define SLREALLOC VAXC$REALLOC_OPT -# define SLCALLOC VAXC$CALLOC_OPT -# else -# define SLFREE(x) free((char *)(x)) -# define SLMALLOC malloc -# define SLREALLOC realloc -# define SLCALLOC calloc -# endif -#endif - - extern char *SLdebug_malloc (unsigned long); - extern char *SLdebug_calloc (unsigned long, unsigned long); - extern char *SLdebug_realloc (char *, unsigned long); - extern void SLdebug_free (char *); - extern void SLmalloc_dump_statistics (void); - extern char *SLstrcpy(register char *, register char *); - extern int SLstrcmp(register char *, register char *); - extern char *SLstrncpy(char *, register char *, register int); - - extern void SLmemset (char *, char, int); - extern char *SLmemchr (register char *, register char, register int); - extern char *SLmemcpy (char *, char *, int); - extern int SLmemcmp (char *, char *, int); - -/*}}}*/ - -/*{{{ Interpreter Typedefs */ - -typedef struct _SLang_Name_Type -{ - char *name; - struct _SLang_Name_Type *next; - char name_type; - /* These values must be less than 0x10 because they map directly - * to byte codes. See _slang.h. - */ -#define SLANG_LVARIABLE 0x01 -#define SLANG_GVARIABLE 0x02 -#define SLANG_IVARIABLE 0x03 /* intrinsic variables */ - /* Note!!! For Macro MAKE_VARIABLE below to work, SLANG_IVARIABLE Must - be 1 less than SLANG_RVARIABLE!!! */ -#define SLANG_RVARIABLE 0x04 /* read only variable */ -#define SLANG_INTRINSIC 0x05 -#define SLANG_FUNCTION 0x06 -#define SLANG_MATH_UNARY 0x07 -#define SLANG_APP_UNARY 0x08 -#define SLANG_ICONSTANT 0x09 -#define SLANG_DCONSTANT 0x0A -#define SLANG_PVARIABLE 0x0B /* private */ -#define SLANG_PFUNCTION 0x0C /* private */ - - /* Rest of fields depend on name type */ -} -SLang_Name_Type; - -typedef struct -{ - char *name; - struct _SLang_Name_Type *next; /* this is for the hash table */ - char name_type; - - FVOID_STAR i_fun; /* address of object */ - - /* Do not change this without modifying slang.c:execute_intrinsic_fun */ -#define SLANG_MAX_INTRIN_ARGS 7 - unsigned char arg_types [SLANG_MAX_INTRIN_ARGS]; - unsigned char num_args; - unsigned char return_type; -} -SLang_Intrin_Fun_Type; - -typedef struct -{ - char *name; - SLang_Name_Type *next; - char name_type; - - VOID_STAR addr; - unsigned char type; -} -SLang_Intrin_Var_Type; - -typedef struct -{ - char *name; - SLang_Name_Type *next; - char name_type; - - int unary_op; -} -SLang_App_Unary_Type; - -typedef struct -{ - char *name; - SLang_Name_Type *next; - char name_type; - - int unary_op; -} -SLang_Math_Unary_Type; - -typedef struct -{ - char *name; - SLang_Name_Type *next; - char name_type; - int i; -} -SLang_IConstant_Type; - -typedef struct -{ - char *name; - SLang_Name_Type *next; - char name_type; - double d; -} -SLang_DConstant_Type; - -typedef struct -{ - char *field_name; - unsigned int offset; - unsigned char type; - unsigned char read_only; -} -SLang_IStruct_Field_Type; - -extern int SLadd_intrin_fun_table (SLang_Intrin_Fun_Type *, char *); -extern int SLadd_intrin_var_table (SLang_Intrin_Var_Type *, char *); -extern int SLadd_app_unary_table (SLang_App_Unary_Type *, char *); -extern int SLadd_math_unary_table (SLang_Math_Unary_Type *, char *); -extern int SLadd_iconstant_table (SLang_IConstant_Type *, char *); -extern int SLadd_dconstant_table (SLang_DConstant_Type *, char *); -extern int SLadd_istruct_table (SLang_IStruct_Field_Type *, VOID_STAR, char *); - -typedef struct _SLang_NameSpace_Type SLang_NameSpace_Type; - -extern int SLns_add_intrin_fun_table (SLang_NameSpace_Type *, SLang_Intrin_Fun_Type *, char *); -extern int SLns_add_intrin_var_table (SLang_NameSpace_Type *, SLang_Intrin_Var_Type *, char *); -extern int SLns_add_app_unary_table (SLang_NameSpace_Type *, SLang_App_Unary_Type *, char *); -extern int SLns_add_math_unary_table (SLang_NameSpace_Type *, SLang_Math_Unary_Type *, char *); -extern int SLns_add_iconstant_table (SLang_NameSpace_Type *, SLang_IConstant_Type *, char *); -extern int SLns_add_dconstant_table (SLang_NameSpace_Type *, SLang_DConstant_Type *, char *); -extern int SLns_add_istruct_table (SLang_NameSpace_Type *, SLang_IStruct_Field_Type *, VOID_STAR, char *); - -extern SLang_NameSpace_Type *SLns_create_namespace (char *); -extern void SLns_delete_namespace (SLang_NameSpace_Type *); - -typedef struct SLang_Load_Type -{ - int type; - - VOID_STAR client_data; - /* Pointer to data that client needs for loading */ - - int auto_declare_globals; - /* if non-zero, undefined global variables are declared as static */ - - char *(*read)(struct SLang_Load_Type *); - /* function to call to read next line from obj. */ - - unsigned int line_num; - /* Number of lines read, used for error reporting */ - - int parse_level; - /* 0 if at top level of parsing */ - - char *name; - /* Name of this object, e.g., filename. This name should be unique because - * it alone determines the name space for static objects associated with - * the compilable unit. - */ - - unsigned long reserved[4]; - /* For future expansion */ -} SLang_Load_Type; - -extern SLang_Load_Type *SLallocate_load_type (char *); -extern void SLdeallocate_load_type (SLang_Load_Type *); - -/* Returns SLang_Error upon failure */ -extern int SLang_load_object (SLang_Load_Type *); -extern int (*SLang_Load_File_Hook)(char *); -extern int (*SLang_Auto_Declare_Var_Hook) (char *); - -extern int SLang_generate_debug_info (int); - - -#if defined(ultrix) && !defined(__GNUC__) -# ifndef NO_PROTOTYPES -# define NO_PROTOTYPES -# endif -#endif - -#ifndef NO_PROTOTYPES -# define _PROTO(x) x -#else -# define _PROTO(x) () -#endif - -typedef struct SL_OOBinary_Type -{ - unsigned char data_type; /* partner type for binary op */ - - int (*binary_function)_PROTO((int, - unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR)); - - int (*binary_result) _PROTO((int, unsigned char, unsigned char, unsigned char *)); - struct SL_OOBinary_Type *next; -} -SL_OOBinary_Type; - -typedef struct _SL_Typecast_Type -{ - unsigned char data_type; /* to_type */ - int allow_implicit; - - int (*typecast)_PROTO((unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR)); - struct _SL_Typecast_Type *next; -} -SL_Typecast_Type; - -typedef struct _SLang_Struct_Type SLang_Struct_Type; - -#if defined(SL_APP_WANTS_FOREACH) -/* It is up to the application to define struct _SLang_Foreach_Context_Type */ -typedef struct _SLang_Foreach_Context_Type SLang_Foreach_Context_Type; -#else -typedef int SLang_Foreach_Context_Type; -#endif - -typedef struct -{ - unsigned char cl_class_type; -#define SLANG_CLASS_TYPE_MMT 0 -#define SLANG_CLASS_TYPE_SCALAR 1 -#define SLANG_CLASS_TYPE_VECTOR 2 -#define SLANG_CLASS_TYPE_PTR 3 - - unsigned int cl_data_type; /* SLANG_INTEGER_TYPE, etc... */ - char *cl_name; /* slstring type */ - - unsigned int cl_sizeof_type; - VOID_STAR cl_transfer_buf; /* cl_sizeof_type bytes*/ - - /* Methods */ - - /* Most of the method functions are prototyped: - * int method (unsigned char type, VOID_STAR addr); - * Here, @type@ represents the type of object that the method is asked - * to deal with. The second parameter @addr@ will contain the ADDRESS of - * the object. For example, if type is SLANG_INT_TYPE, then @addr@ will - * actually be int *. Similary, if type is SLANG_STRING_TYPE, - * then @addr@ will contain the address of the string, i.e., char **. - */ - - void (*cl_destroy)_PROTO((unsigned char, VOID_STAR)); - /* Prototype: void destroy(unsigned type, VOID_STAR val) - * Called to delete/free the object */ - - char *(*cl_string)_PROTO((unsigned char, VOID_STAR)); - /* Prototype: char *to_string (unsigned char t, VOID_STAR p); - * Here p is a pointer to the object for which a string representation - * is to be returned. The returned pointer is to be a MALLOCED string. - */ - - /* Prototype: void push(unsigned char type, VOID_STAR v); - * Push a copy of the object of type @type@ at address @v@ onto the - * stack. - */ - int (*cl_push)_PROTO((unsigned char, VOID_STAR)); - - /* Prototype: int pop(unsigned char type, VOID_STAR v); - * Pops value from stack and assign it to object, whose address is @v@. - */ - int (*cl_pop)_PROTO((unsigned char, VOID_STAR)); - - int (*cl_unary_op_result_type)_PROTO((int, unsigned char, unsigned char *)); - int (*cl_unary_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VOID_STAR)); - - int (*cl_app_unary_op_result_type)_PROTO((int, unsigned char, unsigned char *)); - int (*cl_app_unary_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VOID_STAR)); - - /* If this function is non-NULL, it will be called for sin, cos, etc... */ -#define SLMATH_SIN 1 -#define SLMATH_COS 2 -#define SLMATH_TAN 3 -#define SLMATH_ATAN 4 -#define SLMATH_ASIN 5 -#define SLMATH_ACOS 6 -#define SLMATH_EXP 7 -#define SLMATH_LOG 8 -#define SLMATH_SQRT 9 -#define SLMATH_LOG10 10 -#define SLMATH_REAL 11 -#define SLMATH_IMAG 12 -#define SLMATH_SINH 13 -#define SLMATH_COSH 14 -#define SLMATH_TANH 15 -#define SLMATH_ATANH 16 -#define SLMATH_ASINH 17 -#define SLMATH_ACOSH 18 -#define SLMATH_TODOUBLE 19 -#define SLMATH_CONJ 20 - - int (*cl_math_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VOID_STAR)); - int (*cl_math_op_result_type)_PROTO((int, unsigned char, unsigned char *)); - - SL_OOBinary_Type *cl_binary_ops; - SL_Typecast_Type *cl_typecast_funs; - - void (*cl_byte_code_destroy)_PROTO((unsigned char, VOID_STAR)); - void (*cl_user_destroy_fun)_PROTO((unsigned char, VOID_STAR)); - int (*cl_init_array_object)_PROTO((unsigned char, VOID_STAR)); - int (*cl_datatype_deref)_PROTO((unsigned char)); - SLang_Struct_Type *cl_struct_def; - int (*cl_dereference) _PROTO((unsigned char, VOID_STAR)); - int (*cl_acopy) (unsigned char, VOID_STAR, VOID_STAR); - int (*cl_apop) _PROTO((unsigned char, VOID_STAR)); - int (*cl_apush) _PROTO((unsigned char, VOID_STAR)); - int (*cl_push_literal) _PROTO((unsigned char, VOID_STAR)); - void (*cl_adestroy)_PROTO((unsigned char, VOID_STAR)); - int (*cl_push_intrinsic)_PROTO((unsigned char, VOID_STAR)); - int (*cl_void_typecast)_PROTO((unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR)); - - int (*cl_anytype_typecast)_PROTO((unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR)); - - /* Array access functions */ - int (*cl_aput) (unsigned char, unsigned int); - int (*cl_aget) (unsigned char, unsigned int); - int (*cl_anew) (unsigned char, unsigned int); - - /* length method */ - int (*cl_length) (unsigned char, VOID_STAR, unsigned int *); - - /* foreach */ - SLang_Foreach_Context_Type *(*cl_foreach_open) (unsigned char, unsigned int); - void (*cl_foreach_close) (unsigned char, SLang_Foreach_Context_Type *); - int (*cl_foreach) (unsigned char, SLang_Foreach_Context_Type *); - - /* Structure access: get and put (assign to) fields */ - int (*cl_sput) (unsigned char, char *); - int (*cl_sget) (unsigned char, char *); - - /* File I/O */ - int (*cl_fread) (unsigned char, FILE *, VOID_STAR, unsigned int, unsigned int *); - int (*cl_fwrite) (unsigned char, FILE *, VOID_STAR, unsigned int, unsigned int *); - int (*cl_fdread) (unsigned char, int, VOID_STAR, unsigned int, unsigned int *); - int (*cl_fdwrite) (unsigned char, int, VOID_STAR, unsigned int, unsigned int *); - - int (*cl_to_bool) (unsigned char, int *); - - int (*cl_cmp)(unsigned char, VOID_STAR, VOID_STAR, int *); - -} SLang_Class_Type; - -/* These are the low-level functions for building push/pop methods. They - * know nothing about memory management. For SLANG_CLASS_TYPE_MMT, use the - * MMT push/pop functions instead. - */ -extern int SLclass_push_double_obj (unsigned char, double); -extern int SLclass_push_float_obj (unsigned char, float); -extern int SLclass_push_long_obj (unsigned char, long); -extern int SLclass_push_int_obj (unsigned char, int); -extern int SLclass_push_short_obj (unsigned char, short); -extern int SLclass_push_char_obj (unsigned char, char); -extern int SLclass_push_ptr_obj (unsigned char, VOID_STAR); -extern int SLclass_pop_double_obj (unsigned char, double *); -extern int SLclass_pop_float_obj (unsigned char, float *); -extern int SLclass_pop_long_obj (unsigned char, long *); -extern int SLclass_pop_int_obj (unsigned char, int *); -extern int SLclass_pop_short_obj (unsigned char, short *); -extern int SLclass_pop_char_obj (unsigned char, char *); -extern int SLclass_pop_ptr_obj (unsigned char, VOID_STAR *); - -extern SLang_Class_Type *SLclass_allocate_class (char *); -extern int SLclass_get_class_id (SLang_Class_Type *cl); -extern int SLclass_create_synonym (char *, unsigned char); -extern int SLclass_is_class_defined (unsigned char); - -extern int SLclass_register_class (SLang_Class_Type *, unsigned char, unsigned int, unsigned char); -extern int SLclass_set_string_function (SLang_Class_Type *, char *(*)(unsigned char, VOID_STAR)); -extern int SLclass_set_destroy_function (SLang_Class_Type *, void (*)(unsigned char, VOID_STAR)); -extern int SLclass_set_push_function (SLang_Class_Type *, int (*)(unsigned char, VOID_STAR)); -extern int SLclass_set_pop_function (SLang_Class_Type *, int (*)(unsigned char, VOID_STAR)); - -extern int SLclass_set_aget_function (SLang_Class_Type *, int (*)(unsigned char, unsigned int)); -extern int SLclass_set_aput_function (SLang_Class_Type *, int (*)(unsigned char, unsigned int)); -extern int SLclass_set_anew_function (SLang_Class_Type *, int (*)(unsigned char, unsigned int)); - -extern int SLclass_set_sget_function (SLang_Class_Type *, int (*)(unsigned char, char *)); -extern int SLclass_set_sput_function (SLang_Class_Type *, int (*)(unsigned char, char *)); - -/* Typecast object on the stack to type p1. p2 and p3 should be set to 1 */ -extern int SLclass_typecast (unsigned char, int, int); - -extern int SLclass_add_unary_op (unsigned char, - int (*) (int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR), - int (*) (int, unsigned char, unsigned char *)); - -extern int -SLclass_add_app_unary_op (unsigned char, - int (*) (int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR), - int (*) (int, unsigned char, unsigned char *)); - -extern int -SLclass_add_binary_op (unsigned char, unsigned char, - int (*) (int, - unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR), - int (*) (int, unsigned char, unsigned char, unsigned char *)); - -extern int -SLclass_add_math_op (unsigned char, - int (*)(int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR), - int (*)(int, unsigned char, unsigned char *)); - -extern int -SLclass_add_typecast (unsigned char /* from */, unsigned char /* to */, - int (*)_PROTO((unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR)), - int /* allow implicit typecasts */ - ); - -extern char *SLclass_get_datatype_name (unsigned char); - -extern double SLcomplex_abs (double *); -extern double *SLcomplex_times (double *, double *, double *); -extern double *SLcomplex_divide (double *, double *, double *); -extern double *SLcomplex_sin (double *, double *); -extern double *SLcomplex_cos (double *, double *); -extern double *SLcomplex_tan (double *, double *); -extern double *SLcomplex_asin (double *, double *); -extern double *SLcomplex_acos (double *, double *); -extern double *SLcomplex_atan (double *, double *); -extern double *SLcomplex_exp (double *, double *); -extern double *SLcomplex_log (double *, double *); -extern double *SLcomplex_log10 (double *, double *); -extern double *SLcomplex_sqrt (double *, double *); -extern double *SLcomplex_sinh (double *, double *); -extern double *SLcomplex_cosh (double *, double *); -extern double *SLcomplex_tanh (double *, double *); -extern double *SLcomplex_pow (double *, double *, double *); -extern double SLmath_hypot (double x, double y); - -/* Not implemented yet */ -extern double *SLcomplex_asinh (double *, double *); -extern double *SLcomplex_acosh (double *, double *); -extern double *SLcomplex_atanh (double *, double *); - -#ifdef _SLANG_SOURCE_ -typedef struct _SLang_MMT_Type SLang_MMT_Type; -#else -typedef int SLang_MMT_Type; -#endif - -extern void SLang_free_mmt (SLang_MMT_Type *); -extern VOID_STAR SLang_object_from_mmt (SLang_MMT_Type *); -extern SLang_MMT_Type *SLang_create_mmt (unsigned char, VOID_STAR); -extern int SLang_push_mmt (SLang_MMT_Type *); -extern SLang_MMT_Type *SLang_pop_mmt (unsigned char); -extern void SLang_inc_mmt (SLang_MMT_Type *); - -/* Maximum number of dimensions of an array. */ -#define SLARRAY_MAX_DIMS 7 -typedef struct _SLang_Array_Type -{ - unsigned char data_type; - unsigned int sizeof_type; - VOID_STAR data; - unsigned int num_elements; - unsigned int num_dims; - int dims [SLARRAY_MAX_DIMS]; - VOID_STAR (*index_fun)_PROTO((struct _SLang_Array_Type *, int *)); - /* This function is designed to allow a type to store an array in - * any manner it chooses. This function returns the address of the data - * value at the specified index location. - */ - unsigned int flags; -#define SLARR_DATA_VALUE_IS_READ_ONLY 1 -#define SLARR_DATA_VALUE_IS_POINTER 2 -#define SLARR_DATA_VALUE_IS_RANGE 4 -#define SLARR_DATA_VALUE_IS_INTRINSIC 8 - SLang_Class_Type *cl; - unsigned int num_refs; -} -SLang_Array_Type; - -extern int SLang_pop_array_of_type (SLang_Array_Type **, unsigned char); -extern int SLang_pop_array (SLang_Array_Type **, int); -extern int SLang_push_array (SLang_Array_Type *, int); -extern void SLang_free_array (SLang_Array_Type *); -extern SLang_Array_Type *SLang_create_array (unsigned char, int, VOID_STAR, int *, unsigned int); -extern SLang_Array_Type *SLang_duplicate_array (SLang_Array_Type *); -extern int SLang_get_array_element (SLang_Array_Type *, int *, VOID_STAR); -extern int SLang_set_array_element (SLang_Array_Type *, int *, VOID_STAR); - - -/*}}}*/ - -/*{{{ Interpreter Function Prototypes */ - - extern volatile int SLang_Error; -/* Non zero if error occurs. Must be reset to zero to continue. */ -/* error codes, severe errors are less than 0 */ -#define SL_APPLICATION_ERROR -2 -#define SL_VARIABLE_UNINITIALIZED -3 -#define SL_INTERNAL_ERROR -5 -#define SL_STACK_OVERFLOW -6 -#define SL_STACK_UNDERFLOW -7 -#define SL_UNDEFINED_NAME -8 -#define SL_SYNTAX_ERROR -9 -#define SL_DUPLICATE_DEFINITION -10 -#define SL_TYPE_MISMATCH -11 -#define SL_OBJ_UNKNOWN -13 -#define SL_UNKNOWN_ERROR -14 -#define SL_TYPE_UNDEFINED_OP_ERROR -16 - -#define SL_INTRINSIC_ERROR 1 -/* Intrinsic error is an error generated by intrinsic functions */ -#define SL_USER_BREAK 2 -#define SL_DIVIDE_ERROR 3 -#define SL_OBJ_NOPEN 4 -#define SL_USER_ERROR 5 -#define SL_USAGE_ERROR 6 -#define SL_READONLY_ERROR 7 -#define SL_INVALID_PARM 8 -#define SL_NOT_IMPLEMENTED 9 -#define SL_MALLOC_ERROR 10 -#define SL_OVERFLOW 11 -#define SL_FLOATING_EXCEPTION 12 - -/* Compatibility */ -#define USER_BREAK SL_USER_BREAK -#define INTRINSIC_ERROR SL_INTRINSIC_ERROR - - extern int SLang_Traceback; - /* If non-zero, dump an S-Lang traceback upon error. Available as - _traceback in S-Lang. */ - - extern char *SLang_User_Prompt; - /* Prompt to use when reading from stdin */ - extern int SLang_Version; - extern char *SLang_Version_String; -extern char *SLang_Doc_Dir; - -extern void (*SLang_VMessage_Hook) (char *, va_list); -extern void SLang_vmessage (char *, ...); - - extern void (*SLang_Error_Hook)(char *); - /* Pointer to application dependent error messaging routine. By default, - messages are displayed on stderr. */ - - extern void (*SLang_Exit_Error_Hook)(char *, va_list); - extern void SLang_exit_error (char *, ...); - extern void (*SLang_Dump_Routine)(char *); - /* Called if S-Lang traceback is enabled as well as other debugging - routines (e.g., trace). By default, these messages go to stderr. */ - - extern void (*SLang_Interrupt)(void); - /* function to call whenever inner interpreter is entered. This is - a good place to set SLang_Error to USER_BREAK. */ - - extern void (*SLang_User_Clear_Error)(void); - /* function that gets called when '_clear_error' is called. */ - - /* If non null, these call C functions before and after a slang function. */ - extern void (*SLang_Enter_Function)(char *); -extern void (*SLang_Exit_Function)(char *); - -extern int SLang_Num_Function_Args; - -/* Functions: */ - -extern int SLang_init_all (void); -/* Initializes interpreter and all modules */ - -extern int SLang_init_slang (void); -/* This function is mandatory and must be called by all applications that - * use the interpreter - */ -extern int SLang_init_posix_process (void); /* process specific intrinsics */ -extern int SLang_init_stdio (void); /* fgets, etc. stdio functions */ -extern int SLang_init_posix_dir (void); -extern int SLang_init_ospath (void); - -extern int SLang_init_slmath (void); -/* called if math functions sin, cos, etc... are needed. */ - - extern int SLang_init_slfile (void); - extern int SLang_init_slunix (void); - /* These functions are obsolte. Use init_stdio, posix_process, etc. */ - -extern int SLang_init_slassoc (void); -/* Assoc Arrays (Hashes) */ - -extern int SLang_init_array (void); -/* Additional arrays functions: transpose, etc... */ - -/* Dynamic linking facility */ -extern int SLang_init_import (void); - - extern int SLang_load_file (char *); - /* Load a file of S-Lang code for interpreting. If the parameter is - * NULL, input comes from stdin. */ - - extern void SLang_restart(int); - /* should be called if an error occurs. If the passed integer is - * non-zero, items are popped off the stack; otherwise, the stack is - * left intact. Any time the stack is believed to be trashed, this routine - * should be called with a non-zero argument (e.g., if setjmp/longjmp is - * called). */ - - extern int SLang_byte_compile_file(char *, int); - /* takes a file of S-Lang code and ``byte-compiles'' it for faster - * loading. The new filename is equivalent to the old except that a `c' is - * appended to the name. (e.g., init.sl --> init.slc). The second - * specified the method; currently, it is not used. - */ - - extern int SLang_autoload(char *, char *); - /* Automatically load S-Lang function p1 from file p2. This function - is also available via S-Lang */ - - extern int SLang_load_string(char *); - /* Like SLang_load_file except input is from a null terminated string. */ - - extern int SLdo_pop(void); - /* pops item off stack and frees any memory associated with it */ - extern int SLdo_pop_n(unsigned int); - /* pops n items off stack and frees any memory associated with them */ - -extern int SLang_pop_integer(int *); -extern int SLang_pop_uinteger(unsigned int *); - /* pops integer *p0 from the stack. Returns 0 upon success and non-zero - * if the stack is empty or a type mismatch occurs, setting SLang_Error. - */ -extern int SLang_pop_char (char *); -extern int SLang_pop_uchar (unsigned char *); -extern int SLang_pop_short(short *); -extern int SLang_pop_ushort(unsigned short *); -extern int SLang_pop_long(long *); -extern int SLang_pop_ulong(unsigned long *); - -extern int SLang_pop_float(float *); -extern int SLang_pop_double(double *, int *, int *); - /* Pops double *p1 from stack. If *p3 is non-zero, *p1 was derived - from the integer *p2. Returns zero upon success. */ - - extern int SLang_pop_complex (double *, double *); - - extern int SLpop_string (char **); - extern int SLang_pop_string(char **, int *); - /* pops string *p0 from stack. If *p1 is non-zero, the string must be - * freed after its use. DO NOT FREE p0 if *p1 IS ZERO! Returns 0 upon - * success */ - - extern int SLang_push_complex (double, double); - - extern int SLang_push_char (char); - extern int SLang_push_uchar (unsigned char); - - extern int SLang_push_integer(int); - extern int SLang_push_uinteger(unsigned int); - /* push integer p1 on stack */ - - extern int SLang_push_short(short); - extern int SLang_push_ushort(unsigned short); - extern int SLang_push_long(long); - extern int SLang_push_ulong(unsigned long); - extern int SLang_push_float(float); - extern int SLang_push_double(double); - /* Push double onto stack */ - - extern int SLang_push_string(char *); - /* Push string p1 onto stack */ - - extern int SLang_push_malloced_string(char *); - /* The normal SLang_push_string pushes an slstring. This one converts - * a normally malloced string to an slstring, and then frees the - * malloced string. So, do NOT use the malloced string after calling - * this routine because it will be freed! The routine returns -1 upon - * error, but the string will be freed. - */ - -extern int SLang_push_null (void); -extern int SLang_pop_null (void); - -extern int SLang_push_value (unsigned char type, VOID_STAR); -extern int SLang_pop_value (unsigned char type, VOID_STAR); -extern void SLang_free_value (unsigned char type, VOID_STAR); - -typedef struct _SLang_Object_Type SLang_Any_Type; - -extern int SLang_pop_anytype (SLang_Any_Type **); -extern int SLang_push_anytype (SLang_Any_Type *); -extern void SLang_free_anytype (SLang_Any_Type *); - -#ifdef _SLANG_SOURCE_ -typedef struct _SLang_Ref_Type SLang_Ref_Type; -#else -typedef int SLang_Ref_Type; -#endif - -extern int SLang_pop_ref (SLang_Ref_Type **); -extern void SLang_free_ref (SLang_Ref_Type *); -extern int SLang_assign_to_ref (SLang_Ref_Type *, unsigned char, VOID_STAR); -extern SLang_Name_Type *SLang_pop_function (void); -extern SLang_Name_Type *SLang_get_fun_from_ref (SLang_Ref_Type *); -extern void SLang_free_function (SLang_Name_Type *f); - - extern int SLang_is_defined(char *); - /* Return non-zero is p1 is defined otherwise returns 0. */ - - extern int SLang_run_hooks(char *, unsigned int, ...); - /* calls S-Lang function p1 pushing p2 strings in the variable argument - * list onto the stack first. - * Returns -1 upon error, 1 if hooks exists and it ran, - * or 0 if hook does not exist. Thus it returns non-zero is hook was called. - */ - -/* These functions return 1 if the indicated function exists and the function - * runs without error. If the function does not exist, the function returns - * 0. Otherwise -1 is returned with SLang_Error set appropriately. - */ -extern int SLexecute_function (SLang_Name_Type *); -extern int SLang_execute_function(char *); - - -extern int SLang_end_arg_list (void); -extern int SLang_start_arg_list (void); - -extern void SLang_verror (int, char *, ...); - -extern void SLang_doerror(char *); - /* set SLang_Error and display p1 as error message */ - -extern int SLang_add_intrinsic_array (char *, /* name */ - unsigned char, /* type */ - int, /* readonly */ - VOID_STAR, /* data */ - unsigned int, ...); /* num dims */ - -extern int SLextract_list_element (char *, unsigned int, char, - char *, unsigned int); - -extern void SLexpand_escaped_string (register char *, register char *, - register char *); - -extern SLang_Name_Type *SLang_get_function (char *); -extern void SLang_release_function (SLang_Name_Type *); - -extern int SLreverse_stack (int); -extern int SLroll_stack (int); -/* If argument p is positive, the top p objects on the stack are rolled - * up. If negative, the stack is rolled down. - */ -extern int SLdup_n (int n); -/* Duplicate top n elements of stack */ - -extern int SLang_peek_at_stack1 (void); -extern int SLang_peek_at_stack (void); -/* Returns type of next object on stack-- -1 upon stack underflow. */ -extern void SLmake_lut (unsigned char *, unsigned char *, unsigned char); - - extern int SLang_guess_type (char *); - -extern int SLstruct_create_struct (unsigned int, - char **, - unsigned char *, - VOID_STAR *); - -/*}}}*/ - -/*{{{ Misc Functions */ - -/* This is an interface to atexit */ -extern int SLang_add_cleanup_function (void (*)(void)); - -extern char *SLmake_string (char *); -extern char *SLmake_nstring (char *, unsigned int); -/* Returns a null terminated string made from the first n characters of the - * string. - */ - -/* The string created by this routine must be freed by SLang_free_slstring - * and nothing else!! Also these strings must not be modified. Use - * SLmake_string if you intend to modify them!! - */ -extern char *SLang_create_nslstring (char *, unsigned int); -extern char *SLang_create_slstring (char *); -extern void SLang_free_slstring (char *); /* handles NULL */ -extern int SLang_pop_slstring (char **); /* free with SLang_free_slstring */ -extern char *SLang_concat_slstrings (char *a, char *b); -extern char *SLang_create_static_slstring (char *); /* adds a string that will not get deleted */ -extern void SLstring_dump_stats (void); - -/* Binary strings */ -/* The binary string is an opaque type. Use the SLbstring_get_pointer function - * to get a pointer and length. - */ -typedef struct _SLang_BString_Type SLang_BString_Type; -extern unsigned char *SLbstring_get_pointer (SLang_BString_Type *, unsigned int *); - -extern SLang_BString_Type *SLbstring_dup (SLang_BString_Type *); -extern SLang_BString_Type *SLbstring_create (unsigned char *, unsigned int); - -/* The create_malloced function used the first argument which is assumed - * to be a pointer to a len + 1 malloced string. The extra byte is for - * \0 termination. - */ -extern SLang_BString_Type *SLbstring_create_malloced (unsigned char *, unsigned int, int); - -/* Create a bstring from an slstring */ -extern SLang_BString_Type *SLbstring_create_slstring (char *); - -extern void SLbstring_free (SLang_BString_Type *); -extern int SLang_pop_bstring (SLang_BString_Type **); -extern int SLang_push_bstring (SLang_BString_Type *); - -extern char *SLmalloc (unsigned int); -extern char *SLcalloc (unsigned int, unsigned int); -extern void SLfree(char *); /* This function handles NULL */ -extern char *SLrealloc (char *, unsigned int); - -extern char *SLcurrent_time_string (void); - -extern int SLatoi(unsigned char *); -extern long SLatol (unsigned char *); -extern unsigned long SLatoul (unsigned char *); - -extern int SLang_pop_fileptr (SLang_MMT_Type **, FILE **); -extern char *SLang_get_name_from_fileptr (SLang_MMT_Type *); - -typedef struct _SLFile_FD_Type SLFile_FD_Type; -extern SLFile_FD_Type *SLfile_create_fd (char *, int); -extern void SLfile_free_fd (SLFile_FD_Type *); -extern int SLfile_push_fd (SLFile_FD_Type *); -extern int SLfile_pop_fd (SLFile_FD_Type **); -extern int SLfile_get_fd (SLFile_FD_Type *, int *); -extern SLFile_FD_Type *SLfile_dup_fd (SLFile_FD_Type *f0); -extern int SLang_init_posix_io (void); - -typedef double (*SLang_To_Double_Fun_Type)(VOID_STAR); -extern SLang_To_Double_Fun_Type SLarith_get_to_double_fun (unsigned char, unsigned int *); - -extern int SLang_set_argc_argv (int, char **); - -/*}}}*/ - -/*{{{ SLang getkey interface Functions */ - -#ifdef REAL_UNIX_SYSTEM -extern int SLang_TT_Baud_Rate; -extern int SLang_TT_Read_FD; -#endif - -extern int SLang_init_tty (int, int, int); -/* Initializes the tty for single character input. If the first parameter *p1 - * is in the range 0-255, it will be used for the abort character; - * otherwise, (unix only) if it is -1, the abort character will be the one - * used by the terminal. If the second parameter p2 is non-zero, flow - * control is enabled. If the last parmeter p3 is zero, output processing - * is NOT turned on. A value of zero is required for the screen management - * routines. Returns 0 upon success. In addition, if SLang_TT_Baud_Rate == - * 0 when this function is called, SLang will attempt to determine the - * terminals baud rate. As far as the SLang library is concerned, if - * SLang_TT_Baud_Rate is less than or equal to zero, the baud rate is - * effectively infinite. - */ - -extern void SLang_reset_tty (void); -/* Resets tty to what it was prior to a call to SLang_init_tty */ -#ifdef REAL_UNIX_SYSTEM -extern void SLtty_set_suspend_state (int); - /* If non-zero argument, terminal driver will be told to react to the - * suspend character. If 0, it will not. - */ -extern int (*SLang_getkey_intr_hook) (void); -#endif - -#define SLANG_GETKEY_ERROR 0xFFFF -extern unsigned int SLang_getkey (void); -/* reads a single key from the tty. If the read fails, 0xFFFF is returned. */ - -#ifdef IBMPC_SYSTEM -extern int SLgetkey_map_to_ansi (int); -#endif - -extern int SLang_ungetkey_string (unsigned char *, unsigned int); -extern int SLang_buffer_keystring (unsigned char *, unsigned int); -extern int SLang_ungetkey (unsigned char); -extern void SLang_flush_input (void); -extern int SLang_input_pending (int); -extern int SLang_Abort_Char; -/* The value of the character (0-255) used to trigger SIGINT */ -extern int SLang_Ignore_User_Abort; -/* If non-zero, pressing the abort character will not result in USER_BREAK - * SLang_Error. */ - -extern int SLang_set_abort_signal (void (*)(int)); -/* If SIGINT is generated, the function p1 will be called. If p1 is NULL - * the SLang_default signal handler is called. This sets SLang_Error to - * USER_BREAK. I suspect most users will simply want to pass NULL. - */ -extern unsigned int SLang_Input_Buffer_Len; - -extern volatile int SLKeyBoard_Quit; - -#ifdef VMS -/* If this function returns -1, ^Y will be added to input buffer. */ -extern int (*SLtty_VMS_Ctrl_Y_Hook) (void); -#endif -/*}}}*/ - -/*{{{ SLang Keymap routines */ - -typedef struct SLKeymap_Function_Type -{ - char *name; - int (*f)(void); -} -SLKeymap_Function_Type; - -#define SLANG_MAX_KEYMAP_KEY_SEQ 14 -typedef struct SLang_Key_Type -{ - struct SLang_Key_Type *next; - union - { - char *s; - FVOID_STAR f; - unsigned int keysym; - } - f; - unsigned char type; /* type of function */ -#define SLKEY_F_INTERPRET 0x01 -#define SLKEY_F_INTRINSIC 0x02 -#define SLKEY_F_KEYSYM 0x03 - unsigned char str[SLANG_MAX_KEYMAP_KEY_SEQ + 1];/* key sequence */ -} -SLang_Key_Type; - -typedef struct SLKeyMap_List_Type -{ - char *name; /* hashed string */ - SLang_Key_Type *keymap; - SLKeymap_Function_Type *functions; /* intrinsic functions */ -} -SLKeyMap_List_Type; - -/* This is arbitrary but I have got to start somewhere */ -#define SLANG_MAX_KEYMAPS 30 -extern SLKeyMap_List_Type SLKeyMap_List[SLANG_MAX_KEYMAPS]; - -extern char *SLang_process_keystring(char *); - -extern int SLkm_define_key (char *, FVOID_STAR, SLKeyMap_List_Type *); - -extern int SLang_define_key(char *, char *, SLKeyMap_List_Type *); -/* Like define_key1 except that p2 is a string that is to be associated with - * a function in the functions field of p3. This routine calls define_key1. - */ - -extern int SLkm_define_keysym (char *, unsigned int, SLKeyMap_List_Type *); - -extern void SLang_undefine_key(char *, SLKeyMap_List_Type *); - -extern SLKeyMap_List_Type *SLang_create_keymap(char *, SLKeyMap_List_Type *); -/* create and returns a pointer to a new keymap named p1 created by copying - * keymap p2. If p2 is NULL, it is up to the calling routine to initialize - * the keymap. - */ - -extern char *SLang_make_keystring(unsigned char *); - -extern SLang_Key_Type *SLang_do_key(SLKeyMap_List_Type *, int (*)(void)); -/* read a key using keymap p1 with getkey function p2 */ - -extern - FVOID_STAR - SLang_find_key_function(char *, SLKeyMap_List_Type *); - -extern SLKeyMap_List_Type *SLang_find_keymap(char *); - -extern int SLang_Last_Key_Char; -extern int SLang_Key_TimeOut_Flag; - -/*}}}*/ - -/*{{{ SLang Readline Interface */ - -typedef struct SLang_Read_Line_Type -{ - struct SLang_Read_Line_Type *prev, *next; - unsigned char *buf; - int buf_len; /* number of chars in the buffer */ - int num; /* num and misc are application specific*/ - int misc; -} SLang_Read_Line_Type; - -/* Maximum size of display */ -#define SLRL_DISPLAY_BUFFER_SIZE 256 - -typedef struct -{ - SLang_Read_Line_Type *root, *tail, *last; - unsigned char *buf; /* edit buffer */ - int buf_len; /* sizeof buffer */ - int point; /* current editing point */ - int tab; /* tab width */ - int len; /* current line size */ - - /* display variables */ - int edit_width; /* length of display field */ - int curs_pos; /* current column */ - int start_column; /* column offset of display */ - int dhscroll; /* amount to use for horiz scroll */ - char *prompt; - - FVOID_STAR last_fun; /* last function executed by rl */ - - /* These two contain an image of what is on the display */ - unsigned char upd_buf1[SLRL_DISPLAY_BUFFER_SIZE]; - unsigned char upd_buf2[SLRL_DISPLAY_BUFFER_SIZE]; - unsigned char *old_upd, *new_upd; /* pointers to previous two buffers */ - int new_upd_len, old_upd_len; /* length of output buffers */ - - SLKeyMap_List_Type *keymap; - - /* tty variables */ - unsigned int flags; /* */ -#define SL_RLINE_NO_ECHO 1 -#define SL_RLINE_USE_ANSI 2 -#define SL_RLINE_BLINK_MATCH 4 - unsigned int (*getkey)(void); /* getkey function -- required */ - void (*tt_goto_column)(int); - void (*tt_insert)(char); - void (*update_hook)(unsigned char *, int, int); - /* The update hook is called with a pointer to a buffer p1 that contains - * an image of what the update hook is suppoed to produce. The length - * of the buffer is p2 and after the update, the cursor is to be placed - * in column p3. - */ - /* This function is only called when blinking matches */ - int (*input_pending)(int); - unsigned long reserved[4]; -} SLang_RLine_Info_Type; - -extern int SLang_RL_EOF_Char; - -extern SLang_Read_Line_Type * SLang_rline_save_line (SLang_RLine_Info_Type *); -extern int SLang_init_readline (SLang_RLine_Info_Type *); -extern int SLang_read_line (SLang_RLine_Info_Type *); -extern int SLang_rline_insert (char *); -extern void SLrline_redraw (SLang_RLine_Info_Type *); -extern int SLang_Rline_Quit; - -/*}}}*/ - -/*{{{ Low Level Screen Output Interface */ - -extern unsigned long SLtt_Num_Chars_Output; -extern int SLtt_Baud_Rate; - -typedef unsigned long SLtt_Char_Type; - -#define SLTT_BOLD_MASK 0x01000000UL -#define SLTT_BLINK_MASK 0x02000000UL -#define SLTT_ULINE_MASK 0x04000000UL -#define SLTT_REV_MASK 0x08000000UL -#define SLTT_ALTC_MASK 0x10000000UL - -extern int SLtt_Screen_Rows; -extern int SLtt_Screen_Cols; -extern int SLtt_Term_Cannot_Insert; -extern int SLtt_Term_Cannot_Scroll; -extern int SLtt_Use_Ansi_Colors; -extern int SLtt_Ignore_Beep; -#if defined(REAL_UNIX_SYSTEM) -extern int SLtt_Force_Keypad_Init; -extern int SLang_TT_Write_FD; -#endif - -#ifndef IBMPC_SYSTEM -extern char *SLtt_Graphics_Char_Pairs; -#endif - -#ifndef __GO32__ -#if defined(VMS) || defined(REAL_UNIX_SYSTEM) -extern int SLtt_Blink_Mode; -extern int SLtt_Use_Blink_For_ACS; -extern int SLtt_Newline_Ok; -extern int SLtt_Has_Alt_Charset; -extern int SLtt_Has_Status_Line; /* if 0, NO. If > 0, YES, IF -1, ?? */ -# ifndef VMS -extern int SLtt_Try_Termcap; -# endif -#endif -#endif - -#if defined(IBMPC_SYSTEM) -extern int SLtt_Msdos_Cheap_Video; -#endif - -typedef unsigned short SLsmg_Char_Type; -#define SLSMG_EXTRACT_CHAR(x) ((x) & 0xFF) -#define SLSMG_EXTRACT_COLOR(x) (((x)>>8)&0xFF) -#define SLSMG_BUILD_CHAR(ch,color) (((SLsmg_Char_Type)(unsigned char)(ch))|((color)<<8)) - -extern int SLtt_flush_output (void); -extern void SLtt_set_scroll_region(int, int); -extern void SLtt_reset_scroll_region(void); -extern void SLtt_reverse_video (int); -extern void SLtt_bold_video (void); -extern void SLtt_begin_insert(void); -extern void SLtt_end_insert(void); -extern void SLtt_del_eol(void); -extern void SLtt_goto_rc (int, int); -extern void SLtt_delete_nlines(int); -extern void SLtt_delete_char(void); -extern void SLtt_erase_line(void); -extern void SLtt_normal_video(void); -extern void SLtt_cls(void); -extern void SLtt_beep(void); -extern void SLtt_reverse_index(int); -extern void SLtt_smart_puts(SLsmg_Char_Type *, SLsmg_Char_Type *, int, int); -extern void SLtt_write_string (char *); -extern void SLtt_putchar(char); -extern int SLtt_init_video (void); -extern int SLtt_reset_video (void); -extern void SLtt_get_terminfo(void); -extern void SLtt_get_screen_size (void); -extern int SLtt_set_cursor_visibility (int); - -extern int SLtt_set_mouse_mode (int, int); - -#if defined(VMS) || defined(REAL_UNIX_SYSTEM) -extern int SLtt_initialize (char *); -extern void SLtt_enable_cursor_keys(void); -extern void SLtt_set_term_vtxxx(int *); -extern void SLtt_set_color_esc (int, char *); -extern void SLtt_wide_width(void); -extern void SLtt_narrow_width(void); -extern void SLtt_set_alt_char_set (int); -extern int SLtt_write_to_status_line (char *, int); -extern void SLtt_disable_status_line (void); -# ifdef REAL_UNIX_SYSTEM -/* These are termcap/terminfo routines that assume SLtt_initialize has - * been called. - */ -extern char *SLtt_tgetstr (char *); -extern int SLtt_tgetnum (char *); -extern int SLtt_tgetflag (char *); - -/* The following are terminfo-only routines -- these prototypes will change - * in V2.x. - */ -extern char *SLtt_tigetent (char *); -extern char *SLtt_tigetstr (char *, char **); -extern int SLtt_tigetnum (char *, char **); -# endif -#endif - -extern SLtt_Char_Type SLtt_get_color_object (int); -extern void SLtt_set_color_object (int, SLtt_Char_Type); -extern void SLtt_set_color (int, char *, char *, char *); -extern void SLtt_set_mono (int, char *, SLtt_Char_Type); -extern void SLtt_add_color_attribute (int, SLtt_Char_Type); -extern void SLtt_set_color_fgbg (int, SLtt_Char_Type, SLtt_Char_Type); - -/*}}}*/ - -/*{{{ SLang Preprocessor Interface */ - -typedef struct -{ - int this_level; - int exec_level; - int prev_exec_level; - char preprocess_char; - char comment_char; - unsigned char flags; -#define SLPREP_BLANK_LINES_OK 1 -#define SLPREP_COMMENT_LINES_OK 2 -} -SLPreprocess_Type; - -extern int SLprep_open_prep (SLPreprocess_Type *); -extern void SLprep_close_prep (SLPreprocess_Type *); -extern int SLprep_line_ok (char *, SLPreprocess_Type *); - extern int SLdefine_for_ifdef (char *); - /* Adds a string to the SLang #ifdef preparsing defines. SLang already - defines MSDOS, UNIX, and VMS on the appropriate system. */ -extern int (*SLprep_exists_hook) (char *, char); - -/*}}}*/ - -/*{{{ SLsmg Screen Management Functions */ - -extern void SLsmg_fill_region (int, int, unsigned int, unsigned int, unsigned char); -extern void SLsmg_set_char_set (int); -#ifndef IBMPC_SYSTEM -extern int SLsmg_Scroll_Hash_Border; -#endif -extern int SLsmg_suspend_smg (void); -extern int SLsmg_resume_smg (void); -extern void SLsmg_erase_eol (void); -extern void SLsmg_gotorc (int, int); -extern void SLsmg_erase_eos (void); -extern void SLsmg_reverse_video (void); -extern void SLsmg_set_color (int); -extern void SLsmg_normal_video (void); -extern void SLsmg_printf (char *, ...); -extern void SLsmg_vprintf (char *, va_list); -extern void SLsmg_write_string (char *); -extern void SLsmg_write_nstring (char *, unsigned int); -extern void SLsmg_write_char (char); -extern void SLsmg_write_nchars (char *, unsigned int); -extern void SLsmg_write_wrapped_string (char *, int, int, unsigned int, unsigned int, int); -extern void SLsmg_cls (void); -extern void SLsmg_refresh (void); -extern void SLsmg_touch_lines (int, unsigned int); -extern void SLsmg_touch_screen (void); -extern int SLsmg_init_smg (void); -extern int SLsmg_reinit_smg (void); -extern void SLsmg_reset_smg (void); -extern SLsmg_Char_Type SLsmg_char_at(void); -extern void SLsmg_set_screen_start (int *, int *); -extern void SLsmg_draw_hline (unsigned int); -extern void SLsmg_draw_vline (int); -extern void SLsmg_draw_object (int, int, unsigned char); -extern void SLsmg_draw_box (int, int, unsigned int, unsigned int); -extern int SLsmg_get_column(void); -extern int SLsmg_get_row(void); -extern void SLsmg_forward (int); -extern void SLsmg_write_color_chars (SLsmg_Char_Type *, unsigned int); -extern unsigned int SLsmg_read_raw (SLsmg_Char_Type *, unsigned int); -extern unsigned int SLsmg_write_raw (SLsmg_Char_Type *, unsigned int); -extern void SLsmg_set_color_in_region (int, int, int, unsigned int, unsigned int); -extern int SLsmg_Display_Eight_Bit; -extern int SLsmg_Tab_Width; - -#define SLSMG_NEWLINE_IGNORED 0 /* default */ -#define SLSMG_NEWLINE_MOVES 1 /* moves to next line, column 0 */ -#define SLSMG_NEWLINE_SCROLLS 2 /* moves but scrolls at bottom of screen */ -#define SLSMG_NEWLINE_PRINTABLE 3 /* prints as ^J */ -extern int SLsmg_Newline_Behavior; - -extern int SLsmg_Backspace_Moves; - -#ifdef IBMPC_SYSTEM -# define SLSMG_HLINE_CHAR 0xC4 -# define SLSMG_VLINE_CHAR 0xB3 -# define SLSMG_ULCORN_CHAR 0xDA -# define SLSMG_URCORN_CHAR 0xBF -# define SLSMG_LLCORN_CHAR 0xC0 -# define SLSMG_LRCORN_CHAR 0xD9 -# define SLSMG_RTEE_CHAR 0xB4 -# define SLSMG_LTEE_CHAR 0xC3 -# define SLSMG_UTEE_CHAR 0xC2 -# define SLSMG_DTEE_CHAR 0xC1 -# define SLSMG_PLUS_CHAR 0xC5 -/* There are several to choose from: 0xB0, 0xB1, and 0xB2 */ -# define SLSMG_CKBRD_CHAR 0xB0 -# define SLSMG_DIAMOND_CHAR 0x04 -# define SLSMG_DEGREE_CHAR 0xF8 -# define SLSMG_PLMINUS_CHAR 0xF1 -# define SLSMG_BULLET_CHAR 0xF9 -# define SLSMG_LARROW_CHAR 0x1B -# define SLSMG_RARROW_CHAR 0x1A -# define SLSMG_DARROW_CHAR 0x19 -# define SLSMG_UARROW_CHAR 0x18 -# define SLSMG_BOARD_CHAR 0xB2 -# define SLSMG_BLOCK_CHAR 0xDB -#else -# if defined(AMIGA) -# define SLSMG_HLINE_CHAR '-' -# define SLSMG_VLINE_CHAR '|' -# define SLSMG_ULCORN_CHAR '+' -# define SLSMG_URCORN_CHAR '+' -# define SLSMG_LLCORN_CHAR '+' -# define SLSMG_LRCORN_CHAR '+' -# define SLSMG_CKBRD_CHAR '#' -# define SLSMG_RTEE_CHAR '+' -# define SLSMG_LTEE_CHAR '+' -# define SLSMG_UTEE_CHAR '+' -# define SLSMG_DTEE_CHAR '+' -# define SLSMG_PLUS_CHAR '+' -# define SLSMG_DIAMOND_CHAR '+' -# define SLSMG_DEGREE_CHAR '\\' -# define SLSMG_PLMINUS_CHAR '#' -# define SLSMG_BULLET_CHAR 'o' -# define SLSMG_LARROW_CHAR '<' -# define SLSMG_RARROW_CHAR '>' -# define SLSMG_DARROW_CHAR 'v' -# define SLSMG_UARROW_CHAR '^' -# define SLSMG_BOARD_CHAR '#' -# define SLSMG_BLOCK_CHAR '#' -# else -# define SLSMG_HLINE_CHAR 'q' -# define SLSMG_VLINE_CHAR 'x' -# define SLSMG_ULCORN_CHAR 'l' -# define SLSMG_URCORN_CHAR 'k' -# define SLSMG_LLCORN_CHAR 'm' -# define SLSMG_LRCORN_CHAR 'j' -# define SLSMG_CKBRD_CHAR 'a' -# define SLSMG_RTEE_CHAR 'u' -# define SLSMG_LTEE_CHAR 't' -# define SLSMG_UTEE_CHAR 'w' -# define SLSMG_DTEE_CHAR 'v' -# define SLSMG_PLUS_CHAR 'n' -# define SLSMG_DIAMOND_CHAR '`' -# define SLSMG_DEGREE_CHAR 'f' -# define SLSMG_PLMINUS_CHAR 'g' -# define SLSMG_BULLET_CHAR '~' -# define SLSMG_LARROW_CHAR ',' -# define SLSMG_RARROW_CHAR '+' -# define SLSMG_DARROW_CHAR '.' -# define SLSMG_UARROW_CHAR '-' -# define SLSMG_BOARD_CHAR 'h' -# define SLSMG_BLOCK_CHAR '0' -# endif /* AMIGA */ -#endif /* IBMPC_SYSTEM */ - -#ifndef IBMPC_SYSTEM -# define SLSMG_COLOR_BLACK 0x000000 -# define SLSMG_COLOR_RED 0x000001 -# define SLSMG_COLOR_GREEN 0x000002 -# define SLSMG_COLOR_BROWN 0x000003 -# define SLSMG_COLOR_BLUE 0x000004 -# define SLSMG_COLOR_MAGENTA 0x000005 -# define SLSMG_COLOR_CYAN 0x000006 -# define SLSMG_COLOR_LGRAY 0x000007 -# define SLSMG_COLOR_GRAY 0x000008 -# define SLSMG_COLOR_BRIGHT_RED 0x000009 -# define SLSMG_COLOR_BRIGHT_GREEN 0x00000A -# define SLSMG_COLOR_BRIGHT_BROWN 0x00000B -# define SLSMG_COLOR_BRIGHT_BLUE 0x00000C -# define SLSMG_COLOR_BRIGHT_CYAN 0x00000D -# define SLSMG_COLOR_BRIGHT_MAGENTA 0x00000E -# define SLSMG_COLOR_BRIGHT_WHITE 0x00000F -#endif - -typedef struct -{ - void (*tt_normal_video)(void); - void (*tt_set_scroll_region)(int, int); - void (*tt_goto_rc)(int, int); - void (*tt_reverse_index)(int); - void (*tt_reset_scroll_region)(void); - void (*tt_delete_nlines)(int); - void (*tt_cls) (void); - void (*tt_del_eol) (void); - void (*tt_smart_puts) (SLsmg_Char_Type *, SLsmg_Char_Type *, int, int); - int (*tt_flush_output) (void); - int (*tt_reset_video) (void); - int (*tt_init_video) (void); - - int *tt_screen_rows; - int *tt_screen_cols; - - int *tt_term_cannot_scroll; - int *tt_has_alt_charset; - int *tt_use_blink_for_acs; - char **tt_graphic_char_pairs; - - long reserved[4]; -} -SLsmg_Term_Type; -extern void SLsmg_set_terminal_info (SLsmg_Term_Type *); - -/*}}}*/ - -/*{{{ SLang Keypad Interface */ - -#define SL_KEY_ERR 0xFFFF - -#define SL_KEY_UP 0x101 -#define SL_KEY_DOWN 0x102 -#define SL_KEY_LEFT 0x103 -#define SL_KEY_RIGHT 0x104 -#define SL_KEY_PPAGE 0x105 -#define SL_KEY_NPAGE 0x106 -#define SL_KEY_HOME 0x107 -#define SL_KEY_END 0x108 -#define SL_KEY_A1 0x109 -#define SL_KEY_A3 0x10A -#define SL_KEY_B2 0x10B -#define SL_KEY_C1 0x10C -#define SL_KEY_C3 0x10D -#define SL_KEY_REDO 0x10E -#define SL_KEY_UNDO 0x10F -#define SL_KEY_BACKSPACE 0x110 -#define SL_KEY_ENTER 0x111 -#define SL_KEY_IC 0x112 -#define SL_KEY_DELETE 0x113 - -#define SL_KEY_F0 0x200 -#define SL_KEY_F(X) (SL_KEY_F0 + X) - -/* I do not intend to use keysymps > 0x1000. Applications can use those. */ -/* Returns 0 upon success or -1 upon error. */ -extern int SLkp_define_keysym (char *, unsigned int); - -/* This function must be called AFTER SLtt_get_terminfo and not before. */ -extern int SLkp_init (void); - -/* This function uses SLang_getkey and assumes that what ever initialization - * is required for SLang_getkey has been performed. - */ -extern int SLkp_getkey (void); - -/*}}}*/ - -/*{{{ SLang Scroll Interface */ - -typedef struct _SLscroll_Type -{ - struct _SLscroll_Type *next; - struct _SLscroll_Type *prev; - unsigned int flags; -} -SLscroll_Type; - -typedef struct -{ - unsigned int flags; - SLscroll_Type *top_window_line; /* list element at top of window */ - SLscroll_Type *bot_window_line; /* list element at bottom of window */ - SLscroll_Type *current_line; /* current list element */ - SLscroll_Type *lines; /* first list element */ - unsigned int nrows; /* number of rows in window */ - unsigned int hidden_mask; /* applied to flags in SLscroll_Type */ - unsigned int line_num; /* current line number (visible) */ - unsigned int num_lines; /* total number of lines (visible) */ - unsigned int window_row; /* row of current_line in window */ - unsigned int border; /* number of rows that form scroll border */ - int cannot_scroll; /* should window scroll or recenter */ -} -SLscroll_Window_Type; - -extern int SLscroll_find_top (SLscroll_Window_Type *); -extern int SLscroll_find_line_num (SLscroll_Window_Type *); -extern unsigned int SLscroll_next_n (SLscroll_Window_Type *, unsigned int); -extern unsigned int SLscroll_prev_n (SLscroll_Window_Type *, unsigned int); -extern int SLscroll_pageup (SLscroll_Window_Type *); -extern int SLscroll_pagedown (SLscroll_Window_Type *); - -/*}}}*/ - -/*{{{ Signal Routines */ - -typedef void SLSig_Fun_Type (int); -extern SLSig_Fun_Type *SLsignal (int, SLSig_Fun_Type *); -extern SLSig_Fun_Type *SLsignal_intr (int, SLSig_Fun_Type *); -extern int SLsig_block_signals (void); -extern int SLsig_unblock_signals (void); -extern int SLsystem (char *); - -extern char *SLerrno_strerror (int); -extern int SLerrno_set_errno (int); - -/*}}}*/ - -/*{{{ Interpreter Macro Definitions */ - -/* The definitions here are for objects that may be on the run-time stack. - * They are actually sub_types of literal and data main_types. The actual - * numbers are historical. - */ -#define SLANG_UNDEFINED_TYPE 0x00 /* MUST be 0 */ -#define SLANG_VOID_TYPE 0x01 /* also matches ANY type */ -#define SLANG_INT_TYPE 0x02 -#define SLANG_DOUBLE_TYPE 0x03 -#define SLANG_CHAR_TYPE 0x04 -#define SLANG_INTP_TYPE 0x05 -/* An object of SLANG_INTP_TYPE should never really occur on the stack. Rather, - * the integer to which it refers will be there instead. It is defined here - * because it is a valid type for MAKE_VARIABLE. - */ -#define SLANG_REF_TYPE 0x06 -/* SLANG_REF_TYPE refers to an object on the stack that is a pointer (reference) - * to some other object. - */ -#define SLANG_COMPLEX_TYPE 0x07 -#define SLANG_NULL_TYPE 0x08 -#define SLANG_UCHAR_TYPE 0x09 -#define SLANG_SHORT_TYPE 0x0A -#define SLANG_USHORT_TYPE 0x0B -#define SLANG_UINT_TYPE 0x0C -#define SLANG_LONG_TYPE 0x0D -#define SLANG_ULONG_TYPE 0x0E -#define SLANG_STRING_TYPE 0x0F -#define SLANG_FLOAT_TYPE 0x10 -#define SLANG_STRUCT_TYPE 0x11 -#define SLANG_ISTRUCT_TYPE 0x12 -#define SLANG_ARRAY_TYPE 0x20 -#define SLANG_DATATYPE_TYPE 0x21 -#define SLANG_FILE_PTR_TYPE 0x22 -#define SLANG_ASSOC_TYPE 0x23 -#define SLANG_ANY_TYPE 0x24 -#define SLANG_BSTRING_TYPE 0x25 -#define SLANG_FILE_FD_TYPE 0x26 - -/* Compatibility */ -#ifdef FLOAT_TYPE -# undef FLOAT_TYPE -#endif -#define VOID_TYPE SLANG_VOID_TYPE -#define INT_TYPE SLANG_INT_TYPE -#define INTP_TYPE SLANG_INTP_TYPE -#define FLOAT_TYPE SLANG_DOUBLE_TYPE -#define ARRAY_TYPE SLANG_ARRAY_TYPE -#define CHAR_TYPE SLANG_CHAR_TYPE -#define STRING_TYPE SLANG_STRING_TYPE - -/* I am reserving values greater than or equal to 128 for user applications. - * The first 127 are reserved for S-Lang. - */ - -/* Binary and Unary Subtypes */ -/* Since the application can define new types and can overload the binary - * and unary operators, these definitions must be present in this file. - * The current implementation assumes both unary and binary are distinct. - */ -#define SLANG_PLUS 0x01 -#define SLANG_MINUS 0x02 -#define SLANG_TIMES 0x03 -#define SLANG_DIVIDE 0x04 -#define SLANG_EQ 0x05 -#define SLANG_NE 0x06 -#define SLANG_GT 0x07 -#define SLANG_GE 0x08 -#define SLANG_LT 0x09 -#define SLANG_LE 0x0A -#define SLANG_POW 0x0B -#define SLANG_OR 0x0C -#define SLANG_AND 0x0D -#define SLANG_BAND 0x0E -#define SLANG_BOR 0x0F -#define SLANG_BXOR 0x10 -#define SLANG_SHL 0x11 -#define SLANG_SHR 0x12 -#define SLANG_MOD 0x13 - -/* UNARY subtypes (may be overloaded) */ -#define SLANG_PLUSPLUS 0x20 -#define SLANG_MINUSMINUS 0x21 -#define SLANG_ABS 0x22 -#define SLANG_SIGN 0x23 -#define SLANG_SQR 0x24 -#define SLANG_MUL2 0x25 -#define SLANG_CHS 0x26 -#define SLANG_NOT 0x27 -#define SLANG_BNOT 0x28 - -extern char *SLang_Error_Message; - -int SLadd_intrinsic_variable (char *, VOID_STAR, unsigned char, int); -int SLadd_intrinsic_function (char *, FVOID_STAR, unsigned char, unsigned int,...); - -int SLns_add_intrinsic_variable (SLang_NameSpace_Type *, char *, VOID_STAR, unsigned char, int); -int SLns_add_intrinsic_function (SLang_NameSpace_Type *, char *, FVOID_STAR, unsigned char, unsigned int,...); - -extern void SLadd_at_handler (long *, char *); - -#define MAKE_INTRINSIC_N(n,f,out,in,a1,a2,a3,a4,a5,a6,a7) \ - {(n), NULL, SLANG_INTRINSIC, (FVOID_STAR) (f), \ - {a1,a2,a3,a4,a5,a6,a7}, (in), (out)} - -#define MAKE_INTRINSIC_7(n,f,out,a1,a2,a3,a4,a5,a6,a7) \ - MAKE_INTRINSIC_N(n,f,out,7,a1,a2,a3,a4,a5,a6,a7) -#define MAKE_INTRINSIC_6(n,f,out,a1,a2,a3,a4,a5,a6) \ - MAKE_INTRINSIC_N(n,f,out,6,a1,a2,a3,a4,a5,a6,0) -#define MAKE_INTRINSIC_5(n,f,out,a1,a2,a3,a4,a5) \ - MAKE_INTRINSIC_N(n,f,out,5,a1,a2,a3,a4,a5,0,0) -#define MAKE_INTRINSIC_4(n,f,out,a1,a2,a3,a4) \ - MAKE_INTRINSIC_N(n,f,out,4,a1,a2,a3,a4,0,0,0) -#define MAKE_INTRINSIC_3(n,f,out,a1,a2,a3) \ - MAKE_INTRINSIC_N(n,f,out,3,a1,a2,a3,0,0,0,0) -#define MAKE_INTRINSIC_2(n,f,out,a1,a2) \ - MAKE_INTRINSIC_N(n,f,out,2,a1,a2,0,0,0,0,0) -#define MAKE_INTRINSIC_1(n,f,out,a1) \ - MAKE_INTRINSIC_N(n,f,out,1,a1,0,0,0,0,0,0) -#define MAKE_INTRINSIC_0(n,f,out) \ - MAKE_INTRINSIC_N(n,f,out,0,0,0,0,0,0,0,0) - -#define MAKE_INTRINSIC_S(n,f,r) \ - MAKE_INTRINSIC_1(n,f,r,SLANG_STRING_TYPE) -#define MAKE_INTRINSIC_I(n,f,r) \ - MAKE_INTRINSIC_1(n,f,r,SLANG_INT_TYPE) - -#define MAKE_INTRINSIC_SS(n,f,r) \ - MAKE_INTRINSIC_2(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE) -#define MAKE_INTRINSIC_SI(n,f,r) \ - MAKE_INTRINSIC_2(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE) -#define MAKE_INTRINSIC_IS(n,f,r) \ - MAKE_INTRINSIC_2(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE) -#define MAKE_INTRINSIC_II(n,f,r) \ - MAKE_INTRINSIC_2(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE) - -#define MAKE_INTRINSIC_SSS(n,f,r) \ - MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE,SLANG_STRING_TYPE) -#define MAKE_INTRINSIC_SSI(n,f,r) \ - MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE,SLANG_INT_TYPE) -#define MAKE_INTRINSIC_SIS(n,f,r) \ - MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE,SLANG_STRING_TYPE) -#define MAKE_INTRINSIC_SII(n,f,r) \ - MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE,SLANG_INT_TYPE) -#define MAKE_INTRINSIC_ISS(n,f,r) \ - MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE,SLANG_STRING_TYPE) -#define MAKE_INTRINSIC_ISI(n,f,r) \ - MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE,SLANG_INT_TYPE) -#define MAKE_INTRINSIC_IIS(n,f,r) \ - MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE,SLANG_STRING_TYPE) -#define MAKE_INTRINSIC_III(n,f,r) \ - MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE,SLANG_INT_TYPE) - -#define MAKE_INTRINSIC(n, f, out, in) \ - MAKE_INTRINSIC_N(n,f,out,in,0,0,0,0,0,0,0) - -#define MAKE_VARIABLE(n, v, t, r) \ - {n, NULL, SLANG_IVARIABLE + (r), (VOID_STAR)(v), (t)} - -#define MAKE_APP_UNARY(n,op) \ - {(n), NULL, SLANG_APP_UNARY, (op)} - -#define MAKE_MATH_UNARY(n,op) \ - {(n), NULL, SLANG_MATH_UNARY, (op)} - -#define MAKE_ICONSTANT(n,val) \ - {(n),NULL, SLANG_ICONSTANT, (val)} - -#define MAKE_DCONSTANT(n,val) \ - {(n),NULL, SLANG_DCONSTANT, (val)} - -#ifndef offsetof -# define offsetof(T,F) ((unsigned int)((char *)&((T *)0L)->F - (char *)0L)) -#endif -#define MAKE_ISTRUCT_FIELD(s,f,n,t,r) {(n), offsetof(s,f), (t), (r)} - -#define SLANG_END_TABLE {NULL} -#define SLANG_END_INTRIN_FUN_TABLE MAKE_INTRINSIC_0(NULL,NULL,0) -#define SLANG_END_DCONST_TABLE MAKE_DCONSTANT(NULL,0) -#define SLANG_END_MATH_UNARY_TABLE MAKE_MATH_UNARY(NULL,0) -#define SLANG_END_INTRIN_VAR_TABLE MAKE_VARIABLE(NULL,NULL,0,0) -#define SLANG_END_ICONST_TABLE MAKE_ICONSTANT(NULL,0) -#define SLANG_END_ISTRUCT_TABLE {NULL, 0, 0, 0} - - - -/*}}}*/ - -/*{{{ Upper/Lowercase Functions */ - -extern void SLang_define_case(int *, int *); -extern void SLang_init_case_tables (void); - -extern unsigned char _SLChg_UCase_Lut[256]; -extern unsigned char _SLChg_LCase_Lut[256]; -#define UPPER_CASE(x) (_SLChg_UCase_Lut[(unsigned char) (x)]) -#define LOWER_CASE(x) (_SLChg_LCase_Lut[(unsigned char) (x)]) -#define CHANGE_CASE(x) (((x) == _SLChg_LCase_Lut[(unsigned char) (x)]) ?\ - _SLChg_UCase_Lut[(unsigned char) (x)] : _SLChg_LCase_Lut[(unsigned char) (x)]) - -/*}}}*/ - -/*{{{ Regular Expression Interface */ - -typedef struct -{ - /* These must be set by calling routine. */ - unsigned char *pat; /* regular expression pattern */ - unsigned char *buf; /* buffer for compiled regexp */ - unsigned int buf_len; /* length of buffer */ - int case_sensitive; /* 1 if match is case sensitive */ - - /* The rest are set by SLang_regexp_compile */ - - int must_match; /* 1 if line must contain substring */ - int must_match_bol; /* true if it must match beginning of line */ - unsigned char must_match_str[16]; /* 15 char null term substring */ - int osearch; /* 1 if ordinary search suffices */ - unsigned int min_length; /* minimum length the match must be */ - int beg_matches[10]; /* offset of start of \( */ - unsigned int end_matches[10]; /* length of nth submatch - * Note that the entire match corresponds - * to \0 - */ - int offset; /* offset to be added to beg_matches */ - int reserved[10]; -} SLRegexp_Type; - -extern unsigned char *SLang_regexp_match(unsigned char *, - unsigned int, - SLRegexp_Type *); - -/* Returns 0 upon success. If failure, the offset into the - * pattern is returned (start = 1). - */ -extern int SLang_regexp_compile (SLRegexp_Type *); -extern char *SLregexp_quote_string (char *, char *, unsigned int); - -/*}}}*/ - -/*{{{ SLang Command Interface */ - -struct _SLcmd_Cmd_Type; /* Pre-declaration is needed below */ -typedef struct -{ - struct _SLcmd_Cmd_Type *table; - int argc; - /* Version 2.0 needs to use a union!! */ - char **string_args; - int *int_args; - double *double_args; - unsigned char *arg_type; - unsigned long reserved[4]; -} SLcmd_Cmd_Table_Type; - -typedef struct _SLcmd_Cmd_Type -{ - int (*cmdfun)(int, SLcmd_Cmd_Table_Type *); - char *cmd; - char *arg_type; -} SLcmd_Cmd_Type; - -extern int SLcmd_execute_string (char *, SLcmd_Cmd_Table_Type *); - -/*}}}*/ - -/*{{{ SLang Search Interface */ - -typedef struct -{ - int cs; /* case sensitive */ - unsigned char key[256]; - int ind[256]; - int key_len; - int dir; -} SLsearch_Type; - -extern int SLsearch_init (char *, int, int, SLsearch_Type *); -/* This routine must first be called before any search can take place. - * The second parameter specifies the direction of the search: greater than - * zero for a forwrd search and less than zero for a backward search. The - * third parameter specifies whether the search is case sensitive or not. - * The last parameter is a pointer to a structure that is filled by this - * function and it is this structure that must be passed to SLsearch. - */ - -extern unsigned char *SLsearch (unsigned char *, unsigned char *, SLsearch_Type *); -/* To use this routine, you must first call 'SLsearch_init'. Then the first - * two parameters p1 and p2 serve to define the region over which the search - * is to take place. The third parameter is the structure that was previously - * initialized by SLsearch_init. - * - * The routine returns a pointer to the match if found otherwise it returns - * NULL. - */ - -/*}}}*/ - -/*{{{ SLang Pathname Interface */ - -/* These function return pointers to the original space */ -extern char *SLpath_basename (char *); -extern char *SLpath_extname (char *); -extern int SLpath_is_absolute_path (char *); - -/* These return malloced strings--- NOT slstrings */ -extern char *SLpath_dircat (char *, char *); -extern char *SLpath_find_file_in_path (char *, char *); -extern char *SLpath_dirname (char *); -extern int SLpath_file_exists (char *); -extern char *SLpath_pathname_sans_extname (char *); - -/*}}}*/ - -extern int SLang_set_module_load_path (char *); - -#define SLANG_MODULE(name) \ - extern int init_##name##_module_ns (char *); \ - extern void deinit_##name##_module (void) - -#if 0 -{ -#endif -#ifdef __cplusplus -} -#endif - -#endif /* _DAVIS_SLANG_H_ */ diff --git a/mdk-stage1/slang/slarith.c b/mdk-stage1/slang/slarith.c deleted file mode 100644 index 07ad68687..000000000 --- a/mdk-stage1/slang/slarith.c +++ /dev/null @@ -1,1656 +0,0 @@ - -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include - -#ifdef HAVE_LOCALE_H -# include -#endif - -#include "slang.h" -#include "_slang.h" - -/* - * This file defines binary and unary operations on all integer types. - * Supported types include: - * - * SLANG_CHAR_TYPE (char) - * SLANG_SHORT_TYPE (short) - * SLANG_INT_TYPE (int) - * SLANG_LONG_TYPE (long) - * SLANG_FLOAT_TYPE (float) - * SLANG_DOUBLE_TYPE (double) - * - * as well as unsigned types. The result-type of an arithmentic operation - * will depend upon the data types involved. I am going to distinguish - * between the boolean operations such as `and' and `or' from the arithmetic - * operations such as `plus'. Since the result of a boolean operation is - * either 1 or 0, a boolean result will be represented by SLANG_CHAR_TYPE. - * Ordinarily I would use an integer but for arrays it makes more sense to - * use a character data type. - * - * So, the following will be assumed (`+' is any arithmetic operator) - * - * char + char = int - * char|short + short = int - * char|short|int + int = int - * char|short|int|long + long = long - * char|short|int|long|float + float = float - * char|short|int|long|float|double + double = double - * - * In the actual implementation, a brute force approach is avoided. Such - * an approach would mean defining different functions for all possible - * combinations of types. Including the unsigned types, and not including - * the complex number type, there are 10 arithmetic types and 10*10=100 - * different combinations of types. Clearly this would be too much. - * - * One approach would be to define binary functions only between operands of - * the same type and then convert types as appropriate. This would require - * just 6 such functions (int, uint, long, ulong, float, double). - * However, many conversion functions are going to be required, particularly - * since we are going to allow typecasting from one arithmetic to another. - * Since the bit pattern of signed and unsigned types are the same, and only - * the interpretation differs, there will be no functions to convert between - * signed and unsigned forms of a given type. - */ - -#define MAX_ARITHMETIC_TYPES 10 - -unsigned char _SLarith_Is_Arith_Type [256]; - -unsigned char _SLarith_Arith_Types[] = -{ - SLANG_CHAR_TYPE, - SLANG_UCHAR_TYPE, - SLANG_SHORT_TYPE, - SLANG_USHORT_TYPE, - SLANG_INT_TYPE, - SLANG_UINT_TYPE, - SLANG_LONG_TYPE, - SLANG_ULONG_TYPE, - SLANG_FLOAT_TYPE, - SLANG_DOUBLE_TYPE, - 0 -}; - -/* Here are a bunch of functions to convert from one type to another. To - * facilitate the process, a macros will be used. - */ - -#define DEFUN_1(f,from_type,to_type) \ -static void f (to_type *y, from_type *x, unsigned int n) \ -{ \ - unsigned int i; \ - for (i = 0; i < n; i++) y[i] = (to_type) x[i]; \ -} - -#define DEFUN_2(f,from_type,to_type,copy_fun) \ -static VOID_STAR f (VOID_STAR xp, unsigned int n) \ -{ \ - from_type *x; \ - to_type *y; \ - x = (from_type *) xp; \ - if (NULL == (y = (to_type *) SLmalloc (sizeof (to_type) * n))) return NULL; \ - copy_fun (y, x, n); \ - return (VOID_STAR) y; \ -} -typedef VOID_STAR (*Convert_Fun_Type)(VOID_STAR, unsigned int); - -DEFUN_1(copy_char_to_char,char,char) -#if SIZEOF_INT != SIZEOF_SHORT -DEFUN_1(copy_char_to_short,char,short) -DEFUN_1(copy_char_to_ushort,char,unsigned short) -#else -# define copy_char_to_short copy_char_to_int -# define copy_char_to_ushort copy_char_to_uint -#endif -DEFUN_1(copy_char_to_int,char,int) -DEFUN_1(copy_char_to_uint,char,unsigned int) -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_1(copy_char_to_long,char,long) -DEFUN_1(copy_char_to_ulong,char,unsigned long) -#else -# define copy_char_to_long copy_char_to_int -# define copy_char_to_ulong copy_char_to_uint -#endif -DEFUN_1(copy_char_to_float,char,float) -DEFUN_1(copy_char_to_double,char,double) - -#if SIZEOF_INT != SIZEOF_SHORT -DEFUN_1(copy_uchar_to_short,unsigned char,short) -DEFUN_1(copy_uchar_to_ushort,unsigned char,unsigned short) -#else -# define copy_uchar_to_short copy_uchar_to_int -# define copy_uchar_to_ushort copy_uchar_to_uint -#endif -DEFUN_1(copy_uchar_to_int,unsigned char,int) -DEFUN_1(copy_uchar_to_uint,unsigned char,unsigned int) -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_1(copy_uchar_to_long,unsigned char,long) -DEFUN_1(copy_uchar_to_ulong,unsigned char,unsigned long) -#else -# define copy_uchar_to_long copy_uchar_to_int -# define copy_uchar_to_ulong copy_uchar_to_uint -#endif -DEFUN_1(copy_uchar_to_float,unsigned char,float) -DEFUN_1(copy_uchar_to_double,unsigned char,double) - -#if SIZEOF_INT != SIZEOF_SHORT -DEFUN_1(copy_short_to_char,short,char) -DEFUN_1(copy_short_to_uchar,short,unsigned char) -DEFUN_1(copy_short_to_short,short,short) -DEFUN_1(copy_short_to_int,short,int) -DEFUN_1(copy_short_to_uint,short,unsigned int) -DEFUN_1(copy_short_to_long,short,long) -DEFUN_1(copy_short_to_ulong,short,unsigned long) -DEFUN_1(copy_short_to_float,short,float) -DEFUN_1(copy_short_to_double,short,double) -DEFUN_1(copy_ushort_to_char,unsigned short,char) -DEFUN_1(copy_ushort_to_uchar,unsigned short,unsigned char) -DEFUN_1(copy_ushort_to_int,unsigned short,int) -DEFUN_1(copy_ushort_to_uint,unsigned short,unsigned int) -DEFUN_1(copy_ushort_to_long,unsigned short,long) -DEFUN_1(copy_ushort_to_ulong,unsigned short,unsigned long) -DEFUN_1(copy_ushort_to_float,unsigned short,float) -DEFUN_1(copy_ushort_to_double,unsigned short,double) -#else -# define copy_short_to_char copy_int_to_char -# define copy_short_to_uchar copy_int_to_uchar -# define copy_short_to_short copy_int_to_int -# define copy_short_to_int copy_int_to_int -# define copy_short_to_uint copy_int_to_int -# define copy_short_to_long copy_int_to_long -# define copy_short_to_ulong copy_int_to_ulong -# define copy_short_to_float copy_int_to_float -# define copy_short_to_double copy_int_to_double -# define copy_ushort_to_char copy_uint_to_char -# define copy_ushort_to_uchar copy_uint_to_uchar -# define copy_ushort_to_int copy_int_to_int -# define copy_ushort_to_uint copy_int_to_int -# define copy_ushort_to_long copy_uint_to_long -# define copy_ushort_to_ulong copy_uint_to_ulong -# define copy_ushort_to_float copy_uint_to_float -# define copy_ushort_to_double copy_uint_to_double -#endif - -DEFUN_1(copy_int_to_char,int,char) -DEFUN_1(copy_int_to_uchar,int,unsigned char) -DEFUN_1(copy_uint_to_char,unsigned int,char) -DEFUN_1(copy_uint_to_uchar,unsigned int,unsigned char) -#if SIZEOF_INT != SIZEOF_SHORT -DEFUN_1(copy_int_to_short,int,short) -DEFUN_1(copy_int_to_ushort,int,unsigned short) -DEFUN_1(copy_uint_to_short,unsigned int,short) -DEFUN_1(copy_uint_to_ushort,unsigned int,unsigned short) -#else -# define copy_int_to_short copy_int_to_int -# define copy_int_to_ushort copy_int_to_int -# define copy_uint_to_short copy_int_to_int -# define copy_uint_to_ushort copy_int_to_int -#endif -DEFUN_1(copy_int_to_int,int,int) -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_1(copy_int_to_long,int,long) -DEFUN_1(copy_int_to_ulong,int,unsigned long) -DEFUN_1(copy_uint_to_long,unsigned int,long) -DEFUN_1(copy_uint_to_ulong,unsigned int,unsigned long) -#else -# define copy_int_to_long copy_int_to_int -# define copy_int_to_ulong copy_int_to_int -# define copy_uint_to_long copy_int_to_int -# define copy_uint_to_ulong copy_int_to_int -#endif -DEFUN_1(copy_int_to_float,int,float) -DEFUN_1(copy_int_to_double,int,double) -DEFUN_1(copy_uint_to_float,unsigned int,float) -DEFUN_1(copy_uint_to_double,unsigned int,double) - -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_1(copy_long_to_char,long,char) -DEFUN_1(copy_long_to_uchar,long,unsigned char) -DEFUN_1(copy_long_to_short,long,short) -DEFUN_1(copy_long_to_ushort,long,unsigned short) -DEFUN_1(copy_long_to_int,long,int) -DEFUN_1(copy_long_to_uint,long,unsigned int) -DEFUN_1(copy_long_to_long,long,long) -DEFUN_1(copy_long_to_float,long,float) -DEFUN_1(copy_long_to_double,long,double) -DEFUN_1(copy_ulong_to_char,unsigned long,char) -DEFUN_1(copy_ulong_to_uchar,unsigned long,unsigned char) -DEFUN_1(copy_ulong_to_short,unsigned long,short) -DEFUN_1(copy_ulong_to_ushort,unsigned long,unsigned short) -DEFUN_1(copy_ulong_to_int,unsigned long,int) -DEFUN_1(copy_ulong_to_uint,unsigned long,unsigned int) -DEFUN_1(copy_ulong_to_float,unsigned long,float) -DEFUN_1(copy_ulong_to_double,unsigned long,double) -#else -#define copy_long_to_char copy_int_to_char -#define copy_long_to_uchar copy_int_to_uchar -#define copy_long_to_short copy_int_to_short -#define copy_long_to_ushort copy_int_to_ushort -#define copy_long_to_int copy_int_to_int -#define copy_long_to_uint copy_int_to_int -#define copy_long_to_long copy_int_to_int -#define copy_long_to_float copy_int_to_float -#define copy_long_to_double copy_int_to_double -#define copy_ulong_to_char copy_uint_to_char -#define copy_ulong_to_uchar copy_uint_to_uchar -#define copy_ulong_to_short copy_uint_to_short -#define copy_ulong_to_ushort copy_uint_to_ushort -#define copy_ulong_to_int copy_int_to_int -#define copy_ulong_to_uint copy_int_to_int -#define copy_ulong_to_float copy_uint_to_float -#define copy_ulong_to_double copy_uint_to_double -#endif - -DEFUN_1(copy_float_to_char,float,char) -DEFUN_1(copy_float_to_uchar,float,unsigned char) -#if SIZEOF_INT != SIZEOF_SHORT -DEFUN_1(copy_float_to_short,float,short) -DEFUN_1(copy_float_to_ushort,float,unsigned short) -#else -# define copy_float_to_short copy_float_to_int -# define copy_float_to_ushort copy_float_to_uint -#endif -DEFUN_1(copy_float_to_int,float,int) -DEFUN_1(copy_float_to_uint,float,unsigned int) -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_1(copy_float_to_long,float,long) -DEFUN_1(copy_float_to_ulong,float,unsigned long) -#else -# define copy_float_to_long copy_float_to_int -# define copy_float_to_ulong copy_float_to_uint -#endif -DEFUN_1(copy_float_to_float,float,float) -DEFUN_1(copy_float_to_double,float,double) - -DEFUN_1(copy_double_to_char,double,char) -DEFUN_1(copy_double_to_uchar,double,unsigned char) -#if SIZEOF_INT != SIZEOF_SHORT -DEFUN_1(copy_double_to_short,double,short) -DEFUN_1(copy_double_to_ushort,double,unsigned short) -#else -# define copy_double_to_short copy_double_to_int -# define copy_double_to_ushort copy_double_to_uint -#endif -DEFUN_1(copy_double_to_int,double,int) -DEFUN_1(copy_double_to_uint,double,unsigned int) -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_1(copy_double_to_long,double,long) -DEFUN_1(copy_double_to_ulong,double,unsigned long) -#else -# define copy_double_to_long copy_double_to_int -# define copy_double_to_ulong copy_double_to_uint -#endif -DEFUN_1(copy_double_to_float,double,float) -DEFUN_1(copy_double_to_double,double,double) - -DEFUN_2(char_to_int,char,int,copy_char_to_int) -DEFUN_2(char_to_uint,char,unsigned int,copy_char_to_uint) -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_2(char_to_long,char,long,copy_char_to_long) -DEFUN_2(char_to_ulong,char,unsigned long,copy_char_to_ulong) -#else -# define char_to_long char_to_int -# define char_to_ulong char_to_uint -#endif -DEFUN_2(char_to_float,char,float,copy_char_to_float) -DEFUN_2(char_to_double,char,double,copy_char_to_double) - -DEFUN_2(uchar_to_int,unsigned char,int,copy_uchar_to_int) -DEFUN_2(uchar_to_uint,unsigned char,unsigned int,copy_uchar_to_uint) -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_2(uchar_to_long,unsigned char,long,copy_uchar_to_long) -DEFUN_2(uchar_to_ulong,unsigned char,unsigned long,copy_uchar_to_ulong) -#else -# define uchar_to_long uchar_to_int -# define uchar_to_ulong uchar_to_uint -#endif -DEFUN_2(uchar_to_float,unsigned char,float,copy_uchar_to_float) -DEFUN_2(uchar_to_double,unsigned char,double,copy_uchar_to_double) - -#if SIZEOF_INT != SIZEOF_SHORT -DEFUN_2(short_to_int,short,int,copy_short_to_int) -DEFUN_2(short_to_uint,short,unsigned int,copy_short_to_uint) -DEFUN_2(short_to_long,short,long,copy_short_to_long) -DEFUN_2(short_to_ulong,short,unsigned long,copy_short_to_ulong) -DEFUN_2(short_to_float,short,float,copy_short_to_float) -DEFUN_2(short_to_double,short,double,copy_short_to_double) -DEFUN_2(ushort_to_int,unsigned short,int,copy_ushort_to_int) -DEFUN_2(ushort_to_uint,unsigned short,unsigned int,copy_ushort_to_uint) -DEFUN_2(ushort_to_long,unsigned short,long,copy_ushort_to_long) -DEFUN_2(ushort_to_ulong,unsigned short,unsigned long,copy_ushort_to_ulong) -DEFUN_2(ushort_to_float,unsigned short,float,copy_ushort_to_float) -DEFUN_2(ushort_to_double,unsigned short,double,copy_ushort_to_double) -#else -# define short_to_int NULL -# define short_to_uint NULL -# define short_to_long int_to_long -# define short_to_ulong int_to_ulong -# define short_to_float int_to_float -# define short_to_double int_to_double -# define ushort_to_int NULL -# define ushort_to_uint NULL -# define ushort_to_long uint_to_long -# define ushort_to_ulong uint_to_ulong -# define ushort_to_float uint_to_float -# define ushort_to_double uint_to_double -#endif - -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_2(int_to_long,int,long,copy_int_to_long) -DEFUN_2(int_to_ulong,int,unsigned long,copy_int_to_ulong) -#else -# define int_to_long NULL -# define int_to_ulong NULL -#endif -DEFUN_2(int_to_float,int,float,copy_int_to_float) -DEFUN_2(int_to_double,int,double,copy_int_to_double) - -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_2(uint_to_long,unsigned int,long,copy_uint_to_long) -DEFUN_2(uint_to_ulong,unsigned int,unsigned long,copy_uint_to_ulong) -#else -# define uint_to_long NULL -# define uint_to_ulong NULL -#endif -DEFUN_2(uint_to_float,unsigned int,float,copy_uint_to_float) -DEFUN_2(uint_to_double,unsigned int,double,copy_uint_to_double) - -#if SIZEOF_INT != SIZEOF_LONG -DEFUN_2(long_to_float,long,float,copy_long_to_float) -DEFUN_2(long_to_double,long,double,copy_long_to_double) -DEFUN_2(ulong_to_float,unsigned long,float,copy_ulong_to_float) -DEFUN_2(ulong_to_double,unsigned long,double,copy_ulong_to_double) -#else -# define long_to_float int_to_float -# define long_to_double int_to_double -# define ulong_to_float uint_to_float -# define ulong_to_double uint_to_double -#endif - -DEFUN_2(float_to_double,float,double,copy_float_to_double) - -#define TO_DOUBLE_FUN(name,type) \ -static double name (VOID_STAR x) { return (double) *(type *) x; } -TO_DOUBLE_FUN(char_to_one_double,char) -TO_DOUBLE_FUN(uchar_to_one_double,unsigned char) -#if SIZEOF_INT != SIZEOF_SHORT -TO_DOUBLE_FUN(short_to_one_double,short) -TO_DOUBLE_FUN(ushort_to_one_double,unsigned short) -#else -# define short_to_one_double int_to_one_double -# define ushort_to_one_double uint_to_one_double -#endif -TO_DOUBLE_FUN(int_to_one_double,int) -TO_DOUBLE_FUN(uint_to_one_double,unsigned int) -#if SIZEOF_INT != SIZEOF_LONG -TO_DOUBLE_FUN(long_to_one_double,long) -TO_DOUBLE_FUN(ulong_to_one_double,unsigned long) -#else -# define long_to_one_double int_to_one_double -# define ulong_to_one_double uint_to_one_double -#endif -TO_DOUBLE_FUN(float_to_one_double,float) -TO_DOUBLE_FUN(double_to_one_double,double) - -SLang_To_Double_Fun_Type -SLarith_get_to_double_fun (unsigned char type, unsigned int *sizeof_type) -{ - unsigned int da; - SLang_To_Double_Fun_Type to_double; - - switch (type) - { - default: - return NULL; - - case SLANG_CHAR_TYPE: - da = sizeof (char); to_double = char_to_one_double; - break; - case SLANG_UCHAR_TYPE: - da = sizeof (unsigned char); to_double = uchar_to_one_double; - break; - case SLANG_SHORT_TYPE: - da = sizeof (short); to_double = short_to_one_double; - break; - case SLANG_USHORT_TYPE: - da = sizeof (unsigned short); to_double = ushort_to_one_double; - break; - case SLANG_INT_TYPE: - da = sizeof (int); to_double = int_to_one_double; - break; - case SLANG_UINT_TYPE: - da = sizeof (unsigned int); to_double = uint_to_one_double; - break; - case SLANG_LONG_TYPE: - da = sizeof (long); to_double = long_to_one_double; - break; - case SLANG_ULONG_TYPE: - da = sizeof (unsigned long); to_double = ulong_to_one_double; - break; - case SLANG_FLOAT_TYPE: - da = sizeof (float); to_double = float_to_one_double; - break; - case SLANG_DOUBLE_TYPE: - da = sizeof (double); to_double = double_to_one_double; - break; - } - - if (sizeof_type != NULL) *sizeof_type = da; - return to_double; -} - -/* Each element of the matrix determines how the row maps onto the column. - * That is, let the matrix be B_ij. Where the i,j indices refer to - * precedence of the type. Then, - * B_ij->copy_function copies type i to type j. Similarly, - * B_ij->convert_function mallocs a new array of type j and copies i to it. - * - * Since types are always converted to higher levels of precedence for binary - * operations, many of the elements are NULL. - * - * Is the idea clear? - */ -typedef struct -{ - FVOID_STAR copy_function; - Convert_Fun_Type convert_function; -} -Binary_Matrix_Type; - -static Binary_Matrix_Type Binary_Matrix [MAX_ARITHMETIC_TYPES][MAX_ARITHMETIC_TYPES] = -{ - { - {(FVOID_STAR)copy_char_to_char, NULL}, - {(FVOID_STAR)copy_char_to_char, NULL}, - {(FVOID_STAR) copy_char_to_short, NULL}, - {(FVOID_STAR) copy_char_to_ushort, NULL}, - {(FVOID_STAR) copy_char_to_int, char_to_int}, - {(FVOID_STAR) copy_char_to_uint, char_to_uint}, - {(FVOID_STAR) copy_char_to_long, char_to_long}, - {(FVOID_STAR) copy_char_to_ulong, char_to_ulong}, - {(FVOID_STAR) copy_char_to_float, char_to_float}, - {(FVOID_STAR) copy_char_to_double, char_to_double}, - }, - - { - {(FVOID_STAR)copy_char_to_char, NULL}, - {(FVOID_STAR)copy_char_to_char, NULL}, - {(FVOID_STAR) copy_uchar_to_short, NULL}, - {(FVOID_STAR) copy_uchar_to_ushort, NULL}, - {(FVOID_STAR) copy_uchar_to_int, uchar_to_int}, - {(FVOID_STAR) copy_uchar_to_uint, uchar_to_uint}, - {(FVOID_STAR) copy_uchar_to_long, uchar_to_long}, - {(FVOID_STAR) copy_uchar_to_ulong, uchar_to_ulong}, - {(FVOID_STAR) copy_uchar_to_float, uchar_to_float}, - {(FVOID_STAR) copy_uchar_to_double, uchar_to_double}, - }, - - { - {(FVOID_STAR) copy_short_to_char, NULL}, - {(FVOID_STAR) copy_short_to_uchar, NULL}, - {(FVOID_STAR) copy_short_to_short, NULL}, - {(FVOID_STAR) copy_short_to_short, NULL}, - {(FVOID_STAR) copy_short_to_int, short_to_int}, - {(FVOID_STAR) copy_short_to_uint, short_to_uint}, - {(FVOID_STAR) copy_short_to_long, short_to_long}, - {(FVOID_STAR) copy_short_to_ulong, short_to_ulong}, - {(FVOID_STAR) copy_short_to_float, short_to_float}, - {(FVOID_STAR) copy_short_to_double, short_to_double}, - }, - - { - {(FVOID_STAR) copy_ushort_to_char, NULL}, - {(FVOID_STAR) copy_ushort_to_uchar, NULL}, - {(FVOID_STAR) copy_short_to_short, NULL}, - {(FVOID_STAR) copy_short_to_short, NULL}, - {(FVOID_STAR) copy_ushort_to_int, ushort_to_int}, - {(FVOID_STAR) copy_ushort_to_uint, ushort_to_uint}, - {(FVOID_STAR) copy_ushort_to_long, ushort_to_long}, - {(FVOID_STAR) copy_ushort_to_ulong, ushort_to_ulong}, - {(FVOID_STAR) copy_ushort_to_float, ushort_to_float}, - {(FVOID_STAR) copy_ushort_to_double, ushort_to_double}, - }, - - { - {(FVOID_STAR) copy_int_to_char, NULL}, - {(FVOID_STAR) copy_int_to_uchar, NULL}, - {(FVOID_STAR) copy_int_to_short, NULL}, - {(FVOID_STAR) copy_int_to_ushort, NULL}, - {(FVOID_STAR) copy_int_to_int, NULL}, - {(FVOID_STAR) copy_int_to_int, NULL}, - {(FVOID_STAR) copy_int_to_long, int_to_long}, - {(FVOID_STAR) copy_int_to_ulong, int_to_ulong}, - {(FVOID_STAR) copy_int_to_float, int_to_float}, - {(FVOID_STAR) copy_int_to_double, int_to_double}, - }, - - { - {(FVOID_STAR) copy_uint_to_char, NULL}, - {(FVOID_STAR) copy_uint_to_uchar, NULL}, - {(FVOID_STAR) copy_uint_to_short, NULL}, - {(FVOID_STAR) copy_uint_to_ushort, NULL}, - {(FVOID_STAR) copy_int_to_int, NULL}, - {(FVOID_STAR) copy_int_to_int, NULL}, - {(FVOID_STAR) copy_uint_to_long, uint_to_long}, - {(FVOID_STAR) copy_uint_to_ulong, uint_to_ulong}, - {(FVOID_STAR) copy_uint_to_float, uint_to_float}, - {(FVOID_STAR) copy_uint_to_double, uint_to_double}, - }, - - { - {(FVOID_STAR) copy_long_to_char, NULL}, - {(FVOID_STAR) copy_long_to_uchar, NULL}, - {(FVOID_STAR) copy_long_to_short, NULL}, - {(FVOID_STAR) copy_long_to_ushort, NULL}, - {(FVOID_STAR) copy_long_to_int, NULL}, - {(FVOID_STAR) copy_long_to_uint, NULL}, - {(FVOID_STAR) copy_long_to_long, NULL}, - {(FVOID_STAR) copy_long_to_long, NULL}, - {(FVOID_STAR) copy_long_to_float, long_to_float}, - {(FVOID_STAR) copy_long_to_double, long_to_double}, - }, - - { - {(FVOID_STAR) copy_ulong_to_char, NULL}, - {(FVOID_STAR) copy_ulong_to_uchar, NULL}, - {(FVOID_STAR) copy_ulong_to_short, NULL}, - {(FVOID_STAR) copy_ulong_to_ushort, NULL}, - {(FVOID_STAR) copy_ulong_to_int, NULL}, - {(FVOID_STAR) copy_ulong_to_uint, NULL}, - {(FVOID_STAR) copy_long_to_long, NULL}, - {(FVOID_STAR) copy_long_to_long, NULL}, - {(FVOID_STAR) copy_ulong_to_float, ulong_to_float}, - {(FVOID_STAR) copy_ulong_to_double, ulong_to_double}, - }, - - { - {(FVOID_STAR) copy_float_to_char, NULL}, - {(FVOID_STAR) copy_float_to_uchar, NULL}, - {(FVOID_STAR) copy_float_to_short, NULL}, - {(FVOID_STAR) copy_float_to_ushort, NULL}, - {(FVOID_STAR) copy_float_to_int, NULL}, - {(FVOID_STAR) copy_float_to_uint, NULL}, - {(FVOID_STAR) copy_float_to_long, NULL}, - {(FVOID_STAR) copy_float_to_ulong, NULL}, - {(FVOID_STAR) copy_float_to_float, NULL}, - {(FVOID_STAR) copy_float_to_double, float_to_double}, - }, - - { - {(FVOID_STAR) copy_double_to_char, NULL}, - {(FVOID_STAR) copy_double_to_uchar, NULL}, - {(FVOID_STAR) copy_double_to_short, NULL}, - {(FVOID_STAR) copy_double_to_ushort, NULL}, - {(FVOID_STAR) copy_double_to_int, NULL}, - {(FVOID_STAR) copy_double_to_uint, NULL}, - {(FVOID_STAR) copy_double_to_long, NULL}, - {(FVOID_STAR) copy_double_to_ulong, NULL}, - {(FVOID_STAR) copy_double_to_float, NULL}, - {(FVOID_STAR) copy_double_to_double, NULL}, - } -}; - -#define GENERIC_BINARY_FUNCTION int_int_bin_op -#define GENERIC_BIT_OPERATIONS -#define GENERIC_TYPE int -#define POW_FUNCTION(a,b) pow((double)(a),(double)(b)) -#define POW_RESULT_TYPE double -#define ABS_FUNCTION abs -#define MOD_FUNCTION(a,b) ((a) % (b)) -#define GENERIC_UNARY_FUNCTION int_unary_op -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0)) -#define SCALAR_BINARY_FUNCTION int_int_scalar_bin_op -#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_int_obj(SLANG_INT_TYPE,(x)) -#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x)) -#define CMP_FUNCTION int_cmp_function -#include "slarith.inc" - -#define GENERIC_BINARY_FUNCTION uint_uint_bin_op -#define GENERIC_BIT_OPERATIONS -#define GENERIC_TYPE unsigned int -#define POW_FUNCTION(a,b) pow((double)(a),(double)(b)) -#define POW_RESULT_TYPE double -#define MOD_FUNCTION(a,b) ((a) % (b)) -#define GENERIC_UNARY_FUNCTION uint_unary_op -#define ABS_FUNCTION(a) (a) -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : 0) -#define SCALAR_BINARY_FUNCTION uint_uint_scalar_bin_op -#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_int_obj(SLANG_UINT_TYPE,(int)(x)) -#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x)) -#define CMP_FUNCTION uint_cmp_function -#include "slarith.inc" - -#if SIZEOF_LONG != SIZEOF_INT -#define GENERIC_BINARY_FUNCTION long_long_bin_op -#define GENERIC_BIT_OPERATIONS -#define GENERIC_TYPE long -#define POW_FUNCTION(a,b) pow((double)(a),(double)(b)) -#define POW_RESULT_TYPE double -#define MOD_FUNCTION(a,b) ((a) % (b)) -#define GENERIC_UNARY_FUNCTION long_unary_op -#define ABS_FUNCTION(a) (((a) >= 0) ? (a) : -(a)) -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0)) -#define SCALAR_BINARY_FUNCTION long_long_scalar_bin_op -#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_long_obj(SLANG_LONG_TYPE,(x)) -#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x)) -#define CMP_FUNCTION long_cmp_function -#include "slarith.inc" - -#define GENERIC_BINARY_FUNCTION ulong_ulong_bin_op -#define GENERIC_BIT_OPERATIONS -#define GENERIC_TYPE unsigned long -#define POW_FUNCTION(a,b) pow((double)(a),(double)(b)) -#define POW_RESULT_TYPE double -#define MOD_FUNCTION(a,b) ((a) % (b)) -#define GENERIC_UNARY_FUNCTION ulong_unary_op -#define ABS_FUNCTION(a) (a) -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : 0) -#define SCALAR_BINARY_FUNCTION ulong_ulong_scalar_bin_op -#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_long_obj(SLANG_ULONG_TYPE,(long)(x)) -#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x)) -#define CMP_FUNCTION ulong_cmp_function -#include "slarith.inc" -#else -#define long_long_bin_op int_int_bin_op -#define ulong_ulong_bin_op uint_uint_bin_op -#define long_unary_op int_unary_op -#define ulong_unary_op uint_unary_op -#define long_cmp_function int_cmp_function -#define ulong_cmp_function uint_cmp_function -#endif /* SIZEOF_INT != SIZEOF_LONG */ - -#define GENERIC_BINARY_FUNCTION float_float_bin_op -#define GENERIC_TYPE float -#define POW_FUNCTION(a,b) (float)pow((double)(a),(double)(b)) -#define POW_RESULT_TYPE float -#define MOD_FUNCTION(a,b) (float)fmod((a),(b)) -#define GENERIC_UNARY_FUNCTION float_unary_op -#define ABS_FUNCTION(a) (float)fabs((double) a) -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0)) -#define SCALAR_BINARY_FUNCTION float_float_scalar_bin_op -#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_float_obj(SLANG_FLOAT_TYPE,(x)) -#define PUSH_POW_OBJ_FUN(x) SLclass_push_float_obj(SLANG_FLOAT_TYPE, (x)) -#define CMP_FUNCTION float_cmp_function -#include "slarith.inc" - -#define GENERIC_BINARY_FUNCTION double_double_bin_op -#define GENERIC_TYPE double -#define POW_FUNCTION(a,b) pow((double)(a),(double)(b)) -#define POW_RESULT_TYPE double -#define MOD_FUNCTION(a,b) (float)fmod((a),(b)) -#define GENERIC_UNARY_FUNCTION double_unary_op -#define ABS_FUNCTION(a) fabs(a) -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0)) -#define SCALAR_BINARY_FUNCTION double_double_scalar_bin_op -#define PUSH_SCALAR_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE,(x)) -#define PUSH_POW_OBJ_FUN(x) SLclass_push_double_obj(SLANG_DOUBLE_TYPE, (x)) -#define CMP_FUNCTION double_cmp_function -#include "slarith.inc" - -#define GENERIC_UNARY_FUNCTION char_unary_op -#define GENERIC_BIT_OPERATIONS -#define GENERIC_TYPE signed char -#define ABS_FUNCTION abs -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0)) -#define CMP_FUNCTION char_cmp_function -#include "slarith.inc" - -#define GENERIC_UNARY_FUNCTION uchar_unary_op -#define GENERIC_BIT_OPERATIONS -#define GENERIC_TYPE unsigned char -#define ABS_FUNCTION(x) (x) -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : 0) -#define CMP_FUNCTION uchar_cmp_function -#include "slarith.inc" - -#if SIZEOF_SHORT != SIZEOF_INT -#define GENERIC_UNARY_FUNCTION short_unary_op -#define GENERIC_BIT_OPERATIONS -#define GENERIC_TYPE short -#define ABS_FUNCTION abs -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : (((x) < 0) ? -1 : 0)) -#define CMP_FUNCTION short_cmp_function -#include "slarith.inc" - -#define GENERIC_UNARY_FUNCTION ushort_unary_op -#define GENERIC_BIT_OPERATIONS -#define GENERIC_TYPE unsigned short -#define ABS_FUNCTION(x) (x) -#define SIGN_FUNCTION(x) (((x) > 0) ? 1 : 0) -#define CMP_FUNCTION ushort_cmp_function -#include "slarith.inc" -#endif /* SIZEOF_INT != SIZEOF_SHORT */ - -/* Unfortunately, the numbers that were assigned to the data-types were - * not well thought out. So, I need to use the following table. - */ -#define MAXIMUM_ARITH_TYPE_VALUE SLANG_FLOAT_TYPE -#define IS_INTEGER_TYPE(x) \ - (((x) <= MAXIMUM_ARITH_TYPE_VALUE) \ - && (Type_Precedence_Table[x] < 8) && (Type_Precedence_Table[x] != -1)) -#define IS_ARITHMETIC_TYPE(x) \ - (((x) <= MAXIMUM_ARITH_TYPE_VALUE) && (Type_Precedence_Table[x] != -1)) - -#define LONG_PRECEDENCE_VALUE 6 -#define FLOAT_PRECEDENCE_VALUE 8 - -static signed char Type_Precedence_Table [MAXIMUM_ARITH_TYPE_VALUE + 1] = -{ - -1, /* SLANG_UNDEFINED_TYPE */ - -1, /* SLANG_VOID_TYPE */ - 4, /* SLANG_INT_TYPE */ - 9, /* SLANG_DOUBLE_TYPE */ - 0, /* SLANG_CHAR_TYPE */ - -1, /* SLANG_INTP_TYPE */ - -1, /* SLANG_REF_TYPE */ - -1, /* SLANG_COMPLEX_TYPE */ - -1, /* SLANG_NULL_TYPE */ - 1, /* SLANG_UCHAR_TYPE */ - 2, /* SLANG_SHORT_TYPE */ - 3, /* SLANG_USHORT_TYPE */ - 5, /* SLANG_UINT_TYPE */ - 6, /* SLANG_LONG_TYPE */ - 7, /* SLANG_ULONG_TYPE */ - -1, /* SLANG_STRING_TYPE */ - 8 /* SLANG_FLOAT_TYPE */ -}; - -int _SLarith_get_precedence (unsigned char type) -{ - if (type > MAXIMUM_ARITH_TYPE_VALUE) - return -1; - - return Type_Precedence_Table[type]; -} - -unsigned char _SLarith_promote_type (unsigned char t) -{ - switch (t) - { - case SLANG_FLOAT_TYPE: - case SLANG_DOUBLE_TYPE: - case SLANG_LONG_TYPE: - case SLANG_ULONG_TYPE: - case SLANG_INT_TYPE: - case SLANG_UINT_TYPE: - break; - - case SLANG_USHORT_TYPE: -#if SIZEOF_INT == SIZEOF_SHORT - t = SLANG_UINT_TYPE; - break; -#endif - /* drop */ - case SLANG_CHAR_TYPE: - case SLANG_UCHAR_TYPE: - case SLANG_SHORT_TYPE: - default: - t = SLANG_INT_TYPE; - } - - return t; -} - -static unsigned char promote_to_common_type (unsigned char a, unsigned char b) -{ - a = _SLarith_promote_type (a); - b = _SLarith_promote_type (b); - - return (Type_Precedence_Table[a] > Type_Precedence_Table[b]) ? a : b; -} - -static int arith_bin_op_result (int op, unsigned char a_type, unsigned char b_type, - unsigned char *c_type) -{ - switch (op) - { - case SLANG_EQ: - case SLANG_NE: - case SLANG_GT: - case SLANG_GE: - case SLANG_LT: - case SLANG_LE: - case SLANG_OR: - case SLANG_AND: - *c_type = SLANG_CHAR_TYPE; - return 1; - - case SLANG_POW: - if (SLANG_FLOAT_TYPE == promote_to_common_type (a_type, b_type)) - *c_type = SLANG_FLOAT_TYPE; - else - *c_type = SLANG_DOUBLE_TYPE; - return 1; - - case SLANG_BAND: - case SLANG_BXOR: - case SLANG_BOR: - case SLANG_SHL: - case SLANG_SHR: - /* The bit-level operations are defined just for integer types */ - if ((0 == IS_INTEGER_TYPE (a_type)) - || (0 == IS_INTEGER_TYPE(b_type))) - return 0; - break; - - default: - break; - } - - *c_type = promote_to_common_type (a_type, b_type); - return 1; -} - -typedef int (*Bin_Fun_Type) (int, - unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR); - -/* This array of functions must be indexed by precedence after arithmetic - * promotions. - */ -static Bin_Fun_Type Bin_Fun_Map [MAX_ARITHMETIC_TYPES] = -{ - NULL, - NULL, - NULL, - NULL, - int_int_bin_op, - uint_uint_bin_op, - long_long_bin_op, - ulong_ulong_bin_op, - float_float_bin_op, - double_double_bin_op -}; - -static int arith_bin_op (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - Convert_Fun_Type af, bf; - Bin_Fun_Type binfun; - int a_indx, b_indx, c_indx; - unsigned char c_type; - int ret; - - c_type = promote_to_common_type (a_type, b_type); - - a_indx = Type_Precedence_Table [a_type]; - b_indx = Type_Precedence_Table [b_type]; - c_indx = Type_Precedence_Table [c_type]; - - af = Binary_Matrix[a_indx][c_indx].convert_function; - bf = Binary_Matrix[b_indx][c_indx].convert_function; - binfun = Bin_Fun_Map[c_indx]; - - if ((af != NULL) - && (NULL == (ap = (VOID_STAR) (*af) (ap, na)))) - return -1; - - if ((bf != NULL) - && (NULL == (bp = (VOID_STAR) (*bf) (bp, nb)))) - { - if (af != NULL) SLfree ((char *) ap); - return -1; - } - - ret = (*binfun) (op, a_type, ap, na, b_type, bp, nb, cp); - if (af != NULL) SLfree ((char *) ap); - if (bf != NULL) SLfree ((char *) bp); - - return ret; -} - -static int arith_unary_op_result (int op, unsigned char a, unsigned char *b) -{ - (void) a; - switch (op) - { - default: - return 0; - - case SLANG_SQR: - case SLANG_MUL2: - case SLANG_PLUSPLUS: - case SLANG_MINUSMINUS: - case SLANG_CHS: - case SLANG_ABS: - *b = a; - break; - - case SLANG_NOT: - case SLANG_BNOT: - if (0 == IS_INTEGER_TYPE(a)) - return 0; - *b = a; - break; - - case SLANG_SIGN: - *b = SLANG_INT_TYPE; - break; - } - return 1; -} - -static int integer_pop (unsigned char type, VOID_STAR ptr) -{ - SLang_Object_Type obj; - int i, j; - void (*f)(VOID_STAR, VOID_STAR, unsigned int); - - if (-1 == SLang_pop (&obj)) - return -1; - - if ((obj.data_type > MAXIMUM_ARITH_TYPE_VALUE) - || ((j = Type_Precedence_Table[obj.data_type]) == -1) - || (j >= FLOAT_PRECEDENCE_VALUE)) - { - _SLclass_type_mismatch_error (type, obj.data_type); - SLang_free_object (&obj); - return -1; - } - - i = Type_Precedence_Table[type]; - f = (void (*)(VOID_STAR, VOID_STAR, unsigned int)) - Binary_Matrix[j][i].copy_function; - - (*f) (ptr, (VOID_STAR)&obj.v, 1); - - return 0; -} - -static int integer_push (unsigned char type, VOID_STAR ptr) -{ - SLang_Object_Type obj; - int i; - void (*f)(VOID_STAR, VOID_STAR, unsigned int); - - i = Type_Precedence_Table[type]; - f = (void (*)(VOID_STAR, VOID_STAR, unsigned int)) - Binary_Matrix[i][i].copy_function; - - obj.data_type = type; - - (*f) ((VOID_STAR)&obj.v, ptr, 1); - - return SLang_push (&obj); -} - -int SLang_pop_char (char *i) -{ - return integer_pop (SLANG_CHAR_TYPE, (VOID_STAR) i); -} - -int SLang_pop_uchar (unsigned char *i) -{ - return integer_pop (SLANG_UCHAR_TYPE, (VOID_STAR) i); -} - -int SLang_pop_short (short *i) -{ - return integer_pop (SLANG_SHORT_TYPE, (VOID_STAR) i); -} - -int SLang_pop_ushort (unsigned short *i) -{ - return integer_pop (SLANG_USHORT_TYPE, (VOID_STAR) i); -} - -int SLang_pop_long (long *i) -{ - return integer_pop (SLANG_LONG_TYPE, (VOID_STAR) i); -} - -int SLang_pop_ulong (unsigned long *i) -{ - return integer_pop (SLANG_ULONG_TYPE, (VOID_STAR) i); -} - -int SLang_pop_integer (int *i) -{ -#if _SLANG_OPTIMIZE_FOR_SPEED - SLang_Object_Type obj; - - if (-1 == _SLang_pop_object_of_type (SLANG_INT_TYPE, &obj, 0)) - return -1; - *i = obj.v.int_val; - return 0; -#else - return integer_pop (SLANG_INT_TYPE, (VOID_STAR) i); -#endif -} - -int SLang_pop_uinteger (unsigned int *i) -{ - return integer_pop (SLANG_UINT_TYPE, (VOID_STAR) i); -} - -int SLang_push_integer (int i) -{ - return SLclass_push_int_obj (SLANG_INT_TYPE, i); -} -int SLang_push_uinteger (unsigned int i) -{ - return SLclass_push_int_obj (SLANG_UINT_TYPE, (int) i); -} -int SLang_push_char (char i) -{ - return SLclass_push_char_obj (SLANG_CHAR_TYPE, i); -} -int SLang_push_uchar (unsigned char i) -{ - return SLclass_push_char_obj (SLANG_UCHAR_TYPE, (char) i); -} -int SLang_push_short (short i) -{ - return SLclass_push_short_obj (SLANG_SHORT_TYPE, i); -} -int SLang_push_ushort (unsigned short i) -{ - return SLclass_push_short_obj (SLANG_USHORT_TYPE, (unsigned short) i); -} -int SLang_push_long (long i) -{ - return SLclass_push_long_obj (SLANG_LONG_TYPE, i); -} -int SLang_push_ulong (unsigned long i) -{ - return SLclass_push_long_obj (SLANG_ULONG_TYPE, (long) i); -} - -_INLINE_ -int _SLarith_typecast (unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp) -{ - int i, j; - - void (*copy)(VOID_STAR, VOID_STAR, unsigned int); - - i = Type_Precedence_Table[a_type]; - j = Type_Precedence_Table[b_type]; - - copy = (void (*)(VOID_STAR, VOID_STAR, unsigned int)) - Binary_Matrix[i][j].copy_function; - - (*copy) (bp, ap, na); - return 1; -} - -#if SLANG_HAS_FLOAT - -int SLang_pop_double(double *x, int *convertp, int *ip) -{ - SLang_Object_Type obj; - int i, convert; - - if (0 != SLang_pop (&obj)) - return -1; - - i = 0; - convert = 0; - - switch (obj.data_type) - { - case SLANG_FLOAT_TYPE: - *x = (double) obj.v.float_val; - break; - - case SLANG_DOUBLE_TYPE: - *x = obj.v.double_val; - break; - - case SLANG_INT_TYPE: - i = (int) obj.v.long_val; - *x = (double) i; - convert = 1; - break; - - case SLANG_CHAR_TYPE: *x = (double) obj.v.char_val; break; - case SLANG_UCHAR_TYPE: *x = (double) obj.v.uchar_val; break; - case SLANG_SHORT_TYPE: *x = (double) obj.v.short_val; break; - case SLANG_USHORT_TYPE: *x = (double) obj.v.ushort_val; break; - case SLANG_UINT_TYPE: *x = (double) obj.v.uint_val; break; - case SLANG_LONG_TYPE: *x = (double) obj.v.long_val; break; - case SLANG_ULONG_TYPE: *x = (double) obj.v.ulong_val; break; - - default: - _SLclass_type_mismatch_error (SLANG_DOUBLE_TYPE, obj.data_type); - SLang_free_object (&obj); - return -1; - } - - if (convertp != NULL) *convertp = convert; - if (ip != NULL) *ip = i; - - return 0; -} - -int SLang_push_double (double x) -{ - return SLclass_push_double_obj (SLANG_DOUBLE_TYPE, x); -} - -int SLang_pop_float (float *x) -{ - double d; - - /* Pop it as a double and let the double function do all the typcasting */ - if (-1 == SLang_pop_double (&d, NULL, NULL)) - return -1; - - *x = (float) d; - return 0; -} - -int SLang_push_float (float f) -{ - return SLclass_push_float_obj (SLANG_FLOAT_TYPE, (double) f); -} - -/* Double */ -static int double_push (unsigned char unused, VOID_STAR ptr) -{ - (void) unused; - SLang_push_double (*(double *) ptr); - return 0; -} - -static int double_push_literal (unsigned char type, VOID_STAR ptr) -{ - (void) type; - return SLang_push_double (**(double **)ptr); -} - -static int double_pop (unsigned char unused, VOID_STAR ptr) -{ - (void) unused; - return SLang_pop_double ((double *) ptr, NULL, NULL); -} - -static void double_byte_code_destroy (unsigned char unused, VOID_STAR ptr) -{ - (void) unused; - SLfree (*(char **) ptr); -} - -static int float_push (unsigned char unused, VOID_STAR ptr) -{ - (void) unused; - SLang_push_float (*(float *) ptr); - return 0; -} - -static int float_pop (unsigned char unused, VOID_STAR ptr) -{ - (void) unused; - return SLang_pop_float ((float *) ptr); -} - -#endif /* SLANG_HAS_FLOAT */ - -#if SLANG_HAS_FLOAT -static char Double_Format[16] = "%g"; - -void _SLset_double_format (char *s) -{ - strncpy (Double_Format, s, 15); - Double_Format[15] = 0; -} -#endif - -static char *arith_string (unsigned char type, VOID_STAR v) -{ - char buf [256]; - char *s; - - s = buf; - - switch (type) - { - default: - s = SLclass_get_datatype_name (type); - break; - - case SLANG_CHAR_TYPE: - sprintf (s, "%d", *(char *) v); - break; - case SLANG_UCHAR_TYPE: - sprintf (s, "%u", *(unsigned char *) v); - break; - case SLANG_SHORT_TYPE: - sprintf (s, "%d", *(short *) v); - break; - case SLANG_USHORT_TYPE: - sprintf (s, "%u", *(unsigned short *) v); - break; - case SLANG_INT_TYPE: - sprintf (s, "%d", *(int *) v); - break; - case SLANG_UINT_TYPE: - sprintf (s, "%u", *(unsigned int *) v); - break; - case SLANG_LONG_TYPE: - sprintf (s, "%ld", *(long *) v); - break; - case SLANG_ULONG_TYPE: - sprintf (s, "%lu", *(unsigned long *) v); - break; -#if SLANG_HAS_FLOAT - case SLANG_FLOAT_TYPE: - if (EOF == _SLsnprintf (buf, sizeof (buf), Double_Format, *(float *) v)) - sprintf (s, "%e", *(float *) v); - break; - case SLANG_DOUBLE_TYPE: - if (EOF == _SLsnprintf (buf, sizeof (buf), Double_Format, *(double *) v)) - sprintf (s, "%e", *(double *) v); - break; -#endif - } - - return SLmake_string (s); -} - -static int integer_to_bool (unsigned char type, int *t) -{ - (void) type; - return SLang_pop_integer (t); -} - -static int push_int_literal (unsigned char type, VOID_STAR ptr) -{ - return SLclass_push_int_obj (type, (int) *(long *) ptr); -} - -static int push_char_literal (unsigned char type, VOID_STAR ptr) -{ - return SLclass_push_char_obj (type, (char) *(long *) ptr); -} - -#if SIZEOF_SHORT != SIZEOF_INT -static int push_short_literal (unsigned char type, VOID_STAR ptr) -{ - return SLclass_push_short_obj (type, (short) *(long *) ptr); -} -#endif - -#if SIZEOF_INT != SIZEOF_LONG -static int push_long_literal (unsigned char type, VOID_STAR ptr) -{ - return SLclass_push_long_obj (type, *(long *) ptr); -} -#endif - -typedef struct -{ - char *name; - unsigned char data_type; - unsigned int sizeof_type; - int (*unary_fun)(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR); - int (*push_literal) (unsigned char, VOID_STAR); - int (*cmp_fun) (unsigned char, VOID_STAR, VOID_STAR, int *); -} -Integer_Info_Type; - -static Integer_Info_Type Integer_Types [8] = -{ - {"Char_Type", SLANG_CHAR_TYPE, sizeof (char), char_unary_op, push_char_literal, char_cmp_function}, - {"UChar_Type", SLANG_UCHAR_TYPE, sizeof (unsigned char), uchar_unary_op, push_char_literal, uchar_cmp_function}, -#if SIZEOF_INT != SIZEOF_SHORT - {"Short_Type", SLANG_SHORT_TYPE, sizeof (short), short_unary_op, push_short_literal, short_cmp_function}, - {"UShort_Type", SLANG_USHORT_TYPE, sizeof (unsigned short), ushort_unary_op, push_short_literal, ushort_cmp_function}, -#else - {NULL, SLANG_SHORT_TYPE}, - {NULL, SLANG_USHORT_TYPE}, -#endif - - {"Integer_Type", SLANG_INT_TYPE, sizeof (int), int_unary_op, push_int_literal, int_cmp_function}, - {"UInteger_Type", SLANG_UINT_TYPE, sizeof (unsigned int), uint_unary_op, push_int_literal, uint_cmp_function}, - -#if SIZEOF_INT != SIZEOF_LONG - {"Long_Type", SLANG_LONG_TYPE, sizeof (long), long_unary_op, push_long_literal, long_cmp_function}, - {"ULong_Type", SLANG_ULONG_TYPE, sizeof (unsigned long), ulong_unary_op, push_long_literal, ulong_cmp_function} -#else - {NULL, SLANG_LONG_TYPE, 0, NULL, NULL, NULL}, - {NULL, SLANG_ULONG_TYPE, 0, NULL, NULL, NULL} -#endif -}; - -static int create_synonyms (void) -{ - static char *names[8] = - { - "Int16_Type", "UInt16_Type", "Int32_Type", "UInt32_Type", - "Int64_Type", "UInt64_Type", - "Float32_Type", "Float64_Type" - }; - int types[8]; - unsigned int i; - - memset ((char *) types, 0, sizeof (types)); - - /* The assumption is that sizeof(unsigned X) == sizeof (X) */ -#if SIZEOF_INT == 2 - types[0] = SLANG_INT_TYPE; - types[1] = SLANG_UINT_TYPE; -#else -# if SIZEOF_SHORT == 2 - types[0] = SLANG_SHORT_TYPE; - types[1] = SLANG_USHORT_TYPE; -# else -# if SIZEOF_LONG == 2 - types[0] = SLANG_LONG_TYPE; - types[1] = SLANG_ULONG_TYPE; -# endif -# endif -#endif - -#if SIZEOF_INT == 4 - types[2] = SLANG_INT_TYPE; - types[3] = SLANG_UINT_TYPE; -#else -# if SIZEOF_SHORT == 4 - types[2] = SLANG_SHORT_TYPE; - types[3] = SLANG_USHORT_TYPE; -# else -# if SIZEOF_LONG == 4 - types[2] = SLANG_LONG_TYPE; - types[3] = SLANG_ULONG_TYPE; -# endif -# endif -#endif - -#if SIZEOF_INT == 8 - types[4] = SLANG_INT_TYPE; - types[5] = SLANG_UINT_TYPE; -#else -# if SIZEOF_SHORT == 8 - types[4] = SLANG_SHORT_TYPE; - types[5] = SLANG_USHORT_TYPE; -# else -# if SIZEOF_LONG == 8 - types[4] = SLANG_LONG_TYPE; - types[5] = SLANG_ULONG_TYPE; -# endif -# endif -#endif - -#if SLANG_HAS_FLOAT - -#if SIZEOF_FLOAT == 4 - types[6] = SLANG_FLOAT_TYPE; -#else -# if SIZEOF_DOUBLE == 4 - types[6] = SLANG_DOUBLE_TYPE; -# endif -#endif -#if SIZEOF_FLOAT == 8 - types[7] = SLANG_FLOAT_TYPE; -#else -# if SIZEOF_DOUBLE == 8 - types[7] = SLANG_DOUBLE_TYPE; -# endif -#endif - -#endif - - if ((-1 == SLclass_create_synonym ("Int_Type", SLANG_INT_TYPE)) - || (-1 == SLclass_create_synonym ("UInt_Type", SLANG_UINT_TYPE))) - return -1; - - for (i = 0; i < 8; i++) - { - if (types[i] == 0) continue; - - if (-1 == SLclass_create_synonym (names[i], types[i])) - return -1; - } - -#if SIZEOF_INT == SIZEOF_SHORT - if ((-1 == SLclass_create_synonym ("Short_Type", SLANG_INT_TYPE)) - || (-1 == SLclass_create_synonym ("UShort_Type", SLANG_UINT_TYPE)) - || (-1 == _SLclass_copy_class (SLANG_SHORT_TYPE, SLANG_INT_TYPE)) - || (-1 == _SLclass_copy_class (SLANG_USHORT_TYPE, SLANG_UINT_TYPE))) - return -1; -#endif -#if SIZEOF_INT == SIZEOF_LONG - if ((-1 == SLclass_create_synonym ("Long_Type", SLANG_INT_TYPE)) - || (-1 == SLclass_create_synonym ("ULong_Type", SLANG_UINT_TYPE)) - || (-1 == _SLclass_copy_class (SLANG_LONG_TYPE, SLANG_INT_TYPE)) - || (-1 == _SLclass_copy_class (SLANG_ULONG_TYPE, SLANG_UINT_TYPE))) - return -1; -#endif - return 0; -} - -int _SLarith_register_types (void) -{ - SLang_Class_Type *cl; - int a_type, b_type; - int i, j; - -#if defined(HAVE_SETLOCALE) && defined(LC_NUMERIC) - /* make sure decimal point it used --- the parser requires it */ - (void) setlocale (LC_NUMERIC, "C"); -#endif - - for (i = 0; i < 8; i++) - { - Integer_Info_Type *info; - - info = Integer_Types + i; - - if (info->name == NULL) - { - /* This happens when the object is the same size as an integer - * For this case, we really want to copy the integer class. - * We will handle that when the synonym is created. - */ - continue; - } - - if (NULL == (cl = SLclass_allocate_class (info->name))) - return -1; - - (void) SLclass_set_string_function (cl, arith_string); - (void) SLclass_set_push_function (cl, integer_push); - (void) SLclass_set_pop_function (cl, integer_pop); - cl->cl_push_literal = info->push_literal; - cl->cl_to_bool = integer_to_bool; - - cl->cl_cmp = info->cmp_fun; - - if (-1 == SLclass_register_class (cl, info->data_type, info->sizeof_type, - SLANG_CLASS_TYPE_SCALAR)) - return -1; - if (-1 == SLclass_add_unary_op (info->data_type, info->unary_fun, arith_unary_op_result)) - return -1; - - _SLarith_Is_Arith_Type [info->data_type] = 1; - } - -#if SLANG_HAS_FLOAT - if (NULL == (cl = SLclass_allocate_class ("Double_Type"))) - return -1; - (void) SLclass_set_push_function (cl, double_push); - (void) SLclass_set_pop_function (cl, double_pop); - (void) SLclass_set_string_function (cl, arith_string); - cl->cl_byte_code_destroy = double_byte_code_destroy; - cl->cl_push_literal = double_push_literal; - cl->cl_cmp = double_cmp_function; - - if (-1 == SLclass_register_class (cl, SLANG_DOUBLE_TYPE, sizeof (double), - SLANG_CLASS_TYPE_SCALAR)) - return -1; - if (-1 == SLclass_add_unary_op (SLANG_DOUBLE_TYPE, double_unary_op, arith_unary_op_result)) - return -1; - _SLarith_Is_Arith_Type [SLANG_DOUBLE_TYPE] = 2; - - if (NULL == (cl = SLclass_allocate_class ("Float_Type"))) - return -1; - (void) SLclass_set_string_function (cl, arith_string); - (void) SLclass_set_push_function (cl, float_push); - (void) SLclass_set_pop_function (cl, float_pop); - cl->cl_cmp = float_cmp_function; - - if (-1 == SLclass_register_class (cl, SLANG_FLOAT_TYPE, sizeof (float), - SLANG_CLASS_TYPE_SCALAR)) - return -1; - if (-1 == SLclass_add_unary_op (SLANG_FLOAT_TYPE, float_unary_op, arith_unary_op_result)) - return -1; - _SLarith_Is_Arith_Type [SLANG_FLOAT_TYPE] = 2; -#endif - - if (-1 == create_synonyms ()) - return -1; - - for (a_type = 0; a_type <= MAXIMUM_ARITH_TYPE_VALUE; a_type++) - { - if (-1 == (i = Type_Precedence_Table [a_type])) - continue; - - for (b_type = 0; b_type <= MAXIMUM_ARITH_TYPE_VALUE; b_type++) - { - int implicit_ok; - - if (-1 == (j = Type_Precedence_Table [b_type])) - continue; - - /* Allow implicit typecast, except from into to float */ - implicit_ok = ((j >= FLOAT_PRECEDENCE_VALUE) - || (i < FLOAT_PRECEDENCE_VALUE)); - - if (-1 == SLclass_add_binary_op (a_type, b_type, arith_bin_op, arith_bin_op_result)) - return -1; - - if (i != j) - if (-1 == SLclass_add_typecast (a_type, b_type, _SLarith_typecast, implicit_ok)) - return -1; - } - } - - return 0; -} - -#if _SLANG_OPTIMIZE_FOR_SPEED - -static void promote_objs (SLang_Object_Type *a, SLang_Object_Type *b, - SLang_Object_Type *c, SLang_Object_Type *d) -{ - unsigned char ia, ib, ic, id; - int i, j; - void (*copy)(VOID_STAR, VOID_STAR, unsigned int); - - ia = a->data_type; - ib = b->data_type; - - ic = _SLarith_promote_type (ia); - - if (ic == ib) id = ic; /* already promoted */ - else id = _SLarith_promote_type (ib); - - i = Type_Precedence_Table[ic]; - j = Type_Precedence_Table[id]; - if (i > j) - { - id = ic; - j = i; - } - - c->data_type = d->data_type = id; - - i = Type_Precedence_Table[ia]; - copy = (void (*)(VOID_STAR, VOID_STAR, unsigned int)) - Binary_Matrix[i][j].copy_function; - (*copy) ((VOID_STAR) &c->v, (VOID_STAR)&a->v, 1); - - i = Type_Precedence_Table[ib]; - copy = (void (*)(VOID_STAR, VOID_STAR, unsigned int)) - Binary_Matrix[i][j].copy_function; - (*copy) ((VOID_STAR) &d->v, (VOID_STAR)&b->v, 1); -} - -int _SLarith_bin_op (SLang_Object_Type *oa, SLang_Object_Type *ob, int op) -{ - unsigned char a_type, b_type; - - a_type = oa->data_type; - b_type = ob->data_type; - - if (a_type != b_type) - { - SLang_Object_Type obj_a, obj_b; - - /* Handle common cases */ - if ((a_type == SLANG_INT_TYPE) - && (b_type == SLANG_DOUBLE_TYPE)) - return double_double_scalar_bin_op (oa->v.int_val, ob->v.double_val, op); - - if ((a_type == SLANG_DOUBLE_TYPE) - && (b_type == SLANG_INT_TYPE)) - return double_double_scalar_bin_op (oa->v.double_val, ob->v.int_val, op); - - /* Otherwise do it the hard way */ - promote_objs (oa, ob, &obj_a, &obj_b); - oa = &obj_a; - ob = &obj_b; - - a_type = oa->data_type; - b_type = ob->data_type; - } - - - switch (a_type) - { - case SLANG_CHAR_TYPE: - return int_int_scalar_bin_op (oa->v.char_val, ob->v.char_val, op); - - case SLANG_UCHAR_TYPE: - return int_int_scalar_bin_op (oa->v.uchar_val, ob->v.uchar_val, op); - - case SLANG_SHORT_TYPE: - return int_int_scalar_bin_op (oa->v.short_val, ob->v.short_val, op); - - case SLANG_USHORT_TYPE: -# if SIZEOF_INT == SIZEOF_SHORT - return uint_uint_scalar_bin_op (oa->v.ushort_val, ob->v.ushort_val, op); -# else - return int_int_scalar_bin_op ((int)oa->v.ushort_val, (int)ob->v.ushort_val, op); -# endif - -#if SIZEOF_LONG == SIZEOF_INT - case SLANG_LONG_TYPE: -#endif - case SLANG_INT_TYPE: - return int_int_scalar_bin_op (oa->v.int_val, ob->v.int_val, op); - -#if SIZEOF_LONG == SIZEOF_INT - case SLANG_ULONG_TYPE: -#endif - case SLANG_UINT_TYPE: - return uint_uint_scalar_bin_op (oa->v.uint_val, ob->v.uint_val, op); - -#if SIZEOF_LONG != SIZEOF_INT - case SLANG_LONG_TYPE: - return long_long_scalar_bin_op (oa->v.long_val, ob->v.long_val, op); - case SLANG_ULONG_TYPE: - return ulong_ulong_scalar_bin_op (oa->v.ulong_val, ob->v.ulong_val, op); -#endif - case SLANG_FLOAT_TYPE: - return float_float_scalar_bin_op (oa->v.float_val, ob->v.float_val, op); - case SLANG_DOUBLE_TYPE: - return double_double_scalar_bin_op (oa->v.double_val, ob->v.double_val, op); - } - - return 1; -} -#endif diff --git a/mdk-stage1/slang/slarith.inc b/mdk-stage1/slang/slarith.inc deleted file mode 100644 index efa8a5e04..000000000 --- a/mdk-stage1/slang/slarith.inc +++ /dev/null @@ -1,783 +0,0 @@ -/* -*- c -*- */ - -/* This include file is a template for defining arithmetic binary operations - * on arithmetic types. I realize that doing it this way is not very - * elegant but it minimizes the number of lines of code and I believe it - * promotes clarity. - */ - -/* The following macros should be properly defined before including this file: - * - * GENERIC_BINARY_FUNCTION: The name of the binary function - * GENERIC_TYPE: The class data type - * MOD_FUNCTION: The function to use for mod - * ABS_FUNCTION: Name of the abs function - * SIGN_FUNCTION: Name of the sign function - * GENERIC_UNARY_FUNCTION Name of the unary function - * - * If GENERIC_BIT_OPERATIONS is defined, the bit-level binary operators - * will get included. If the data type has a power operation (SLANG_POW), - * then POW_FUNCTION should be defined to return POW_RESULT_TYPE. - */ -#ifdef GENERIC_BINARY_FUNCTION - -static int GENERIC_BINARY_FUNCTION -(int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - GENERIC_TYPE *c, *a, *b; -#ifdef POW_FUNCTION - POW_RESULT_TYPE *d; -#endif - unsigned int n; -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - unsigned int n_max, da, db; -#endif - char *cc; - - (void) a_type; /* Both SLANG_INT_TYPE */ - (void) b_type; - - a = (GENERIC_TYPE *) ap; - b = (GENERIC_TYPE *) bp; - c = (GENERIC_TYPE *) cp; - cc = (char *) cp; - -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - if (na == 1) da = 0; else da = 1; - if (nb == 1) db = 0; else db = 1; - - if (na > nb) n_max = na; else n_max = nb; -#endif - - switch (op) - { - default: - return 0; -#ifdef POW_FUNCTION - case SLANG_POW: - d = (POW_RESULT_TYPE *) cp; -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - d[n] = POW_FUNCTION(*a, *b); - a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - d[n] = POW_FUNCTION(a[n],b[n]); - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - if (xb == 2) - for (n = 0; n < na; n++) - d[n] = a[n] * a[n]; - else - for (n = 0; n < na; n++) - d[n] = POW_FUNCTION(a[n], xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - d[n] = POW_FUNCTION(xa, b[n]); - } -#endif - break; -#endif - case SLANG_PLUS: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - c[n] = (*a + *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - c[n] = a[n] + b[n]; - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - c[n] = a[n] + xb; - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - c[n] = xa + b[n]; - } -#endif - break; - - case SLANG_MINUS: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - c[n] = (*a - *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - c[n] = a[n] - b[n]; - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - c[n] = a[n] - xb; - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - c[n] = xa - b[n]; - } -#endif - break; - - case SLANG_TIMES: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - c[n] = (*a * *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - c[n] = a[n] * b[n]; - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - c[n] = a[n] * xb; - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - c[n] = xa * b[n]; - } -#endif - break; - - case SLANG_DIVIDE: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - if (*b == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - c[n] = (*a / *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - { - if (b[n] == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - c[n] = a[n] / b[n]; - } - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - - if (xb == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - for (n = 0; n < na; n++) - c[n] = a[n] / xb; - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - { - if (b[n] == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - c[n] = xa / b[n]; - } - } -#endif - break; - - case SLANG_MOD: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - if (*b == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - c[n] = MOD_FUNCTION(*a, *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - { - if (b[n] == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - c[n] = MOD_FUNCTION(a[n],b[n]); - } - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - if (xb == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - for (n = 0; n < na; n++) - c[n] = MOD_FUNCTION(a[n],xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - { - if (b[n] == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - c[n] = MOD_FUNCTION(xa,b[n]); - } - } -#endif - break; - -#ifdef GENERIC_BIT_OPERATIONS - case SLANG_BAND: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - c[n] = (*a & *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - c[n] = a[n] & b[n]; - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - c[n] = a[n] & xb; - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - c[n] = xa & b[n]; - } -#endif - break; - - case SLANG_BXOR: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - c[n] = (*a ^ *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - c[n] = a[n] ^ b[n]; - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - c[n] = a[n] ^ xb; - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - c[n] = xa ^ b[n]; - } -#endif - break; - - case SLANG_BOR: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - c[n] = (*a | *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - c[n] = a[n] | b[n]; - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - c[n] = a[n] | xb; - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - c[n] = xa | b[n]; - } -#endif - break; - - case SLANG_SHL: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - c[n] = (*a << *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - c[n] = a[n] << b[n]; - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - c[n] = a[n] << xb; - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - c[n] = xa << b[n]; - } -#endif - break; - - case SLANG_SHR: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - c[n] = (*a >> *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - c[n] = a[n] >> b[n]; - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - c[n] = a[n] >> xb; - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - c[n] = xa >> b[n]; - } -#endif - break; -#endif /* GENERIC_BIT_OPERATIONS */ - case SLANG_EQ: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - cc[n] = (*a == *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - cc[n] = (a[n] == b[n]); - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - cc[n] = (a[n] == xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - cc[n] = (xa == b[n]); - } -#endif - break; - - case SLANG_NE: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - cc[n] = (*a != *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - cc[n] = (a[n] != b[n]); - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - cc[n] = (a[n] != xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - cc[n] = (xa != b[n]); - } -#endif - break; - - case SLANG_GT: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - cc[n] = (*a > *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - cc[n] = (a[n] > b[n]); - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - cc[n] = (a[n] > xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - cc[n] = (xa > b[n]); - } -#endif - break; - - case SLANG_GE: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - cc[n] = (*a >= *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - cc[n] = (a[n] >= b[n]); - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - cc[n] = (a[n] >= xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - cc[n] = (xa >= b[n]); - } -#endif - break; - - case SLANG_LT: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - cc[n] = (*a < *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - cc[n] = (a[n] < b[n]); - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - cc[n] = (a[n] < xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - cc[n] = (xa < b[n]); - } -#endif - break; - - case SLANG_LE: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - cc[n] = (*a <= *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - cc[n] = (a[n] <= b[n]); - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - cc[n] = (a[n] <= xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - cc[n] = (xa <= b[n]); - } -#endif - break; - - case SLANG_OR: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - cc[n] = (*a || *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - cc[n] = (a[n] || b[n]); - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - cc[n] = (a[n] || xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - cc[n] = (xa || b[n]); - } -#endif - break; - - case SLANG_AND: -#if _SLANG_OPTIMIZE_FOR_SPEED < 2 - for (n = 0; n < n_max; n++) - { - cc[n] = (*a && *b); a += da; b += db; - } -#else - if (na == nb) - { - for (n = 0; n < na; n++) - cc[n] = (a[n] && b[n]); - } - else if (nb == 1) - { - GENERIC_TYPE xb = *b; - for (n = 0; n < na; n++) - cc[n] = (a[n] && xb); - } - else /* if (na == 1) */ - { - GENERIC_TYPE xa = *a; - for (n = 0; n < nb; n++) - cc[n] = (xa && b[n]); - } -#endif - break; - } - return 1; -} - -#endif /* GENERIC_BINARY_FUNCTION */ - - -#ifdef GENERIC_UNARY_FUNCTION - -static int GENERIC_UNARY_FUNCTION -(int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - VOID_STAR bp - ) -{ - GENERIC_TYPE *a, *b; - unsigned int n; - int *ib; - - (void) a_type; - - a = (GENERIC_TYPE *) ap; - b = (GENERIC_TYPE *) bp; - - switch (op) - { - default: - return 0; - - case SLANG_PLUSPLUS: - for (n = 0; n < na; n++) b[n] = (a[n] + 1); - break; - case SLANG_MINUSMINUS: - for (n = 0; n < na; n++) b[n] = (a[n] - 1); - break; - case SLANG_CHS: - for (n = 0; n < na; n++) b[n] = (GENERIC_TYPE) -(a[n]); - break; - case SLANG_SQR: - for (n = 0; n < na; n++) b[n] = (a[n] * a[n]); - break; - case SLANG_MUL2: - for (n = 0; n < na; n++) b[n] = (2 * a[n]); - break; - case SLANG_ABS: - for (n = 0; n < na; n++) b[n] = ABS_FUNCTION (a[n]); - break; - case SLANG_SIGN: - ib = (int *) bp; - for (n = 0; n < na; n++) - ib[n] = SIGN_FUNCTION(a[n]); - break; - -#ifdef GENERIC_BIT_OPERATIONS - case SLANG_NOT: - for (n = 0; n < na; n++) b[n] = !(a[n]); - break; - case SLANG_BNOT: - for (n = 0; n < na; n++) b[n] = ~(a[n]); - break; -#endif - } - - return 1; -} -#endif /* GENERIC_UNARY_FUNCTION */ - - -#ifdef SCALAR_BINARY_FUNCTION - -static int SCALAR_BINARY_FUNCTION (GENERIC_TYPE a, GENERIC_TYPE b, int op) -{ - switch (op) - { - default: - return 1; - -#ifdef POW_FUNCTION - case SLANG_POW: - return PUSH_POW_OBJ_FUN(POW_FUNCTION(a, b)); -#endif - case SLANG_PLUS: - return PUSH_SCALAR_OBJ_FUN (a + b); - case SLANG_MINUS: - return PUSH_SCALAR_OBJ_FUN (a - b); - case SLANG_TIMES: - return PUSH_SCALAR_OBJ_FUN (a * b); - case SLANG_DIVIDE: - if (b == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - return PUSH_SCALAR_OBJ_FUN (a / b); - case SLANG_MOD: - if (b == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - return PUSH_SCALAR_OBJ_FUN (MOD_FUNCTION(a,b)); -#ifdef GENERIC_BIT_OPERATIONS - case SLANG_BAND: - return PUSH_SCALAR_OBJ_FUN (a & b); - case SLANG_BXOR: - return PUSH_SCALAR_OBJ_FUN (a ^ b); - case SLANG_BOR: - return PUSH_SCALAR_OBJ_FUN (a | b); - case SLANG_SHL: - return PUSH_SCALAR_OBJ_FUN (a << b); - case SLANG_SHR: - return PUSH_SCALAR_OBJ_FUN (a >> b); -#endif - case SLANG_GT: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a > b)); - case SLANG_LT: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a < b)); - case SLANG_GE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a >= b)); - case SLANG_LE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a <= b)); - case SLANG_EQ: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a == b)); - case SLANG_NE: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a != b)); - case SLANG_OR: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a || b)); - case SLANG_AND: return SLclass_push_char_obj (SLANG_CHAR_TYPE, (char)(a && b)); - } -} - -#endif /* SCALAR_BINARY_FUNCTION */ - -#ifdef CMP_FUNCTION -static int CMP_FUNCTION (unsigned char unused, VOID_STAR a, VOID_STAR b, int *c) -{ - GENERIC_TYPE x, y; - - (void) unused; - x = *(GENERIC_TYPE *) a; - y = *(GENERIC_TYPE *) b; - - if (x > y) *c = 1; - else if (x == y) *c = 0; - else *c = -1; - - return 0; -} -#endif - -#undef CMP_FUNCTION -#undef SCALAR_BINARY_FUNCTION -#undef PUSH_POW_OBJ_FUN -#undef PUSH_SCALAR_OBJ_FUN -#undef GENERIC_BINARY_FUNCTION -#undef GENERIC_UNARY_FUNCTION -#undef GENERIC_BIT_OPERATIONS -#undef GENERIC_TYPE -#undef POW_FUNCTION -#undef POW_RESULT_TYPE -#undef MOD_FUNCTION -#undef ABS_FUNCTION -#undef SIGN_FUNCTION diff --git a/mdk-stage1/slang/slarray.c b/mdk-stage1/slang/slarray.c deleted file mode 100644 index 0b9a1406c..000000000 --- a/mdk-stage1/slang/slarray.c +++ /dev/null @@ -1,3139 +0,0 @@ -/* Array manipulation routines for S-Lang */ -/* Copyright (c) 1997, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#define SL_APP_WANTS_FOREACH -#include "slang.h" -#include "_slang.h" - -typedef struct -{ - int first_index; - int last_index; - int delta; -} -SLarray_Range_Array_Type; - -/* Use SLang_pop_array when a linear array is required. */ -static int pop_array (SLang_Array_Type **at_ptr, int convert_scalar) -{ - SLang_Array_Type *at; - int one = 1; - int type; - - *at_ptr = NULL; - type = SLang_peek_at_stack (); - - switch (type) - { - case -1: - return -1; - - case SLANG_ARRAY_TYPE: - return SLclass_pop_ptr_obj (SLANG_ARRAY_TYPE, (VOID_STAR *) at_ptr); - - case SLANG_NULL_TYPE: - convert_scalar = 0; - /* drop */ - default: - if (convert_scalar == 0) - { - SLdo_pop (); - SLang_verror (SL_TYPE_MISMATCH, "Context requires an array. Scalar not converted"); - return -1; - } - break; - } - - if (NULL == (at = SLang_create_array ((unsigned char) type, 0, NULL, &one, 1))) - return -1; - - if (-1 == at->cl->cl_apop ((unsigned char) type, at->data)) - { - SLang_free_array (at); - return -1; - } - - *at_ptr = at; - - return 0; -} - -static VOID_STAR linear_get_data_addr (SLang_Array_Type *at, int *dims) -{ - unsigned int num_dims; - unsigned int ofs; - unsigned int i; - int *max_dims; - - ofs = 0; - max_dims = at->dims; - num_dims = at->num_dims; - - for (i = 0; i < num_dims; i++) - { - int d = dims[i]; - - if (d < 0) - d = d + max_dims[i]; - - ofs = ofs * (unsigned int)max_dims [i] + (unsigned int) d; - } - - return (VOID_STAR) ((char *)at->data + (ofs * at->sizeof_type)); -} - -static VOID_STAR get_data_addr (SLang_Array_Type *at, int *dims) -{ - VOID_STAR data; - - data = at->data; - if (data == NULL) - { - SLang_verror (SL_UNKNOWN_ERROR, "Array has no data"); - return NULL; - } - - data = (*at->index_fun) (at, dims); - - if (data == NULL) - { - SLang_verror (SL_UNKNOWN_ERROR, "Unable to access array element"); - return NULL; - } - - return data; -} - -void _SLarray_free_array_elements (SLang_Class_Type *cl, VOID_STAR s, unsigned int num) -{ - unsigned int sizeof_type; - void (*f) (unsigned char, VOID_STAR); - char *p; - unsigned char type; - - if ((cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR) - || (cl->cl_class_type == SLANG_CLASS_TYPE_VECTOR)) - return; - - f = cl->cl_destroy; - sizeof_type = cl->cl_sizeof_type; - type = cl->cl_data_type; - - p = (char *) s; - while (num != 0) - { - if (NULL != *(VOID_STAR *)p) - { - (*f) (type, (VOID_STAR)p); - *(VOID_STAR *) p = NULL; - } - p += sizeof_type; - num--; - } -} - -static int destroy_element (SLang_Array_Type *at, - int *dims, - VOID_STAR data) -{ - data = get_data_addr (at, dims); - if (data == NULL) - return -1; - - /* This function should only get called for arrays that have - * pointer elements. Do not call the destroy method if the element - * is NULL. - */ - if (NULL != *(VOID_STAR *)data) - { - (*at->cl->cl_destroy) (at->data_type, data); - *(VOID_STAR *) data = NULL; - } - return 0; -} - -/* This function only gets called when a new array is created. Thus there - * is no need to destroy the object first. - */ -static int new_object_element (SLang_Array_Type *at, - int *dims, - VOID_STAR data) -{ - data = get_data_addr (at, dims); - if (data == NULL) - return -1; - - return (*at->cl->cl_init_array_object) (at->data_type, data); -} - -static int next_index (int *dims, int *max_dims, unsigned int num_dims) -{ - while (num_dims) - { - int dims_i; - - num_dims--; - - dims_i = dims [num_dims] + 1; - if (dims_i != (int) max_dims [num_dims]) - { - dims [num_dims] = dims_i; - return 0; - } - dims [num_dims] = 0; - } - - return -1; -} - -static int do_method_for_all_elements (SLang_Array_Type *at, - int (*method)(SLang_Array_Type *, - int *, - VOID_STAR), - VOID_STAR client_data) -{ - int dims [SLARRAY_MAX_DIMS]; - int *max_dims; - unsigned int num_dims; - - if (at->num_elements == 0) - return 0; - - max_dims = at->dims; - num_dims = at->num_dims; - - SLMEMSET((char *)dims, 0, sizeof(dims)); - - do - { - if (-1 == (*method) (at, dims, client_data)) - return -1; - } - while (0 == next_index (dims, max_dims, num_dims)); - - return 0; -} - -void SLang_free_array (SLang_Array_Type *at) -{ - VOID_STAR data; - unsigned int flags; - - if (at == NULL) return; - - if (at->num_refs > 1) - { - at->num_refs -= 1; - return; - } - - data = at->data; - flags = at->flags; - - if (flags & SLARR_DATA_VALUE_IS_INTRINSIC) - return; /* not to be freed */ - - if (flags & SLARR_DATA_VALUE_IS_POINTER) - (void) do_method_for_all_elements (at, destroy_element, NULL); - - SLfree ((char *) data); - SLfree ((char *) at); -} - -SLang_Array_Type * -SLang_create_array1 (unsigned char type, int read_only, VOID_STAR data, - int *dims, unsigned int num_dims, int no_init) -{ - SLang_Class_Type *cl; - unsigned int i; - SLang_Array_Type *at; - unsigned int num_elements; - unsigned int sizeof_type; - unsigned int size; - - if (num_dims > SLARRAY_MAX_DIMS) - { - SLang_verror (SL_NOT_IMPLEMENTED, "%u dimensional arrays are not supported", num_dims); - return NULL; - } - - for (i = 0; i < num_dims; i++) - { - if (dims[i] < 0) - { - SLang_verror (SL_INVALID_PARM, "Size of array dim %u is less than 0", i); - return NULL; - } - } - - cl = _SLclass_get_class (type); - - at = (SLang_Array_Type *) SLmalloc (sizeof(SLang_Array_Type)); - if (at == NULL) - return NULL; - - SLMEMSET ((char*) at, 0, sizeof(SLang_Array_Type)); - - at->data_type = type; - at->cl = cl; - at->num_dims = num_dims; - at->num_refs = 1; - - if (read_only) at->flags = SLARR_DATA_VALUE_IS_READ_ONLY; - switch (cl->cl_class_type) - { - case SLANG_CLASS_TYPE_VECTOR: - case SLANG_CLASS_TYPE_SCALAR: - break; - - default: - at->flags |= SLARR_DATA_VALUE_IS_POINTER; - } - - num_elements = 1; - for (i = 0; i < num_dims; i++) - { - at->dims [i] = dims[i]; - num_elements = dims [i] * num_elements; - } - - /* Now set the rest of the unused dimensions to 1. This makes it easier - * when transposing arrays. - */ - while (i < SLARRAY_MAX_DIMS) - at->dims[i++] = 1; - - at->num_elements = num_elements; - at->index_fun = linear_get_data_addr; - at->sizeof_type = sizeof_type = cl->cl_sizeof_type; - - if (data != NULL) - { - at->data = data; - return at; - } - - size = num_elements * sizeof_type; - - if (size == 0) size = 1; - - if (NULL == (data = (VOID_STAR) SLmalloc (size))) - { - SLang_free_array (at); - return NULL; - } - - if (no_init == 0) - SLMEMSET ((char *) data, 0, size); - - at->data = data; - - if ((cl->cl_init_array_object != NULL) - && (-1 == do_method_for_all_elements (at, new_object_element, NULL))) - { - SLang_free_array (at); - return NULL; - } - return at; -} - -SLang_Array_Type * -SLang_create_array (unsigned char type, int read_only, VOID_STAR data, - int *dims, unsigned int num_dims) -{ - return SLang_create_array1 (type, read_only, data, dims, num_dims, 0); -} - -int SLang_add_intrinsic_array (char *name, - unsigned char type, - int read_only, - VOID_STAR data, - unsigned int num_dims, ...) -{ - va_list ap; - unsigned int i; - int dims[SLARRAY_MAX_DIMS]; - SLang_Array_Type *at; - - if ((num_dims > SLARRAY_MAX_DIMS) - || (name == NULL) - || (data == NULL)) - { - SLang_verror (SL_INVALID_PARM, "Unable to create intrinsic array"); - return -1; - } - - va_start (ap, num_dims); - for (i = 0; i < num_dims; i++) - dims [i] = va_arg (ap, int); - va_end (ap); - - at = SLang_create_array (type, read_only, data, dims, num_dims); - if (at == NULL) - return -1; - at->flags |= SLARR_DATA_VALUE_IS_INTRINSIC; - - /* Note: The variable that refers to the intrinsic array is regarded as - * read-only. That way, Array_Name = another_array; will fail. - */ - if (-1 == SLadd_intrinsic_variable (name, (VOID_STAR) at, SLANG_ARRAY_TYPE, 1)) - { - SLang_free_array (at); - return -1; - } - return 0; -} - -static int pop_array_indices (int *dims, unsigned int num_dims) -{ - unsigned int n; - int i; - - if (num_dims > SLARRAY_MAX_DIMS) - { - SLang_verror (SL_INVALID_PARM, "Array size not supported"); - return -1; - } - - n = num_dims; - while (n != 0) - { - n--; - if (-1 == SLang_pop_integer (&i)) - return -1; - - dims[n] = i; - } - - return 0; -} - -int SLang_push_array (SLang_Array_Type *at, int free_flag) -{ - if (at == NULL) - return SLang_push_null (); - - at->num_refs += 1; - - if (0 == SLclass_push_ptr_obj (SLANG_ARRAY_TYPE, (VOID_STAR) at)) - { - if (free_flag) - SLang_free_array (at); - return 0; - } - - at->num_refs -= 1; - - if (free_flag) SLang_free_array (at); - return -1; -} - -/* This function gets called via expressions such as Double_Type[10, 20]; - */ -static int push_create_new_array (void) -{ - unsigned int num_dims; - SLang_Array_Type *at; - unsigned char type; - int dims [SLARRAY_MAX_DIMS]; - int (*anew) (unsigned char, unsigned int); - - num_dims = (SLang_Num_Function_Args - 1); - - if (-1 == _SLang_pop_datatype (&type)) - return -1; - - anew = (_SLclass_get_class (type))->cl_anew; - if (anew != NULL) - return (*anew) (type, num_dims); - - if (-1 == pop_array_indices (dims, num_dims)) - return -1; - - if (NULL == (at = SLang_create_array (type, 0, NULL, dims, num_dims))) - return -1; - - return SLang_push_array (at, 1); -} - -static int push_element_at_addr (SLang_Array_Type *at, - VOID_STAR data, int allow_null) -{ - SLang_Class_Type *cl; - - cl = at->cl; - if ((at->flags & SLARR_DATA_VALUE_IS_POINTER) - && (*(VOID_STAR *) data == NULL)) - { - if (allow_null) - return SLang_push_null (); - - SLang_verror (SL_VARIABLE_UNINITIALIZED, - "%s array has unitialized element", cl->cl_name); - return -1; - } - - return (*cl->cl_apush)(at->data_type, data); -} - -static int coerse_array_to_linear (SLang_Array_Type *at) -{ - SLarray_Range_Array_Type *range; - int *data; - int xmin, dx; - unsigned int i, imax; - - /* FIXME: Priority = low. This assumes that if an array is not linear, then - * it is a range. - */ - if (0 == (at->flags & SLARR_DATA_VALUE_IS_RANGE)) - return 0; - - range = (SLarray_Range_Array_Type *) at->data; - xmin = range->first_index; - dx = range->delta; - - imax = at->num_elements; - data = (int *) SLmalloc ((imax + 1) * sizeof (int)); - if (data == NULL) - return -1; - - for (i = 0; i < imax; i++) - { - data [i] = xmin; - xmin += dx; - } - - SLfree ((char *) range); - at->data = (VOID_STAR) data; - at->flags &= ~SLARR_DATA_VALUE_IS_RANGE; - at->index_fun = linear_get_data_addr; - return 0; -} - -static void -free_index_objects (SLang_Object_Type *index_objs, unsigned int num_indices) -{ - unsigned int i; - SLang_Object_Type *obj; - - for (i = 0; i < num_indices; i++) - { - obj = index_objs + i; - if (obj->data_type != 0) - SLang_free_object (obj); - } -} - -static int -pop_indices (SLang_Object_Type *index_objs, unsigned int num_indices, - int *is_index_array) -{ - unsigned int i; - - SLMEMSET((char *) index_objs, 0, num_indices * sizeof (SLang_Object_Type)); - - *is_index_array = 0; - - if (num_indices >= SLARRAY_MAX_DIMS) - { - SLang_verror (SL_INVALID_PARM, "too many indices for array"); - return -1; - } - - i = num_indices; - while (i != 0) - { - SLang_Object_Type *obj; - - i--; - obj = index_objs + i; - if (-1 == _SLang_pop_object_of_type (SLANG_INT_TYPE, obj, 1)) - goto return_error; - - if (obj->data_type == SLANG_ARRAY_TYPE) - { - SLang_Array_Type *at = obj->v.array_val; - - if (at->num_dims == 1) - { - if ((num_indices == 1) - && (0 == (at->flags & SLARR_DATA_VALUE_IS_RANGE))) - *is_index_array = 1; - } - else - { - SLang_verror (SL_INVALID_PARM, "expecting a 1-d index array"); - goto return_error; - } - } - } - - return 0; - - return_error: - free_index_objects (index_objs, num_indices); - return -1; -} - -/* Here ind_at is a linear 1-d array of indices */ -static int -check_index_array_ranges (SLang_Array_Type *at, SLang_Array_Type *ind_at) -{ - int *indices, *indices_max; - unsigned int num_elements; - - num_elements = at->num_elements; - indices = (int *) ind_at->data; - indices_max = indices + ind_at->num_elements; - - while (indices < indices_max) - { - unsigned int d; - - d = (unsigned int) *indices++; - if (d >= num_elements) - { - SLang_verror (SL_INVALID_PARM, - "index-array is out of range"); - return -1; - } - } - return 0; -} - -static int -transfer_n_elements (SLang_Array_Type *at, VOID_STAR dest_data, VOID_STAR src_data, - unsigned int sizeof_type, unsigned int n, int is_ptr) -{ - unsigned char data_type; - SLang_Class_Type *cl; - - if (is_ptr == 0) - { - SLMEMCPY ((char *) dest_data, (char *)src_data, n * sizeof_type); - return 0; - } - - data_type = at->data_type; - cl = at->cl; - - while (n != 0) - { - if (*(VOID_STAR *)dest_data != NULL) - { - (*cl->cl_destroy) (data_type, dest_data); - *(VOID_STAR *) dest_data = NULL; - } - - if (*(VOID_STAR *) src_data == NULL) - *(VOID_STAR *) dest_data = NULL; - else - { - if (-1 == (*cl->cl_acopy) (data_type, src_data, dest_data)) - /* No need to destroy anything */ - return -1; - } - - src_data = (VOID_STAR) ((char *)src_data + sizeof_type); - dest_data = (VOID_STAR) ((char *)dest_data + sizeof_type); - - n--; - } - - return 0; -} - -int -_SLarray_aget_transfer_elem (SLang_Array_Type *at, int *indices, - VOID_STAR new_data, unsigned int sizeof_type, int is_ptr) -{ - VOID_STAR at_data; - - /* Since 1 element is being transferred, there is not need to coerse - * the array to linear. - */ - if (NULL == (at_data = get_data_addr (at, indices))) - return -1; - - return transfer_n_elements (at, new_data, at_data, sizeof_type, 1, is_ptr); -} - -/* Here the ind_at index-array is a 1-d array of indices. This function - * creates a 1-d array of made up of values of 'at' at the locations - * specified by the indices. The result is pushed. - */ -static int -aget_from_index_array (SLang_Array_Type *at, - SLang_Array_Type *ind_at) -{ - SLang_Array_Type *new_at; - int *indices, *indices_max; - unsigned char *new_data, *src_data; - unsigned int sizeof_type; - int is_ptr; - - if (-1 == coerse_array_to_linear (at)) - return -1; - - if (-1 == coerse_array_to_linear (ind_at)) - return -1; - - if (-1 == check_index_array_ranges (at, ind_at)) - return -1; - - if (NULL == (new_at = SLang_create_array (at->data_type, 0, NULL, ind_at->dims, 1))) - return -1; - - /* Since the index array is linear, I can address it directly */ - indices = (int *) ind_at->data; - indices_max = indices + ind_at->num_elements; - - src_data = (unsigned char *) at->data; - new_data = (unsigned char *) new_at->data; - sizeof_type = new_at->sizeof_type; - is_ptr = (new_at->flags & SLARR_DATA_VALUE_IS_POINTER); - - while (indices < indices_max) - { - unsigned int offset; - - offset = sizeof_type * (unsigned int)*indices; - if (-1 == transfer_n_elements (at, (VOID_STAR) new_data, - (VOID_STAR) (src_data + offset), - sizeof_type, 1, is_ptr)) - { - SLang_free_array (new_at); - return -1; - } - - new_data += sizeof_type; - indices++; - } - - return SLang_push_array (new_at, 1); -} - -/* This is extremely ugly. It is due to the fact that the index_objects - * may contain ranges. This is a utility function for the aget/aput - * routines - */ -static int -convert_nasty_index_objs (SLang_Array_Type *at, - SLang_Object_Type *index_objs, - unsigned int num_indices, - int **index_data, - int *range_buf, int *range_delta_buf, - int *max_dims, - unsigned int *num_elements, - int *is_array, int is_dim_array[SLARRAY_MAX_DIMS]) -{ - unsigned int i, total_num_elements; - SLang_Array_Type *ind_at; - - if (num_indices != at->num_dims) - { - SLang_verror (SL_INVALID_PARM, "Array requires %u indices", at->num_dims); - return -1; - } - - *is_array = 0; - total_num_elements = 1; - for (i = 0; i < num_indices; i++) - { - int max_index, min_index; - SLang_Object_Type *obj; - int at_dims_i; - - at_dims_i = at->dims[i]; - obj = index_objs + i; - range_delta_buf [i] = 0; - - if (obj->data_type == SLANG_INT_TYPE) - { - range_buf [i] = min_index = max_index = obj->v.int_val; - max_dims [i] = 1; - index_data[i] = range_buf + i; - is_dim_array[i] = 0; - } - else - { - *is_array = 1; - is_dim_array[i] = 1; - ind_at = obj->v.array_val; - - if (ind_at->flags & SLARR_DATA_VALUE_IS_RANGE) - { - SLarray_Range_Array_Type *r; - int delta; - int first_index, last_index; - - r = (SLarray_Range_Array_Type *) ind_at->data; - - /* In an array indexing context, range arrays have different - * semantics. Consider a[[0:10]]. Clearly this means elements - * 0-10 of a. But what does a[[0:-1]] mean? By itself, - * [0:-1] is a null matrix []. But, it is useful in an - * indexing context to allow -1 to refer to the last element - * of the array. Similarly, [-3:-1] refers to the last 3 - * elements. - * - * However, [-1:-3] does not refer to any of the elements. - */ - if ((first_index = r->first_index) < 0) - { - if (at_dims_i != 0) - first_index = (at_dims_i + first_index) % at_dims_i; - } - - if ((last_index = r->last_index) < 0) - { - if (at_dims_i != 0) - last_index = (at_dims_i + last_index) % at_dims_i; - } - - delta = r->delta; - - range_delta_buf [i] = delta; - range_buf[i] = first_index; - - if (delta > 0) - { - if (first_index > last_index) - max_dims[i] = min_index = max_index = 0; - else - { - max_index = min_index = first_index; - while (max_index + delta <= last_index) - max_index += delta; - max_dims [i] = 1 + (max_index - min_index) / delta; - } - } - else - { - if (first_index < last_index) - max_dims[i] = min_index = max_index = 0; - else - { - min_index = max_index = first_index; - while (min_index + delta >= last_index) - min_index += delta; - max_dims [i] = 1 + (max_index - min_index) / (-delta); - } - } - } - else - { - int *tmp, *tmp_max; - - if (0 == (max_dims[i] = ind_at->num_elements)) - { - total_num_elements = 0; - break; - } - - tmp = (int *) ind_at->data; - tmp_max = tmp + ind_at->num_elements; - index_data [i] = tmp; - - min_index = max_index = *tmp; - while (tmp < tmp_max) - { - if (max_index > *tmp) - max_index = *tmp; - if (min_index < *tmp) - min_index = *tmp; - - tmp++; - } - } - } - - if ((at_dims_i == 0) && (max_dims[i] == 0)) - { - total_num_elements = 0; - continue; - } - - if (max_index < 0) - max_index += at_dims_i; - if (min_index < 0) - min_index += at_dims_i; - - if ((min_index < 0) || (min_index >= at_dims_i) - || (max_index < 0) || (max_index >= at_dims_i)) - { - SLang_verror (SL_INVALID_PARM, "Array index %u ([%d:%d]) out of allowed range [0->%d]", - i, min_index, max_index, at_dims_i); - return -1; - } - - total_num_elements = total_num_elements * max_dims[i]; - } - - *num_elements = total_num_elements; - return 0; -} - -/* This routine pushes a 1-d vector of values from 'at' indexed by - * the objects 'index_objs'. These objects can either be integers or - * 1-d integer arrays. The fact that the 1-d arrays can be ranges - * makes this look ugly. - */ -static int -aget_from_indices (SLang_Array_Type *at, - SLang_Object_Type *index_objs, unsigned int num_indices) -{ - int *index_data [SLARRAY_MAX_DIMS]; - int range_buf [SLARRAY_MAX_DIMS]; - int range_delta_buf [SLARRAY_MAX_DIMS]; - int max_dims [SLARRAY_MAX_DIMS]; - unsigned int i, num_elements; - SLang_Array_Type *new_at; - int map_indices[SLARRAY_MAX_DIMS]; - int indices [SLARRAY_MAX_DIMS]; - unsigned int sizeof_type; - int is_ptr, ret, is_array; - char *new_data; - SLang_Class_Type *cl; - int is_dim_array[SLARRAY_MAX_DIMS]; - - if (-1 == convert_nasty_index_objs (at, index_objs, num_indices, - index_data, range_buf, range_delta_buf, - max_dims, &num_elements, &is_array, - is_dim_array)) - return -1; - - is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER); - sizeof_type = at->sizeof_type; - - cl = _SLclass_get_class (at->data_type); - - if ((is_array == 0) && (num_elements == 1)) - { - new_data = (char *)cl->cl_transfer_buf; - memset (new_data, 0, sizeof_type); - new_at = NULL; - } - else - { - int i_num_elements = (int)num_elements; - - new_at = SLang_create_array (at->data_type, 0, NULL, &i_num_elements, 1); - if (NULL == new_at) - return -1; - if (num_elements == 0) - return SLang_push_array (new_at, 1); - - new_data = (char *)new_at->data; - } - - SLMEMSET((char *) map_indices, 0, sizeof(map_indices)); - do - { - for (i = 0; i < num_indices; i++) - { - int j; - - j = map_indices[i]; - - if (0 != range_delta_buf[i]) - indices[i] = range_buf[i] + j * range_delta_buf[i]; - else - indices[i] = index_data [i][j]; - } - - if (-1 == _SLarray_aget_transfer_elem (at, indices, (VOID_STAR)new_data, sizeof_type, is_ptr)) - { - SLang_free_array (new_at); - return -1; - } - new_data += sizeof_type; - } - while (0 == next_index (map_indices, max_dims, num_indices)); - - if (new_at != NULL) - { - int num_dims = 0; - /* Fixup dimensions on array */ - for (i = 0; i < num_indices; i++) - { - if (is_dim_array[i]) /* was: (max_dims[i] > 1) */ - { - new_at->dims[num_dims] = max_dims[i]; - num_dims++; - } - } - - if (num_dims != 0) new_at->num_dims = num_dims; - return SLang_push_array (new_at, 1); - } - - /* Here new_data is a whole new copy, so free it after the push */ - new_data -= sizeof_type; - if (is_ptr && (*(VOID_STAR *)new_data == NULL)) - ret = SLang_push_null (); - else - { - ret = (*cl->cl_apush) (at->data_type, (VOID_STAR)new_data); - (*cl->cl_adestroy) (at->data_type, (VOID_STAR)new_data); - } - - return ret; -} - -static int push_string_as_array (unsigned char *s, unsigned int len) -{ - int ilen; - SLang_Array_Type *at; - - ilen = (int) len; - - at = SLang_create_array (SLANG_UCHAR_TYPE, 0, NULL, &ilen, 1); - if (at == NULL) - return -1; - - memcpy ((char *)at->data, (char *)s, len); - return SLang_push_array (at, 1); -} - -static int pop_array_as_string (char **sp) -{ - SLang_Array_Type *at; - int ret; - - *sp = NULL; - - if (-1 == SLang_pop_array_of_type (&at, SLANG_UCHAR_TYPE)) - return -1; - - ret = 0; - - if (NULL == (*sp = SLang_create_nslstring ((char *) at->data, at->num_elements))) - ret = -1; - - SLang_free_array (at); - return ret; -} - -static int pop_array_as_bstring (SLang_BString_Type **bs) -{ - SLang_Array_Type *at; - int ret; - - *bs = NULL; - - if (-1 == SLang_pop_array_of_type (&at, SLANG_UCHAR_TYPE)) - return -1; - - ret = 0; - - if (NULL == (*bs = SLbstring_create ((unsigned char *) at->data, at->num_elements))) - ret = -1; - - SLang_free_array (at); - return ret; -} - -static int aget_from_array (unsigned int num_indices) -{ - SLang_Array_Type *at; - SLang_Object_Type index_objs [SLARRAY_MAX_DIMS]; - int ret; - int is_index_array; - unsigned int i; - - if (num_indices > SLARRAY_MAX_DIMS) - { - SLang_verror (SL_INVALID_PARM, "Number of dims must be less than %d", SLARRAY_MAX_DIMS); - return -1; - } - - if (-1 == pop_array (&at, 1)) - return -1; - - if (-1 == pop_indices (index_objs, num_indices, &is_index_array)) - { - SLang_free_array (at); - return -1; - } - - if (is_index_array == 0) - ret = aget_from_indices (at, index_objs, num_indices); - else - ret = aget_from_index_array (at, index_objs[0].v.array_val); - - SLang_free_array (at); - for (i = 0; i < num_indices; i++) - SLang_free_object (index_objs + i); - - return ret; -} - -static int push_string_element (unsigned char type, unsigned char *s, unsigned int len) -{ - int i; - - if (SLang_peek_at_stack () == SLANG_ARRAY_TYPE) - { - char *str; - - /* The indices are array values. So, do this: */ - if (-1 == push_string_as_array (s, len)) - return -1; - - if (-1 == aget_from_array (1)) - return -1; - - if (type == SLANG_BSTRING_TYPE) - { - SLang_BString_Type *bs; - int ret; - - if (-1 == pop_array_as_bstring (&bs)) - return -1; - - ret = SLang_push_bstring (bs); - SLbstring_free (bs); - return ret; - } - - if (-1 == pop_array_as_string (&str)) - return -1; - return _SLang_push_slstring (str); /* frees s upon error */ - } - - if (-1 == SLang_pop_integer (&i)) - return -1; - - if (i < 0) i = i + (int)len; - if ((unsigned int) i > len) - i = len; /* get \0 character --- bstrings include it as well */ - - i = s[(unsigned int) i]; - - return SLang_push_integer (i); -} - -/* ARRAY[i, j, k] generates code: __args i j ...k ARRAY __aput/__aget - * Here i, j, ... k may be a mixture of integers and 1-d arrays, or - * a single 2-d array of indices. The 2-d index array is generated by the - * 'where' function. - * - * If ARRAY is of type DataType, then this function will create an array of - * the appropriate type. In that case, the indices i, j, ..., k must be - * integers. - */ -int _SLarray_aget (void) -{ - unsigned int num_indices; - int type; - int (*aget_fun) (unsigned char, unsigned int); - - num_indices = (SLang_Num_Function_Args - 1); - - type = SLang_peek_at_stack (); - switch (type) - { - case -1: - return -1; /* stack underflow */ - - case SLANG_DATATYPE_TYPE: - return push_create_new_array (); - - case SLANG_BSTRING_TYPE: - if (1 == num_indices) - { - SLang_BString_Type *bs; - int ret; - unsigned int len; - unsigned char *s; - - if (-1 == SLang_pop_bstring (&bs)) - return -1; - - if (NULL == (s = SLbstring_get_pointer (bs, &len))) - ret = -1; - else - ret = push_string_element (type, s, len); - - SLbstring_free (bs); - return ret; - } - break; - - case SLANG_STRING_TYPE: - if (1 == num_indices) - { - char *s; - int ret; - - if (-1 == SLang_pop_slstring (&s)) - return -1; - - ret = push_string_element (type, (unsigned char *)s, strlen (s)); - SLang_free_slstring (s); - return ret; - } - break; - - case SLANG_ARRAY_TYPE: - break; - - default: - aget_fun = _SLclass_get_class (type)->cl_aget; - if (NULL != aget_fun) - return (*aget_fun) (type, num_indices); - } - - return aget_from_array (num_indices); -} - -int -_SLarray_aput_transfer_elem (SLang_Array_Type *at, int *indices, - VOID_STAR data_to_put, unsigned int sizeof_type, int is_ptr) -{ - VOID_STAR at_data; - - /* Since 1 element is being transferred, there is no need to coerse - * the array to linear. - */ - if (NULL == (at_data = get_data_addr (at, indices))) - return -1; - - return transfer_n_elements (at, at_data, data_to_put, sizeof_type, 1, is_ptr); -} - -static int -aput_get_array_to_put (SLang_Class_Type *cl, unsigned int num_elements, int allow_array, - SLang_Array_Type **at_ptr, char **data_to_put, unsigned int *data_increment) -{ - unsigned char data_type; - SLang_Array_Type *at; - - *at_ptr = NULL; - - data_type = cl->cl_data_type; - if (-1 == SLclass_typecast (data_type, 1, allow_array)) - return -1; - - if ((data_type != SLANG_ARRAY_TYPE) - && (data_type != SLANG_ANY_TYPE) - && (SLANG_ARRAY_TYPE == SLang_peek_at_stack ())) - { - if (-1 == SLang_pop_array (&at, 0)) - return -1; - - if ((at->num_elements != num_elements) -#if 0 - || (at->num_dims != 1) -#endif - ) - { - SLang_verror (SL_TYPE_MISMATCH, "Array size is inappropriate for use with index-array"); - SLang_free_array (at); - return -1; - } - - *data_to_put = (char *) at->data; - *data_increment = at->sizeof_type; - *at_ptr = at; - return 0; - } - - *data_increment = 0; - *data_to_put = (char *) cl->cl_transfer_buf; - - if (-1 == (*cl->cl_apop)(data_type, (VOID_STAR) *data_to_put)) - return -1; - - return 0; -} - -static int -aput_from_indices (SLang_Array_Type *at, - SLang_Object_Type *index_objs, unsigned int num_indices) -{ - int *index_data [SLARRAY_MAX_DIMS]; - int range_buf [SLARRAY_MAX_DIMS]; - int range_delta_buf [SLARRAY_MAX_DIMS]; - int max_dims [SLARRAY_MAX_DIMS]; - unsigned int i, num_elements; - SLang_Array_Type *bt; - int map_indices[SLARRAY_MAX_DIMS]; - int indices [SLARRAY_MAX_DIMS]; - unsigned int sizeof_type; - int is_ptr, is_array, ret; - char *data_to_put; - unsigned int data_increment; - SLang_Class_Type *cl; - int is_dim_array [SLARRAY_MAX_DIMS]; - - if (-1 == convert_nasty_index_objs (at, index_objs, num_indices, - index_data, range_buf, range_delta_buf, - max_dims, &num_elements, &is_array, - is_dim_array)) - return -1; - - cl = at->cl; - - if (-1 == aput_get_array_to_put (cl, num_elements, is_array, - &bt, &data_to_put, &data_increment)) - return -1; - - sizeof_type = at->sizeof_type; - is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER); - - ret = -1; - - SLMEMSET((char *) map_indices, 0, sizeof(map_indices)); - if (num_elements) do - { - for (i = 0; i < num_indices; i++) - { - int j; - - j = map_indices[i]; - - if (0 != range_delta_buf[i]) - indices[i] = range_buf[i] + j * range_delta_buf[i]; - else - indices[i] = index_data [i][j]; - } - - if (-1 == _SLarray_aput_transfer_elem (at, indices, (VOID_STAR)data_to_put, sizeof_type, is_ptr)) - goto return_error; - - data_to_put += data_increment; - } - while (0 == next_index (map_indices, max_dims, num_indices)); - - ret = 0; - - /* drop */ - - return_error: - if (bt == NULL) - { - if (is_ptr) - (*cl->cl_destroy) (cl->cl_data_type, (VOID_STAR) data_to_put); - } - else SLang_free_array (bt); - - return ret; -} - -static int -aput_from_index_array (SLang_Array_Type *at, SLang_Array_Type *ind_at) -{ - int *indices, *indices_max; - unsigned int sizeof_type; - char *data_to_put, *dest_data; - unsigned int data_increment; - int is_ptr; - SLang_Array_Type *bt; - SLang_Class_Type *cl; - int ret; - - if (-1 == coerse_array_to_linear (at)) - return -1; - - if (-1 == coerse_array_to_linear (ind_at)) - return -1; - - if (-1 == check_index_array_ranges (at, ind_at)) - return -1; - - sizeof_type = at->sizeof_type; - - cl = at->cl; - - /* Note that if bt is returned as non NULL, then the array is a linear - * one. - */ - if (-1 == aput_get_array_to_put (cl, ind_at->num_elements, 1, - &bt, &data_to_put, &data_increment)) - return -1; - - /* Since the index array is linear, I can address it directly */ - indices = (int *) ind_at->data; - indices_max = indices + ind_at->num_elements; - - is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER); - dest_data = (char *) at->data; - - ret = -1; - while (indices < indices_max) - { - unsigned int offset; - - offset = sizeof_type * (unsigned int)*indices; - - if (-1 == transfer_n_elements (at, (VOID_STAR) (dest_data + offset), - (VOID_STAR) data_to_put, sizeof_type, 1, - is_ptr)) - goto return_error; - - indices++; - data_to_put += data_increment; - } - - ret = 0; - /* Drop */ - - return_error: - - if (bt == NULL) - { - if (is_ptr) - (*cl->cl_destroy) (cl->cl_data_type, (VOID_STAR)data_to_put); - } - else SLang_free_array (bt); - - return ret; -} - -/* ARRAY[i, j, k] = generates code: __args i j k ARRAY __aput - */ -int _SLarray_aput (void) -{ - unsigned int num_indices; - SLang_Array_Type *at; - SLang_Object_Type index_objs [SLARRAY_MAX_DIMS]; - int ret; - int is_index_array; - int (*aput_fun) (unsigned char, unsigned int); - int type; - - ret = -1; - num_indices = (SLang_Num_Function_Args - 1); - - type = SLang_peek_at_stack (); - switch (type) - { - case -1: - return -1; - - case SLANG_ARRAY_TYPE: - break; - - default: - if (NULL != (aput_fun = _SLclass_get_class (type)->cl_aput)) - return (*aput_fun) (type, num_indices); - break; - } - - if (-1 == SLang_pop_array (&at, 0)) - return -1; - - if (at->flags & SLARR_DATA_VALUE_IS_READ_ONLY) - { - SLang_verror (SL_READONLY_ERROR, "%s Array is read-only", - SLclass_get_datatype_name (at->data_type)); - SLang_free_array (at); - return -1; - } - - if (-1 == pop_indices (index_objs, num_indices, &is_index_array)) - { - SLang_free_array (at); - return -1; - } - - if (is_index_array == 0) - ret = aput_from_indices (at, index_objs, num_indices); - else - ret = aput_from_index_array (at, index_objs[0].v.array_val); - - SLang_free_array (at); - free_index_objects (index_objs, num_indices); - return ret; -} - -/* This is for 1-d matrices only. It is used by the sort function */ -static int push_element_at_index (SLang_Array_Type *at, int indx) -{ - VOID_STAR data; - - if (NULL == (data = get_data_addr (at, &indx))) - return -1; - - return push_element_at_addr (at, (VOID_STAR) data, 1); -} - -static SLang_Name_Type *Sort_Function; -static SLang_Array_Type *Sort_Array; - -static int sort_cmp_fun (int *a, int *b) -{ - int cmp; - - if (SLang_Error - || (-1 == push_element_at_index (Sort_Array, *a)) - || (-1 == push_element_at_index (Sort_Array, *b)) - || (-1 == SLexecute_function (Sort_Function)) - || (-1 == SLang_pop_integer (&cmp))) - { - /* DO not allow qsort to loop forever. Return something meaningful */ - if (*a > *b) return 1; - if (*a < *b) return -1; - return 0; - } - - return cmp; -} - -static int builtin_sort_cmp_fun (int *a, int *b) -{ - VOID_STAR a_data; - VOID_STAR b_data; - SLang_Class_Type *cl; - - cl = Sort_Array->cl; - - if ((SLang_Error == 0) - && (NULL != (a_data = get_data_addr (Sort_Array, a))) - && (NULL != (b_data = get_data_addr (Sort_Array, b)))) - { - int cmp; - - if ((Sort_Array->flags & SLARR_DATA_VALUE_IS_POINTER) - && ((*(VOID_STAR *) a_data == NULL) || (*(VOID_STAR *) a_data == NULL))) - { - SLang_verror (SL_VARIABLE_UNINITIALIZED, - "%s array has unitialized element", cl->cl_name); - } - else if (0 == (*cl->cl_cmp)(Sort_Array->data_type, a_data, b_data, &cmp)) - return cmp; - } - - - if (*a > *b) return 1; - if (*a == *b) return 0; - return -1; -} - -static void sort_array_internal (SLang_Array_Type *at_str, - SLang_Name_Type *entry, - int (*sort_fun)(int *, int *)) -{ - SLang_Array_Type *ind_at; - /* This is a silly hack to make up for braindead compilers and the lack of - * uniformity in prototypes for qsort. - */ - void (*qsort_fun) (char *, unsigned int, int, int (*)(int *, int *)); - int *indx; - int i, n; - int dims[1]; - - if (Sort_Array != NULL) - { - SLang_verror (SL_NOT_IMPLEMENTED, "array_sort is not recursive"); - return; - } - - n = at_str->num_elements; - - if (at_str->num_dims != 1) - { - SLang_verror (SL_INVALID_PARM, "sort is restricted to 1 dim arrays"); - return; - } - - dims [0] = n; - - if (NULL == (ind_at = SLang_create_array (SLANG_INT_TYPE, 0, NULL, dims, 1))) - return; - - indx = (int *) ind_at->data; - for (i = 0; i < n; i++) indx[i] = i; - - if (n > 1) - { - qsort_fun = (void (*)(char *, unsigned int, int, int (*)(int *, - int *))) - qsort; - - Sort_Array = at_str; - Sort_Function = entry; - (*qsort_fun) ((char *) indx, n, sizeof (int), sort_fun); - } - - Sort_Array = NULL; - (void) SLang_push_array (ind_at, 1); -} - -static void sort_array (void) -{ - SLang_Name_Type *entry; - SLang_Array_Type *at; - int (*sort_fun) (int *, int *); - - if (SLang_Num_Function_Args != 1) - { - sort_fun = sort_cmp_fun; - - if (NULL == (entry = SLang_pop_function ())) - return; - - if (-1 == SLang_pop_array (&at, 1)) - return; - } - else - { - sort_fun = builtin_sort_cmp_fun; - if (-1 == SLang_pop_array (&at, 1)) - return; - if (at->cl->cl_cmp == NULL) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "%s does not have a predefined sorting method", - at->cl->cl_name); - SLang_free_array (at); - return; - } - entry = NULL; - } - - sort_array_internal (at, entry, sort_fun); - SLang_free_array (at); - SLang_free_function (entry); -} - -static void bstring_to_array (SLang_BString_Type *bs) -{ - unsigned char *s; - unsigned int len; - - if (NULL == (s = SLbstring_get_pointer (bs, &len))) - (void) SLang_push_null (); - else - (void) push_string_as_array (s, len); -} - -static void array_to_bstring (SLang_Array_Type *at) -{ - unsigned int nbytes; - SLang_BString_Type *bs; - - nbytes = at->num_elements * at->sizeof_type; - bs = SLbstring_create ((unsigned char *)at->data, nbytes); - (void) SLang_push_bstring (bs); - SLbstring_free (bs); -} - -static void init_char_array (void) -{ - SLang_Array_Type *at; - char *s; - unsigned int n, ndim; - - if (SLang_pop_slstring (&s)) return; - - if (-1 == SLang_pop_array (&at, 0)) - goto free_and_return; - - if (at->data_type != SLANG_CHAR_TYPE) - { - SLang_doerror("Operation requires character array"); - goto free_and_return; - } - - n = strlen (s); - ndim = at->num_elements; - if (n > ndim) - { - SLang_doerror("String too big to init array"); - goto free_and_return; - } - - strncpy((char *) at->data, s, ndim); - /* drop */ - - free_and_return: - SLang_free_array (at); - SLang_free_slstring (s); -} - -static void array_info (void) -{ - SLang_Array_Type *at, *bt; - int num_dims; - - if (-1 == pop_array (&at, 1)) - return; - - num_dims = (int)at->num_dims; - - if (NULL != (bt = SLang_create_array (SLANG_INT_TYPE, 0, NULL, &num_dims, 1))) - { - int *bdata; - int i; - int *a_dims; - - a_dims = at->dims; - bdata = (int *) bt->data; - for (i = 0; i < num_dims; i++) bdata [i] = a_dims [i]; - - if (0 == SLang_push_array (bt, 1)) - { - (void) SLang_push_integer ((int) at->num_dims); - (void) _SLang_push_datatype (at->data_type); - } - } - - SLang_free_array (at); -} - -static VOID_STAR range_get_data_addr (SLang_Array_Type *at, int *dims) -{ - static int value; - SLarray_Range_Array_Type *r; - int d; - - d = *dims; - r = (SLarray_Range_Array_Type *)at->data; - - if (d < 0) - d += at->dims[0]; - - value = r->first_index + d * r->delta; - return (VOID_STAR) &value; -} - -static SLang_Array_Type *inline_implicit_int_array (int *xminptr, int *xmaxptr, int *dxptr) -{ - int delta; - SLang_Array_Type *at; - int dims, idims; - SLarray_Range_Array_Type *data; - - if (dxptr == NULL) delta = 1; - else delta = *dxptr; - - if (delta == 0) - { - SLang_verror (SL_INVALID_PARM, "range-array increment must be non-zero"); - return NULL; - } - - data = (SLarray_Range_Array_Type *) SLmalloc (sizeof (SLarray_Range_Array_Type)); - if (data == NULL) - return NULL; - - SLMEMSET((char *) data, 0, sizeof (SLarray_Range_Array_Type)); - data->delta = delta; - dims = 0; - - if (xminptr != NULL) - data->first_index = *xminptr; - else - data->first_index = 0; - - if (xmaxptr != NULL) - data->last_index = *xmaxptr; - else - data->last_index = -1; - -/* if ((xminptr != NULL) && (xmaxptr != NULL)) - { */ - idims = 1 + (data->last_index - data->first_index) / delta; - if (idims > 0) - dims = idims; - /* } */ - - if (NULL == (at = SLang_create_array (SLANG_INT_TYPE, 0, (VOID_STAR) data, &dims, 1))) - return NULL; - - at->index_fun = range_get_data_addr; - at->flags |= SLARR_DATA_VALUE_IS_RANGE; - - return at; -} - -#if SLANG_HAS_FLOAT -static SLang_Array_Type *inline_implicit_floating_array (unsigned char type, - double *xminptr, double *xmaxptr, double *dxptr) -{ - int n, i; - SLang_Array_Type *at; - int dims; - double xmin, xmax, dx; - - if ((xminptr == NULL) || (xmaxptr == NULL)) - { - SLang_verror (SL_INVALID_PARM, "range-array has unknown size"); - return NULL; - } - xmin = *xminptr; - xmax = *xmaxptr; - if (dxptr == NULL) dx = 1.0; - else dx = *dxptr; - - if (dx == 0.0) - { - SLang_doerror ("range-array increment must be non-zero"); - return NULL; - } - - /* I have convinced myself that it is better to use semi-open intervals - * because of less ambiguities. So, [a:b:c] will represent the set of - * values a, a + c, a + 2c ... a + nc - * such that a + nc < b. That is, b lies outside the interval. - */ - - /* Allow for roundoff by adding 0.5 before truncation */ - n = (int)(1.5 + ((xmax - xmin) / dx)); - if (n <= 0) - n = 0; - else - { - double last = xmin + (n-1) * dx; - - if (dx > 0.0) - { - if (last >= xmax) - n -= 1; - } - else if (last <= xmax) - n -= 1; - } - - dims = n; - if (NULL == (at = SLang_create_array1 (type, 0, NULL, &dims, 1, 1))) - return NULL; - - if (type == SLANG_DOUBLE_TYPE) - { - double *ptr; - - ptr = (double *) at->data; - - for (i = 0; i < n; i++) - ptr[i] = xmin + i * dx; - } - else - { - float *ptr; - - ptr = (float *) at->data; - - for (i = 0; i < n; i++) - ptr[i] = (float) (xmin + i * dx); - } - return at; -} -#endif - -/* FIXME: Priority=medium - * This needs to be updated to work with all integer types. - */ -int _SLarray_inline_implicit_array (void) -{ - int int_vals[3]; -#if SLANG_HAS_FLOAT - double double_vals[3]; -#endif - int has_vals[3]; - unsigned int i, count; - SLang_Array_Type *at; - int precedence; - unsigned char type; - int is_int; - - count = SLang_Num_Function_Args; - - if (count == 2) - has_vals [2] = 0; - else if (count != 3) - { - SLang_doerror ("wrong number of arguments to __implicit_inline_array"); - return -1; - } - -#if SLANG_HAS_FLOAT - is_int = 1; -#endif - - type = 0; - precedence = 0; - - i = count; - while (i--) - { - int this_type, this_precedence; - - if (-1 == (this_type = SLang_peek_at_stack ())) - return -1; - - this_precedence = _SLarith_get_precedence ((unsigned char) this_type); - if (precedence < this_precedence) - { - type = (unsigned char) this_type; - precedence = this_precedence; - } - - has_vals [i] = 1; - - switch (this_type) - { - case SLANG_NULL_TYPE: - has_vals[i] = 0; - (void) SLdo_pop (); - break; - -#if SLANG_HAS_FLOAT - case SLANG_DOUBLE_TYPE: - case SLANG_FLOAT_TYPE: - if (-1 == SLang_pop_double (double_vals + i, NULL, NULL)) - return -1; - is_int = 0; - break; -#endif - default: - if (-1 == SLang_pop_integer (int_vals + i)) - return -1; - double_vals[i] = (double) int_vals[i]; - } - } - -#if SLANG_HAS_FLOAT - if (is_int == 0) - at = inline_implicit_floating_array (type, - (has_vals[0] ? &double_vals[0] : NULL), - (has_vals[1] ? &double_vals[1] : NULL), - (has_vals[2] ? &double_vals[2] : NULL)); - else -#endif - at = inline_implicit_int_array ((has_vals[0] ? &int_vals[0] : NULL), - (has_vals[1] ? &int_vals[1] : NULL), - (has_vals[2] ? &int_vals[2] : NULL)); - - if (at == NULL) - return -1; - - return SLang_push_array (at, 1); -} - -int _SLarray_wildcard_array (void) -{ - SLang_Array_Type *at; - - if (NULL == (at = inline_implicit_int_array (NULL, NULL, NULL))) - return -1; - - return SLang_push_array (at, 1); -} - -static SLang_Array_Type *concat_arrays (unsigned int count) -{ - SLang_Array_Type **arrays; - SLang_Array_Type *at, *bt; - unsigned int i; - int num_elements; - unsigned char type; - char *src_data, *dest_data; - int is_ptr; - unsigned int sizeof_type; - int max_dims, min_dims, max_rows, min_rows; - - arrays = (SLang_Array_Type **)SLmalloc (count * sizeof (SLang_Array_Type *)); - if (arrays == NULL) - { - SLdo_pop_n (count); - return NULL; - } - SLMEMSET((char *) arrays, 0, count * sizeof(SLang_Array_Type *)); - - at = NULL; - - num_elements = 0; - i = count; - - while (i != 0) - { - i--; - - if (-1 == SLang_pop_array (&bt, 1)) - goto free_and_return; - - arrays[i] = bt; - num_elements += (int)bt->num_elements; - } - - type = arrays[0]->data_type; - max_dims = min_dims = arrays[0]->num_dims; - min_rows = max_rows = arrays[0]->dims[0]; - - for (i = 1; i < count; i++) - { - SLang_Array_Type *ct; - int num; - - bt = arrays[i]; - - num = bt->num_dims; - if (num > max_dims) max_dims = num; - if (num < min_dims) min_dims = num; - - num = bt->dims[0]; - if (num > max_rows) max_rows = num; - if (num < min_rows) min_rows = num; - - if (type == bt->data_type) - continue; - - if (1 != _SLarray_typecast (bt->data_type, (VOID_STAR) &bt, 1, - type, (VOID_STAR) &ct, 1)) - goto free_and_return; - - SLang_free_array (bt); - arrays [i] = ct; - } - - if (NULL == (at = SLang_create_array (type, 0, NULL, &num_elements, 1))) - goto free_and_return; - - is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER); - sizeof_type = at->sizeof_type; - dest_data = (char *) at->data; - - for (i = 0; i < count; i++) - { - bt = arrays[i]; - - src_data = (char *) bt->data; - num_elements = bt->num_elements; - - if (-1 == transfer_n_elements (bt, (VOID_STAR)dest_data, (VOID_STAR)src_data, sizeof_type, - num_elements, is_ptr)) - { - SLang_free_array (at); - at = NULL; - goto free_and_return; - } - - dest_data += num_elements * sizeof_type; - } - - /* If the arrays are all 1-d, and all the same size, then reshape to a - * 2-d array. This will allow us to do, e.g. - * a = [[1,2], [3,4]] - * to specifiy a 2-d. - * Someday I will generalize this. - */ - if ((max_dims == min_dims) && (max_dims == 1) && (min_rows == max_rows)) - { - at->num_dims = 2; - at->dims[0] = count; - at->dims[1] = min_rows; - } - - free_and_return: - - for (i = 0; i < count; i++) - SLang_free_array (arrays[i]); - SLfree ((char *) arrays); - - return at; -} - -int _SLarray_inline_array (void) -{ - SLang_Object_Type *obj; - unsigned char type, this_type; - unsigned int count; - SLang_Array_Type *at; - - obj = _SLStack_Pointer; - - count = SLang_Num_Function_Args; - type = 0; - - while ((count > 0) && (--obj >= _SLRun_Stack)) - { - this_type = obj->data_type; - - if (type == 0) - type = this_type; - - if ((type == this_type) || (type == SLANG_ARRAY_TYPE)) - { - count--; - continue; - } - - switch (this_type) - { - case SLANG_ARRAY_TYPE: - type = SLANG_ARRAY_TYPE; - break; - - case SLANG_INT_TYPE: - switch (type) - { -#if SLANG_HAS_FLOAT - case SLANG_DOUBLE_TYPE: - break; -#endif -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - break; -#endif - default: - goto type_mismatch; - } - break; -#if SLANG_HAS_FLOAT - case SLANG_DOUBLE_TYPE: - switch (type) - { - case SLANG_INT_TYPE: - type = SLANG_DOUBLE_TYPE; - break; -# if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - break; -# endif - default: - goto type_mismatch; - } - break; -#endif -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - switch (type) - { - case SLANG_INT_TYPE: - case SLANG_DOUBLE_TYPE: - type = SLANG_COMPLEX_TYPE; - break; - - default: - goto type_mismatch; - } - break; -#endif - default: - type_mismatch: - _SLclass_type_mismatch_error (type, this_type); - return -1; - } - count--; - } - - if (count != 0) - { - SLang_Error = SL_STACK_UNDERFLOW; - return -1; - } - - count = SLang_Num_Function_Args; - - if (count == 0) - { - SLang_verror (SL_NOT_IMPLEMENTED, "Empty inline-arrays not supported"); - return -1; - } - - if (type == SLANG_ARRAY_TYPE) - { - if (NULL == (at = concat_arrays (count))) - return -1; - } - else - { - SLang_Object_Type index_obj; - int icount = (int) count; - - if (NULL == (at = SLang_create_array (type, 0, NULL, &icount, 1))) - return -1; - - index_obj.data_type = SLANG_INT_TYPE; - while (count != 0) - { - count--; - index_obj.v.int_val = (int) count; - if (-1 == aput_from_indices (at, &index_obj, 1)) - { - SLang_free_array (at); - SLdo_pop_n (count); - return -1; - } - } - } - - return SLang_push_array (at, 1); -} - -static int array_binary_op_result (int op, unsigned char a, unsigned char b, - unsigned char *c) -{ - (void) op; - (void) a; - (void) b; - *c = SLANG_ARRAY_TYPE; - return 1; -} - -static int array_binary_op (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - SLang_Array_Type *at, *bt, *ct; - unsigned int i, num_dims; - int (*binary_fun) (int, - unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR); - SLang_Class_Type *a_cl, *b_cl, *c_cl; - int no_init; - - if (a_type == SLANG_ARRAY_TYPE) - { - if (na != 1) - { - SLang_verror (SL_NOT_IMPLEMENTED, "Binary operation on multiple arrays not implemented"); - return -1; - } - - at = *(SLang_Array_Type **) ap; - if (-1 == coerse_array_to_linear (at)) - return -1; - ap = at->data; - a_type = at->data_type; - na = at->num_elements; - } - else - { - at = NULL; - } - - if (b_type == SLANG_ARRAY_TYPE) - { - if (nb != 1) - { - SLang_verror (SL_NOT_IMPLEMENTED, "Binary operation on multiple arrays not implemented"); - return -1; - } - - bt = *(SLang_Array_Type **) bp; - if (-1 == coerse_array_to_linear (bt)) - return -1; - bp = bt->data; - b_type = bt->data_type; - nb = bt->num_elements; - } - else - { - bt = NULL; - } - - if ((at != NULL) && (bt != NULL)) - { - num_dims = at->num_dims; - - if (num_dims != bt->num_dims) - { - SLang_verror (SL_TYPE_MISMATCH, "Arrays must have same dim for binary operation"); - return -1; - } - - for (i = 0; i < num_dims; i++) - { - if (at->dims[i] != bt->dims[i]) - { - SLang_verror (SL_TYPE_MISMATCH, "Arrays must be the same for binary operation"); - return -1; - } - } - } - - a_cl = _SLclass_get_class (a_type); - b_cl = _SLclass_get_class (b_type); - - if (NULL == (binary_fun = _SLclass_get_binary_fun (op, a_cl, b_cl, &c_cl, 1))) - return -1; - - no_init = ((c_cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR) - || (c_cl->cl_class_type == SLANG_CLASS_TYPE_VECTOR)); - - ct = NULL; -#if _SLANG_USE_TMP_OPTIMIZATION - /* If we are dealing with scalar (or vector) objects, and if the object - * appears to be owned by the stack, then use it instead of creating a - * new version. This can happen with code such as: - * @ x = [1,2,3,4]; - * @ x = __tmp(x) + 1; - */ - if (no_init) - { - if ((at != NULL) - && (at->num_refs == 1) - && (at->data_type == c_cl->cl_data_type)) - { - ct = at; - ct->num_refs = 2; - } - else if ((bt != NULL) - && (bt->num_refs == 1) - && (bt->data_type == c_cl->cl_data_type)) - { - ct = bt; - ct->num_refs = 2; - } - } -#endif /* _SLANG_USE_TMP_OPTIMIZATION */ - - if (ct == NULL) - { - if (at != NULL) ct = at; else ct = bt; - ct = SLang_create_array1 (c_cl->cl_data_type, 0, NULL, ct->dims, ct->num_dims, no_init); - if (ct == NULL) - return -1; - } - - - if ((na == 0) || (nb == 0) /* allow empty arrays */ - || (1 == (*binary_fun) (op, a_type, ap, na, b_type, bp, nb, ct->data))) - { - *(SLang_Array_Type **) cp = ct; - return 1; - } - - SLang_free_array (ct); - return -1; -} - -static void array_where (void) -{ - SLang_Array_Type *at, *bt; - char *a_data; - int *b_data; - unsigned int i, num_elements; - int b_num; - - if (-1 == SLang_pop_array (&at, 1)) - return; - - bt = NULL; - - if (at->data_type != SLANG_CHAR_TYPE) - { - int zero; - SLang_Array_Type *tmp_at; - - tmp_at = at; - zero = 0; - if (1 != array_binary_op (SLANG_NE, - SLANG_ARRAY_TYPE, (VOID_STAR) &at, 1, - SLANG_CHAR_TYPE, (VOID_STAR) &zero, 1, - (VOID_STAR) &tmp_at)) - goto return_error; - - SLang_free_array (at); - at = tmp_at; - if (at->data_type != SLANG_CHAR_TYPE) - { - SLang_Error = SL_TYPE_MISMATCH; - goto return_error; - } - } - - a_data = (char *) at->data; - num_elements = at->num_elements; - - b_num = 0; - for (i = 0; i < num_elements; i++) - if (a_data[i] != 0) b_num++; - - if (NULL == (bt = SLang_create_array1 (SLANG_INT_TYPE, 0, NULL, &b_num, 1, 1))) - goto return_error; - - b_data = (int *) bt->data; - - i = 0; - while (b_num) - { - if (a_data[i] != 0) - { - *b_data++ = i; - b_num--; - } - - i++; - } - - (void) SLang_push_array (bt, 0); - /* drop */ - - return_error: - SLang_free_array (at); - SLang_free_array (bt); -} - -static int do_array_reshape (SLang_Array_Type *at, SLang_Array_Type *ind_at) -{ - int *dims; - unsigned int i, num_dims; - unsigned int num_elements; - - if ((ind_at->data_type != SLANG_INT_TYPE) - || (ind_at->num_dims != 1)) - { - SLang_verror (SL_TYPE_MISMATCH, "Expecting 1-d integer array"); - return -1; - } - - num_dims = ind_at->num_elements; - dims = (int *) ind_at->data; - - num_elements = 1; - for (i = 0; i < num_dims; i++) - { - int d = dims[i]; - if (d < 0) - { - SLang_verror (SL_INVALID_PARM, "reshape: dimension is less then 0"); - return -1; - } - - num_elements = (unsigned int) d * num_elements; - } - - if ((num_elements != at->num_elements) - || (num_dims > SLARRAY_MAX_DIMS)) - { - SLang_verror (SL_INVALID_PARM, "Unable to reshape array to specified size"); - return -1; - } - - for (i = 0; i < num_dims; i++) - at->dims [i] = dims[i]; - - while (i < SLARRAY_MAX_DIMS) - { - at->dims [i] = 1; - i++; - } - - at->num_dims = num_dims; - return 0; -} - -static void array_reshape (SLang_Array_Type *at, SLang_Array_Type *ind_at) -{ - (void) do_array_reshape (at, ind_at); -} - -static void _array_reshape (SLang_Array_Type *ind_at) -{ - SLang_Array_Type *at; - SLang_Array_Type *new_at; - - if (-1 == SLang_pop_array (&at, 1)) - return; - - /* FIXME: Priority=low: duplicate_array could me modified to look at num_refs */ - - /* Now try to avoid the overhead of creating a new array if possible */ - if (at->num_refs == 1) - { - /* Great, we are the sole owner of this array. */ - if ((-1 == do_array_reshape (at, ind_at)) - || (-1 == SLclass_push_ptr_obj (SLANG_ARRAY_TYPE, (VOID_STAR)at))) - SLang_free_array (at); - return; - } - - new_at = SLang_duplicate_array (at); - if (new_at != NULL) - { - if (0 == do_array_reshape (new_at, ind_at)) - (void) SLang_push_array (new_at, 0); - - SLang_free_array (new_at); - } - SLang_free_array (at); -} - -typedef struct -{ - SLang_Array_Type *at; - unsigned int increment; - char *addr; -} -Map_Arg_Type; -/* Usage: array_map (Return-Type, func, args,....); */ -static void array_map (void) -{ - Map_Arg_Type *args; - unsigned int num_args; - unsigned int i, i_control; - SLang_Name_Type *nt; - unsigned int num_elements; - SLang_Array_Type *at; - char *addr; - unsigned char type; - - at = NULL; - args = NULL; - nt = NULL; - - if (SLang_Num_Function_Args < 3) - { - SLang_verror (SL_INVALID_PARM, - "Usage: array_map (Return-Type, &func, args...)"); - SLdo_pop_n (SLang_Num_Function_Args); - return; - } - - num_args = (unsigned int)SLang_Num_Function_Args - 2; - args = (Map_Arg_Type *) SLmalloc (num_args * sizeof (Map_Arg_Type)); - if (args == NULL) - { - SLdo_pop_n (SLang_Num_Function_Args); - return; - } - memset ((char *) args, 0, num_args * sizeof (Map_Arg_Type)); - i = num_args; - i_control = 0; - while (i > 0) - { - i--; - if (-1 == SLang_pop_array (&args[i].at, 1)) - { - SLdo_pop_n (i + 2); - goto return_error; - } - if (args[i].at->num_elements > 1) - i_control = i; - } - - if (NULL == (nt = SLang_pop_function ())) - { - SLdo_pop_n (1); - goto return_error; - } - - num_elements = args[i_control].at->num_elements; - - if (-1 == _SLang_pop_datatype (&type)) - goto return_error; - - if (type == SLANG_UNDEFINED_TYPE) /* Void_Type */ - at = NULL; - else - { - at = args[i_control].at; - - if (NULL == (at = SLang_create_array (type, 0, NULL, at->dims, at->num_dims))) - goto return_error; - } - - - for (i = 0; i < num_args; i++) - { - SLang_Array_Type *ati = args[i].at; - /* FIXME: Priority = low: The actual dimensions should be compared. */ - if (ati->num_elements == num_elements) - args[i].increment = ati->sizeof_type; - /* memset already guarantees increment to be zero */ - - if (ati->num_elements == 0) - { - SLang_verror (0, "array_map: function argument %d of %d is an empty array", - i+1, num_args); - goto return_error; - } - - args[i].addr = (char *) ati->data; - } - - if (at == NULL) - addr = NULL; - else - addr = (char *)at->data; - - for (i = 0; i < num_elements; i++) - { - unsigned int j; - - if (-1 == SLang_start_arg_list ()) - goto return_error; - - for (j = 0; j < num_args; j++) - { - if (-1 == push_element_at_addr (args[j].at, - (VOID_STAR) args[j].addr, - 1)) - { - SLdo_pop_n (j); - goto return_error; - } - - args[j].addr += args[j].increment; - } - - if (-1 == SLang_end_arg_list ()) - { - SLdo_pop_n (num_args); - goto return_error; - } - - if (-1 == SLexecute_function (nt)) - goto return_error; - - if (at == NULL) - continue; - - if (-1 == at->cl->cl_apop (type, (VOID_STAR) addr)) - goto return_error; - - addr += at->sizeof_type; - } - - if (at != NULL) - (void) SLang_push_array (at, 0); - - /* drop */ - - return_error: - SLang_free_array (at); - SLang_free_function (nt); - if (args != NULL) - { - for (i = 0; i < num_args; i++) - SLang_free_array (args[i].at); - - SLfree ((char *) args); - } -} - -static SLang_Intrin_Fun_Type Array_Table [] = -{ - MAKE_INTRINSIC_0("array_map", array_map, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("array_sort", sort_array, SLANG_VOID_TYPE), - MAKE_INTRINSIC_1("array_to_bstring", array_to_bstring, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE), - MAKE_INTRINSIC_1("bstring_to_array", bstring_to_array, SLANG_VOID_TYPE, SLANG_BSTRING_TYPE), - MAKE_INTRINSIC("init_char_array", init_char_array, SLANG_VOID_TYPE, 0), - MAKE_INTRINSIC("array_info", array_info, SLANG_VOID_TYPE, 0), - MAKE_INTRINSIC("where", array_where, SLANG_VOID_TYPE, 0), - MAKE_INTRINSIC_2("reshape", array_reshape, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE, SLANG_ARRAY_TYPE), - MAKE_INTRINSIC_1("_reshape", _array_reshape, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE), - SLANG_END_INTRIN_FUN_TABLE -}; - -static char *array_string (unsigned char type, VOID_STAR v) -{ - SLang_Array_Type *at; - char buf[512]; - unsigned int i, num_dims; - int *dims; - - at = *(SLang_Array_Type **) v; - type = at->data_type; - num_dims = at->num_dims; - dims = at->dims; - - sprintf (buf, "%s[%d", SLclass_get_datatype_name (type), at->dims[0]); - - for (i = 1; i < num_dims; i++) - sprintf (buf + strlen(buf), ",%d", dims[i]); - strcat (buf, "]"); - - return SLmake_string (buf); -} - -static void array_destroy (unsigned char type, VOID_STAR v) -{ - (void) type; - SLang_free_array (*(SLang_Array_Type **) v); -} - -static int array_push (unsigned char type, VOID_STAR v) -{ - SLang_Array_Type *at; - - (void) type; - at = *(SLang_Array_Type **) v; - return SLang_push_array (at, 0); -} - -/* Intrinsic arrays are not stored in a variable. So, the address that - * would contain the variable holds the array address. - */ -static int array_push_intrinsic (unsigned char type, VOID_STAR v) -{ - (void) type; - return SLang_push_array ((SLang_Array_Type *) v, 0); -} - -int _SLarray_add_bin_op (unsigned char type) -{ - SL_OOBinary_Type *ab; - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - ab = cl->cl_binary_ops; - - while (ab != NULL) - { - if (ab->data_type == SLANG_ARRAY_TYPE) - return 0; - ab = ab->next; - } - - if ((-1 == SLclass_add_binary_op (SLANG_ARRAY_TYPE, type, array_binary_op, array_binary_op_result)) - || (-1 == SLclass_add_binary_op (type, SLANG_ARRAY_TYPE, array_binary_op, array_binary_op_result))) - return -1; - - return 0; -} - -static SLang_Array_Type * -do_array_math_op (int op, int unary_type, - SLang_Array_Type *at, unsigned int na) -{ - unsigned char a_type, b_type; - int (*f) (int, unsigned char, VOID_STAR, unsigned int, VOID_STAR); - SLang_Array_Type *bt; - SLang_Class_Type *b_cl; - int no_init; - - if (na != 1) - { - SLang_verror (SL_NOT_IMPLEMENTED, "Operation restricted to 1 array"); - return NULL; - } - - a_type = at->data_type; - if (NULL == (f = _SLclass_get_unary_fun (op, at->cl, &b_cl, unary_type))) - return NULL; - b_type = b_cl->cl_data_type; - - if (-1 == coerse_array_to_linear (at)) - return NULL; - - no_init = ((b_cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR) - || (b_cl->cl_class_type == SLANG_CLASS_TYPE_VECTOR)); - -#if _SLANG_USE_TMP_OPTIMIZATION - /* If we are dealing with scalar (or vector) objects, and if the object - * appears to be owned by the stack, then use it instead of creating a - * new version. This can happen with code such as: - * @ x = [1,2,3,4]; - * @ x = UNARY_OP(__tmp(x)); - */ - if (no_init - && (at->num_refs == 1) - && (at->data_type == b_cl->cl_data_type)) - { - bt = at; - bt->num_refs = 2; - } - else -#endif /* _SLANG_USE_TMP_OPTIMIZATION */ - if (NULL == (bt = SLang_create_array1 (b_type, 0, NULL, at->dims, at->num_dims, no_init))) - return NULL; - - if (1 != (*f)(op, a_type, at->data, at->num_elements, bt->data)) - { - SLang_free_array (bt); - return NULL; - } - return bt; -} - -static int -array_unary_op_result (int op, unsigned char a, unsigned char *b) -{ - (void) op; - (void) a; - *b = SLANG_ARRAY_TYPE; - return 1; -} - -static int -array_unary_op (int op, - unsigned char a, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - SLang_Array_Type *at; - - (void) a; - at = *(SLang_Array_Type **) ap; - if (NULL == (at = do_array_math_op (op, _SLANG_BC_UNARY, at, na))) - { - if (SLang_Error) return -1; - return 0; - } - *(SLang_Array_Type **) bp = at; - return 1; -} - -static int -array_math_op (int op, - unsigned char a, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - SLang_Array_Type *at; - - (void) a; - at = *(SLang_Array_Type **) ap; - if (NULL == (at = do_array_math_op (op, _SLANG_BC_MATH_UNARY, at, na))) - { - if (SLang_Error) return -1; - return 0; - } - *(SLang_Array_Type **) bp = at; - return 1; -} - -static int -array_app_op (int op, - unsigned char a, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - SLang_Array_Type *at; - - (void) a; - at = *(SLang_Array_Type **) ap; - if (NULL == (at = do_array_math_op (op, _SLANG_BC_APP_UNARY, at, na))) - { - if (SLang_Error) return -1; - return 0; - } - *(SLang_Array_Type **) bp = at; - return 1; -} - -int -_SLarray_typecast (unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, - int is_implicit) -{ - SLang_Array_Type *at, *bt; - SLang_Class_Type *b_cl; - int no_init; - int (*t) (unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR); - - if (na != 1) - { - SLang_verror (SL_NOT_IMPLEMENTED, "typecast of multiple arrays not implemented"); - return -1; - } - - at = *(SLang_Array_Type **) ap; - a_type = at->data_type; - - if (a_type == b_type) - { - at->num_refs += 1; - *(SLang_Array_Type **) bp = at; - return 1; - } - - if (NULL == (t = _SLclass_get_typecast (a_type, b_type, is_implicit))) - return -1; - - if (-1 == coerse_array_to_linear (at)) - return -1; - - b_cl = _SLclass_get_class (b_type); - - no_init = ((b_cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR) - || (b_cl->cl_class_type == SLANG_CLASS_TYPE_VECTOR)); - - if (NULL == (bt = SLang_create_array1 (b_type, 0, NULL, at->dims, at->num_dims, no_init))) - return -1; - - if (1 == (*t) (a_type, at->data, at->num_elements, b_type, bt->data)) - { - *(SLang_Array_Type **) bp = bt; - return 1; - } - - SLang_free_array (bt); - return 0; -} - -SLang_Array_Type *SLang_duplicate_array (SLang_Array_Type *at) -{ - SLang_Array_Type *bt; - char *data, *a_data; - unsigned int i, num_elements, sizeof_type; - unsigned int size; - int (*cl_acopy) (unsigned char, VOID_STAR, VOID_STAR); - unsigned char type; - - if (-1 == coerse_array_to_linear (at)) - return NULL; - - type = at->data_type; - num_elements = at->num_elements; - sizeof_type = at->sizeof_type; - size = num_elements * sizeof_type; - - if (NULL == (data = SLmalloc (size))) - return NULL; - - if (NULL == (bt = SLang_create_array (type, 0, (VOID_STAR)data, at->dims, at->num_dims))) - { - SLfree (data); - return NULL; - } - - a_data = (char *) at->data; - if (0 == (at->flags & SLARR_DATA_VALUE_IS_POINTER)) - { - SLMEMCPY (data, a_data, size); - return bt; - } - - SLMEMSET (data, 0, size); - - cl_acopy = at->cl->cl_acopy; - for (i = 0; i < num_elements; i++) - { - if (NULL != *(VOID_STAR *) a_data) - { - if (-1 == (*cl_acopy) (type, (VOID_STAR) a_data, (VOID_STAR) data)) - { - SLang_free_array (bt); - return NULL; - } - } - - data += sizeof_type; - a_data += sizeof_type; - } - - return bt; -} - -static int array_dereference (unsigned char type, VOID_STAR addr) -{ - SLang_Array_Type *at; - - (void) type; - at = SLang_duplicate_array (*(SLang_Array_Type **) addr); - if (at == NULL) return -1; - return SLang_push_array (at, 1); -} - -/* This function gets called via, e.g., @Array_Type (Double_Type, [10,20]); - */ -static int -array_datatype_deref (unsigned char type) -{ - SLang_Array_Type *ind_at; - SLang_Array_Type *at; - -#if 0 - /* The parser generated code for this as if a function call were to be - * made. However, the interpreter simply called the deref object routine - * instead of the function call. So, I must simulate the function call. - * This needs to be formalized to hide this detail from applications - * who wish to do the same. So... - * FIXME: Priority=medium - */ - if (0 == _SL_increment_frame_pointer ()) - (void) _SL_decrement_frame_pointer (); -#endif - - if (-1 == SLang_pop_array (&ind_at, 1)) - return -1; - - if ((ind_at->data_type != SLANG_INT_TYPE) - || (ind_at->num_dims != 1)) - { - SLang_verror (SL_TYPE_MISMATCH, "Expecting 1-d integer array"); - goto return_error; - } - - if (-1 == _SLang_pop_datatype (&type)) - goto return_error; - - if (NULL == (at = SLang_create_array (type, 0, NULL, - (int *) ind_at->data, - ind_at->num_elements))) - goto return_error; - - SLang_free_array (ind_at); - return SLang_push_array (at, 1); - - return_error: - SLang_free_array (ind_at); - return -1; -} - -static int array_length (unsigned char type, VOID_STAR v, unsigned int *len) -{ - SLang_Array_Type *at; - - (void) type; - at = *(SLang_Array_Type **) v; - *len = at->num_elements; - return 0; -} - -int -_SLarray_init_slarray (void) -{ - SLang_Class_Type *cl; - - if (-1 == SLadd_intrin_fun_table (Array_Table, NULL)) - return -1; - - if (NULL == (cl = SLclass_allocate_class ("Array_Type"))) - return -1; - - (void) SLclass_set_string_function (cl, array_string); - (void) SLclass_set_destroy_function (cl, array_destroy); - (void) SLclass_set_push_function (cl, array_push); - cl->cl_push_intrinsic = array_push_intrinsic; - cl->cl_dereference = array_dereference; - cl->cl_datatype_deref = array_datatype_deref; - cl->cl_length = array_length; - - if (-1 == SLclass_register_class (cl, SLANG_ARRAY_TYPE, sizeof (VOID_STAR), - SLANG_CLASS_TYPE_PTR)) - return -1; - - if ((-1 == SLclass_add_binary_op (SLANG_ARRAY_TYPE, SLANG_ARRAY_TYPE, array_binary_op, array_binary_op_result)) - || (-1 == SLclass_add_unary_op (SLANG_ARRAY_TYPE, array_unary_op, array_unary_op_result)) - || (-1 == SLclass_add_app_unary_op (SLANG_ARRAY_TYPE, array_app_op, array_unary_op_result)) - || (-1 == SLclass_add_math_op (SLANG_ARRAY_TYPE, array_math_op, array_unary_op_result)) - || (-1 == SLclass_add_math_op (SLANG_ARRAY_TYPE, array_math_op, array_unary_op_result))) - return -1; - - return 0; -} - -int SLang_pop_array (SLang_Array_Type **at_ptr, int convert_scalar) -{ - if (-1 == pop_array (at_ptr, convert_scalar)) - return -1; - - if (-1 == coerse_array_to_linear (*at_ptr)) - { - SLang_free_array (*at_ptr); - return -1; - } - return 0; -} - -int SLang_pop_array_of_type (SLang_Array_Type **at, unsigned char type) -{ - if (-1 == SLclass_typecast (type, 1, 1)) - return -1; - - return SLang_pop_array (at, 1); -} - -void (*_SLang_Matrix_Multiply)(void); - -int _SLarray_matrix_multiply (void) -{ - if (_SLang_Matrix_Multiply != NULL) - { - (*_SLang_Matrix_Multiply)(); - return 0; - } - SLang_verror (SL_NOT_IMPLEMENTED, "Matrix multiplication not available"); - return -1; -} - -struct _SLang_Foreach_Context_Type -{ - SLang_Array_Type *at; - unsigned int next_element_index; -}; - -SLang_Foreach_Context_Type * -_SLarray_cl_foreach_open (unsigned char type, unsigned int num) -{ - SLang_Foreach_Context_Type *c; - - if (num != 0) - { - SLdo_pop_n (num + 1); - SLang_verror (SL_NOT_IMPLEMENTED, - "%s does not support 'foreach using' form", - SLclass_get_datatype_name (type)); - return NULL; - } - - if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type)))) - return NULL; - - memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type)); - - if (-1 == pop_array (&c->at, 1)) - { - SLfree ((char *) c); - return NULL; - } - - return c; -} - -void _SLarray_cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c) -{ - (void) type; - if (c == NULL) return; - SLang_free_array (c->at); - SLfree ((char *) c); -} - -int _SLarray_cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c) -{ - SLang_Array_Type *at; - VOID_STAR data; - - (void) type; - - if (c == NULL) - return -1; - - at = c->at; - if (at->num_elements == c->next_element_index) - return 0; - - /* FIXME: Priority = low. The following assumes linear arrays - * or Integer range arrays. Fixing it right requires a method to get the - * nth element of a multidimensional array. - */ - - if (at->flags & SLARR_DATA_VALUE_IS_RANGE) - { - int d = (int) c->next_element_index; - data = range_get_data_addr (at, &d); - } - else - data = (VOID_STAR) ((char *)at->data + (c->next_element_index * at->sizeof_type)); - - c->next_element_index += 1; - - if ((at->flags & SLARR_DATA_VALUE_IS_POINTER) - && (*(VOID_STAR *) data == NULL)) - { - if (-1 == SLang_push_null ()) - return -1; - } - else if (-1 == (*at->cl->cl_apush)(at->data_type, data)) - return -1; - - /* keep going */ - return 1; -} - diff --git a/mdk-stage1/slang/slarrfun.c b/mdk-stage1/slang/slarrfun.c deleted file mode 100644 index bfa6ec5e5..000000000 --- a/mdk-stage1/slang/slarrfun.c +++ /dev/null @@ -1,464 +0,0 @@ -/* Advanced array manipulation routines for S-Lang */ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -static int next_transposed_index (int *dims, int *max_dims, unsigned int num_dims) -{ - int i; - - for (i = 0; i < (int) num_dims; i++) - { - int dims_i; - - dims_i = dims [i] + 1; - if (dims_i != (int) max_dims [i]) - { - dims [i] = dims_i; - return 0; - } - dims [i] = 0; - } - - return -1; -} - -static SLang_Array_Type *allocate_transposed_array (SLang_Array_Type *at) -{ - unsigned int num_elements; - SLang_Array_Type *bt; - VOID_STAR b_data; - - num_elements = at->num_elements; - b_data = (VOID_STAR) SLmalloc (at->sizeof_type * num_elements); - if (b_data == NULL) - return NULL; - - bt = SLang_create_array (at->data_type, 0, b_data, at->dims, 2); - if (bt == NULL) - { - SLfree ((char *)b_data); - return NULL; - } - - bt->dims[1] = at->dims[0]; - bt->dims[0] = at->dims[1]; - - return bt; -} - -#define GENERIC_TYPE float -#define TRANSPOSE_2D_ARRAY transpose_floats -#define GENERIC_TYPE_A float -#define GENERIC_TYPE_B float -#define GENERIC_TYPE_C float -#define INNERPROD_FUNCTION innerprod_float_float -#if SLANG_HAS_COMPLEX -# define INNERPROD_COMPLEX_A innerprod_complex_float -# define INNERPROD_A_COMPLEX innerprod_float_complex -#endif -#include "slarrfun.inc" - -#define GENERIC_TYPE double -#define TRANSPOSE_2D_ARRAY transpose_doubles -#define GENERIC_TYPE_A double -#define GENERIC_TYPE_B double -#define GENERIC_TYPE_C double -#define INNERPROD_FUNCTION innerprod_double_double -#if SLANG_HAS_COMPLEX -# define INNERPROD_COMPLEX_A innerprod_complex_double -# define INNERPROD_A_COMPLEX innerprod_double_complex -#endif -#include "slarrfun.inc" - -#define GENERIC_TYPE_A double -#define GENERIC_TYPE_B float -#define GENERIC_TYPE_C double -#define INNERPROD_FUNCTION innerprod_double_float -#include "slarrfun.inc" - -#define GENERIC_TYPE_A float -#define GENERIC_TYPE_B double -#define GENERIC_TYPE_C double -#define INNERPROD_FUNCTION innerprod_float_double -#include "slarrfun.inc" - -/* Finally pick up the complex_complex multiplication - * and do the integers - */ -#if SLANG_HAS_COMPLEX -# define INNERPROD_COMPLEX_COMPLEX innerprod_complex_complex -#endif -#define GENERIC_TYPE int -#define TRANSPOSE_2D_ARRAY transpose_ints -#include "slarrfun.inc" - -#if SIZEOF_LONG != SIZEOF_INT -# define GENERIC_TYPE long -# define TRANSPOSE_2D_ARRAY transpose_longs -# include "slarrfun.inc" -#else -# define transpose_longs transpose_ints -#endif - -#if SIZEOF_SHORT != SIZEOF_INT -# define GENERIC_TYPE short -# define TRANSPOSE_2D_ARRAY transpose_shorts -# include "slarrfun.inc" -#else -# define transpose_shorts transpose_ints -#endif - -#define GENERIC_TYPE char -#define TRANSPOSE_2D_ARRAY transpose_chars -#include "slarrfun.inc" - -/* This routine works only with linear arrays */ -static SLang_Array_Type *transpose (SLang_Array_Type *at) -{ - int dims [SLARRAY_MAX_DIMS]; - int *max_dims; - unsigned int num_dims; - SLang_Array_Type *bt; - int i; - unsigned int sizeof_type; - int is_ptr; - char *b_data; - - max_dims = at->dims; - num_dims = at->num_dims; - - if ((at->num_elements == 0) - || (num_dims == 1)) - { - bt = SLang_duplicate_array (at); - if (num_dims == 1) bt->num_dims = 2; - goto transpose_dims; - } - - /* For numeric arrays skip the overhead below */ - if (num_dims == 2) - { - bt = allocate_transposed_array (at); - if (bt == NULL) return NULL; - - switch (at->data_type) - { - case SLANG_INT_TYPE: - case SLANG_UINT_TYPE: - return transpose_ints (at, bt); - case SLANG_DOUBLE_TYPE: - return transpose_doubles (at, bt); - case SLANG_FLOAT_TYPE: - return transpose_floats (at, bt); - case SLANG_CHAR_TYPE: - case SLANG_UCHAR_TYPE: - return transpose_chars (at, bt); - case SLANG_LONG_TYPE: - case SLANG_ULONG_TYPE: - return transpose_longs (at, bt); - case SLANG_SHORT_TYPE: - case SLANG_USHORT_TYPE: - return transpose_shorts (at, bt); - } - } - else - { - bt = SLang_create_array (at->data_type, 0, NULL, max_dims, num_dims); - if (bt == NULL) return NULL; - } - - sizeof_type = at->sizeof_type; - is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER); - - memset ((char *)dims, 0, sizeof(dims)); - - b_data = (char *) bt->data; - - do - { - if (-1 == _SLarray_aget_transfer_elem (at, dims, (VOID_STAR) b_data, - sizeof_type, is_ptr)) - { - SLang_free_array (bt); - return NULL; - } - b_data += sizeof_type; - } - while (0 == next_transposed_index (dims, max_dims, num_dims)); - - transpose_dims: - - num_dims = bt->num_dims; - for (i = 0; i < (int) num_dims; i++) - bt->dims[i] = max_dims [num_dims - i - 1]; - - return bt; -} - -static void array_transpose (SLang_Array_Type *at) -{ - if (NULL != (at = transpose (at))) - (void) SLang_push_array (at, 1); -} - -static int get_inner_product_parms (SLang_Array_Type *a, int *dp, - unsigned int *loops, unsigned int *other) -{ - int num_dims; - int d; - - d = *dp; - - num_dims = (int)a->num_dims; - if (num_dims == 0) - { - SLang_verror (SL_INVALID_PARM, "Inner-product operation requires an array of at least 1 dimension."); - return -1; - } - - /* An index of -1 refers to last dimension */ - if (d == -1) - d += num_dims; - *dp = d; - - if (a->num_elements == 0) - { /* [] # [] ==> [] */ - *loops = *other = 0; - return 0; - } - - *loops = a->num_elements / a->dims[d]; - - if (d == 0) - { - *other = *loops; /* a->num_elements / a->dims[0]; */ - return 0; - } - - *other = a->dims[d]; - return 0; -} - -/* This routines takes two arrays A_i..j and B_j..k and produces a third - * via C_i..k = A_i..j B_j..k. - * - * If A is a vector, and B is a 2-d matrix, then regard A as a 2-d matrix - * with 1-column. - */ -static void do_inner_product (void) -{ - SLang_Array_Type *a, *b, *c; - void (*fun)(SLang_Array_Type *, SLang_Array_Type *, SLang_Array_Type *, - unsigned int, unsigned int, unsigned int, unsigned int, - unsigned int); - unsigned char c_type; - int dims[SLARRAY_MAX_DIMS]; - int status; - unsigned int a_loops, b_loops, b_inc, a_stride; - int ai_dims, i, j; - unsigned int num_dims, a_num_dims, b_num_dims; - int ai, bi; - - /* The result of a inner_product will be either a float, double, or - * a complex number. - * - * If an integer array is used, it will be promoted to a float. - */ - - switch (SLang_peek_at_stack1 ()) - { - case SLANG_DOUBLE_TYPE: - if (-1 == SLang_pop_array_of_type (&b, SLANG_DOUBLE_TYPE)) - return; - break; - -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - if (-1 == SLang_pop_array_of_type (&b, SLANG_COMPLEX_TYPE)) - return; - break; -#endif - case SLANG_FLOAT_TYPE: - default: - if (-1 == SLang_pop_array_of_type (&b, SLANG_FLOAT_TYPE)) - return; - break; - } - - switch (SLang_peek_at_stack1 ()) - { - case SLANG_DOUBLE_TYPE: - status = SLang_pop_array_of_type (&a, SLANG_DOUBLE_TYPE); - break; - -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - status = SLang_pop_array_of_type (&a, SLANG_COMPLEX_TYPE); - break; -#endif - case SLANG_FLOAT_TYPE: - default: - status = SLang_pop_array_of_type (&a, SLANG_FLOAT_TYPE); - break; - } - - if (status == -1) - { - SLang_free_array (b); - return; - } - - ai = -1; /* last index of a */ - bi = 0; /* first index of b */ - if ((-1 == get_inner_product_parms (a, &ai, &a_loops, &a_stride)) - || (-1 == get_inner_product_parms (b, &bi, &b_loops, &b_inc))) - { - SLang_verror (SL_TYPE_MISMATCH, "Array dimensions are not compatible for inner-product"); - goto free_and_return; - } - - a_num_dims = a->num_dims; - b_num_dims = b->num_dims; - - /* Coerse a 1-d vector to 2-d */ - if ((a_num_dims == 1) - && (b_num_dims == 2) - && (a->num_elements)) - { - a_num_dims = 2; - ai = 1; - a_loops = a->num_elements; - a_stride = 1; - } - - if ((ai_dims = a->dims[ai]) != b->dims[bi]) - { - SLang_verror (SL_TYPE_MISMATCH, "Array dimensions are not compatible for inner-product"); - goto free_and_return; - } - - num_dims = a_num_dims + b_num_dims - 2; - if (num_dims > SLARRAY_MAX_DIMS) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "Inner-product result exceed max allowed dimensions"); - goto free_and_return; - } - - if (num_dims) - { - j = 0; - for (i = 0; i < (int)a_num_dims; i++) - if (i != ai) dims [j++] = a->dims[i]; - for (i = 0; i < (int)b_num_dims; i++) - if (i != bi) dims [j++] = b->dims[i]; - } - else - { - /* a scalar */ - num_dims = 1; - dims[0] = 1; - } - - c_type = 0; fun = NULL; - switch (a->data_type) - { - case SLANG_FLOAT_TYPE: - switch (b->data_type) - { - case SLANG_FLOAT_TYPE: - c_type = SLANG_FLOAT_TYPE; - fun = innerprod_float_float; - break; - case SLANG_DOUBLE_TYPE: - c_type = SLANG_DOUBLE_TYPE; - fun = innerprod_float_double; - break; -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - c_type = SLANG_COMPLEX_TYPE; - fun = innerprod_float_complex; - break; -#endif - } - break; - case SLANG_DOUBLE_TYPE: - switch (b->data_type) - { - case SLANG_FLOAT_TYPE: - c_type = SLANG_DOUBLE_TYPE; - fun = innerprod_double_float; - break; - case SLANG_DOUBLE_TYPE: - c_type = SLANG_DOUBLE_TYPE; - fun = innerprod_double_double; - break; -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - c_type = SLANG_COMPLEX_TYPE; - fun = innerprod_double_complex; - break; -#endif - } - break; -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - c_type = SLANG_COMPLEX_TYPE; - switch (b->data_type) - { - case SLANG_FLOAT_TYPE: - fun = innerprod_complex_float; - break; - case SLANG_DOUBLE_TYPE: - fun = innerprod_complex_double; - break; - case SLANG_COMPLEX_TYPE: - fun = innerprod_complex_complex; - break; - } - break; -#endif - default: - break; - } - - if (NULL == (c = SLang_create_array (c_type, 0, NULL, dims, num_dims))) - goto free_and_return; - - (*fun)(a, b, c, a_loops, a_stride, b_loops, b_inc, ai_dims); - - (void) SLang_push_array (c, 1); - /* drop */ - - free_and_return: - SLang_free_array (a); - SLang_free_array (b); -} - - - -static SLang_Intrin_Fun_Type Array_Fun_Table [] = -{ - MAKE_INTRINSIC_1("transpose", array_transpose, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE), - SLANG_END_INTRIN_FUN_TABLE -}; - -int SLang_init_array (void) -{ - if (-1 == SLadd_intrin_fun_table (Array_Fun_Table, "__SLARRAY__")) - return -1; -#if SLANG_HAS_FLOAT - _SLang_Matrix_Multiply = do_inner_product; -#endif - return 0; -} - diff --git a/mdk-stage1/slang/slarrfun.inc b/mdk-stage1/slang/slarrfun.inc deleted file mode 100644 index 348473a6f..000000000 --- a/mdk-stage1/slang/slarrfun.inc +++ /dev/null @@ -1,257 +0,0 @@ -/* -*- mode: C -*- */ - -/* Some "inline" functions for generic scalar types */ - -#ifdef TRANSPOSE_2D_ARRAY -static SLang_Array_Type *TRANSPOSE_2D_ARRAY (SLang_Array_Type *at, SLang_Array_Type *bt) -{ - GENERIC_TYPE *a_data, *b_data; - int nr, nc, i; - - nr = at->dims[0]; - nc = at->dims[1]; - - a_data = (GENERIC_TYPE *) at->data; - b_data = (GENERIC_TYPE *) bt->data; - - for (i = 0; i < nr; i++) - { - GENERIC_TYPE *offset = b_data + i; - int j; - for (j = 0; j < nc; j++) - { - *offset = *a_data++; - offset += nr; - } - } - return bt; -} -#undef TRANSPOSE_2D_ARRAY -#endif - - -#ifdef INNERPROD_FUNCTION - -static void INNERPROD_FUNCTION - (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct, - unsigned int a_loops, unsigned int a_stride, - unsigned int b_loops, unsigned int b_inc, - unsigned int inner_loops) -{ - GENERIC_TYPE_A *a; - GENERIC_TYPE_B *b; - GENERIC_TYPE_C *c; - - c = (GENERIC_TYPE_C *) ct->data; - b = (GENERIC_TYPE_B *) bt->data; - a = (GENERIC_TYPE_A *) at->data; - - while (a_loops--) - { - GENERIC_TYPE_B *bb; - unsigned int j; - - bb = b; - - for (j = 0; j < inner_loops; j++) - { - double x = (double) a[j]; - - if (x != 0.0) - { - unsigned int k; - - for (k = 0; k < b_loops; k++) - c[k] += x * bb[k]; - } - bb += b_inc; - } - c += b_loops; - a += a_stride; - } -} -#undef INNERPROD_FUNCTION - -#undef GENERIC_TYPE_A -#undef GENERIC_TYPE_B -#undef GENERIC_TYPE_C -#endif - -#ifdef INNERPROD_COMPLEX_A -static void INNERPROD_COMPLEX_A - (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct, - unsigned int a_loops, unsigned int a_stride, - unsigned int b_loops, unsigned int b_inc, - unsigned int inner_loops) -{ - double *a; - GENERIC_TYPE *b; - double *c; - - c = (double *) ct->data; - b = (GENERIC_TYPE *) bt->data; - a = (double *) at->data; - - a_stride *= 2; - - while (a_loops--) - { - GENERIC_TYPE *bb; - unsigned int bb_loops; - - bb = b; - bb_loops = b_loops; - - while (bb_loops--) - { - double real_sum; - double imag_sum; - unsigned int iloops; - double *aa; - GENERIC_TYPE *bbb; - - aa = a; - bbb = bb; - iloops = inner_loops; - - real_sum = 0.0; - imag_sum = 0.0; - while (iloops--) - { - real_sum += aa[0] * (double)bbb[0]; - imag_sum += aa[1] * (double)bbb[0]; - aa += 2; - bbb += b_inc; - } - - *c++ = real_sum; - *c++ = imag_sum; - bb++; - } - - a += a_stride; - } -} - -static void INNERPROD_A_COMPLEX - (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct, - unsigned int a_loops, unsigned int a_stride, - unsigned int b_loops, unsigned int b_inc, - unsigned int inner_loops) -{ - GENERIC_TYPE *a; - double *b; - double *c; - - c = (double *) ct->data; - b = (double *) bt->data; - a = (GENERIC_TYPE *) at->data; - - b_inc *= 2; - - while (a_loops--) - { - double *bb; - unsigned int bb_loops; - - bb = b; - bb_loops = b_loops; - - while (bb_loops--) - { - double real_sum; - double imag_sum; - unsigned int iloops; - GENERIC_TYPE *aa; - double *bbb; - - aa = a; - bbb = bb; - iloops = inner_loops; - - real_sum = 0.0; - imag_sum = 0.0; - while (iloops--) - { - real_sum += (double)aa[0] * bbb[0]; - imag_sum += (double)aa[0] * bbb[1]; - aa += 1; - bbb += b_inc; - } - - *c++ = real_sum; - *c++ = imag_sum; - bb += 2; - } - - a += a_stride; - } -} - -#undef INNERPROD_A_COMPLEX -#undef INNERPROD_COMPLEX_A -#endif /* INNERPROD_COMPLEX_A */ - - -#ifdef INNERPROD_COMPLEX_COMPLEX -static void INNERPROD_COMPLEX_COMPLEX - (SLang_Array_Type *at, SLang_Array_Type *bt, SLang_Array_Type *ct, - unsigned int a_loops, unsigned int a_stride, - unsigned int b_loops, unsigned int b_inc, - unsigned int inner_loops) -{ - double *a; - double *b; - double *c; - - c = (double *) ct->data; - b = (double *) bt->data; - a = (double *) at->data; - - a_stride *= 2; - b_inc *= 2; - - while (a_loops--) - { - double *bb; - unsigned int bb_loops; - - bb = b; - bb_loops = b_loops; - - while (bb_loops--) - { - double real_sum; - double imag_sum; - unsigned int iloops; - double *aa; - double *bbb; - - aa = a; - bbb = bb; - iloops = inner_loops; - - real_sum = 0.0; - imag_sum = 0.0; - while (iloops--) - { - real_sum += aa[0]*bbb[0] - aa[1]*bbb[1]; - imag_sum += aa[0]*bbb[1] + aa[1]*bbb[0]; - aa += 2; - bbb += b_inc; - } - - *c++ = real_sum; - *c++ = imag_sum; - bb += 2; - } - - a += a_stride; - } -} -#undef INNERPROD_COMPLEX_COMPLEX -#endif - -#ifdef GENERIC_TYPE -# undef GENERIC_TYPE -#endif diff --git a/mdk-stage1/slang/slarrmis.c b/mdk-stage1/slang/slarrmis.c deleted file mode 100644 index 330dcb53f..000000000 --- a/mdk-stage1/slang/slarrmis.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Misc Array Functions */ -/* Copyright (c) 1997, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -int SLang_get_array_element (SLang_Array_Type *at, int *indices, VOID_STAR data) -{ - int is_ptr; - - if ((at == NULL) - || (indices == NULL) - || (data == NULL)) - return -1; - - is_ptr = (at->flags & SLARR_DATA_VALUE_IS_POINTER); - if (is_ptr) *(VOID_STAR *) data = NULL; - return _SLarray_aget_transfer_elem (at, indices, data, at->sizeof_type, is_ptr); -} - -int SLang_set_array_element (SLang_Array_Type *at, int *indices, VOID_STAR data) -{ - if ((at == NULL) - || (indices == NULL) - || (data == NULL)) - return -1; - - return _SLarray_aput_transfer_elem (at, indices, data, at->sizeof_type, - at->flags & SLARR_DATA_VALUE_IS_POINTER); -} - diff --git a/mdk-stage1/slang/slassoc.c b/mdk-stage1/slang/slassoc.c deleted file mode 100644 index 5997458d2..000000000 --- a/mdk-stage1/slang/slassoc.c +++ /dev/null @@ -1,713 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#define SL_APP_WANTS_FOREACH -#include "slang.h" -#include "_slang.h" - -#define USE_NEW_ANYTYPE_CODE 1 - -typedef struct _SLAssoc_Array_Element_Type -{ - char *key; /* slstring */ - struct _SLAssoc_Array_Element_Type *next; - SLang_Object_Type value; -} -_SLAssoc_Array_Element_Type; - -typedef struct -{ - _SLAssoc_Array_Element_Type *elements[SLASSOC_HASH_TABLE_SIZE]; - SLang_Object_Type default_value; - unsigned int num_elements; -#define HAS_DEFAULT_VALUE 1 - unsigned int flags; - unsigned char type; -} -SLang_Assoc_Array_Type; - -#define USE_CACHED_STRING 1 - -#if USE_CACHED_STRING -static char *Cached_String; -static SLang_Object_Type *Cached_Obj; -static SLang_Assoc_Array_Type *Cached_Array; -#endif - -static SLang_Assoc_Array_Type *alloc_assoc_array (unsigned char type, int has_default_value) -{ - SLang_Assoc_Array_Type *a; - - a = (SLang_Assoc_Array_Type *)SLmalloc (sizeof (SLang_Assoc_Array_Type)); - if (a == NULL) - { - if (has_default_value) - SLdo_pop_n (1); - return NULL; - } - - memset ((char *) a, 0, sizeof (SLang_Assoc_Array_Type)); - a->type = type; - - if (has_default_value) - { - if ( -#if USE_NEW_ANYTYPE_CODE - ((type != SLANG_ANY_TYPE) && (-1 == SLclass_typecast (type, 1, 1))) -#else - (-1 == SLclass_typecast (type, 1, 1)) -#endif - || (-1 == SLang_pop (&a->default_value))) - { - SLfree ((char *) a); - return NULL; - } - - a->flags |= HAS_DEFAULT_VALUE; - } - return a; -} - -static void free_element (_SLAssoc_Array_Element_Type *e) -{ - if (e == NULL) - return; - - SLang_free_object (&e->value); - SLang_free_slstring (e->key); -#if USE_CACHED_STRING - if (e->key == Cached_String) - Cached_String = NULL; -#endif - SLfree ((char *)e); -} - -static void delete_assoc_array (SLang_Assoc_Array_Type *a) -{ - unsigned int i; - - if (a == NULL) return; - - for (i = 0; i < SLASSOC_HASH_TABLE_SIZE; i++) - { - _SLAssoc_Array_Element_Type *e; - - e = a->elements[i]; - while (e != NULL) - { - _SLAssoc_Array_Element_Type *next_e; - - next_e = e->next; - free_element (e); - e = next_e; - } - } - if (a->flags & HAS_DEFAULT_VALUE) - SLang_free_object (&a->default_value); - - SLfree ((char *) a); -} - -_INLINE_ -static SLang_Object_Type * -find_element (SLang_Assoc_Array_Type *a, char *str, unsigned long hash) -{ - unsigned int h; - _SLAssoc_Array_Element_Type *e; - - h = (unsigned int) (hash % SLASSOC_HASH_TABLE_SIZE); - e = a->elements[h]; - - while (e != NULL) - { - if (str == e->key) /* slstrings can be compared this way */ - { -#if USE_CACHED_STRING - Cached_String = str; - Cached_Obj = &e->value; - Cached_Array = a; -#endif - return &e->value; - } - - e = e->next; - } - - return NULL; -} - -static _SLAssoc_Array_Element_Type * -create_element (SLang_Assoc_Array_Type *a, char *str, unsigned long hash) -{ - unsigned int h; - _SLAssoc_Array_Element_Type *e; - - e = (_SLAssoc_Array_Element_Type *) SLmalloc (sizeof (_SLAssoc_Array_Element_Type)); - if (e == NULL) - return NULL; - - memset ((char *) e, 0, sizeof (_SLAssoc_Array_Element_Type)); - h = (unsigned int) (hash % SLASSOC_HASH_TABLE_SIZE); - - if (NULL == (str = _SLstring_dup_hashed_string (str, hash))) - { - SLfree ((char *) e); - return NULL; - } - - e->key = str; - e->next = a->elements[h]; - a->elements[h] = e; - - a->num_elements += 1; -#if USE_CACHED_STRING - Cached_String = str; - Cached_Obj = &e->value; - Cached_Array = a; -#endif - return e; -} - -static int store_object (SLang_Assoc_Array_Type *a, char *s, SLang_Object_Type *obj) -{ - unsigned long hash; - SLang_Object_Type *v; - -#if USE_CACHED_STRING - if ((s == Cached_String) && (a == Cached_Array)) - { - v = Cached_Obj; - SLang_free_object (v); - } - else - { -#endif - hash = _SLcompute_string_hash (s); - if (NULL != (v = find_element (a, s, hash))) - SLang_free_object (v); - else - { - _SLAssoc_Array_Element_Type *e; - - e = create_element (a, s, hash); - if (e == NULL) - return -1; - - v = &e->value; - } -#if USE_CACHED_STRING - } -#endif - - *v = *obj; - - return 0; -} - -static void assoc_destroy (unsigned char type, VOID_STAR ptr) -{ - (void) type; - delete_assoc_array ((SLang_Assoc_Array_Type *) ptr); -} - -static int pop_index (unsigned int num_indices, - SLang_MMT_Type **mmt, - SLang_Assoc_Array_Type **a, - char **str) -{ - if (NULL == (*mmt = SLang_pop_mmt (SLANG_ASSOC_TYPE))) - { - *a = NULL; - *str = NULL; - return -1; - } - - if ((num_indices != 1) - || (-1 == SLang_pop_slstring (str))) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "Assoc_Type arrays require a single string index"); - SLang_free_mmt (*mmt); - *mmt = NULL; - *a = NULL; - *str = NULL; - return -1; - } - - *a = (SLang_Assoc_Array_Type *) SLang_object_from_mmt (*mmt); - return 0; -} - -static int assoc_aget (unsigned char type, unsigned int num_indices) -{ - SLang_MMT_Type *mmt; - char *str; - SLang_Assoc_Array_Type *a; - SLang_Object_Type *obj; - int ret; - - (void) type; - - if (-1 == pop_index (num_indices, &mmt, &a, &str)) - return -1; - -#if USE_CACHED_STRING - if ((str == Cached_String) && (a == Cached_Array)) - obj = Cached_Obj; - else -#endif - obj = find_element (a, str, _SLcompute_string_hash (str)); - - if ((obj == NULL) - && (a->flags & HAS_DEFAULT_VALUE)) - obj = &a->default_value; - - if (obj == NULL) - { - SLang_verror (SL_INTRINSIC_ERROR, - "No such element in Assoc Array: %s", str); - ret = -1; - } - else - { -#if _SLANG_OPTIMIZE_FOR_SPEED - if (SLANG_CLASS_TYPE_SCALAR == _SLclass_Class_Type[obj->data_type]) - ret = SLang_push (obj); -#endif - else - ret = _SLpush_slang_obj (obj); - } - - SLang_free_slstring (str); - SLang_free_mmt (mmt); - return ret; -} - -static int assoc_aput (unsigned char type, unsigned int num_indices) -{ - SLang_MMT_Type *mmt; - char *str; - SLang_Assoc_Array_Type *a; - SLang_Object_Type obj; - int ret; - - (void) type; - - if (-1 == pop_index (num_indices, &mmt, &a, &str)) - return -1; - - ret = -1; - - if (0 == SLang_pop (&obj)) - { - if ((obj.data_type != a->type) -#if USE_NEW_ANYTYPE_CODE - && (a->type != SLANG_ANY_TYPE) -#endif - ) - { - (void) SLang_push (&obj); - if ((-1 == SLclass_typecast (a->type, 1, 1)) - || (-1 == SLang_pop (&obj))) - goto the_return; - } - - if (-1 == store_object (a, str, &obj)) - SLang_free_object (&obj); - else - ret = 0; - } - - the_return: - SLang_free_slstring (str); - SLang_free_mmt (mmt); - return ret; -} - -static int assoc_anew (unsigned char type, unsigned int num_dims) -{ - SLang_MMT_Type *mmt; - SLang_Assoc_Array_Type *a; - int has_default_value; - - has_default_value = 0; - switch (num_dims) - { - case 0: - type = SLANG_ANY_TYPE; - break; - case 2: - (void) SLreverse_stack (2); - has_default_value = 1; - /* drop */ - case 1: - if (0 == _SLang_pop_datatype (&type)) - break; - num_dims--; - /* drop */ - default: - SLdo_pop_n (num_dims); - SLang_verror (SL_SYNTAX_ERROR, "Usage: Assoc_Type [DataType_Type]"); - return -1; - } - - a = alloc_assoc_array (type, has_default_value); - if (a == NULL) - return -1; - - if (NULL == (mmt = SLang_create_mmt (SLANG_ASSOC_TYPE, (VOID_STAR) a))) - { - delete_assoc_array (a); - return -1; - } - - if (-1 == SLang_push_mmt (mmt)) - { - SLang_free_mmt (mmt); - return -1; - } - - return 0; -} - -static void assoc_get_keys (SLang_Assoc_Array_Type *a) -{ - SLang_Array_Type *at; - int num; - unsigned int i, j; - char **data; - - /* Note: If support for threads is added, then we need to modify this - * algorithm to prevent another thread from modifying the array. - * However, that should be handled in inner_interp. - */ - num = a->num_elements; - - if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &num, 1))) - return; - - data = (char **)at->data; - - i = 0; - for (j = 0; j < SLASSOC_HASH_TABLE_SIZE; j++) - { - _SLAssoc_Array_Element_Type *e; - - e = a->elements[j]; - while (e != NULL) - { - /* Next cannot fail because it is an slstring */ - data [i] = SLang_create_slstring (e->key); - e = e->next; - i++; - } - } - (void) SLang_push_array (at, 1); -} - -static int -transfer_element (SLang_Class_Type *cl, VOID_STAR dest_data, - SLang_Object_Type *obj) -{ - unsigned int sizeof_type; - VOID_STAR src_data; - -#if USE_NEW_ANYTYPE_CODE - if (cl->cl_data_type == SLANG_ANY_TYPE) - { - SLang_Any_Type *any; - - if ((-1 == _SLpush_slang_obj (obj)) - || (-1 == SLang_pop_anytype (&any))) - return -1; - - *(SLang_Any_Type **)dest_data = any; - return 0; - } -#endif - /* Optimize for scalar */ - if (cl->cl_class_type == SLANG_CLASS_TYPE_SCALAR) - { - sizeof_type = cl->cl_sizeof_type; - memcpy ((char *) dest_data, (char *)&obj->v, sizeof_type); - return 0; - } - - src_data = _SLclass_get_ptr_to_value (cl, obj); - - if (-1 == (*cl->cl_acopy) (cl->cl_data_type, src_data, dest_data)) - return -1; - - return 0; -} - -static void assoc_get_values (SLang_Assoc_Array_Type *a) -{ - SLang_Array_Type *at; - int num; - unsigned int i, j; - char *dest_data; - unsigned char type; - SLang_Class_Type *cl; - unsigned int sizeof_type; - - /* Note: If support for threads is added, then we need to modify this - * algorithm to prevent another thread from modifying the array. - * However, that should be handled in inner_interp. - */ - num = a->num_elements; - type = a->type; - - cl = _SLclass_get_class (type); - sizeof_type = cl->cl_sizeof_type; - - if (NULL == (at = SLang_create_array (type, 0, NULL, &num, 1))) - return; - - dest_data = (char *)at->data; - - i = 0; - for (j = 0; j < SLASSOC_HASH_TABLE_SIZE; j++) - { - _SLAssoc_Array_Element_Type *e; - - e = a->elements[j]; - while (e != NULL) - { - if (-1 == transfer_element (cl, (VOID_STAR) dest_data, &e->value)) - { - SLang_free_array (at); - return; - } - - dest_data += sizeof_type; - e = e->next; - i++; - } - } - (void) SLang_push_array (at, 1); -} - -static int assoc_key_exists (SLang_Assoc_Array_Type *a, char *key) -{ - return (NULL != find_element (a, key, _SLcompute_string_hash (key))); -} - -static void assoc_delete_key (SLang_Assoc_Array_Type *a, char *key) -{ - unsigned int h; - _SLAssoc_Array_Element_Type *v, *v0; - - h = (unsigned int) (_SLcompute_string_hash (key) % SLASSOC_HASH_TABLE_SIZE); - - v0 = NULL; - v = a->elements[h]; - while (v != NULL) - { - if (v->key == key) - { - if (v0 != NULL) - v0->next = v->next; - else - a->elements[h] = v->next; - - free_element (v); - a->num_elements -= 1; - return; - } - v0 = v; - v = v->next; - } - - /* No such element. Let it pass with no error. */ -} - -#define A SLANG_ASSOC_TYPE -#define S SLANG_STRING_TYPE -static SLang_Intrin_Fun_Type Assoc_Table [] = -{ - MAKE_INTRINSIC_1("assoc_get_keys", assoc_get_keys, SLANG_VOID_TYPE, A), - MAKE_INTRINSIC_1("assoc_get_values", assoc_get_values, SLANG_VOID_TYPE, A), - MAKE_INTRINSIC_2("assoc_key_exists", assoc_key_exists, SLANG_INT_TYPE, A, S), - MAKE_INTRINSIC_2("assoc_delete_key", assoc_delete_key, SLANG_VOID_TYPE, A, S), - - SLANG_END_INTRIN_FUN_TABLE -}; -#undef A -#undef S - -static int assoc_length (unsigned char type, VOID_STAR v, unsigned int *len) -{ - SLang_Assoc_Array_Type *a; - - (void) type; - a = (SLang_Assoc_Array_Type *) SLang_object_from_mmt (*(SLang_MMT_Type **)v); - *len = a->num_elements; - return 0; -} - -struct _SLang_Foreach_Context_Type -{ - SLang_MMT_Type *mmt; - SLang_Assoc_Array_Type *a; - unsigned int this_hash_index; - unsigned int next_same_hash_index; -#define CTX_WRITE_KEYS 1 -#define CTX_WRITE_VALUES 2 - unsigned char flags; -}; - -static SLang_Foreach_Context_Type * -cl_foreach_open (unsigned char type, unsigned int num) -{ - SLang_Foreach_Context_Type *c; - unsigned char flags; - SLang_MMT_Type *mmt; - - (void) type; - - if (NULL == (mmt = SLang_pop_mmt (SLANG_ASSOC_TYPE))) - return NULL; - - flags = 0; - - while (num--) - { - char *s; - - if (-1 == SLang_pop_slstring (&s)) - { - SLang_free_mmt (mmt); - return NULL; - } - - if (0 == strcmp (s, "keys")) - flags |= CTX_WRITE_KEYS; - else if (0 == strcmp (s, "values")) - flags |= CTX_WRITE_VALUES; - else - { - SLang_verror (SL_NOT_IMPLEMENTED, - "using '%s' not supported by SLassoc_Type", - s); - SLang_free_slstring (s); - SLang_free_mmt (mmt); - return NULL; - } - - SLang_free_slstring (s); - } - - if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type)))) - { - SLang_free_mmt (mmt); - return NULL; - } - - memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type)); - - if (flags == 0) flags = CTX_WRITE_VALUES|CTX_WRITE_KEYS; - - c->flags = flags; - c->mmt = mmt; - c->a = (SLang_Assoc_Array_Type *) SLang_object_from_mmt (mmt); - - return c; -} - -static void cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c) -{ - (void) type; - if (c == NULL) return; - SLang_free_mmt (c->mmt); - SLfree ((char *) c); -} - -static int cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c) -{ - SLang_Assoc_Array_Type *a; - _SLAssoc_Array_Element_Type *e; - unsigned int i, j; - - (void) type; - - if (c == NULL) - return -1; - - a = c->a; - - i = c->this_hash_index; - if (i >= SLASSOC_HASH_TABLE_SIZE) - return 0; - - e = a->elements[i]; - - j = c->next_same_hash_index; - c->next_same_hash_index = j + 1; - - while ((j > 0) && (e != NULL)) - { - j--; - e = e->next; - } - - if (e == NULL) - { - do - { - i++; - if (i >= SLASSOC_HASH_TABLE_SIZE) - return 0; /* no more */ - } - while (a->elements [i] == NULL); - - e = a->elements[i]; - c->this_hash_index = i; - c->next_same_hash_index = 1; - } - - if ((c->flags & CTX_WRITE_KEYS) - && (-1 == SLang_push_string (e->key))) - return -1; - - if ((c->flags & CTX_WRITE_VALUES) - && (-1 == _SLpush_slang_obj (&e->value))) - return -1; - - /* keep going */ - return 1; -} - -int SLang_init_slassoc (void) -{ - SLang_Class_Type *cl; - - if (SLclass_is_class_defined (SLANG_ASSOC_TYPE)) - return 0; - - if (NULL == (cl = SLclass_allocate_class ("Assoc_Type"))) - return -1; - - (void) SLclass_set_destroy_function (cl, assoc_destroy); - (void) SLclass_set_aput_function (cl, assoc_aput); - (void) SLclass_set_aget_function (cl, assoc_aget); - (void) SLclass_set_anew_function (cl, assoc_anew); - cl->cl_length = assoc_length; - cl->cl_foreach_open = cl_foreach_open; - cl->cl_foreach_close = cl_foreach_close; - cl->cl_foreach = cl_foreach; - - if (-1 == SLclass_register_class (cl, SLANG_ASSOC_TYPE, sizeof (SLang_Assoc_Array_Type), SLANG_CLASS_TYPE_MMT)) - return -1; - - if (-1 == SLadd_intrin_fun_table (Assoc_Table, "__SLASSOC__")) - return -1; - - return 0; -} - diff --git a/mdk-stage1/slang/slbstr.c b/mdk-stage1/slang/slbstr.c deleted file mode 100644 index b4b8c4c51..000000000 --- a/mdk-stage1/slang/slbstr.c +++ /dev/null @@ -1,615 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -struct _SLang_BString_Type -{ - unsigned int num_refs; - unsigned int len; - int ptr_type; -#define IS_SLSTRING 1 -#define IS_MALLOCED 2 -#define IS_NOT_TO_BE_FREED 3 - union - { - unsigned char bytes[1]; - unsigned char *ptr; - } - v; -}; - -#define BS_GET_POINTER(b) ((b)->ptr_type ? (b)->v.ptr : (b)->v.bytes) - -static SLang_BString_Type *create_bstring_of_type (char *bytes, unsigned int len, int type) -{ - SLang_BString_Type *b; - unsigned int size; - - size = sizeof(SLang_BString_Type); - if (type == 0) - size += len; - - if (NULL == (b = (SLang_BString_Type *)SLmalloc (size))) - return NULL; - - b->len = len; - b->num_refs = 1; - b->ptr_type = type; - - switch (type) - { - case 0: - if (bytes != NULL) memcpy ((char *) b->v.bytes, bytes, len); - /* Now \0 terminate it because we want to also use it as a C string - * whenever possible. Note that sizeof(SLang_BString_Type) includes - * space for 1 character and we allocated len extra bytes. Thus, it is - * ok to add a \0 to the end. - */ - b->v.bytes[len] = 0; - break; - - case IS_SLSTRING: - if (NULL == (b->v.ptr = (unsigned char *)SLang_create_nslstring (bytes, len))) - { - SLfree ((char *) b); - return NULL; - } - break; - - case IS_MALLOCED: - case IS_NOT_TO_BE_FREED: - b->v.ptr = (unsigned char *)bytes; - bytes [len] = 0; /* NULL terminate */ - break; - } - - return b; -} - -SLang_BString_Type * -SLbstring_create (unsigned char *bytes, unsigned int len) -{ - return create_bstring_of_type ((char *)bytes, len, 0); -} - -/* Note that ptr must be len + 1 bytes long for \0 termination */ -SLang_BString_Type * -SLbstring_create_malloced (unsigned char *ptr, unsigned int len, int free_on_error) -{ - SLang_BString_Type *b; - - if (ptr == NULL) - return NULL; - - if (NULL == (b = create_bstring_of_type ((char *)ptr, len, IS_MALLOCED))) - { - if (free_on_error) - SLfree ((char *) ptr); - } - return b; -} - -SLang_BString_Type *SLbstring_create_slstring (char *s) -{ - if (s == NULL) - return NULL; - - return create_bstring_of_type (s, strlen (s), IS_SLSTRING); -} - -SLang_BString_Type *SLbstring_dup (SLang_BString_Type *b) -{ - if (b != NULL) - b->num_refs += 1; - - return b; -} - -unsigned char *SLbstring_get_pointer (SLang_BString_Type *b, unsigned int *len) -{ - if (b == NULL) - { - *len = 0; - return NULL; - } - *len = b->len; - return BS_GET_POINTER(b); -} - -void SLbstring_free (SLang_BString_Type *b) -{ - if (b == NULL) - return; - - if (b->num_refs > 1) - { - b->num_refs -= 1; - return; - } - - switch (b->ptr_type) - { - case 0: - case IS_NOT_TO_BE_FREED: - default: - break; - - case IS_SLSTRING: - SLang_free_slstring ((char *)b->v.ptr); - break; - - case IS_MALLOCED: - SLfree ((char *)b->v.ptr); - break; - } - - SLfree ((char *) b); -} - -int SLang_pop_bstring (SLang_BString_Type **b) -{ - return SLclass_pop_ptr_obj (SLANG_BSTRING_TYPE, (VOID_STAR *)b); -} - -int SLang_push_bstring (SLang_BString_Type *b) -{ - if (b == NULL) - return SLang_push_null (); - - b->num_refs += 1; - - if (0 == SLclass_push_ptr_obj (SLANG_BSTRING_TYPE, (VOID_STAR)b)) - return 0; - - b->num_refs -= 1; - return -1; -} - -static int -bstring_bstring_bin_op_result (int op, unsigned char a, unsigned char b, - unsigned char *c) -{ - (void) a; - (void) b; - switch (op) - { - default: - return 0; - - case SLANG_PLUS: - *c = SLANG_BSTRING_TYPE; - break; - - case SLANG_GT: - case SLANG_GE: - case SLANG_LT: - case SLANG_LE: - case SLANG_EQ: - case SLANG_NE: - *c = SLANG_CHAR_TYPE; - break; - } - return 1; -} - -static int compare_bstrings (SLang_BString_Type *a, SLang_BString_Type *b) -{ - unsigned int len; - int ret; - - len = a->len; - if (b->len < len) len = b->len; - - ret = memcmp ((char *)BS_GET_POINTER(b), (char *)BS_GET_POINTER(a), len); - if (ret != 0) - return ret; - - if (a->len > b->len) - return 1; - if (a->len == b->len) - return 0; - - return -1; -} - -static SLang_BString_Type * -concat_bstrings (SLang_BString_Type *a, SLang_BString_Type *b) -{ - unsigned int len; - SLang_BString_Type *c; - char *bytes; - - len = a->len + b->len; - - if (NULL == (c = SLbstring_create (NULL, len))) - return NULL; - - bytes = (char *)BS_GET_POINTER(c); - - memcpy (bytes, (char *)BS_GET_POINTER(a), a->len); - memcpy (bytes + a->len, (char *)BS_GET_POINTER(b), b->len); - - return c; -} - -static void free_n_bstrings (SLang_BString_Type **a, unsigned int n) -{ - unsigned int i; - - if (a == NULL) return; - - for (i = 0; i < n; i++) - { - SLbstring_free (a[i]); - a[i] = NULL; - } -} - -static int -bstring_bstring_bin_op (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - char *ic; - SLang_BString_Type **a, **b, **c; - unsigned int n, n_max; - unsigned int da, db; - - (void) a_type; - (void) b_type; - - if (na == 1) da = 0; else da = 1; - if (nb == 1) db = 0; else db = 1; - - if (na > nb) n_max = na; else n_max = nb; - - a = (SLang_BString_Type **) ap; - b = (SLang_BString_Type **) bp; - for (n = 0; n < n_max; n++) - { - if ((*a == NULL) || (*b == NULL)) - { - SLang_verror (SL_VARIABLE_UNINITIALIZED, - "Binary string element[%u] not initialized for binary operation", n); - return -1; - } - a += da; b += db; - } - - a = (SLang_BString_Type **) ap; - b = (SLang_BString_Type **) bp; - ic = (char *) cp; - c = NULL; - - switch (op) - { - case SLANG_PLUS: - /* Concat */ - c = (SLang_BString_Type **) cp; - for (n = 0; n < n_max; n++) - { - if (NULL == (c[n] = concat_bstrings (*a, *b))) - goto return_error; - - a += da; b += db; - } - break; - - case SLANG_NE: - for (n = 0; n < n_max; n++) - { - ic [n] = (0 != compare_bstrings (*a, *b)); - a += da; - b += db; - } - break; - case SLANG_GT: - for (n = 0; n < n_max; n++) - { - ic [n] = (compare_bstrings (*a, *b) > 0); - a += da; - b += db; - } - break; - case SLANG_GE: - for (n = 0; n < n_max; n++) - { - ic [n] = (compare_bstrings (*a, *b) >= 0); - a += da; - b += db; - } - break; - case SLANG_LT: - for (n = 0; n < n_max; n++) - { - ic [n] = (compare_bstrings (*a, *b) < 0); - a += da; - b += db; - } - break; - case SLANG_LE: - for (n = 0; n < n_max; n++) - { - ic [n] = (compare_bstrings (*a, *b) <= 0); - a += da; - b += db; - } - break; - case SLANG_EQ: - for (n = 0; n < n_max; n++) - { - ic [n] = (compare_bstrings (*a, *b) == 0); - a += da; - b += db; - } - break; - } - return 1; - - return_error: - if (c != NULL) - { - free_n_bstrings (c, n); - while (n < n_max) - { - c[n] = NULL; - n++; - } - } - return -1; -} - -/* If preserve_ptr, then use a[i] as the bstring data. See how this function - * is called by the binary op routines for why. - */ -static SLang_BString_Type ** -make_n_bstrings (SLang_BString_Type **b, char **a, unsigned int n, int ptr_type) -{ - unsigned int i; - int malloc_flag; - - malloc_flag = 0; - if (b == NULL) - { - b = (SLang_BString_Type **) SLmalloc ((n + 1) * sizeof (SLang_BString_Type *)); - if (b == NULL) - return NULL; - malloc_flag = 1; - } - - for (i = 0; i < n; i++) - { - char *s = a[i]; - - if (s == NULL) - { - b[i] = NULL; - continue; - } - - if (NULL == (b[i] = create_bstring_of_type (s, strlen(s), ptr_type))) - { - free_n_bstrings (b, i); - if (malloc_flag) SLfree ((char *) b); - return NULL; - } - } - - return b; -} - -static int -bstring_string_bin_op (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - SLang_BString_Type **b; - int ret; - - if (NULL == (b = make_n_bstrings (NULL, (char **)bp, nb, IS_NOT_TO_BE_FREED))) - return -1; - - b_type = SLANG_BSTRING_TYPE; - ret = bstring_bstring_bin_op (op, - a_type, ap, na, - b_type, (VOID_STAR) b, nb, - cp); - free_n_bstrings (b, nb); - SLfree ((char *) b); - return ret; -} - -static int -string_bstring_bin_op (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - SLang_BString_Type **a; - int ret; - - if (NULL == (a = make_n_bstrings (NULL, (char **)ap, na, IS_NOT_TO_BE_FREED))) - return -1; - - a_type = SLANG_BSTRING_TYPE; - ret = bstring_bstring_bin_op (op, - a_type, (VOID_STAR) a, na, - b_type, bp, nb, - cp); - free_n_bstrings (a, na); - SLfree ((char *) a); - - return ret; -} - -static void bstring_destroy (unsigned char unused, VOID_STAR s) -{ - (void) unused; - SLbstring_free (*(SLang_BString_Type **) s); -} - -static int bstring_push (unsigned char unused, VOID_STAR sptr) -{ - (void) unused; - - return SLang_push_bstring (*(SLang_BString_Type **) sptr); -} - -static int string_to_bstring (unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp) -{ - char **s; - SLang_BString_Type **b; - - (void) a_type; - (void) b_type; - - s = (char **) ap; - b = (SLang_BString_Type **) bp; - - if (NULL == make_n_bstrings (b, s, na, IS_SLSTRING)) - return -1; - - return 1; -} - -static int bstring_to_string (unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp) -{ - char **s; - unsigned int i; - SLang_BString_Type **a; - - (void) a_type; - (void) b_type; - - s = (char **) bp; - a = (SLang_BString_Type **) ap; - - for (i = 0; i < na; i++) - { - SLang_BString_Type *ai = a[i]; - - if (ai == NULL) - { - s[i] = NULL; - continue; - } - - if (NULL == (s[i] = SLang_create_slstring ((char *)BS_GET_POINTER(ai)))) - { - while (i != 0) - { - i--; - SLang_free_slstring (s[i]); - s[i] = NULL; - } - return -1; - } - } - - return 1; -} - -static char *bstring_string (unsigned char type, VOID_STAR v) -{ - SLang_BString_Type *s; - unsigned char buf[128]; - unsigned char *bytes, *bytes_max; - unsigned char *b, *bmax; - - (void) type; - - s = *(SLang_BString_Type **) v; - bytes = BS_GET_POINTER(s); - bytes_max = bytes + s->len; - - b = buf; - bmax = buf + (sizeof (buf) - 4); - - while (bytes < bytes_max) - { - unsigned char ch = *bytes; - - if ((ch < 32) || (ch >= 127) || (ch == '\\')) - { - if (b + 4 > bmax) - break; - - sprintf ((char *) b, "\\%03o", ch); - b += 4; - } - else - { - if (b == bmax) - break; - - *b++ = ch; - } - - bytes++; - } - - if (bytes < bytes_max) - { - *b++ = '.'; - *b++ = '.'; - *b++ = '.'; - } - *b = 0; - - return SLmake_string ((char *)buf); -} - -static unsigned int bstrlen_cmd (SLang_BString_Type *b) -{ - return b->len; -} - -static SLang_Intrin_Fun_Type BString_Table [] = /*{{{*/ -{ - MAKE_INTRINSIC_1("bstrlen", bstrlen_cmd, SLANG_UINT_TYPE, SLANG_BSTRING_TYPE), - MAKE_INTRINSIC_0("pack", _SLpack, SLANG_VOID_TYPE), - MAKE_INTRINSIC_2("unpack", _SLunpack, SLANG_VOID_TYPE, SLANG_STRING_TYPE, SLANG_BSTRING_TYPE), - MAKE_INTRINSIC_1("pad_pack_format", _SLpack_pad_format, SLANG_VOID_TYPE, SLANG_STRING_TYPE), - MAKE_INTRINSIC_1("sizeof_pack", _SLpack_compute_size, SLANG_UINT_TYPE, SLANG_STRING_TYPE), - SLANG_END_INTRIN_FUN_TABLE -}; - -int _SLang_init_bstring (void) -{ - SLang_Class_Type *cl; - - if (NULL == (cl = SLclass_allocate_class ("BString_Type"))) - return -1; - (void) SLclass_set_destroy_function (cl, bstring_destroy); - (void) SLclass_set_push_function (cl, bstring_push); - (void) SLclass_set_string_function (cl, bstring_string); - - if (-1 == SLclass_register_class (cl, SLANG_BSTRING_TYPE, sizeof (char *), - SLANG_CLASS_TYPE_PTR)) - return -1; - - if ((-1 == SLclass_add_typecast (SLANG_BSTRING_TYPE, SLANG_STRING_TYPE, bstring_to_string, 1)) - || (-1 == SLclass_add_typecast (SLANG_STRING_TYPE, SLANG_BSTRING_TYPE, string_to_bstring, 1)) - || (-1 == SLclass_add_binary_op (SLANG_BSTRING_TYPE, SLANG_BSTRING_TYPE, bstring_bstring_bin_op, bstring_bstring_bin_op_result)) - || (-1 == SLclass_add_binary_op (SLANG_STRING_TYPE, SLANG_BSTRING_TYPE, string_bstring_bin_op, bstring_bstring_bin_op_result)) - || (-1 == SLclass_add_binary_op (SLANG_BSTRING_TYPE, SLANG_STRING_TYPE, bstring_string_bin_op, bstring_bstring_bin_op_result))) - - return -1; - - if (-1 == SLadd_intrin_fun_table (BString_Table, NULL)) - return -1; - - return 0; -} - diff --git a/mdk-stage1/slang/slclass.c b/mdk-stage1/slang/slclass.c deleted file mode 100644 index 733888cb8..000000000 --- a/mdk-stage1/slang/slclass.c +++ /dev/null @@ -1,1391 +0,0 @@ -/* User defined objects */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -#if _SLANG_OPTIMIZE_FOR_SPEED -unsigned char _SLclass_Class_Type [256]; -#endif - -static SLang_Class_Type *Registered_Types[256]; -SLang_Class_Type *_SLclass_get_class (unsigned char type) -{ - SLang_Class_Type *cl; - - cl = Registered_Types [type]; - if (cl == NULL) - SLang_exit_error ("Application error: Type %d not registered", (int) type); - - return cl; -} - -int SLclass_is_class_defined (unsigned char type) -{ - return (NULL != Registered_Types[type]); -} - -VOID_STAR _SLclass_get_ptr_to_value (SLang_Class_Type *cl, - SLang_Object_Type *obj) -{ - VOID_STAR p; - - switch (cl->cl_class_type) - { - case SLANG_CLASS_TYPE_MMT: - case SLANG_CLASS_TYPE_PTR: - case SLANG_CLASS_TYPE_SCALAR: - p = (VOID_STAR) &obj->v; - break; - - case SLANG_CLASS_TYPE_VECTOR: - p = obj->v.ptr_val; - break; - - default: - p = NULL; - } - return p; -} - -char *SLclass_get_datatype_name (unsigned char stype) -{ - SLang_Class_Type *cl; - - cl = _SLclass_get_class (stype); - return cl->cl_name; -} - -static int method_undefined_error (unsigned char type, char *method, char *name) -{ - if (name == NULL) name = SLclass_get_datatype_name (type); - - SLang_verror (SL_TYPE_MISMATCH, "%s method not defined for %s", - method, name); - return -1; -} - -static int -scalar_vector_bin_op_result (int op, unsigned char a, unsigned char b, - unsigned char *c) -{ - (void) a; (void) b; - switch (op) - { - case SLANG_NE: - case SLANG_EQ: - *c = SLANG_INT_TYPE; - return 1; - } - return 0; -} - -static int -scalar_vector_bin_op (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - int *c; - char *a, *b; - unsigned int da, db; - unsigned int n, n_max; - unsigned int data_type_len; - SLang_Class_Type *cl; - - (void) b_type; - cl = _SLclass_get_class (a_type); - - data_type_len = cl->cl_sizeof_type; - - a = (char *) ap; - b = (char *) bp; - c = (int *) cp; - - if (na == 1) da = 0; else da = data_type_len; - if (nb == 1) db = 0; else db = data_type_len; - if (na > nb) n_max = na; else n_max = nb; - - switch (op) - { - default: - return 0; - - case SLANG_NE: - for (n = 0; n < n_max; n++) - { - c[n] = (0 != SLMEMCMP(a, b, data_type_len)); - a += da; b += db; - } - break; - - case SLANG_EQ: - for (n = 0; n < n_max; n++) - { - c[n] = (0 == SLMEMCMP(a, b, data_type_len)); - a += da; b += db; - } - break; - } - return 1; -} - -static int scalar_fread (unsigned char type, FILE *fp, VOID_STAR ptr, - unsigned int desired, unsigned int *actual) -{ - unsigned int n; - - n = fread ((char *) ptr, _SLclass_get_class (type)->cl_sizeof_type, - desired, fp); - *actual = n; - return 0; -} - -static int scalar_fwrite (unsigned char type, FILE *fp, VOID_STAR ptr, - unsigned int desired, unsigned int *actual) -{ - unsigned int n; - - n = fwrite ((char *) ptr, _SLclass_get_class (type)->cl_sizeof_type, - desired, fp); - *actual = n; - return 0; -} - -static int vector_apush (unsigned char type, VOID_STAR ptr) -{ - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - return (*cl->cl_push)(type, (VOID_STAR) &ptr); -} - -static int vector_apop (unsigned char type, VOID_STAR ptr) -{ - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - return (*cl->cl_pop)(type, (VOID_STAR) &ptr); -} - -static int default_push_mmt (unsigned char type_unused, VOID_STAR ptr) -{ - SLang_MMT_Type *ref; - - (void) type_unused; - ref = *(SLang_MMT_Type **) ptr; - return SLang_push_mmt (ref); -} - -static void default_destroy_simple (unsigned char type_unused, VOID_STAR ptr_unused) -{ - (void) type_unused; - (void) ptr_unused; -} - -static void default_destroy_user (unsigned char type, VOID_STAR ptr) -{ - (void) type; - SLang_free_mmt (*(SLang_MMT_Type **) ptr); -} - -static int default_pop (unsigned char type, VOID_STAR ptr) -{ - return SLclass_pop_ptr_obj (type, (VOID_STAR *) ptr); -} - -static int default_datatype_deref (unsigned char type) -{ - return method_undefined_error (type, "datatype_deref", NULL); -} - -static int default_acopy (unsigned char type, VOID_STAR from, VOID_STAR to) -{ - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - if (-1 == (*cl->cl_apush) (type, from)) - return -1; - return (*cl->cl_apop) (type, to); -} - -static int default_dereference_object (unsigned char type, VOID_STAR ptr) -{ - (void) ptr; - return method_undefined_error (type, "dereference", NULL); -} - -static char *default_string (unsigned char stype, VOID_STAR v) -{ - char buf [256]; - char *s; -#if SLANG_HAS_COMPLEX - double *cplx; -#endif - s = buf; - - switch (stype) - { - case SLANG_STRING_TYPE: - s = *(char **) v; - break; - - case SLANG_NULL_TYPE: - s = "NULL"; - break; - - case SLANG_DATATYPE_TYPE: - s = SLclass_get_datatype_name ((unsigned char) *(int *)v); - break; - -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - cplx = *(double **) v; - if (cplx[1] < 0) - sprintf (s, "(%g - %gi)", cplx [0], -cplx [1]); - else - sprintf (s, "(%g + %gi)", cplx [0], cplx [1]); - break; -#endif - default: - s = SLclass_get_datatype_name (stype); - } - - return SLmake_string (s); -} - -static int -use_cmp_bin_op_result (int op, unsigned char a, unsigned char b, - unsigned char *c) -{ - if (a != b) - return 0; - switch (op) - { - case SLANG_NE: - case SLANG_EQ: - case SLANG_LT: - case SLANG_LE: - case SLANG_GT: - case SLANG_GE: - *c = SLANG_INT_TYPE; - return 1; - } - return 0; -} - -static int -use_cmp_bin_op (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - int *c; - char *a, *b; - unsigned int da, db; - unsigned int n, n_max; - unsigned int data_type_len; - SLang_Class_Type *cl; - int (*cmp)(unsigned char, VOID_STAR, VOID_STAR, int *); - - (void) b_type; - cl = _SLclass_get_class (a_type); - cmp = cl->cl_cmp; - data_type_len = cl->cl_sizeof_type; - - a = (char *) ap; - b = (char *) bp; - c = (int *) cp; - - if (na == 1) da = 0; else da = data_type_len; - if (nb == 1) db = 0; else db = data_type_len; - if (na > nb) n_max = na; else n_max = nb; - - switch (op) - { - int result; - - default: - return 0; - - case SLANG_NE: - for (n = 0; n < n_max; n++) - { - if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result)) - return -1; - c[n] = (result != 0); - a += da; b += db; - } - break; - - case SLANG_EQ: - for (n = 0; n < n_max; n++) - { - if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result)) - return -1; - c[n] = (result == 0); - a += da; b += db; - } - break; - - case SLANG_GT: - for (n = 0; n < n_max; n++) - { - if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result)) - return -1; - c[n] = (result > 0); - a += da; b += db; - } - break; - case SLANG_GE: - for (n = 0; n < n_max; n++) - { - if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result)) - return -1; - c[n] = (result >= 0); - a += da; b += db; - } - break; - case SLANG_LT: - for (n = 0; n < n_max; n++) - { - if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result)) - return -1; - c[n] = (result < 0); - a += da; b += db; - } - break; - case SLANG_LE: - for (n = 0; n < n_max; n++) - { - if (-1 == (*cmp) (a_type, (VOID_STAR)a, (VOID_STAR)b, &result)) - return -1; - c[n] = (result <= 0); - a += da; b += db; - } - break; - } - return 1; -} - - -int SLclass_get_class_id (SLang_Class_Type *cl) -{ - if (cl == NULL) - return -1; - return (int) cl->cl_data_type; -} - -SLang_Class_Type *SLclass_allocate_class (char *name) -{ - SLang_Class_Type *cl; - unsigned int i; - - for (i = 0; i < 256; i++) - { - cl = Registered_Types [i]; - if ((cl != NULL) - && (0 == strcmp (cl->cl_name, name))) - { - SLang_verror (SL_DUPLICATE_DEFINITION, "Type name %s already exists", name); - return NULL; - } - } - - cl = (SLang_Class_Type *) SLmalloc (sizeof (SLang_Class_Type)); - if (cl == NULL) return NULL; - - SLMEMSET ((char *) cl, 0, sizeof (SLang_Class_Type)); - - if (NULL == (cl->cl_name = SLang_create_slstring (name))) - { - SLfree ((char *) cl); - return NULL; - } - - return cl; -} - -static int DataType_Ids [256]; - -int _SLang_push_datatype (unsigned char data_type) -{ - /* This data type could be a copy of another type, e.g., short and - * int if they are the same size (Int16 == Short). So, make sure - * we push the original and not the copy. - */ - data_type = _SLclass_get_class (data_type)->cl_data_type; - return SLclass_push_int_obj (SLANG_DATATYPE_TYPE, (int) data_type); -} - -static int datatype_deref (unsigned char type, VOID_STAR ptr) -{ - SLang_Class_Type *cl; - int status; - - /* The parser generated code for this as if a function call were to be - * made. However, we are calling the deref object routine - * instead of the function call. So, I must simulate the function call. - */ - if (-1 == _SL_increment_frame_pointer ()) - return -1; - - type = (unsigned char) *(int *) ptr; - cl = _SLclass_get_class (type); - status = (*cl->cl_datatype_deref) (type); - - (void) _SL_decrement_frame_pointer (); - return status; -} - -static int datatype_push (unsigned char type_unused, VOID_STAR ptr) -{ - (void) type_unused; - return _SLang_push_datatype (*(int *) ptr); -} - -int _SLang_pop_datatype (unsigned char *type) -{ - int i; - - if (-1 == SLclass_pop_int_obj (SLANG_DATATYPE_TYPE, &i)) - return -1; - - *type = (unsigned char) i; - return 0; -} - -static int datatype_pop (unsigned char type, VOID_STAR ptr) -{ - if (-1 == _SLang_pop_datatype (&type)) - return -1; - - *(int *) ptr = type; - return 0; -} - -int _SLclass_init (void) -{ - SLang_Class_Type *cl; - - /* First initialize the container classes. This is so binary operations - * added later will work with them. - */ - if (-1 == _SLarray_init_slarray ()) - return -1; - - /* DataType_Type */ - if (NULL == (cl = SLclass_allocate_class ("DataType_Type"))) - return -1; - cl->cl_pop = datatype_pop; - cl->cl_push = datatype_push; - cl->cl_dereference = datatype_deref; - if (-1 == SLclass_register_class (cl, SLANG_DATATYPE_TYPE, sizeof(int), - SLANG_CLASS_TYPE_SCALAR)) - return -1; - - return 0; -} - -static int register_new_datatype (char *name, unsigned char type) -{ - DataType_Ids [type] = type; - return SLadd_intrinsic_variable (name, (VOID_STAR) (DataType_Ids + type), - SLANG_DATATYPE_TYPE, 1); -} - -int SLclass_create_synonym (char *name, unsigned char type) -{ - if (NULL == _SLclass_get_class (type)) - return -1; - - return register_new_datatype (name, type); -} - -int _SLclass_copy_class (unsigned char to, unsigned char from) -{ - SLang_Class_Type *cl = _SLclass_get_class (from); - - if (Registered_Types[to] != NULL) - SLang_exit_error ("Application error: Class already exists"); - - Registered_Types[to] = cl; - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (to != SLANG_UNDEFINED_TYPE) - _SLclass_Class_Type [to] = cl->cl_class_type; -#endif - return 0; -} - -int SLclass_register_class (SLang_Class_Type *cl, unsigned char type, unsigned int type_size, unsigned char class_type) -{ - char *name; - unsigned int i; - int can_binop = 1; /* scalar_vector_bin_op should work - * for all data types. - */ - - if (type == SLANG_VOID_TYPE) for (i = 0; i < 256; i++) - { - if ((Registered_Types[i] == NULL) - && (i != SLANG_VOID_TYPE)) - { - type = (unsigned char) i; - break; - } - } - - if ((NULL != Registered_Types [type]) - || (type == SLANG_VOID_TYPE)) - { - SLang_verror (SL_APPLICATION_ERROR, "Class type %d already in use", (int) type); - return -1; - } - - cl->cl_data_type = type; - cl->cl_class_type = class_type; - name = cl->cl_name; - - switch (class_type) - { - case SLANG_CLASS_TYPE_MMT: - if (cl->cl_push == NULL) cl->cl_push = default_push_mmt; - if (cl->cl_destroy == NULL) - return method_undefined_error (type, "destroy", name); - cl->cl_user_destroy_fun = cl->cl_destroy; - cl->cl_destroy = default_destroy_user; - type_size = sizeof (VOID_STAR); - break; - - case SLANG_CLASS_TYPE_SCALAR: - if (cl->cl_destroy == NULL) cl->cl_destroy = default_destroy_simple; - if ((type_size == 0) - || (type_size > sizeof (_SL_Object_Union_Type))) - { - SLang_verror (SL_INVALID_PARM, - "Type size for %s not appropriate for SCALAR type", - name); - return -1; - } - if (cl->cl_pop == NULL) - return method_undefined_error (type, "pop", name); - if (cl->cl_fread == NULL) cl->cl_fread = scalar_fread; - if (cl->cl_fwrite == NULL) cl->cl_fwrite = scalar_fwrite; - - can_binop = 1; - break; - - case SLANG_CLASS_TYPE_PTR: - if (cl->cl_destroy == NULL) - return method_undefined_error (type, "destroy", name); - type_size = sizeof (VOID_STAR); - break; - - case SLANG_CLASS_TYPE_VECTOR: - if (cl->cl_destroy == NULL) - return method_undefined_error (type, "destroy", name); - if (cl->cl_pop == NULL) - return method_undefined_error (type, "pop", name); - cl->cl_apop = vector_apop; - cl->cl_apush = vector_apush; - cl->cl_adestroy = default_destroy_simple; - if (cl->cl_fread == NULL) cl->cl_fread = scalar_fread; - if (cl->cl_fwrite == NULL) cl->cl_fwrite = scalar_fwrite; - can_binop = 1; - break; - - default: - SLang_verror (SL_INVALID_PARM, "%s: unknown class type (%d)", name, class_type); - return -1; - } - -#if _SLANG_OPTIMIZE_FOR_SPEED - if (type != SLANG_UNDEFINED_TYPE) - _SLclass_Class_Type [type] = class_type; -#endif - - if (type_size == 0) - { - SLang_verror (SL_INVALID_PARM, "type size must be non-zero for %s", name); - return -1; - } - - if (cl->cl_string == NULL) cl->cl_string = default_string; - if (cl->cl_acopy == NULL) cl->cl_acopy = default_acopy; - if (cl->cl_datatype_deref == NULL) cl->cl_datatype_deref = default_datatype_deref; - - if (cl->cl_pop == NULL) cl->cl_pop = default_pop; - - if (cl->cl_push == NULL) - return method_undefined_error (type, "push", name); - - if (cl->cl_byte_code_destroy == NULL) - cl->cl_byte_code_destroy = cl->cl_destroy; - if (cl->cl_push_literal == NULL) - cl->cl_push_literal = cl->cl_push; - - if (cl->cl_dereference == NULL) - cl->cl_dereference = default_dereference_object; - - if (cl->cl_apop == NULL) cl->cl_apop = cl->cl_pop; - if (cl->cl_apush == NULL) cl->cl_apush = cl->cl_push; - if (cl->cl_adestroy == NULL) cl->cl_adestroy = cl->cl_destroy; - if (cl->cl_push_intrinsic == NULL) cl->cl_push_intrinsic = cl->cl_push; - - if ((cl->cl_foreach == NULL) - || (cl->cl_foreach_open == NULL) - || (cl->cl_foreach_close == NULL)) - { - cl->cl_foreach = _SLarray_cl_foreach; - cl->cl_foreach_open = _SLarray_cl_foreach_open; - cl->cl_foreach_close = _SLarray_cl_foreach_close; - } - - cl->cl_sizeof_type = type_size; - - if (NULL == (cl->cl_transfer_buf = (VOID_STAR) SLmalloc (type_size))) - return -1; - - Registered_Types[type] = cl; - - if (-1 == register_new_datatype (name, type)) - return -1; - - if (cl->cl_cmp != NULL) - { - if (-1 == SLclass_add_binary_op (type, type, use_cmp_bin_op, use_cmp_bin_op_result)) - return -1; - } - else if (can_binop - && (-1 == SLclass_add_binary_op (type, type, scalar_vector_bin_op, scalar_vector_bin_op_result))) - return -1; - - cl->cl_anytype_typecast = _SLanytype_typecast; - - return 0; -} - -int SLclass_add_math_op (unsigned char type, - int (*handler)(int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR), - int (*result) (int, unsigned char, unsigned char *)) -{ - SLang_Class_Type *cl = _SLclass_get_class (type); - - cl->cl_math_op = handler; - cl->cl_math_op_result_type = result; - return 0; -} - -int SLclass_add_binary_op (unsigned char a, unsigned char b, - int (*f) (int, - unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR), - int (*r) (int, unsigned char, unsigned char, unsigned char *)) -{ - SLang_Class_Type *cl; - SL_OOBinary_Type *ab; - - if ((f == NULL) || (r == NULL)) - { - SLang_verror (SL_INVALID_PARM, "SLclass_add_binary_op"); - return -1; - } - - cl = _SLclass_get_class (a); - (void) _SLclass_get_class (b); - - if (NULL == (ab = (SL_OOBinary_Type *) SLmalloc (sizeof(SL_OOBinary_Type)))) - return -1; - - ab->data_type = b; - ab->binary_function = f; - ab->binary_result = r; - ab->next = cl->cl_binary_ops; - cl->cl_binary_ops = ab; - - if ((a != SLANG_ARRAY_TYPE) - && (b != SLANG_ARRAY_TYPE)) - { - if ((-1 == _SLarray_add_bin_op (a)) - || (-1 == _SLarray_add_bin_op (b))) - return -1; - } - - return 0; -} - -int SLclass_add_unary_op (unsigned char type, - int (*f)(int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR), - int (*r)(int, unsigned char, unsigned char *)) -{ - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - if ((f == NULL) || (r == NULL)) - { - SLang_verror (SL_INVALID_PARM, "SLclass_add_unary_op"); - return -1; - } - - cl->cl_unary_op = f; - cl->cl_unary_op_result_type = r; - - return 0; -} - -int SLclass_add_app_unary_op (unsigned char type, - int (*f)(int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR), - int (*r)(int, unsigned char, unsigned char *)) -{ - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - if ((f == NULL) || (r == NULL)) - { - SLang_verror (SL_INVALID_PARM, "SLclass_add_app_unary_op"); - return -1; - } - - cl->cl_app_unary_op = f; - cl->cl_app_unary_op_result_type = r; - - return 0; -} - -int SLclass_set_pop_function (SLang_Class_Type *cl, int (*f)(unsigned char, VOID_STAR)) -{ - if (cl == NULL) return -1; - cl->cl_pop = f; - - return 0; -} - -int SLclass_set_push_function (SLang_Class_Type *cl, int (*f)(unsigned char, VOID_STAR)) -{ - if (cl == NULL) return -1; - cl->cl_push = f; - - return 0; -} - -int SLclass_set_string_function (SLang_Class_Type *cl, char *(*f)(unsigned char, VOID_STAR)) -{ - if (cl == NULL) return -1; - - cl->cl_string = f; - return 0; -} - -int SLclass_set_destroy_function (SLang_Class_Type *cl, void (*f)(unsigned char, VOID_STAR)) -{ - if (cl == NULL) return -1; - - cl->cl_destroy = f; - return 0; -} - -int SLclass_set_sget_function (SLang_Class_Type *cl, int (*f)(unsigned char, char *)) -{ - if (cl == NULL) return -1; - cl->cl_sget = f; - return 0; -} - -int SLclass_set_sput_function (SLang_Class_Type *cl, int (*f)(unsigned char, char *)) -{ - if (cl == NULL) return -1; - cl->cl_sput = f; - return 0; -} - -int SLclass_set_aget_function (SLang_Class_Type *cl, int (*f)(unsigned char, unsigned int)) -{ - if (cl == NULL) return -1; - cl->cl_aget = f; - return 0; -} - -int SLclass_set_aput_function (SLang_Class_Type *cl, int (*f)(unsigned char, unsigned int)) -{ - if (cl == NULL) return -1; - cl->cl_aput = f; - return 0; -} - -int SLclass_set_anew_function (SLang_Class_Type *cl, int (*f)(unsigned char, unsigned int)) -{ - if (cl == NULL) return -1; - cl->cl_anew = f; - return 0; -} - -/* Misc */ -void _SLclass_type_mismatch_error (unsigned char a, unsigned char b) -{ - SLang_verror (SL_TYPE_MISMATCH, "Expecting %s, found %s", - SLclass_get_datatype_name (a), - SLclass_get_datatype_name (b)); -} - -/* */ - -static int null_binary_fun (int op, - unsigned char a, VOID_STAR ap, unsigned int na, - unsigned char b, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - int *ic; - unsigned int i; - int c; - - (void) ap; (void) bp; - - switch (op) - { - case SLANG_EQ: - c = (a == b); - break; - - case SLANG_NE: - c = (a != b); - break; - - default: - return 0; - } - - if (na > nb) nb = na; - ic = (int *) cp; - for (i = 0; i < nb; i++) - ic[i] = c; - - return 1; -} - -static char *get_binary_op_string (int op) -{ - static char *ops[SLANG_MOD] = - { - "+", "=", "*", "/", "==", "!=", ">", ">=", "<", "<=", "^", - "or", "and", "&", "|", "xor", "shl", "shr", "mod" - }; - - if ((op > SLANG_MOD) || (op <= 0)) - return "??"; - return ops[op - 1]; -} - -int (*_SLclass_get_binary_fun (int op, - SLang_Class_Type *a_cl, SLang_Class_Type *b_cl, - SLang_Class_Type **c_cl, int do_error)) -(int, - unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR, unsigned int, - VOID_STAR) -{ - SL_OOBinary_Type *bt; - unsigned char a, b, c; - - a = a_cl->cl_data_type; - b = b_cl->cl_data_type; - - if ((a == SLANG_NULL_TYPE) || (b == SLANG_NULL_TYPE)) - { - *c_cl = _SLclass_get_class (SLANG_INT_TYPE); - return null_binary_fun; - } - - bt = a_cl->cl_binary_ops; - - while (bt != NULL) - { - if (bt->data_type == b) - { - if (1 != (*bt->binary_result)(op, a, b, &c)) - break; - - if (c == a) *c_cl = a_cl; - else if (c == b) *c_cl = b_cl; - else *c_cl = _SLclass_get_class (c); - - return bt->binary_function; - } - - bt = bt->next; - } - - if (do_error) - SLang_verror (SL_TYPE_MISMATCH, "%s %s %s is not possible", - a_cl->cl_name, get_binary_op_string (op), b_cl->cl_name); - - *c_cl = NULL; - return NULL; -} - -int (*_SLclass_get_unary_fun (int op, - SLang_Class_Type *a_cl, - SLang_Class_Type **b_cl, - int utype)) -(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR) -{ - int (*f)(int, unsigned char, VOID_STAR, unsigned int, VOID_STAR); - int (*r)(int, unsigned char, unsigned char *); - unsigned char a; - unsigned char b; - - switch (utype) - { - case _SLANG_BC_UNARY: - f = a_cl->cl_unary_op; - r = a_cl->cl_unary_op_result_type; - break; - - case _SLANG_BC_MATH_UNARY: - f = a_cl->cl_math_op; - r = a_cl->cl_math_op_result_type; - break; - - case _SLANG_BC_APP_UNARY: - f = a_cl->cl_app_unary_op; - r = a_cl->cl_app_unary_op_result_type; - break; - - default: - f = NULL; - r = NULL; - } - - a = a_cl->cl_data_type; - if ((f != NULL) && (r != NULL) && (1 == (*r) (op, a, &b))) - { - if (a == b) - *b_cl = a_cl; - else - *b_cl = _SLclass_get_class (b); - return f; - } - - SLang_verror (SL_TYPE_MISMATCH, "undefined unary operation/function on %s", - a_cl->cl_name); - - *b_cl = NULL; - - return NULL; -} - -int -SLclass_typecast (unsigned char to_type, int is_implicit, int allow_array) -{ - unsigned char from_type; - SLang_Class_Type *cl_to, *cl_from; - SLang_Object_Type obj; - VOID_STAR ap; - VOID_STAR bp; - int status; - - if (-1 == SLang_pop (&obj)) - return -1; - - from_type = obj.data_type; - if (from_type == to_type) - { - SLang_push (&obj); - return 0; - } - - cl_from = _SLclass_get_class (from_type); - - /* Since the typecast functions are designed to work on arrays, - * get the pointer to the value instead of just &obj.v. - */ - ap = _SLclass_get_ptr_to_value (cl_from, &obj); - - if ((from_type == SLANG_ARRAY_TYPE) - && (allow_array || (to_type != SLANG_ANY_TYPE))) - { - if (allow_array == 0) - goto return_error; - - cl_to = _SLclass_get_class (SLANG_ARRAY_TYPE); - bp = cl_to->cl_transfer_buf; - status = _SLarray_typecast (from_type, ap, 1, to_type, bp, is_implicit); - } - else - { - int (*t) (unsigned char, VOID_STAR, unsigned int, unsigned char, VOID_STAR); - - if (NULL == (t = _SLclass_get_typecast (from_type, to_type, is_implicit))) - { - SLang_free_object (&obj); - return -1; - } - - cl_to = _SLclass_get_class (to_type); - bp = cl_to->cl_transfer_buf; - status = (*t) (from_type, ap, 1, to_type, bp); - } - - if (1 == status) - { - if (-1 == (*cl_to->cl_apush)(to_type, bp)) - { - (*cl_to->cl_adestroy) (to_type, bp); - SLang_free_object (&obj); - return -1; - } - - /* cl_apush will push a copy, so destry this one */ - (*cl_to->cl_adestroy) (to_type, bp); - SLang_free_object (&obj); - return 0; - } - - return_error: - - SLang_verror (SL_TYPE_MISMATCH, "Unable to typecast %s to %s", - cl_from->cl_name, - SLclass_get_datatype_name (to_type)); - SLang_free_object (&obj); - return -1; -} - -int (*_SLclass_get_typecast (unsigned char from, unsigned char to, int is_implicit)) -(unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR) -{ - SL_Typecast_Type *t; - SLang_Class_Type *cl_from; - - cl_from = _SLclass_get_class (from); - - t = cl_from->cl_typecast_funs; - while (t != NULL) - { - if (t->data_type != to) - { - t = t->next; - continue; - } - - if (is_implicit && (t->allow_implicit == 0)) - break; - - return t->typecast; - } - - if (to == SLANG_ANY_TYPE) - return _SLanytype_typecast; - - if ((is_implicit == 0) - && (cl_from->cl_void_typecast != NULL)) - return cl_from->cl_void_typecast; - - SLang_verror (SL_TYPE_MISMATCH, "Unable to typecast %s to %s", - cl_from->cl_name, - SLclass_get_datatype_name (to)); - - return NULL; -} - -int -SLclass_add_typecast (unsigned char from, unsigned char to, - int (*f)_PROTO((unsigned char, VOID_STAR, unsigned int, - unsigned char, VOID_STAR)), - int allow_implicit) -{ - SL_Typecast_Type *t; - SLang_Class_Type *cl; - - cl = _SLclass_get_class (from); - if (to == SLANG_VOID_TYPE) - { - cl->cl_void_typecast = f; - return 0; - } - - (void) _SLclass_get_class (to); - - if (NULL == (t = (SL_Typecast_Type *) SLmalloc (sizeof (SL_Typecast_Type)))) - return -1; - - SLMEMSET((char *) t, 0, sizeof(SL_Typecast_Type)); - t->data_type = to; - t->next = cl->cl_typecast_funs; - t->typecast = f; - t->allow_implicit = allow_implicit; - - cl->cl_typecast_funs = t; - - return 0; -} - -SLang_MMT_Type *SLang_pop_mmt (unsigned char type) /*{{{*/ -{ - SLang_MMT_Type *mmt; - - if (-1 == SLclass_pop_ptr_obj (type, (VOID_STAR *) &mmt)) - mmt = NULL; - return mmt; - -#if 0 - SLang_Object_Type obj; - SLang_Class_Type *cl; - - if (_SLang_pop_object_of_type (type, &obj)) - return NULL; - - cl = _SLclass_get_class (type); - if ((cl->cl_class_type == SLANG_CLASS_TYPE_MMT) - && (obj.data_type == type)) - { - return obj.v.ref; - } - - _SLclass_type_mismatch_error (type, obj.data_type); - SLang_free_object (&obj); - return NULL; -#endif -} - -/*}}}*/ - -int SLang_push_mmt (SLang_MMT_Type *ref) /*{{{*/ -{ - if (ref == NULL) - return SLang_push_null (); - - ref->count += 1; - - if (0 == SLclass_push_ptr_obj (ref->data_type, (VOID_STAR) ref)) - return 0; - - ref->count -= 1; - return -1; -} - -/*}}}*/ - -void SLang_inc_mmt (SLang_MMT_Type *ref) -{ - if (ref != NULL) - ref->count += 1; -} - -VOID_STAR SLang_object_from_mmt (SLang_MMT_Type *ref) -{ - if (ref == NULL) - return NULL; - - return ref->user_data; -} - -SLang_MMT_Type *SLang_create_mmt (unsigned char t, VOID_STAR p) -{ - SLang_MMT_Type *ref; - - (void) _SLclass_get_class (t); /* check to see if it is registered */ - - if (NULL == (ref = (SLang_MMT_Type *) SLmalloc (sizeof (SLang_MMT_Type)))) - return NULL; - - SLMEMSET ((char *) ref, 0, sizeof (SLang_MMT_Type)); - - ref->data_type = t; - ref->user_data = p; - /* FIXME!! To be consistent with other types, the reference count should - * be set to 1 here. However, doing so will require other code changes - * involving the use of MMTs. For instance, SLang_free_mmt would have - * to be called after every push of the MMT. - */ - return ref; -} - -void SLang_free_mmt (SLang_MMT_Type *ref) -{ - unsigned char type; - SLang_Class_Type *cl; - - if (ref == NULL) - return; - - /* This can be zero if SLang_create_mmt is called followed - * by this routine before anything gets a chance to attach itself - * to it. - */ - if (ref->count > 1) - { - ref->count -= 1; - return; - } - - type = ref->data_type; - cl = _SLclass_get_class (type); - (*cl->cl_user_destroy_fun) (type, ref->user_data); - SLfree ((char *)ref); -} - -int SLang_push_value (unsigned char type, VOID_STAR v) -{ - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - return (*cl->cl_apush)(type, v); -} - -int SLang_pop_value (unsigned char type, VOID_STAR v) -{ - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - return (*cl->cl_apop)(type, v); -} - -void SLang_free_value (unsigned char type, VOID_STAR v) -{ - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - (*cl->cl_adestroy) (type, v); -} - -/* These routines are very low-level and are designed for application data - * types to access the stack from their push/pop methods. The int and - * pointer versions are in slang.c - */ -#if SLANG_HAS_FLOAT -int SLclass_push_double_obj (unsigned char type, double x) -{ - SLang_Object_Type obj; - obj.data_type = type; - obj.v.double_val = x; - return SLang_push (&obj); -} -int SLclass_push_float_obj (unsigned char type, float x) -{ - SLang_Object_Type obj; - obj.data_type = type; - obj.v.float_val = x; - return SLang_push (&obj); -} - -#endif - -int SLclass_push_long_obj (unsigned char type, long x) -{ - SLang_Object_Type obj; - obj.data_type = type; - obj.v.long_val = x; - return SLang_push (&obj); -} - -int SLclass_push_short_obj (unsigned char type, short x) -{ - SLang_Object_Type obj; - obj.data_type = type; - obj.v.short_val = x; - return SLang_push (&obj); -} - -int SLclass_push_char_obj (unsigned char type, char x) -{ - SLang_Object_Type obj; - obj.data_type = type; - obj.v.char_val = x; - return SLang_push (&obj); -} - -#if SLANG_HAS_FLOAT -int SLclass_pop_double_obj (unsigned char type, double *x) -{ - SLang_Object_Type obj; - - if (-1 == _SLang_pop_object_of_type (type, &obj, 0)) - return -1; - - *x = obj.v.double_val; - return 0; -} - -int SLclass_pop_float_obj (unsigned char type, float *x) -{ - SLang_Object_Type obj; - - if (-1 == _SLang_pop_object_of_type (type, &obj, 0)) - return -1; - - *x = obj.v.float_val; - return 0; -} -#endif - -int SLclass_pop_long_obj (unsigned char type, long *x) -{ - SLang_Object_Type obj; - - if (-1 == _SLang_pop_object_of_type (type, &obj, 0)) - return -1; - - *x = obj.v.long_val; - return 0; -} - -int SLclass_pop_int_obj (unsigned char type, int *x) -{ - SLang_Object_Type obj; - - if (-1 == _SLang_pop_object_of_type (type, &obj, 0)) - return -1; - - *x = obj.v.int_val; - return 0; -} - -int SLclass_pop_short_obj (unsigned char type, short *x) -{ - SLang_Object_Type obj; - - if (-1 == _SLang_pop_object_of_type (type, &obj, 0)) - return -1; - - *x = obj.v.short_val; - return 0; -} - -int SLclass_pop_char_obj (unsigned char type, char *x) -{ - SLang_Object_Type obj; - - if (-1 == _SLang_pop_object_of_type (type, &obj, 0)) - return -1; - - *x = obj.v.char_val; - return 0; -} - -int SLclass_pop_ptr_obj (unsigned char type, VOID_STAR *s) -{ - SLang_Object_Type obj; - - if (-1 == _SLang_pop_object_of_type (type, &obj, 0)) - { - *s = (VOID_STAR) NULL; - return -1; - } - *s = obj.v.ptr_val; - return 0; -} - diff --git a/mdk-stage1/slang/slcmd.c b/mdk-stage1/slang/slcmd.c deleted file mode 100644 index 4a00a90fc..000000000 --- a/mdk-stage1/slang/slcmd.c +++ /dev/null @@ -1,351 +0,0 @@ -/* cmd line facility for slang */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#if SLANG_HAS_FLOAT -# include -#endif - -#include "slang.h" -#include "_slang.h" - -#ifndef HAVE_STDLIB_H -/* Oh dear. Where is the prototype for atof? If not in stdlib, then - * I do not know where. Not in math.h onsome systems either. - */ -extern double atof (); -#endif - -static SLcmd_Cmd_Type *SLcmd_find_command (char *s, SLcmd_Cmd_Type *cmd) -{ - char *cmdstr; - char chs = *s++, ch; - - while ((cmd->cmdfun != NULL) - && (NULL != (cmdstr = cmd->cmd)) - && (0 != (ch = *cmdstr++))) - { - if ((ch == chs) && !strcmp (s, cmdstr)) return cmd; - cmd++; - } - return NULL; -} - -static int extract_token (char **strptr, char *buf) -{ - char *s, *b; - char ch, quote; - - *buf = 0; - - s = *strptr; - while (((ch = *s) != 0) - && ((ch == ' ') || (ch == '\t') || (ch == '\n'))) - s++; - - *strptr = s; - - if (ch == 0) return 0; - if (ch == '%') return 0; - - b = buf; - - *b++ = ch; - s++; - - if ((ch == '\'') || (ch == '"')) - { - quote = ch; - while ((ch = *s) != 0) - { - s++; - *b++ = ch; - if (ch == quote) - break; - - if (ch == '\\') - { - if (0 == (ch = *s)) - break; - *b++ = ch; - s++; - } - } - *strptr = s; - *b = 0; - return 1; - } - - while (((ch = *s) != 0) - && (ch != ' ') - && (ch != '\t') - && (ch != '\n') - && (ch != '%')) - *b++ = *s++; - - *strptr = s; - *b = 0; - return 1; -} - -static int allocate_arg_space (SLcmd_Cmd_Table_Type *table, int argc, unsigned int *space_ptr) -{ - unsigned int space = *space_ptr; - char *p; - - if (argc + 1 < (int) space) - return 0; - - if (space > 128) - { - if (space > 1024) space += 1024; - else space += 128; - } - else space += 32; - - if (NULL == (p = SLrealloc ((char *)table->string_args, space * sizeof (char *)))) - return -1; - table->string_args = (char **)p; - table->string_args [argc] = NULL; - - if (NULL == (p = SLrealloc ((char *)table->int_args, space * sizeof (int)))) - return -1; - table->int_args = (int *)p; - - if (NULL == (p = SLrealloc ((char *)table->double_args, space * sizeof (double)))) - return -1; - table->double_args = (double *)p; - - if (NULL == (p = SLrealloc ((char *)table->arg_type, space * sizeof (unsigned char)))) - return -1; - table->arg_type = (unsigned char *)p; - - *space_ptr = space; - return 0; -} - -int SLcmd_execute_string (char *str, SLcmd_Cmd_Table_Type *table) -{ - char *s, *b = NULL, *arg_type, *last_str, *cmd_name; - SLcmd_Cmd_Type *cmd; - char *buf; - int token_present; - int i; - int status; - unsigned int len; - int argc; - unsigned int space; - - table->argc = 0; - table->string_args = NULL; - table->int_args = NULL; - table->double_args = NULL; - table->arg_type = NULL; - - buf = SLmake_string (str); - if (buf == NULL) - return -1; - - status = extract_token (&str, buf); - if (status <= 0) - { - SLfree (buf); - return status; - } - - if (((len = strlen (buf)) >= 32) - || (NULL == (cmd = SLcmd_find_command (buf, table->table)))) - { - SLang_verror (SL_UNDEFINED_NAME,"%s: invalid command", buf); - SLfree (buf); - return -1; - } - - if (NULL == (cmd_name = SLmake_string (buf))) - { - SLfree (buf); - return -1; - } - - space = 0; - argc = 0; - if (-1 == allocate_arg_space (table, argc, &space)) - { - SLfree (buf); - return -1; - } - table->arg_type[argc] = SLANG_STRING_TYPE; - table->string_args[argc++] = cmd_name; - - arg_type = cmd->arg_type; - status = -1; - while (*arg_type) - { - int guess_type = 0; - - last_str = str; - - if (-1 == allocate_arg_space (table, argc, &space)) - goto error; - - if (-1 == (token_present = extract_token (&str, buf))) - goto error; - - table->string_args[argc] = NULL; - - if (token_present) - { - b = buf; - len = strlen (b); - - if ((*b == '"') && (len > 1)) - { - b++; - len -= 2; - b[len] = 0; - guess_type = SLANG_STRING_TYPE; - SLexpand_escaped_string (buf, b, b + len); - len = strlen (buf); - } - else if ((*b == '\'') && (len > 1)) - { - char ch; - b++; - len -= 2; - b[len] = 0; - guess_type = SLANG_INT_TYPE; - ch = *b; - if (ch == '\\') - (void) _SLexpand_escaped_char (b, &ch); - sprintf (buf, "%d", (unsigned char) ch); - len = strlen (buf); - } - else guess_type = SLang_guess_type (buf); - } - - switch (*arg_type++) - { - /* variable argument number */ - case 'v': - if (token_present == 0) break; - case 'V': - if (token_present == 0) - { - SLang_verror (SL_INVALID_PARM, "%s: Expecting argument", cmd_name); - goto error; - } - - while (*last_str == ' ') last_str++; - len = strlen (last_str); - str = last_str + len; - - s = SLmake_nstring (last_str, len); - if (s == NULL) goto error; - - table->arg_type[argc] = SLANG_STRING_TYPE; - table->string_args[argc++] = s; - break; - - case 's': - if (token_present == 0) break; - case 'S': - if (token_present == 0) - { - SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting string argument", cmd_name); - goto error; - } - - s = SLmake_nstring (buf, len); - if (s == NULL) goto error; - table->arg_type[argc] = SLANG_STRING_TYPE; - table->string_args[argc++] = s; - break; - - /* integer argument */ - case 'i': - if (token_present == 0) break; - case 'I': - if ((token_present == 0) || (SLANG_INT_TYPE != guess_type)) - { - SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting integer argument", cmd_name); - goto error; - } - - table->arg_type[argc] = SLANG_INT_TYPE; - table->int_args[argc++] = SLatoi((unsigned char *) buf); - break; - - /* floating point arg */ -#if SLANG_HAS_FLOAT - case 'f': - if (token_present == 0) break; - case 'F': - if ((token_present == 0) || (SLANG_STRING_TYPE == guess_type)) - { - SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting double argument", cmd_name); - goto error; - } - table->arg_type[argc] = SLANG_DOUBLE_TYPE; - table->double_args[argc++] = atof(buf); - break; -#endif - /* Generic type */ - case 'g': - if (token_present == 0) break; - case 'G': - if (token_present == 0) - { - SLang_verror (SL_TYPE_MISMATCH, "%s: Expecting argument", cmd_name); - goto error; - } - - switch (guess_type) - { - case SLANG_INT_TYPE: - table->arg_type[argc] = SLANG_INT_TYPE; - table->int_args[argc++] = SLatoi((unsigned char *) buf); - break; - - case SLANG_STRING_TYPE: - s = SLmake_nstring (buf, len); - if (s == NULL) goto error; - - table->arg_type[argc] = SLANG_STRING_TYPE; - table->string_args[argc++] = s; - break; -#if SLANG_HAS_FLOAT - case SLANG_DOUBLE_TYPE: - table->arg_type[argc] = SLANG_DOUBLE_TYPE; - table->double_args[argc++] = atof(buf); -#endif - } - break; - } - } - - /* call function */ - status = (*cmd->cmdfun)(argc, table); - - error: - if (table->string_args != NULL) for (i = 0; i < argc; i++) - { - if (NULL != table->string_args[i]) - { - SLfree (table->string_args[i]); - table->string_args[i] = NULL; - } - } - SLfree ((char *)table->string_args); table->string_args = NULL; - SLfree ((char *)table->double_args); table->double_args = NULL; - SLfree ((char *)table->int_args); table->int_args = NULL; - SLfree ((char *)table->arg_type); table->arg_type = NULL; - - SLfree (buf); - return status; -} - diff --git a/mdk-stage1/slang/slcmplex.c b/mdk-stage1/slang/slcmplex.c deleted file mode 100644 index b210dfc04..000000000 --- a/mdk-stage1/slang/slcmplex.c +++ /dev/null @@ -1,1142 +0,0 @@ -/* Complex Data Type definition for S-Lang */ -/* Copyright (c) 1997, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -/* The rest of the file is enclosed in this #if */ -#if SLANG_HAS_COMPLEX - -#if SLANG_HAS_FLOAT -# include -#endif - -#ifdef PI -# undef PI -#endif -#define PI 3.14159265358979323846 - -int SLang_pop_complex (double *r, double *i) -{ - double *c; - - switch (SLang_peek_at_stack ()) - { - case SLANG_COMPLEX_TYPE: - if (-1 == SLclass_pop_ptr_obj (SLANG_COMPLEX_TYPE, (VOID_STAR *)&c)) - return -1; - *r = c[0]; - *i = c[1]; - SLfree ((char *) c); - break; - - default: - *i = 0.0; - if (-1 == SLang_pop_double (r, NULL, NULL)) - return -1; - break; - - case -1: - return -1; - } - return 0; -} - -int SLang_push_complex (double r, double i) -{ - double *c; - - c = (double *) SLmalloc (2 * sizeof (double)); - if (c == NULL) - return -1; - - c[0] = r; - c[1] = i; - - if (-1 == SLclass_push_ptr_obj (SLANG_COMPLEX_TYPE, (VOID_STAR) c)) - { - SLfree ((char *) c); - return -1; - } - return 0; -} - -double *SLcomplex_times (double *c, double *a, double *b) -{ - double a_real, b_real, a_imag, b_imag; - - a_real = a[0]; - b_real = b[0]; - a_imag = a[1]; - b_imag = b[1]; - - c[0] = a_real * b_real - a_imag * b_imag; - c[1] = a_imag * b_real + a_real * b_imag; - - return c; -} - -double *SLcomplex_divide (double *c, double *a, double *b) -{ - double a_real, b_real, a_imag, b_imag; - double ratio, invden; - - a_real = a[0]; - b_real = b[0]; - a_imag = a[1]; - b_imag = b[1]; - - /* Do it this way to avoid overflow in the denom */ - if (fabs(b_real) > fabs(b_imag)) - { - ratio = b_imag / b_real; - invden = 1.0 / (b_real + b_imag * ratio); - c[0] = (a_real + ratio * a_imag) * invden; - c[1] = (a_imag - a_real * ratio) * invden; - } - else - { - ratio = b_real / b_imag; - invden = 1.0 / (b_real * ratio + b_imag); - c[0] = (a_real * ratio + a_imag) * invden; - c[1] = (a_imag * ratio - a_real) * invden; - } - return c; -} - -/* a^b = exp (b log a); */ -double *SLcomplex_pow (double *c, double *a, double *b) -{ - return SLcomplex_exp (c, SLcomplex_times (c, b, SLcomplex_log (c, a))); -} - -static double *complex_dpow (double *c, double *a, double b) -{ - SLcomplex_log (c, a); - c[0] *= b; - c[1] *= b; - return SLcomplex_exp (c, c); -} - -static double *dcomplex_pow (double *c, double a, double *b) -{ - a = log (a); - c[0] = a * b[0]; - c[1] = a * b[1]; - return SLcomplex_exp (c, c); -} - -double SLcomplex_abs (double *z) -{ - return SLmath_hypot (z[0], z[1]); -} - -/* It appears that FORTRAN assumes that the branch cut for the log function - * is along the -x axis. So, use this for atan2: - */ -static double my_atan2 (double y, double x) -{ - double val; - - val = atan (y/x); - - if (x >= 0) - return val; /* I, IV */ - - if (y <= 0) /* III */ - return val - PI; - - return PI + val; /* II */ -} - -static void polar_form (double *r, double *theta, double *z) -{ - double x, y; - - *r = SLcomplex_abs (z); - - x = z[0]; - y = z[1]; - - if (x == 0.0) - { - if (y >= 0) - *theta = 0.5 * PI; - else - *theta = 1.5 * PI; - } - else *theta = my_atan2 (y, x); -} - -double *SLcomplex_sin (double *sinz, double *z) -{ - double x, y; - - x = z[0]; y = z[1]; - sinz[0] = sin (x) * cosh (y); - sinz[1] = cos (x) * sinh (y); - return sinz; -} - -double *SLcomplex_cos (double *cosz, double *z) -{ - double x, y; - - x = z[0]; y = z[1]; - cosz[0] = cos (x) * cosh (y); - cosz[1] = -sin (x) * sinh (y); - return cosz; -} - -double *SLcomplex_exp (double *expz, double *z) -{ - double r, i; - - r = exp (z[0]); - i = z[1]; - expz[0] = r * cos (i); - expz[1] = r * sin (i); - return expz; -} - -double *SLcomplex_log (double *logz, double *z) -{ - double r, theta; - - polar_form (&r, &theta, z); /* log R.e^(ix) = log R + ix */ - logz[0] = log(r); - logz[1] = theta; - return logz; -} - -double *SLcomplex_log10 (double *log10z, double *z) -{ - double l10 = log (10.0); - (void) SLcomplex_log (log10z, z); - log10z[0] = log10z[0] / l10; - log10z[1] = log10z[1] / l10; - return log10z; -} - -double *SLcomplex_sqrt (double *sqrtz, double *z) -{ - double r, x, y; - - x = z[0]; - y = z[1]; - - r = SLmath_hypot (x, y); - - if (r == 0.0) - { - sqrtz [0] = sqrtz [1] = 0.0; - return sqrtz; - } - - if (x >= 0.0) - { - x = sqrt (0.5 * (r + x)); - y = 0.5 * y / x; - } - else - { - r = sqrt (0.5 * (r - x)); - x = 0.5 * y / r; - y = r; - - if (x < 0.0) - { - x = -x; - y = -y; - } - } - - sqrtz[0] = x; - sqrtz[1] = y; - - return sqrtz; -} - -double *SLcomplex_tan (double *tanz, double *z) -{ - double x, y, invden; - - x = 2 * z[0]; - y = 2 * z[1]; - invden = 1.0 / (cos (x) + cosh (y)); - tanz[0] = invden * sin (x); - tanz[1] = invden * sinh (y); - return tanz; -} - -/* Utility Function */ -static void compute_alpha_beta (double *z, double *alpha, double *beta) -{ - double x, y, a, b; - - x = z[0]; - y = z[1]; - a = 0.5 * SLmath_hypot (x + 1, y); - b = 0.5 * SLmath_hypot (x - 1, y); - - *alpha = a + b; - *beta = a - b; -} - -double *SLcomplex_asin (double *asinz, double *z) -{ - double alpha, beta; - - compute_alpha_beta (z, &alpha, &beta); - asinz[0] = asin (beta); - asinz[1] = log (alpha + sqrt (alpha * alpha - 1)); - return asinz; -} - -double *SLcomplex_acos (double *acosz, double *z) -{ - double alpha, beta; - - compute_alpha_beta (z, &alpha, &beta); - acosz[0] = acos (beta); - acosz[1] = -log (alpha + sqrt (alpha * alpha - 1)); - return acosz; -} - -double *SLcomplex_atan (double *atanz, double *z) -{ - double x, y; - double z1[2], z2[2]; - - x = z[0]; y = z[1]; - z1[0] = x; - z1[1] = 1 + y; - z2[0] = -x; - z2[1] = 1 - y; - - SLcomplex_log (z1, SLcomplex_divide (z2, z1, z2)); - atanz[0] = -0.5 * z1[1]; - atanz[1] = 0.5 * z1[0]; - - return atanz; -} - -double *SLcomplex_sinh (double *sinhz, double *z) -{ - double x, y; - x = z[0]; y = z[1]; - sinhz[0] = sinh (x) * cos (y); - sinhz[1] = cosh (x) * sin (y); - return sinhz; -} - -double *SLcomplex_cosh (double *coshz, double *z) -{ - double x, y; - x = z[0]; y = z[1]; - coshz[0] = cosh (x) * cos (y); - coshz[1] = sinh (x) * sin (y); - return coshz; -} - -double *SLcomplex_tanh (double *tanhz, double *z) -{ - double x, y, invden; - x = 2 * z[0]; - y = 2 * z[1]; - invden = 1.0 / (cosh (x) + cos (y)); - tanhz[0] = invden * sinh (x); - tanhz[1] = invden * sin (y); - return tanhz; -} -#if 0 -static double *not_implemented (char *fun, double *p) -{ - SLang_verror (SL_NOT_IMPLEMENTED, "%s for complex numbers has not been implemented", - fun); - *p = -1.0; - return p; -} -#endif -/* Use: asinh(z) = -i asin(iz) */ -double *SLcomplex_asinh (double *asinhz, double *z) -{ - double iz[2]; - - iz[0] = -z[1]; - iz[1] = z[0]; - - (void) SLcomplex_asin (iz, iz); - asinhz[0] = iz[1]; - asinhz[1] = -iz[0]; - - return asinhz; -} - -/* Use: acosh (z) = i acos(z) */ -double *SLcomplex_acosh (double *acoshz, double *z) -{ - double iz[2]; - - (void) SLcomplex_acos (iz, z); - acoshz[0] = -iz[1]; - acoshz[1] = iz[0]; - - return acoshz; -} - -/* Use: atanh(z) = -i atan(iz) */ -double *SLcomplex_atanh (double *atanhz, double *z) -{ - double iz[2]; - - iz[0] = -z[1]; - iz[1] = z[0]; - - (void) SLcomplex_atan (iz, iz); - atanhz[0] = iz[1]; - atanhz[1] = -iz[0]; - - return atanhz; -} - -static int complex_binary_result (int op, unsigned char a, unsigned char b, - unsigned char *c) -{ - (void) a; (void) b; - - switch (op) - { - default: - case SLANG_POW: - case SLANG_PLUS: - case SLANG_MINUS: - case SLANG_TIMES: - case SLANG_DIVIDE: - *c = SLANG_COMPLEX_TYPE; - break; - - case SLANG_EQ: - case SLANG_NE: - *c = SLANG_CHAR_TYPE; - break; - } - return 1; -} - -static int complex_complex_binary (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - char *ic; - double *a, *b, *c; - unsigned int n, n_max; - unsigned int da, db; - - (void) a_type; - (void) b_type; - - a = (double *) ap; - b = (double *) bp; - c = (double *) cp; - ic = (char *) cp; - - if (na == 1) da = 0; else da = 2; - if (nb == 1) db = 0; else db = 2; - - if (na > nb) n_max = na; else n_max = nb; - n_max = 2 * n_max; - - switch (op) - { - default: - return 0; - - case SLANG_PLUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = a[0] + b[0]; - c[n + 1] = a[1] + b[1]; - a += da; b += db; - } - break; - - case SLANG_MINUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = a[0] - b[0]; - c[n + 1] = a[1] - b[1]; - a += da; b += db; - } - break; - - case SLANG_TIMES: - for (n = 0; n < n_max; n += 2) - { - SLcomplex_times (c + n, a, b); - a += da; b += db; - } - break; - - case SLANG_DIVIDE: /* / */ - for (n = 0; n < n_max; n += 2) - { - if ((b[0] == 0.0) && (b[1] == 0.0)) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - SLcomplex_divide (c + n, a, b); - a += da; b += db; - } - break; - - case SLANG_EQ: /* == */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((a[0] == b[0]) && (a[1] == b[1])); - a += da; b += db; - } - break; - - case SLANG_NE: /* != */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((a[0] != b[0]) || (a[1] != b[1])); - a += da; b += db; - } - break; - - case SLANG_POW: - for (n = 0; n < n_max; n += 2) - { - SLcomplex_pow (c + n, a, b); - a += da; b += db; - } - break; - - } - - return 1; -} - -static int complex_double_binary (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - char *ic; - double *a, *b, *c; - unsigned int n, n_max; - unsigned int da, db; - - (void) a_type; - (void) b_type; - - a = (double *) ap; - b = (double *) bp; - c = (double *) cp; - ic = (char *) cp; - - if (na == 1) da = 0; else da = 2; - if (nb == 1) db = 0; else db = 1; - - if (na > nb) n_max = na; else n_max = nb; - n_max = 2 * n_max; - - switch (op) - { - default: - return 0; - - case SLANG_PLUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = a[0] + b[0]; - c[n + 1] = a[1]; - a += da; b += db; - } - break; - - case SLANG_MINUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = a[0] - b[0]; - c[n + 1] = a[1]; - a += da; b += db; - } - break; - - case SLANG_TIMES: - for (n = 0; n < n_max; n += 2) - { - double b0 = b[0]; - c[n] = a[0] * b0; - c[n + 1] = a[1] * b0; - a += da; b += db; - } - break; - - case SLANG_DIVIDE: /* / */ - for (n = 0; n < n_max; n += 2) - { - double b0 = b[0]; - if (b0 == 0.0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - c[n] = a[0] / b0; - c[n + 1] = a[1] / b0; - a += da; b += db; - } - break; - - case SLANG_EQ: /* == */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((a[0] == b[0]) && (a[1] == 0.0)); - a += da; b += db; - } - break; - - case SLANG_NE: /* != */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((a[0] != b[0]) || (a[1] != 0.0)); - a += da; b += db; - } - break; - - case SLANG_POW: - for (n = 0; n < n_max; n += 2) - { - complex_dpow (c + n, a, b[0]); - a += da; b += db; - } - break; - } - - return 1; -} - -static int double_complex_binary (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - char *ic; - double *a, *b, *c; - unsigned int n, n_max; - unsigned int da, db; - - (void) a_type; - (void) b_type; - - a = (double *) ap; - b = (double *) bp; - c = (double *) cp; - ic = (char *) cp; - - if (na == 1) da = 0; else da = 1; - if (nb == 1) db = 0; else db = 2; - - if (na > nb) n_max = na; else n_max = nb; - n_max = 2 * n_max; - - switch (op) - { - default: - return 0; - - case SLANG_PLUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = a[0] + b[0]; - c[n + 1] = b[1]; - a += da; b += db; - } - break; - - case SLANG_MINUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = a[0] - b[0]; - c[n + 1] = -b[1]; - a += da; b += db; - } - break; - - case SLANG_TIMES: - for (n = 0; n < n_max; n += 2) - { - double a0 = a[0]; - c[n] = a0 * b[0]; - c[n + 1] = a0 * b[1]; - a += da; b += db; - } - break; - - case SLANG_DIVIDE: /* / */ - for (n = 0; n < n_max; n += 2) - { - double z[2]; - if ((b[0] == 0.0) && (b[1] == 0.0)) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - z[0] = a[0]; - z[1] = 0.0; - SLcomplex_divide (c + n, z, b); - a += da; b += db; - } - break; - - case SLANG_EQ: /* == */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((a[0] == b[0]) && (0.0 == b[1])); - a += da; b += db; - } - break; - - case SLANG_NE: /* != */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((a[0] != b[0]) || (0.0 != b[1])); - a += da; b += db; - } - break; - - case SLANG_POW: - for (n = 0; n < n_max; n += 2) - { - dcomplex_pow (c + n, a[0], b); - a += da; b += db; - } - break; - } - - return 1; -} - -static int complex_generic_binary (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - char *ic; - char *b; - double *a, *c; - unsigned int n, n_max; - unsigned int da, db; - unsigned int sizeof_b; - SLang_To_Double_Fun_Type to_double; - - if (NULL == (to_double = SLarith_get_to_double_fun (b_type, &sizeof_b))) - return 0; - - (void) a_type; - - a = (double *) ap; - b = (char *) bp; - c = (double *) cp; - ic = (char *) cp; - - if (na == 1) da = 0; else da = 2; - if (nb == 1) db = 0; else db = sizeof_b; - - if (na > nb) n_max = na; else n_max = nb; - n_max = 2 * n_max; - - switch (op) - { - default: - return 0; - - case SLANG_POW: - for (n = 0; n < n_max; n += 2) - { - complex_dpow (c + n, a, to_double((VOID_STAR)b)); - a += da; b += db; - } - break; - - case SLANG_PLUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = a[0] + to_double((VOID_STAR)b); - c[n + 1] = a[1]; - a += da; b += db; - } - break; - - case SLANG_MINUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = a[0] - to_double((VOID_STAR)b); - c[n + 1] = a[1]; - a += da; b += db; - } - break; - - case SLANG_TIMES: - for (n = 0; n < n_max; n += 2) - { - double b0 = to_double((VOID_STAR)b); - c[n] = a[0] * b0; - c[n + 1] = a[1] * b0; - a += da; b += db; - } - break; - - case SLANG_DIVIDE: /* / */ - for (n = 0; n < n_max; n += 2) - { - double b0 = to_double((VOID_STAR)b); - if (b0 == 0) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - c[n] = a[0] / b0; - c[n + 1] = a[1] / b0; - a += da; b += db; - } - break; - - case SLANG_EQ: /* == */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((a[0] == to_double((VOID_STAR)b)) && (a[1] == 0.0)); - a += da; b += db; - } - break; - - case SLANG_NE: /* != */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((a[0] != to_double((VOID_STAR)b)) || (a[1] != 0.0)); - a += da; b += db; - } - break; - } - - return 1; -} - -static int generic_complex_binary (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - double *b, *c; - char *a, *ic; - unsigned int n, n_max; - unsigned int da, db; - unsigned int sizeof_a; - SLang_To_Double_Fun_Type to_double; - - if (NULL == (to_double = SLarith_get_to_double_fun (a_type, &sizeof_a))) - return 0; - - (void) b_type; - - a = (char *) ap; - b = (double *) bp; - c = (double *) cp; - ic = (char *) cp; - - if (na == 1) da = 0; else da = sizeof_a; - if (nb == 1) db = 0; else db = 2; - - if (na > nb) n_max = na; else n_max = nb; - n_max = 2 * n_max; - - switch (op) - { - default: - return 0; - case SLANG_POW: - for (n = 0; n < n_max; n += 2) - { - dcomplex_pow (c + n, to_double((VOID_STAR)a), b); - a += da; b += db; - } - break; - - case SLANG_PLUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = to_double((VOID_STAR)a) + b[0]; - c[n + 1] = b[1]; - a += da; b += db; - } - break; - - case SLANG_MINUS: - for (n = 0; n < n_max; n += 2) - { - c[n] = to_double((VOID_STAR)a) - b[0]; - c[n + 1] = -b[1]; - a += da; b += db; - } - break; - - case SLANG_TIMES: - for (n = 0; n < n_max; n += 2) - { - double a0 = to_double((VOID_STAR)a); - c[n] = a0 * b[0]; - c[n + 1] = a0 * b[1]; - a += da; b += db; - } - break; - - case SLANG_DIVIDE: /* / */ - for (n = 0; n < n_max; n += 2) - { - double z[2]; - if ((b[0] == 0.0) && (b[1] == 0.0)) - { - SLang_Error = SL_DIVIDE_ERROR; - return -1; - } - z[0] = to_double((VOID_STAR)a); - z[1] = 0.0; - SLcomplex_divide (c + n, z, b); - a += da; b += db; - } - break; - - case SLANG_EQ: /* == */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((to_double((VOID_STAR)a) == b[0]) && (0.0 == b[1])); - a += da; b += db; - } - break; - - case SLANG_NE: /* != */ - for (n = 0; n < n_max; n += 2) - { - ic[n/2] = ((to_double((VOID_STAR)a) != b[0]) || (0.0 != b[1])); - a += da; b += db; - } - break; - } - - return 1; -} - -static int complex_unary_result (int op, unsigned char a, unsigned char *b) -{ - (void) a; - - switch (op) - { - default: - return 0; - - case SLANG_PLUSPLUS: - case SLANG_MINUSMINUS: - case SLANG_CHS: - case SLANG_MUL2: - *b = SLANG_COMPLEX_TYPE; - break; - - case SLANG_SQR: /* |Real|^2 + |Imag|^2 ==> double */ - case SLANG_ABS: /* |z| ==> double */ - *b = SLANG_DOUBLE_TYPE; - break; - - case SLANG_SIGN: - *b = SLANG_INT_TYPE; - break; - } - return 1; -} - -static int complex_unary (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - unsigned int n; - double *a, *b; - int *ic; - - (void) a_type; - - a = (double *) ap; - b = (double *) bp; - ic = (int *) bp; - - na = 2 * na; - - switch (op) - { - default: - return 0; - - case SLANG_PLUSPLUS: - for (n = 0; n < na; n += 2) b[n] = (a[n] + 1); - break; - case SLANG_MINUSMINUS: - for (n = 0; n < na; n += 2) b[n] = (a[n] - 1); - break; - case SLANG_CHS: - for (n = 0; n < na; n += 2) - { - b[n] = -(a[n]); - b[n + 1] = -(a[n + 1]); - } - break; - case SLANG_SQR: /* |Real|^2 + |Imag|^2 ==> double */ - for (n = 0; n < na; n += 2) - b[n/2] = (a[n] * a[n] + a[n + 1] * a[n + 1]); - break; - - case SLANG_MUL2: - for (n = 0; n < na; n += 2) - { - b[n] = (2 * a[n]); - b[n + 1] = (2 * a[n + 1]); - } - break; - - case SLANG_ABS: /* |z| ==> double */ - for (n = 0; n < na; n += 2) - b[n/2] = SLcomplex_abs (a + n); - break; - - case SLANG_SIGN: - /* Another creative extension. Lets return an integer which indicates - * whether the complex number is in the upperhalf plane or not. - */ - for (n = 0; n < na; n += 2) - { - if (a[n + 1] < 0.0) ic[n/2] = -1; - else if (a[n + 1] > 0.0) ic[n/2] = 1; - else ic[n/2] = 0; - } - break; - } - - return 1; -} - -static int -complex_typecast (unsigned char from_type, VOID_STAR from, unsigned int num, - unsigned char to_type, VOID_STAR to) -{ - double *z; - double *d; - char *i; - unsigned int n; - unsigned int sizeof_i; - SLang_To_Double_Fun_Type to_double; - - (void) to_type; - - z = (double *) to; - - switch (from_type) - { - default: - if (NULL == (to_double = SLarith_get_to_double_fun (from_type, &sizeof_i))) - return 0; - i = (char *) from; - for (n = 0; n < num; n++) - { - *z++ = to_double ((VOID_STAR) i); - *z++ = 0.0; - - i += sizeof_i; - } - break; - - case SLANG_DOUBLE_TYPE: - d = (double *) from; - for (n = 0; n < num; n++) - { - *z++ = d[n]; - *z++ = 0.0; - } - break; - } - - return 1; -} - -static void complex_destroy (unsigned char type, VOID_STAR ptr) -{ - (void) type; - SLfree ((char *)*(double **) ptr); -} - -static int complex_push (unsigned char type, VOID_STAR ptr) -{ - double *z; - - (void) type; - z = *(double **) ptr; - return SLang_push_complex (z[0], z[1]); -} - -static int complex_pop (unsigned char type, VOID_STAR ptr) -{ - double *z; - - (void) type; - z = *(double **) ptr; - return SLang_pop_complex (&z[0], &z[1]); -} - -int _SLinit_slcomplex (void) -{ - SLang_Class_Type *cl; - unsigned char *types; - - if (NULL == (cl = SLclass_allocate_class ("Complex_Type"))) - return -1; - - (void) SLclass_set_destroy_function (cl, complex_destroy); - (void) SLclass_set_push_function (cl, complex_push); - (void) SLclass_set_pop_function (cl, complex_pop); - - if (-1 == SLclass_register_class (cl, SLANG_COMPLEX_TYPE, 2 * sizeof (double), - SLANG_CLASS_TYPE_VECTOR)) - return -1; - - types = _SLarith_Arith_Types; - while (*types != SLANG_DOUBLE_TYPE) - { - unsigned char t = *types++; - - if ((-1 == SLclass_add_binary_op (t, SLANG_COMPLEX_TYPE, generic_complex_binary, complex_binary_result)) - || (-1 == SLclass_add_binary_op (SLANG_COMPLEX_TYPE, t, complex_generic_binary, complex_binary_result)) - || (-1 == (SLclass_add_typecast (t, SLANG_COMPLEX_TYPE, complex_typecast, 1)))) - return -1; - } - - if ((-1 == (SLclass_add_binary_op (SLANG_COMPLEX_TYPE, SLANG_COMPLEX_TYPE, complex_complex_binary, complex_binary_result))) - || (-1 == (SLclass_add_binary_op (SLANG_COMPLEX_TYPE, SLANG_DOUBLE_TYPE, complex_double_binary, complex_binary_result))) - || (-1 == (SLclass_add_binary_op (SLANG_DOUBLE_TYPE, SLANG_COMPLEX_TYPE, double_complex_binary, complex_binary_result))) - || (-1 == (SLclass_add_unary_op (SLANG_COMPLEX_TYPE, complex_unary, complex_unary_result))) - || (-1 == (SLclass_add_typecast (SLANG_DOUBLE_TYPE, SLANG_COMPLEX_TYPE, complex_typecast, 1)))) - return -1; - - return 0; -} - -#endif /* if SLANG_HAS_COMPLEX */ - diff --git a/mdk-stage1/slang/slcompat.c b/mdk-stage1/slang/slcompat.c deleted file mode 100644 index 5aa122483..000000000 --- a/mdk-stage1/slang/slcompat.c +++ /dev/null @@ -1,34 +0,0 @@ -/* These functions are provided for backward compatibility and are obsolete. - * Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -/* Compatibility */ -int SLang_init_slunix (void) -{ - if ((-1 == SLang_init_posix_dir ()) - || (-1 == SLang_init_posix_process ()) - || (-1 == SLdefine_for_ifdef ("__SLUNIX__"))) - return -1; - - return 0; -} - -int SLang_init_slfile (void) -{ - if ((-1 == SLang_init_stdio ()) - || (-1 == SLang_init_posix_dir ()) - || (-1 == SLdefine_for_ifdef("__SLFILE__"))) - return -1; - - return 0; -} - diff --git a/mdk-stage1/slang/slcurses.c b/mdk-stage1/slang/slcurses.c deleted file mode 100644 index f1212afc8..000000000 --- a/mdk-stage1/slang/slcurses.c +++ /dev/null @@ -1,972 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include -#include - -#include "slang.h" -#include "_slang.h" -#include "slcurses.h" - -/* This file is meant to implement a primitive curses implementation in - * terms of SLsmg calls. The fact is that the interfaces are sufficiently - * different that a 100% emulation is not possible. - */ - -SLcurses_Window_Type *SLcurses_Stdscr; -int SLcurses_Esc_Delay = 150; /* 0.15 seconds */ -SLtt_Char_Type SLcurses_Acs_Map [128]; -int SLcurses_Is_Endwin = 1; -int SLcurses_Num_Colors = 8; - -static void blank_line (SLsmg_Char_Type *b, unsigned int len, SLsmg_Char_Type color) -{ - SLsmg_Char_Type *bmax; - - bmax = b + len; - color = SLSMG_BUILD_CHAR(' ', color); - - while (b < bmax) *b++ = color; -} - -static int va_mvprintw (SLcurses_Window_Type *w, int r, int c, int do_move, - char *fmt, va_list ap) -{ - char buf[1024]; - - if (do_move) SLcurses_wmove (w, r, c); - - (void) _SLvsnprintf (buf, sizeof(buf), fmt, ap); - - SLcurses_waddnstr (w, buf, -1); - return 0; -} - -int SLcurses_mvprintw (int r, int c, char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - va_mvprintw (SLcurses_Stdscr, r, c, 1, fmt, ap); - va_end(ap); - - return 0; -} - -int SLcurses_mvwprintw (SLcurses_Window_Type *w, int r, int c, char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - va_mvprintw (w, r, c, 1, fmt, ap); - va_end(ap); - - return 0; -} - -int SLcurses_wprintw (SLcurses_Window_Type *w, char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - va_mvprintw (w, 0, 0, 0, fmt, ap); - va_end(ap); - - return 0; -} - -int SLcurses_printw (char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - va_mvprintw (SLcurses_Stdscr, 0, 0, 0, fmt, ap); - va_end(ap); - - return 0; -} - -int SLcurses_nil (void) -{ - return 0; -} - -int SLcurses_has_colors(void) -{ - return SLtt_Use_Ansi_Colors; -} - -int SLcurses_nodelay (SLcurses_Window_Type *w, int onoff) -{ - w->delay_off = (onoff ? 0 : -1); - return 0; -} - -int SLcurses_wgetch (SLcurses_Window_Type *w) -{ - if (w == NULL) - return ERR; - - SLcurses_wrefresh (w); - - if ((w->delay_off == -1) || - SLang_input_pending (w->delay_off)) - { - if (w->use_keypad) - { - int ch = SLang_getkey (); - if (ch == '\033') - { - if (0 == SLang_input_pending (ESCDELAY / 100)) - return ch; - } - else if (ch == 0xFFFF) return ERR; - SLang_ungetkey (ch); - return SLkp_getkey (); - } - return SLang_getkey (); - } - - return ERR; -} - -int SLcurses_getch (void) -{ - return SLcurses_wgetch (SLcurses_Stdscr); -} - -/* This is a super hack. That fact is that SLsmg and curses - * are incompatible. - */ -static unsigned char Color_Objects[256]; - -static unsigned int map_attr_to_object (SLtt_Char_Type attr) -{ - unsigned int obj; - SLtt_Char_Type at; - - obj = (attr >> 8) & 0xFF; - - if (SLtt_Use_Ansi_Colors) - { - if (Color_Objects[obj] != 0) return obj; - - at = SLtt_get_color_object (obj & 0xF); - - if (attr & A_BOLD) at |= SLTT_BOLD_MASK; - if (attr & A_UNDERLINE) at |= SLTT_ULINE_MASK; - if (attr & A_REVERSE) at |= SLTT_REV_MASK; - - SLtt_set_color_object (obj, at); - - Color_Objects[obj] = 1; - } - else obj = obj & 0xF0; - - return obj; - -} - -int SLcurses_start_color (void) -{ - int f, b; - int obj; - - if (SLtt_Use_Ansi_Colors == 0) return -1; - - obj = 0; - for (f = 0; f < 16; f++) - { - for (b = 0; b < 16; b++) - { - obj++; - SLtt_set_color_fgbg (obj, f, b); - } - } - return 0; -} - -#ifdef SIGINT -static void sigint_handler (int sig) -{ - SLang_reset_tty (); - SLsmg_reset_smg (); - exit (sig); -} -#endif - -/* Values are assumed to be 0, 1, 2. This fact is exploited */ -static int TTY_State; - -static int init_tty (int suspend_ok) -{ - if (-1 == SLang_init_tty (-1, 1, 0)) - return -1; - -#ifdef REAL_UNIX_SYSTEM - if (suspend_ok) SLtty_set_suspend_state (1); -#endif - return 0; -} - -int SLcurses_raw (void) -{ - TTY_State = 1; - return init_tty (0); -} - -int SLcurses_cbreak (void) -{ - TTY_State = 2; - return init_tty (1); -} - -#if defined(SIGTSTP) && defined(SIGSTOP) -static void sigtstp_handler (int sig) -{ - sig = errno; - - SLsmg_suspend_smg (); - - if (TTY_State) - SLang_reset_tty (); - - kill(getpid(),SIGSTOP); - - SLsmg_resume_smg (); - - if (TTY_State) init_tty (TTY_State - 1); - - signal (SIGTSTP, sigtstp_handler); - errno = sig; -} -#endif - -SLcurses_Window_Type *SLcurses_initscr (void) -{ - SLcurses_Is_Endwin = 0; - SLsmg_Newline_Behavior = SLSMG_NEWLINE_MOVES; - SLtt_get_terminfo (); - -#if !defined(IBMPC_SYSTEM) && !defined(VMS) - if (-1 == (SLcurses_Num_Colors = SLtt_tgetnum ("Co"))) -#endif - SLcurses_Num_Colors = 8; - - if ((-1 == SLkp_init ()) - || (-1 == SLcurses_cbreak ()) - || (NULL == (SLcurses_Stdscr = SLcurses_newwin (0, 0, 0, 0))) - || (-1 == SLsmg_init_smg ())) - { - SLang_doerror (NULL); - SLang_exit_error ("SLcurses_initscr: init failed\n"); - return NULL; - } - -#ifdef SIGINT - signal (SIGINT, sigint_handler); -#endif - -#if defined(SIGTSTP) && defined(SIGSTOP) - signal (SIGTSTP, sigtstp_handler); -#endif - - SLtt_set_mono (A_BOLD >> 8, NULL, SLTT_BOLD_MASK); - SLtt_set_mono (A_UNDERLINE >> 8, NULL, SLTT_ULINE_MASK); - SLtt_set_mono (A_REVERSE >> 8, NULL, SLTT_REV_MASK); - /* SLtt_set_mono (A_BLINK >> 8, NULL, SLTT_BLINK_MASK); */ - SLtt_set_mono ((A_BOLD|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_BOLD_MASK); - SLtt_set_mono ((A_REVERSE|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_REV_MASK); - - if (SLtt_Has_Alt_Charset) - { - SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = SLSMG_ULCORN_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = SLSMG_URCORN_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = SLSMG_LLCORN_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = SLSMG_LRCORN_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = SLSMG_UTEE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = SLSMG_DTEE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = SLSMG_LTEE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = SLSMG_RTEE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = SLSMG_VLINE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = SLSMG_HLINE_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = SLSMG_PLUS_CHAR | A_ALTCHARSET; - SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = SLSMG_CKBRD_CHAR | A_ALTCHARSET; - } - else - { - /* ugly defaults to use on terminals which don't support graphics */ - SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = '|'; - SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = '-'; - SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = '+'; - SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = '#'; - } - - return SLcurses_Stdscr; -} - -int SLcurses_wattrset (SLcurses_Window_Type *w, SLtt_Char_Type ch) -{ - unsigned int obj; - - obj = map_attr_to_object (ch); - w->color = obj; - w->attr = ch; - return 0; -} - -int SLcurses_wattroff (SLcurses_Window_Type *w, SLtt_Char_Type ch) -{ - if (SLtt_Use_Ansi_Colors) - return SLcurses_wattrset (w, 0); - - w->attr &= ~ch; - return SLcurses_wattrset (w, w->attr); -} - -int SLcurses_wattron (SLcurses_Window_Type *w, SLtt_Char_Type ch) -{ - if (SLtt_Use_Ansi_Colors) - return SLcurses_wattrset (w, ch); - - w->attr |= ch; - return SLcurses_wattrset (w, w->attr); -} - -int SLcurses_delwin (SLcurses_Window_Type *w) -{ - if (w == NULL) return 0; - if (w->lines != NULL) - { - SLsmg_Char_Type **lines = w->lines; - if (w->is_subwin == 0) - { - unsigned int r, rmax; - - rmax = w->nrows; - for (r = 0; r < rmax; r++) - { - SLfree ((char *)lines[r]); - } - } - - SLfree ((char *)lines); - } - - SLfree ((char *)w); - if (w == SLcurses_Stdscr) - SLcurses_Stdscr = NULL; - return 0; -} - -SLcurses_Window_Type *SLcurses_newwin (unsigned int nrows, unsigned int ncols, - unsigned int r, unsigned int c) -{ - SLcurses_Window_Type *win; - SLsmg_Char_Type **lines; - - if (r >= (unsigned int) SLtt_Screen_Rows) - return NULL; - if (c >= (unsigned int) SLtt_Screen_Cols) - return NULL; - - if (NULL == (win = (SLcurses_Window_Type *) SLmalloc (sizeof (SLcurses_Window_Type)))) - return NULL; - - SLMEMSET ((char *) win, 0, sizeof (SLcurses_Window_Type)); - - if (nrows == 0) - nrows = (unsigned int) SLtt_Screen_Rows - r; - if (ncols == 0) - ncols = (unsigned int) SLtt_Screen_Cols - c; - - lines = (SLsmg_Char_Type **) SLmalloc (nrows * sizeof (SLsmg_Char_Type *)); - if (lines == NULL) - { - SLcurses_delwin (win); - return NULL; - } - - SLMEMSET ((char *) lines, 0, nrows * sizeof (SLsmg_Char_Type *)); - - win->lines = lines; - win->scroll_max = win->nrows = nrows; - win->ncols = ncols; - win->_begy = r; - win->_begx = c; - win->_maxx = (c + ncols) - 1; - win->_maxy = (r + nrows) - 1; - win->modified = 1; - win->delay_off = -1; - - for (r = 0; r < nrows; r++) - { - SLsmg_Char_Type *b; - - b = (SLsmg_Char_Type *) SLmalloc (ncols * sizeof (SLsmg_Char_Type)); - if (b == NULL) - { - SLcurses_delwin (win); - return NULL; - } - lines [r] = b; - blank_line (b, ncols, 0); - } - - return win; -} - -int SLcurses_wmove (SLcurses_Window_Type *win, unsigned int r, unsigned int c) -{ - if (win == NULL) return -1; - win->_cury = r; - win->_curx = c; - win->modified = 1; - return 0; -} - -static int do_newline (SLcurses_Window_Type *w) -{ - w->_curx = 0; - w->_cury += 1; - if (w->_cury >= w->scroll_max) - { - w->_cury = w->scroll_max - 1; - if (w->scroll_ok) - SLcurses_wscrl (w, 1); - } - - return 0; -} - -int SLcurses_waddch (SLcurses_Window_Type *win, SLtt_Char_Type attr) -{ - SLsmg_Char_Type *b, ch; - SLsmg_Char_Type color; - - if (win == NULL) return -1; - - if (win->_cury >= win->nrows) - { - /* Curses seems to move current postion to top of window. */ - win->_cury = win->_curx = 0; - return -1; - } - - win->modified = 1; - - ch = SLSMG_EXTRACT_CHAR(attr); - - if (attr == ch) - color = win->color; - else - { - /* hack to pick up the default color for graphics chars */ - if (((attr & A_COLOR) == 0) && ((attr & A_ALTCHARSET) != 0)) - { - /* FIXME: priority=medium: Use SLSMG_?? instead of << */ - attr |= win->color << 8; - } - color = map_attr_to_object (attr); - } - - if (ch < ' ') - { - if (ch == '\n') - { - SLcurses_wclrtoeol (win); - return do_newline (win); - } - - if (ch == '\r') - { - win->_curx = 0; - return 0; - } - - if (ch == '\b') - { - if (win->_curx > 0) - win->_curx--; - - return 0; - } - - /* HACK HACK!!!! */ - if (ch == '\t') ch = ' '; - } - - if (win->_curx >= win->ncols) - do_newline (win); - - b = win->lines[win->_cury] + win->_curx; - *b = SLSMG_BUILD_CHAR(ch,color); - win->_curx++; - - return 0; -} - -int SLcurses_wnoutrefresh (SLcurses_Window_Type *w) -{ - unsigned int len; - unsigned int r, c; - unsigned int i, imax; - - if (SLcurses_Is_Endwin) - { - if (TTY_State) init_tty (TTY_State - 1); - SLsmg_resume_smg (); - SLcurses_Is_Endwin = 0; - } - - if (w == NULL) - { - SLsmg_refresh (); - return -1; - } - - if (w->modified == 0) - return 0; - - r = w->_begy; - c = w->_begx; - - len = w->ncols; - imax = w->nrows; - - for (i = 0; i < imax; i++) - { - SLsmg_gotorc (r, c); - SLsmg_write_color_chars (w->lines[i], len); - r++; - } - - if (w->has_box) - SLsmg_draw_box(w->_begy, w->_begx, w->nrows, w->ncols); - - SLsmg_gotorc (w->_begy + w->_cury, w->_begx + w->_curx); - w->modified = 0; - return 0; -} - -int SLcurses_wrefresh (SLcurses_Window_Type *w) -{ - if (w == NULL) - return -1; - - if (w->modified == 0) - return 0; - - SLcurses_wnoutrefresh (w); - SLsmg_refresh (); - return 0; -} - -int SLcurses_wclrtoeol (SLcurses_Window_Type *w) -{ - SLsmg_Char_Type *b, *bmax; - SLsmg_Char_Type blank; - - if (w == NULL) return -1; - if (w->_cury >= w->nrows) - return 0; - - w->modified = 1; - - blank = SLSMG_BUILD_CHAR(' ',w->color); - - b = w->lines[w->_cury]; - bmax = b + w->ncols; - b += w->_curx; - - while (b < bmax) *b++ = blank; - return 0; -} - -int SLcurses_wclrtobot (SLcurses_Window_Type *w) -{ - SLsmg_Char_Type *b, *bmax; - SLsmg_Char_Type blank; - unsigned int r; - - if (w == NULL) return -1; - - w->modified = 1; - blank = SLSMG_BUILD_CHAR(' ',w->color); - SLcurses_wclrtoeol (w); - for (r = w->_cury + 1; r < w->nrows; r++) - { - b = w->lines [r]; - bmax = b + w->ncols; - - while (b < bmax) *b++ = blank; - } - - return 0; -} - -int SLcurses_wscrl (SLcurses_Window_Type *w, int n) -{ - SLsmg_Char_Type **lines; - unsigned int r, rmax, rmin, ncols; - SLsmg_Char_Type color; - - if ((w == NULL) || (w->scroll_ok == 0)) - return -1; - - w->modified = 1; -#if 0 - if (w->is_subwin) - { - SLang_reset_tty (); - SLsmg_reset_smg (); - fprintf (stderr, "\rAttempt to scroll a subwindow\n"); - exit (1); - } -#endif - - color = w->color; - ncols = w->ncols; - lines = w->lines; - rmax = w->scroll_max; - rmin = w->scroll_min; - if (rmax > w->nrows) - rmax = w->nrows; - if (rmin >= rmax) - return 0; - - while (n > 0) - { - for (r = rmin + 1; r < rmax; r++) - { - /* lines[r - 1] = lines[r]; */ - memcpy ((char *)lines[r - 1], (char *)lines[r], - sizeof (SLsmg_Char_Type) * ncols); - } - blank_line (lines[rmax - 1], ncols, color); - n--; - } - - rmax--; - while (n < 0) - { - for (r = rmax; r > rmin; r--) - { - memcpy ((char *)lines[r], (char *)lines[r - 1], - sizeof (SLsmg_Char_Type) * ncols); - } - blank_line (lines[rmin], ncols, color); - n++; - } - - /* wmove (w, w->nrows - 1, 0); */ - /* wclrtobot (w); */ - return 0; -} - -/* Note: if len is < 0, entire string will be used. - */ -int SLcurses_waddnstr (SLcurses_Window_Type *w, char *str, int len) -{ - SLsmg_Char_Type *b; - SLsmg_Char_Type color; - unsigned char ch; - unsigned int nrows, ncols, crow, ccol; - - if ((w == NULL) - || (str == NULL)) - return -1; - - w->modified = 1; - nrows = w->nrows; - ncols = w->ncols; - crow = w->_cury; - ccol = w->_curx; - color = w->color; - - if (w->scroll_max <= nrows) - nrows = w->scroll_max; - - if (crow >= nrows) - crow = 0; /* wrap back to top */ - - b = w->lines [crow] + ccol; - - while (len && ((ch = (unsigned char) *str++) != 0)) - { - len--; - - if (ch == '\n') - { - w->_cury = crow; - w->_curx = ccol; - SLcurses_wclrtoeol (w); - do_newline (w); - crow = w->_cury; - ccol = w->_curx; - b = w->lines[crow]; - continue; - } - - if (ccol >= ncols) - { - ccol = 0; - crow++; - if (crow >= nrows) - { - w->_curx = 0; - w->_cury = crow; - do_newline (w); - crow = w->_cury; - ccol = w->_curx; - } - - b = w->lines [crow]; - } - - if (ch == '\t') - { - unsigned int n = ccol; - n += SLsmg_Tab_Width; - n = SLsmg_Tab_Width - (n % SLsmg_Tab_Width); - if (ccol + n > ncols) n = ncols - len; - ccol += n; - while (n--) - *b++ = SLSMG_BUILD_CHAR(' ',color); - continue; - } - - *b++ = SLSMG_BUILD_CHAR(ch, color); - ccol++; - } - - w->_curx = ccol; - w->_cury = crow; - - return 0; -} - -/* This routine IS NOT CORRECT. It needs to compute the proper overlap - * and copy accordingly. Here, I just assume windows are same size. - */ -#if 0 -int SLcurses_overlay (SLcurses_Window_Type *swin, SLcurses_Window_Type *dwin) -{ - SLsmg_Char_Type *s, *smax, *d, *dmax; - - if ((swin == NULL) || (dwin == NULL)) - return -1; - - s = swin->buf; - smax = swin->bufmax; - d = dwin->buf; - dmax = dwin->bufmax; - - while ((s < smax) && (d < dmax)) - { - SLsmg_Char_Type ch = *s++; - if (SLSMG_EXTRACT_CHAR(ch) != ' ') - *d = ch; - d++; - } - - return -1; /* not implemented */ -} - -#endif - -SLcurses_Window_Type *SLcurses_subwin (SLcurses_Window_Type *orig, - unsigned int nlines, unsigned int ncols, - unsigned int begin_y, unsigned int begin_x) -{ - SLcurses_Window_Type *sw; - int r, c; - unsigned int i; - - if (orig == NULL) - return NULL; - - sw = (SLcurses_Window_Type *) SLmalloc (sizeof (SLcurses_Window_Type)); - if (sw == NULL) - return NULL; - - SLMEMSET ((char *)sw, 0, sizeof (SLcurses_Window_Type)); -#if 1 - r = begin_y - orig->_begy; -#else - r = 1 + ((int)orig->nrows - (int)nlines) / 2; -#endif - if (r < 0) r = 0; - if (r + nlines > orig->nrows) nlines = orig->nrows - r; - - c = ((int)orig->ncols - (int)ncols) / 2; - if (c < 0) c = 0; - if (c + ncols > orig->ncols) ncols = orig->ncols - c; - - sw->scroll_min = 0; - sw->scroll_max = sw->nrows = nlines; - sw->ncols = ncols; - sw->_begy = begin_y; - sw->_begx = begin_x; - sw->_maxx = (begin_x + ncols) - 1; - sw->_maxy = (begin_y + nlines) - 1; - - sw->lines = (SLsmg_Char_Type **) SLmalloc (nlines * sizeof (SLsmg_Char_Type *)); - if (sw->lines == NULL) - { - SLcurses_delwin (sw); - return NULL; - } - - for (i = 0; i < nlines; i++) - { - sw->lines [i] = orig->lines [r + i] + c; - } - - sw->is_subwin = 1; - return sw; -} - -int SLcurses_wclear (SLcurses_Window_Type *w) -{ - unsigned int i; - - if (w != NULL) w->modified = 1; - for (i=0; i < w->nrows; i++) - blank_line (w->lines[i], w->ncols, w->color); - return 0; -} - -int SLcurses_wdelch (SLcurses_Window_Type *w) -{ - SLsmg_Char_Type *p, *p1, *pmax; - - p = w->lines[w->_cury]; - pmax = p + w->ncols; - p += w->_curx; - p1 = p + 1; - - while (p1 < pmax) - { - *p = *p1; - p = p1; - p1++; - } - - if (p < pmax) - *p = SLSMG_BUILD_CHAR(' ',w->color); - - w->modified = 1; - return 0; -} - -int SLcurses_winsch (SLcurses_Window_Type *w, int ch) -{ - SLsmg_Char_Type *p, *p1, *pmax; - - p = w->lines[w->_cury]; - pmax = p + w->ncols; - p += w->_curx; - p1 = pmax - 1; - - while (pmax > p) - { - *pmax = *p1; - pmax = p1; - p1--; - } - - if (p < pmax) - *p = SLSMG_BUILD_CHAR(ch, w->color); - - w->modified = 1; - return 0; -} - -int SLcurses_endwin (void) -{ - SLcurses_Is_Endwin = 1; - SLsmg_suspend_smg (); - SLang_reset_tty (); - return 0; -} - -#if 0 -int SLcurses_mvwscanw (SLcurses_Window_Type *w, unsigned int r, unsigned int c, - char *fmt, ...) -{ -#if HAVE_VFSCANF - int ret; - va_list ap; - - SLcurses_wmove (w, r, c); - SLcurses_wrefresh (w); - - va_start(ap, fmt); - ret = vfscanf (stdin, fmt, ap); - va_end(ap); - return ret; -#else - return 0; -#endif -} - -int SLcurses_wscanw (SLcurses_Window_Type *w, char *fmt, ...) -{ -#if HAVE_VFSCANF - va_list ap; - int ret; - - SLcurses_wrefresh (w); - - va_start(ap, fmt); - ret = vfscanf (stdin, fmt, ap); - va_end(ap); - - return ret; -#else - return 0; -#endif -} - -int SLcurses_scanw (char *fmt, ...) -{ -#ifdef HAVE_VFSCANF - va_list ap; - int ret; - - SLcurses_wrefresh (SLcurses_Stdscr); - - va_start(ap, fmt); - ret = vfscanf (stdin, fmt, ap); - va_end(ap); - - return ret; -#else - return 0; -#endif -} -#endif - -int SLcurses_clearok (SLcurses_Window_Type *w, int bf) -{ - if (bf) - { - SLsmg_cls (); - w->modified = 1; - } - return 0; -} diff --git a/mdk-stage1/slang/slcurses.h b/mdk-stage1/slang/slcurses.h deleted file mode 100644 index fa082304f..000000000 --- a/mdk-stage1/slang/slcurses.h +++ /dev/null @@ -1,353 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include - -#ifndef SLANG_VERSION -# include -#endif - -/* This is a temporary hack until lynx is fixed to not include this file. */ -#ifndef LYCURSES_H - -typedef struct -{ - unsigned int _begy, _begx, _maxy, _maxx; - unsigned int _curx, _cury; - unsigned int nrows, ncols; - unsigned int scroll_min, scroll_max; - SLsmg_Char_Type **lines; - SLsmg_Char_Type color; - int is_subwin; - SLtt_Char_Type attr; - int delay_off; - int scroll_ok; - int modified; - int has_box; - int use_keypad; -} -SLcurses_Window_Type; - -extern int SLcurses_wclrtobot (SLcurses_Window_Type *); -extern int SLcurses_wscrl (SLcurses_Window_Type *, int); -extern int SLcurses_wrefresh (SLcurses_Window_Type *); -extern int SLcurses_delwin (SLcurses_Window_Type *); -extern int SLcurses_wprintw (SLcurses_Window_Type *, char *, ...); -extern SLcurses_Window_Type *SLcurses_newwin (unsigned int, unsigned int, - unsigned int, unsigned int); - -extern SLcurses_Window_Type *SLcurses_subwin (SLcurses_Window_Type *, - unsigned int, unsigned int, - unsigned int, unsigned int); - -extern int SLcurses_wnoutrefresh (SLcurses_Window_Type *); -extern int SLcurses_wclrtoeol (SLcurses_Window_Type *); - -extern int SLcurses_wmove (SLcurses_Window_Type *, unsigned int, unsigned int); -extern int SLcurses_waddch (SLcurses_Window_Type *, SLtt_Char_Type); -extern int SLcurses_waddnstr (SLcurses_Window_Type *, char *, int); - -#define waddnstr SLcurses_waddnstr -#define waddch SLcurses_waddch -#define waddstr(w,s) waddnstr((w),(s),-1) -#define addstr(x) waddstr(stdscr, (x)) -#define addnstr(s,n) waddnstr(stdscr,(s),(n)) -#define addch(ch) waddch(stdscr,(ch)) - -#define mvwaddnstr(w,y,x,s,n) \ - (-1 == wmove((w),(y),(x)) ? -1 : waddnstr((w),(s),(n))) -#define mvwaddstr(w,y,x,s) \ - (-1 == wmove((w),(y),(x)) ? -1 : waddnstr((w),(s), -1)) -#define mvaddnstr(y,x,s,n) mvwaddnstr(stdscr,(y),(x),(s),(n)) -#define mvaddstr(y,x,s) mvwaddstr(stdscr,(y),(x),(s)) -#define mvwaddch(w,y,x,c) \ - ((-1 == wmove((w),(y),(x))) ? -1 : waddch((w),(c))) -#define mvaddch(y,x,c) mvwaddch(stdscr,(y),(x),(c)) - -extern int SLcurses_wclear (SLcurses_Window_Type *w); -extern int SLcurses_printw (char *, ...); - -#if 0 -/* Why are these functions part of curses??? */ -extern int SLcurses_mvwscanw (SLcurses_Window_Type *, unsigned int, unsigned int, - char *, ...); -extern int SLcurses_wscanw (SLcurses_Window_Type *, char *, ...); -extern int SLcurses_scanw (char *, ...); -#define mvwscanw SLcurses_mvwscanw -#define wscanw SLcurses_wscanw -#define scanw SLcurses_scanw -#endif - -extern SLcurses_Window_Type *SLcurses_Stdscr; -#define WINDOW SLcurses_Window_Type -#define stdscr SLcurses_Stdscr - -#define subwin SLcurses_subwin -#define wclrtobot SLcurses_wclrtobot -#define wscrl SLcurses_wscrl -#define scrl(n) wscrl(stdscr,(n)) -#define scroll(w) wscrl((w),1) -#define wrefresh SLcurses_wrefresh -#define delwin SLcurses_delwin -#define wmove SLcurses_wmove -#define newwin SLcurses_newwin -#define wnoutrefresh SLcurses_wnoutrefresh -#define werase(w) SLcurses_wmove((w),0,0); SLcurses_wclrtobot(w) -#define wclear(w) SLcurses_wmove((w),0,0); SLcurses_wclrtobot(w) -#define wprintw SLcurses_wprintw -#define mvwprintw SLcurses_mvwprintw - -#define winch(w) \ - ((((w)->_cury < (w)->nrows) && ((w)->_curx < (w)->ncols)) \ - ? ((w)->lines[(w)->_cury][(w)->_curx]) : 0) - -#define inch() winch(stdscr) -#define mvwinch(w,x,y) \ - ((-1 != wmove((w),(x),(y))) ? winch(w) : (-1)) -#define doupdate SLsmg_refresh - -#define mvwin(w,a,b) ((w)->_begy = (a), (w)->_begx = (b)) - -extern int SLcurses_mvprintw (int, int, char *, ...); -extern int SLcurses_mvwprintw (SLcurses_Window_Type *, int, int, char *, ...); -extern int SLcurses_has_colors(void); -extern int SLcurses_nil (void); -extern int SLcurses_wgetch (SLcurses_Window_Type *); -extern int SLcurses_getch (void); - -extern int SLcurses_wattrset (SLcurses_Window_Type *, SLtt_Char_Type); -extern int SLcurses_wattron (SLcurses_Window_Type *, SLtt_Char_Type); -extern int SLcurses_wattroff (SLcurses_Window_Type *, SLtt_Char_Type); -#define attrset(x) SLcurses_wattrset(stdscr, (x)) -#define attron(x) SLcurses_wattron(stdscr, (x)) -#define attroff(x) SLcurses_wattroff(stdscr, (x)) -#define wattrset(w, x) SLcurses_wattrset((w), (x)) -#define wattron(w, x) SLcurses_wattron((w), (x)) -#define wattroff(w, x) SLcurses_wattroff((w), (x)) -#define wattr_get(w) ((w)->color << 8) -#define attr_get() wattr_get(stdscr) - -#define COLOR_PAIR(x) ((x) << 8) - -extern int SLcurses_start_color (void); -#define start_color SLcurses_start_color - -#define ERR 0xFFFF -#define wgetch SLcurses_wgetch -#define getch SLcurses_getch - -extern int SLcurses_nodelay (SLcurses_Window_Type *, int); -extern SLcurses_Window_Type *SLcurses_initscr (void); -#define initscr SLcurses_initscr - -extern int SLcurses_cbreak (void); -extern int SLcurses_raw (void); -#define cbreak SLcurses_cbreak -#define crmode SLcurses_cbreak -#define raw SLcurses_raw -#define noraw SLang_reset_tty -#define nocbreak SLang_reset_tty - -#define mvprintw SLcurses_mvprintw -#define has_colors SLcurses_has_colors -#define nodelay SLcurses_nodelay - -#define ungetch SLang_ungetkey - -#define COLS SLtt_Screen_Cols -#define LINES SLtt_Screen_Rows - -#define move(x,y) SLcurses_wmove(stdscr, (x), (y)) -#define wclrtoeol SLcurses_wclrtoeol -#define clrtoeol() SLcurses_wclrtoeol(stdscr) -#define clrtobot() SLcurses_wclrtobot(stdscr) - -#define printw SLcurses_printw -#define mvprintw SLcurses_mvprintw -#define wstandout(w) SLcurses_wattrset((w),A_STANDOUT) -#define wstandend(w) SLcurses_wattrset((w),A_NORMAL) -#define standout() SLcurses_wattrset(stdscr,A_STANDOUT) -#define standend() SLcurses_wattrset(stdscr,A_NORMAL) - -#define refresh() SLcurses_wrefresh(stdscr) -#define clear() SLcurses_wclear(stdscr) -#define erase() werase(stdscr) -#define touchline SLsmg_touch_lines -#define resetterm SLang_reset_tty - -extern int SLcurses_endwin (void); -#define endwin SLcurses_endwin -extern int SLcurses_Is_Endwin; -#define isendwin() SLcurses_Is_Endwin - -#define keypad(w,x) ((w)->use_keypad = (x)) - -#define KEY_MIN SL_KEY_UP -#define KEY_DOWN SL_KEY_DOWN -#define KEY_UP SL_KEY_UP -#define KEY_LEFT SL_KEY_LEFT -#define KEY_RIGHT SL_KEY_RIGHT -#define KEY_A1 SL_KEY_A1 -#define KEY_B1 SL_KEY_B1 -#define KEY_C1 SL_KEY_C1 -#define KEY_A2 SL_KEY_A2 -#define KEY_B2 SL_KEY_B2 -#define KEY_C2 SL_KEY_C2 -#define KEY_A3 SL_KEY_A3 -#define KEY_B3 SL_KEY_B3 -#define KEY_C3 SL_KEY_C3 -#define KEY_REDO SL_KEY_REDO -#define KEY_UNDO SL_KEY_UNDO -#define KEY_BACKSPACE SL_KEY_BACKSPACE -#define KEY_PPAGE SL_KEY_PPAGE -#define KEY_NPAGE SL_KEY_NPAGE -#define KEY_HOME SL_KEY_HOME -#define KEY_END SL_KEY_END -#define KEY_F0 SL_KEY_F0 -#define KEY_F SL_KEY_F -#define KEY_ENTER SL_KEY_ENTER -#define KEY_MAX 0xFFFF - -/* Ugly Hacks that may not work */ -#define flushinp SLcurses_nil -#define winsertln(w) \ - ((w)->scroll_min=(w)->_cury, \ - (w)->scroll_max=(w)->nrows, \ - wscrl((w), -1)) - -extern SLtt_Char_Type SLcurses_Acs_Map [128]; -#define acs_map SLcurses_Acs_Map - -#define ACS_ULCORNER (acs_map[SLSMG_ULCORN_CHAR]) -#define ACS_URCORNER (acs_map[SLSMG_URCORN_CHAR]) -#define ACS_LRCORNER (acs_map[SLSMG_LRCORN_CHAR]) -#define ACS_LLCORNER (acs_map[SLSMG_LLCORN_CHAR]) -#define ACS_TTEE (acs_map[SLSMG_UTEE_CHAR]) -#define ACS_LTEE (acs_map[SLSMG_LTEE_CHAR]) -#define ACS_RTEE (acs_map[SLSMG_RTEE_CHAR]) -#define ACS_BTEE (acs_map[SLSMG_DTEE_CHAR]) -#define ACS_PLUS (acs_map[SLSMG_PLUS_CHAR]) -#define ACS_VLINE (acs_map[SLSMG_VLINE_CHAR]) -#define ACS_HLINE (acs_map[SLSMG_HLINE_CHAR]) -#define ACS_S1 '-' -#define ACS_S9 '-' -#define ACS_DIAMOND '&' -#define ACS_CKBOARD (acs_map[SLSMG_CKBRD_CHAR]) -#define ACS_DEGREE 'o' -#define ACS_PLMINUS '+' -#define ACS_BULLET '*' -#define ACS_LARROW '<' -#define ACS_RARROW '>' -#define ACS_DARROW 'v' -#define ACS_UARROW '^' -#define ACS_BOARD '#' -#define ACS_LANTERN '#' -#define ACS_BLOCK '#' - -#if 1 -#define hline(x,y) SLcurses_nil () -#define vline(x,y) SLcurses_nil () -#endif - -#define A_CHARTEXT 0x00FF -#define A_NORMAL 0 -#define A_BOLD 0x1000 -#define A_REVERSE 0x2000 -#define A_STANDOUT A_REVERSE -#define A_UNDERLINE 0x4000 -#define A_BLINK 0 -#define A_COLOR 0x0700 -#define A_ALTCHARSET 0x8000 -#define A_DIM 0 -#define A_PROTECT 0 -#define A_INVIS 0 - -#define COLOR_BLACK SLSMG_COLOR_BLACK -#define COLOR_RED SLSMG_COLOR_RED -#define COLOR_GREEN SLSMG_COLOR_GREEN -#define COLOR_YELLOW SLSMG_COLOR_BROWN -#define COLOR_BLUE SLSMG_COLOR_BLUE -#define COLOR_MAGENTA SLSMG_COLOR_MAGENTA -#define COLOR_CYAN SLSMG_COLOR_CYAN -#define COLOR_WHITE SLSMG_COLOR_LGRAY - -extern int SLcurses_Num_Colors; -#define COLORS SLcurses_Num_Colors -#define COLOR_PAIRS (SLcurses_Num_Colors*SLcurses_Num_Colors) - -#define init_pair(_x,_f,_b) \ - SLtt_set_color_object((_x), ((_f) == (_b) ? 0x0700 : ((_f) | ((_b) << 8)) << 8)) - -#define scrollok(a,b) ((a)->scroll_ok = (b)) -#define getyx(a,y,x) (y=(a)->_cury, x=(a)->_curx) -#define getmaxyx(a,y,x) (y=(a)->nrows, x=(a)->ncols) -#define napms(x) usleep(1000 * (x)) -typedef SLtt_Char_Type chtype; -#define beep SLtt_beep -#define curs_set(x) SLtt_set_cursor_visibility(x) -#define touchwin(x) SLsmg_touch_lines((x)->_begy, (x)->nrows) -#define flash SLtt_beep - -#define wsetscrreg(w,a,b) ((w)->scroll_min = (a), (w)->scroll_max = (b)) - -#define wtimeout(a,b) (a)->delay_off = ((b >= 0) ? (b) / 100 : -1) -#define timeout(a) wtimeout(stdscr, a) -extern int SLcurses_wdelch (SLcurses_Window_Type *); -#define wdelch SLcurses_wdelch -#define delch() wdelch(stdscr) - -extern int SLcurses_winsch (SLcurses_Window_Type *, int); -#define winsch SLcurses_winsch - -extern int SLcurses_Esc_Delay;/* ESC expire time in milliseconds (ncurses compatible) */ -#define ESCDELAY SLcurses_Esc_Delay - -extern int SLcurses_clearok (SLcurses_Window_Type *, int); -#define clearok SLcurses_clearok - -/* Functions that have not been implemented. */ -#define copywin(w,v,a,b,c,d,e,f,g) SLcurses_nil() -#define wdeleteln(win) SLcurses_nil() -#define resetty SLcurses_nil -#define savetty SLcurses_nil -#define overlay(u,v) SLcurses_nil() - -/* These functions do nothing */ -#define savetty SLcurses_nil -#define nonl SLcurses_nil -#define echo SLcurses_nil -#define noecho SLcurses_nil -#define saveterm SLcurses_nil -#define box(w,y,z) ((w)->has_box = 1, (w)->modified = 1) -#define leaveok(a,b) SLcurses_nil() -#define nl() SLcurses_nil() -#define trace(x) SLcurses_nil() -#define tigetstr(x) NULL - -/* These have no place in C */ -#define TRUE 1 -#define FALSE 0 -#define bool int - -/* Lynx compatability */ -#else - -#define stdscr NULL -#define COLS SLtt_Screen_Cols -#define LINES SLtt_Screen_Rows -#define move SLsmg_gotorc -#define addstr SLsmg_write_string -#define clear SLsmg_cls -#define standout SLsmg_reverse_video -#define standend SLsmg_normal_video -#define clrtoeol SLsmg_erase_eol -#define scrollok(a,b) SLsmg_Newline_Moves = ((b) ? 1 : -1) -#define addch SLsmg_write_char -#define echo() -#define printw SLsmg_printf -#define endwin SLsmg_reset_smg(),SLang_reset_tty - -#endif diff --git a/mdk-stage1/slang/sldisply.c b/mdk-stage1/slang/sldisply.c deleted file mode 100644 index 1e1161774..000000000 --- a/mdk-stage1/slang/sldisply.c +++ /dev/null @@ -1,2596 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include -#include - -#if !defined(VMS) || (__VMS_VER >= 70000000) -# include -# ifdef __QNX__ -# include -# endif -# include -#endif - -#ifdef __BEOS__ -/* Prototype for select */ -# include -#endif - -#ifdef HAVE_TERMIOS_H -# include -#endif - -#ifdef VMS -# include -# include -# include -# include -# include -# include -#else -# if !defined(sun) -# include -# endif -#endif - -#ifdef SYSV -# include -# include -# include -# include -#endif - -#if defined (_AIX) && !defined (FD_SET) -# include /* for FD_ISSET, FD_SET, FD_ZERO */ -#endif - -#include - -#if defined(__DECC) && defined(VMS) -/* These get prototypes for write an sleep */ -# include -#endif -#include - -#include "slang.h" -#include "_slang.h" - -/* Colors: These definitions are used for the display. However, the - * application only uses object handles which get mapped to this - * internal representation. The mapping is performed by the Color_Map - * structure below. */ - -#define CHAR_MASK 0x000000FF -#define FG_MASK 0x0000FF00 -#define BG_MASK 0x00FF0000 -#define ATTR_MASK 0x1F000000 -#define BGALL_MASK 0x0FFF0000 - -/* The 0x10000000 bit represents the alternate character set. BGALL_MASK does - * not include this attribute. - */ - -#define GET_FG(color) ((color & FG_MASK) >> 8) -#define GET_BG(color) ((color & BG_MASK) >> 16) -#define MAKE_COLOR(fg, bg) (((fg) | ((bg) << 8)) << 8) - -int SLtt_Screen_Cols; -int SLtt_Screen_Rows; -int SLtt_Term_Cannot_Insert; -int SLtt_Term_Cannot_Scroll; -int SLtt_Use_Ansi_Colors; -int SLtt_Blink_Mode = 1; -int SLtt_Use_Blink_For_ACS = 0; -int SLtt_Newline_Ok = 0; -int SLtt_Has_Alt_Charset = 0; -int SLtt_Force_Keypad_Init = 0; - -void (*_SLtt_color_changed_hook)(void); - -#if SLTT_HAS_NON_BCE_SUPPORT -static int Bce_Color_Offset = 0; -#endif -static int Can_Background_Color_Erase = 1; - -/* -1 means unknown */ -int SLtt_Has_Status_Line = -1; /* hs */ -int SLang_TT_Write_FD = -1; - -static int Automatic_Margins; -/* static int No_Move_In_Standout; */ -static int Worthless_Highlight; -#define HP_GLITCH_CODE -#ifdef HP_GLITCH_CODE -/* This glitch is exclusive to HP term. Basically it means that to clear - * attributes, one has to erase to the end of the line. - */ -static int Has_HP_Glitch; -#endif - -static char *Reset_Color_String; -static int Is_Color_Terminal = 0; - -static int Linux_Console; - -/* It is crucial that JMAX_COLORS must be less than 128 since the high bit - * is used to indicate a character from the ACS (alt char set). The exception - * to this rule is if SLtt_Use_Blink_For_ACS is true. This means that of - * the highbit is set, we interpret that as a blink character. This is - * exploited by DOSemu. - */ -#define JMAX_COLORS 256 -#define JNORMAL_COLOR 0 - -typedef struct -{ - SLtt_Char_Type fgbg; - SLtt_Char_Type mono; - char *custom_esc; -} -Ansi_Color_Type; - -#define RGB1(r, g, b) ((r) | ((g) << 1) | ((b) << 2)) -#define RGB(r, g, b, br, bg, bb) ((RGB1(r, g, b) << 8) | (RGB1(br, bg, bb) << 16)) - -static Ansi_Color_Type Ansi_Color_Map[JMAX_COLORS] = -{ - {RGB(1, 1, 1, 0, 0, 0), 0x00000000, NULL}, /* white/black */ - {RGB(0, 1, 0, 0, 0, 0), SLTT_REV_MASK, NULL}, /* green/black */ - {RGB(1, 0, 1, 0, 0, 0), SLTT_REV_MASK, NULL}, /* magenta/black */ - {RGB(0, 1, 1, 0, 0, 0), SLTT_REV_MASK, NULL}, /* cyan/black */ - {RGB(1, 0, 0, 0, 0, 0), SLTT_REV_MASK, NULL}, - {RGB(0, 1, 0, 0, 0, 1), SLTT_REV_MASK, NULL}, - {RGB(1, 0, 0, 0, 0, 1), SLTT_REV_MASK, NULL}, - {RGB(1, 0, 0, 0, 1, 0), SLTT_REV_MASK, NULL}, - {RGB(0, 0, 1, 1, 0, 0), SLTT_REV_MASK, NULL}, - {RGB(0, 1, 0, 1, 0, 0), SLTT_REV_MASK, NULL}, - {RGB(0, 1, 1, 1, 1, 1), SLTT_REV_MASK, NULL}, - {RGB(1, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL}, - {RGB(1, 0, 1, 1, 1, 1), SLTT_REV_MASK, NULL}, - {RGB(0, 0, 0, 0, 1, 1), SLTT_REV_MASK, NULL}, - {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL}, - {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL}, - {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL}, - {RGB(0, 1, 0, 1, 1, 1), SLTT_REV_MASK, NULL} -}; - -static char *Color_Fg_Str = "\033[3%dm"; -static char *Color_Bg_Str = "\033[4%dm"; -static char *Default_Color_Fg_Str = "\033[39m"; -static char *Default_Color_Bg_Str = "\033[49m"; - -static int Max_Terminfo_Colors = 8; /* termcap Co */ - -char *SLtt_Graphics_Char_Pairs; /* ac termcap string -- def is vt100 */ - -/* 1 if terminal lacks the ability to go into insert mode or into delete - mode. Currently controlled by S-Lang but later perhaps termcap. */ - -static char *UnderLine_Vid_Str; -static char *Blink_Vid_Str; -static char *Bold_Vid_Str; -static char *Ins_Mode_Str; /* = "\033[4h"; */ /* ins mode (im) */ -static char *Eins_Mode_Str; /* = "\033[4l"; */ /* end ins mode (ei) */ -static char *Scroll_R_Str; /* = "\033[%d;%dr"; */ /* scroll region */ -static char *Cls_Str; /* = "\033[2J\033[H"; */ /* cl termcap STR for ansi terminals */ -static char *Rev_Vid_Str; /* = "\033[7m"; */ /* mr,so termcap string */ -static char *Norm_Vid_Str; /* = "\033[m"; */ /* me,se termcap string */ -static char *Del_Eol_Str; /* = "\033[K"; */ /* ce */ -static char *Del_Bol_Str; /* = "\033[1K"; */ /* cb */ -static char *Del_Char_Str; /* = "\033[P"; */ /* dc */ -static char *Del_N_Lines_Str; /* = "\033[%dM"; */ /* DL */ -static char *Add_N_Lines_Str; /* = "\033[%dL"; */ /* AL */ -static char *Rev_Scroll_Str; -static char *Curs_Up_Str; -static char *Curs_F_Str; /* RI termcap string */ -static char *Cursor_Visible_Str; /* ve termcap string */ -static char *Cursor_Invisible_Str; /* vi termcap string */ -#if 0 -static char *Start_Mouse_Rpt_Str; /* Start mouse reporting mode */ -static char *End_Mouse_Rpt_Str; /* End mouse reporting mode */ -#endif -static char *Start_Alt_Chars_Str; /* as */ -static char *End_Alt_Chars_Str; /* ae */ -static char *Enable_Alt_Char_Set; /* eA */ - -static char *Term_Init_Str; -static char *Keypad_Init_Str; -static char *Term_Reset_Str; -static char *Keypad_Reset_Str; - -/* status line functions */ -static char *Disable_Status_line_Str; /* ds */ -static char *Return_From_Status_Line_Str; /* fs */ -static char *Goto_Status_Line_Str; /* ts */ -static int Num_Status_Line_Columns; /* ws */ -/* static int Status_Line_Esc_Ok; */ /* es */ - -/* static int Len_Curs_F_Str = 5; */ - -/* cm string has %i%d since termcap numbers columns from 0 */ -/* char *CURS_POS_STR = "\033[%d;%df"; ansi-- hor and vert pos */ -static char *Curs_Pos_Str; /* = "\033[%i%d;%dH";*/ /* cm termcap string */ - -/* scrolling region */ -static int Scroll_r1 = 0, Scroll_r2 = 23; -static int Cursor_r, Cursor_c; /* 0 based */ - -/* current attributes --- initialized to impossible value */ -static SLtt_Char_Type Current_Fgbg = 0xFFFFFFFFU; - -static int Cursor_Set; /* 1 if cursor position known, 0 - * if not. -1 if only row is known - */ - -#define MAX_OUTPUT_BUFFER_SIZE 4096 - -static unsigned char Output_Buffer[MAX_OUTPUT_BUFFER_SIZE]; -static unsigned char *Output_Bufferp = Output_Buffer; - -unsigned long SLtt_Num_Chars_Output; - -int _SLusleep (unsigned long usecs) -{ -#if !defined(VMS) || (__VMS_VER >= 70000000) - struct timeval tv; - tv.tv_sec = usecs / 1000000; - tv.tv_usec = usecs % 1000000; - return select(0, NULL, NULL, NULL, &tv); -#else - return 0; -#endif -} - -int SLtt_flush_output (void) -{ - int nwrite = 0; - unsigned int total; - int n = (int) (Output_Bufferp - Output_Buffer); - - SLtt_Num_Chars_Output += n; - - total = 0; - while (n > 0) - { - nwrite = write (SLang_TT_Write_FD, (char *) Output_Buffer + total, n); - if (nwrite == -1) - { - nwrite = 0; -#ifdef EAGAIN - if (errno == EAGAIN) - { - _SLusleep (100000); /* 1/10 sec */ - continue; - } -#endif -#ifdef EWOULDBLOCK - if (errno == EWOULDBLOCK) - { - _SLusleep (100000); - continue; - } -#endif -#ifdef EINTR - if (errno == EINTR) continue; -#endif - break; - } - n -= nwrite; - total += nwrite; - } - Output_Bufferp = Output_Buffer; - return n; -} - -int SLtt_Baud_Rate; -static void tt_write(char *str, unsigned int n) -{ - static unsigned long last_time; - static int total; - unsigned long now; - unsigned int ndiff; - - if ((str == NULL) || (n == 0)) return; - total += n; - - while (1) - { - ndiff = MAX_OUTPUT_BUFFER_SIZE - (int) (Output_Bufferp - Output_Buffer); - if (ndiff < n) - { - SLMEMCPY ((char *) Output_Bufferp, (char *) str, ndiff); - Output_Bufferp += ndiff; - SLtt_flush_output (); - n -= ndiff; - str += ndiff; - } - else - { - SLMEMCPY ((char *) Output_Bufferp, str, n); - Output_Bufferp += n; - break; - } - } - - if (((SLtt_Baud_Rate > 150) && (SLtt_Baud_Rate <= 9600)) - && (10 * total > SLtt_Baud_Rate)) - { - total = 0; - if ((now = (unsigned long) time(NULL)) - last_time <= 1) - { - SLtt_flush_output (); - sleep((unsigned) 1); - } - last_time = now; - } -} - -static void tt_write_string (char *str) -{ - if (str != NULL) tt_write(str, strlen(str)); -} - -void SLtt_write_string (char *str) -{ - tt_write_string (str); - Cursor_Set = 0; -} - -void SLtt_putchar (char ch) -{ - SLtt_normal_video (); - if (Cursor_Set == 1) - { - if (ch >= ' ') Cursor_c++; - else if (ch == '\b') Cursor_c--; - else if (ch == '\r') Cursor_c = 0; - else Cursor_Set = 0; - - if ((Cursor_c + 1 == SLtt_Screen_Cols) - && Automatic_Margins) Cursor_Set = 0; - } - - if (Output_Bufferp < Output_Buffer + MAX_OUTPUT_BUFFER_SIZE) - { - *Output_Bufferp++ = (unsigned char) ch; - } - else tt_write (&ch, 1); -} - -static unsigned int tt_sprintf(char *buf, char *fmt, int x, int y) -{ - char *fmt_max; - register unsigned char *b, ch; - int offset; - int z, z1, parse_level; - int zero_pad; - int field_width; - int variables [26]; - int stack [64]; - unsigned int stack_len; - int parms [10]; -#define STACK_POP (stack_len ? stack[--stack_len] : 0) - - if (fmt == NULL) - { - *buf = 0; - return 0; - } - - stack [0] = y; /* pushed for termcap */ - stack [1] = x; - stack_len = 2; - - parms [1] = x; /* p1 */ - parms [2] = y; /* p2 */ - - offset = 0; - zero_pad = 0; - field_width = 0; - - b = (unsigned char *) buf; - fmt_max = fmt + strlen (fmt); - - while (fmt < fmt_max) - { - ch = *fmt++; - - if (ch != '%') - { - *b++ = ch; - continue; - } - - if (fmt == fmt_max) break; - ch = *fmt++; - - switch (ch) - { - default: - *b++ = ch; - break; - - case 'p': - - if (fmt == fmt_max) break; - ch = *fmt++; - if ((ch >= '0') && (ch <= '9')) - stack [stack_len++] = parms [ch - '0']; - break; - - case '\'': /* 'x' */ - if (fmt == fmt_max) break; - stack [stack_len++] = *fmt++; - if (fmt < fmt_max) fmt++; /* skip ' */ - break; - - case '{': /* literal constant, e.g. {30} */ - z = 0; - while ((fmt < fmt_max) && ((ch = *fmt) <= '9') && (ch >= '0')) - { - z = z * 10 + (ch - '0'); - fmt++; - } - stack [stack_len++] = z; - if ((ch == '}') && (fmt < fmt_max)) fmt++; - break; - - case '0': - if (fmt == fmt_max) break; - ch = *fmt; - if ((ch != '2') && (ch != '3')) - break; - zero_pad = 1; - fmt++; - /* drop */ - - case '2': - case '3': - if (fmt == fmt_max) - if (*fmt == 'x') - { - char x_fmt_buf [4]; - char *x_fmt_buf_ptr; - - x_fmt_buf_ptr = x_fmt_buf; - if (zero_pad) *x_fmt_buf_ptr++ = '0'; - *x_fmt_buf_ptr++ = ch; - *x_fmt_buf_ptr++ = 'X'; - *x_fmt_buf_ptr = 0; - - z = STACK_POP; - z += offset; - - sprintf ((char *)b, x_fmt_buf, z); - b += strlen ((char *)b); - zero_pad = 0; - break; - } - - field_width = (ch - '0'); - /* drop */ - - case 'd': - z = STACK_POP; - z += offset; - if (z >= 100) - { - *b++ = z / 100 + '0'; - z = z % 100; - zero_pad = 1; - field_width = 2; - } - else if (zero_pad && (field_width == 3)) - *b++ = '0'; - - if (z >= 10) - { - *b++ = z / 10 + '0'; - z = z % 10; - } - else if (zero_pad && (field_width >= 2)) - *b++ = '0'; - - *b++ = z + '0'; - field_width = zero_pad = 0; - break; - - case 'x': - z = STACK_POP; - z += offset; - sprintf ((char *) b, "%X", z); - b += strlen ((char *)b); - break; - - case 'i': - offset = 1; - break; - - case '+': - /* Handling this depends upon whether or not we are parsing - * terminfo. Terminfo requires the stack so use it as an - * indicator. - */ - if (stack_len > 2) - { - z = STACK_POP; - stack [stack_len - 1] += z; - } - else if (fmt < fmt_max) - { - ch = *fmt++; - if ((unsigned char) ch == 128) ch = 0; - ch = ch + (unsigned char) STACK_POP; - if (ch == '\n') ch++; - *b++ = ch; - } - break; - - /* Binary operators */ - case '-': - case '*': - case '/': - case 'm': - case '&': - case '|': - case '^': - case '=': - case '>': - case '<': - case 'A': - case 'O': - z1 = STACK_POP; - z = STACK_POP; - switch (ch) - { - case '-': z = (z - z1); break; - case '*': z = (z * z1); break; - case '/': z = (z / z1); break; - case 'm': z = (z % z1); break; - case '&': z = (z & z1); break; - case '|': z = (z | z1); break; - case '^': z = (z ^ z1); break; - case '=': z = (z == z1); break; - case '>': z = (z > z1); break; - case '<': z = (z < z1); break; - case 'A': z = (z && z1); break; - case 'O': z = (z || z1); break; - } - stack [stack_len++] = z; - break; - - /* unary */ - case '!': - z = STACK_POP; - stack [stack_len++] = !z; - break; - - case '~': - z = STACK_POP; - stack [stack_len++] = ~z; - break; - - case 'r': /* termcap -- swap parameters */ - z = stack [0]; - stack [0] = stack [1]; - stack [1] = z; - break; - - case '.': /* termcap */ - case 'c': - ch = (unsigned char) STACK_POP; - if (ch == '\n') ch++; - *b++ = ch; - break; - - case 'g': - if (fmt == fmt_max) break; - ch = *fmt++; - if ((ch >= 'a') && (ch <= 'z')) - stack [stack_len++] = variables [ch - 'a']; - break; - - case 'P': - if (fmt == fmt_max) break; - ch = *fmt++; - if ((ch >= 'a') && (ch <= 'z')) - variables [ch - 'a'] = STACK_POP; - break; - - /* If then else parsing. Actually, this is rather easy. The - * key is to notice that 'then' does all the work. 'if' simply - * there to indicate the start of a test and endif indicates - * the end of tests. If 'else' is seen, then skip to - * endif. - */ - case '?': /* if */ - case ';': /* endif */ - break; - - case 't': /* then */ - z = STACK_POP; - if (z != 0) - break; /* good. Continue parsing. */ - - /* z == 0 and test has failed. So, skip past this entire if - * expression to the matching else or matching endif. - */ - /* drop */ - case 'e': /* else */ - - parse_level = 0; - while (fmt < fmt_max) - { - unsigned char ch1; - - ch1 = *fmt++; - if ((ch1 != '%') || (fmt == fmt_max)) - continue; - - ch1 = *fmt++; - - if (ch1 == '?') parse_level++; /* new if */ - else if (ch1 == 'e') - { - if ((ch != 'e') && (parse_level == 0)) - break; - } - else if (ch1 == ';') - { - if (parse_level == 0) - break; - parse_level--; - } - } - break; - } - } - *b = 0; - return (unsigned int) (b - (unsigned char *) buf); -} - -static void tt_printf(char *fmt, int x, int y) -{ - char buf[1024]; - unsigned int n; - if (fmt == NULL) return; - n = tt_sprintf(buf, fmt, x, y); - tt_write(buf, n); -} - -void SLtt_set_scroll_region (int r1, int r2) -{ - Scroll_r1 = r1; - Scroll_r2 = r2; - tt_printf (Scroll_R_Str, Scroll_r1, Scroll_r2); - Cursor_Set = 0; -} - -void SLtt_reset_scroll_region (void) -{ - SLtt_set_scroll_region(0, SLtt_Screen_Rows - 1); -} - -int SLtt_set_cursor_visibility (int show) -{ - if ((Cursor_Visible_Str == NULL) || (Cursor_Invisible_Str == NULL)) - return -1; - - tt_write_string (show ? Cursor_Visible_Str : Cursor_Invisible_Str); - return 0; -} - -/* the goto_rc function moves to row relative to scrolling region */ -void SLtt_goto_rc(int r, int c) -{ - char *s = NULL; - int n; - char buf[6]; - - if ((c < 0) || (r < 0)) - { - Cursor_Set = 0; - return; - } - - /* if (No_Move_In_Standout && Current_Fgbg) SLtt_normal_video (); */ - r += Scroll_r1; - - if ((Cursor_Set > 0) || ((Cursor_Set < 0) && !Automatic_Margins)) - { - n = r - Cursor_r; - if ((n == -1) && (Cursor_Set > 0) && (Cursor_c == c) - && (Curs_Up_Str != NULL)) - { - s = Curs_Up_Str; - } - else if ((n >= 0) && (n <= 4)) - { - if ((n == 0) && (Cursor_Set == 1) - && ((c > 1) || (c == Cursor_c))) - { - if (Cursor_c == c) return; - if (Cursor_c == c + 1) - { - s = buf; - *s++ = '\b'; *s = 0; - s = buf; - } - } - else if (c == 0) - { - s = buf; - if ((Cursor_Set != 1) || (Cursor_c != 0)) *s++ = '\r'; - while (n--) *s++ = '\n'; -#ifdef VMS - /* Need to add this after \n to start a new record. Sheesh. */ - *s++ = '\r'; -#endif - *s = 0; - s = buf; - } - /* Will fail on VMS */ -#ifndef VMS - else if (SLtt_Newline_Ok && (Cursor_Set == 1) && - (Cursor_c >= c) && (c + 3 > Cursor_c)) - { - s = buf; - while (n--) *s++ = '\n'; - n = Cursor_c - c; - while (n--) *s++ = '\b'; - *s = 0; - s = buf; - } -#endif - } - } - if (s != NULL) tt_write_string(s); - else tt_printf(Curs_Pos_Str, r, c); - Cursor_c = c; Cursor_r = r; - Cursor_Set = 1; -} - -void SLtt_begin_insert (void) -{ - tt_write_string(Ins_Mode_Str); -} - -void SLtt_end_insert (void) -{ - tt_write_string(Eins_Mode_Str); -} - -void SLtt_delete_char (void) -{ - SLtt_normal_video (); - tt_write_string(Del_Char_Str); -} - -void SLtt_erase_line (void) -{ - tt_write_string("\r"); - Cursor_Set = 1; Cursor_c = 0; - SLtt_del_eol(); -} - -/* It appears that the Linux console, and most likely others do not - * like scrolling regions that consist of one line. So I have to - * resort to this stupidity to make up for that stupidity. - */ -static void delete_line_in_scroll_region (void) -{ - SLtt_goto_rc (Cursor_r - Scroll_r1, 0); - SLtt_del_eol (); -} - -void SLtt_delete_nlines (int n) -{ - int r1, curs; - char buf[132]; - - if (n <= 0) return; - SLtt_normal_video (); - - if (Scroll_r1 == Scroll_r2) - { - delete_line_in_scroll_region (); - return; - } - - if (Del_N_Lines_Str != NULL) tt_printf(Del_N_Lines_Str,n, 0); - else - /* get a new terminal */ - { - r1 = Scroll_r1; - curs = Cursor_r; - SLtt_set_scroll_region(curs, Scroll_r2); - SLtt_goto_rc(Scroll_r2 - Scroll_r1, 0); - SLMEMSET(buf, '\n', (unsigned int) n); - tt_write(buf, (unsigned int) n); - /* while (n--) tt_putchar('\n'); */ - SLtt_set_scroll_region(r1, Scroll_r2); - SLtt_goto_rc(curs, 0); - } -} - -void SLtt_cls (void) -{ - /* If the terminal is a color terminal but the user wants black and - * white, then make sure that the colors are reset. This appears to be - * necessary. - */ - if ((SLtt_Use_Ansi_Colors == 0) && Is_Color_Terminal) - { - if (Reset_Color_String != NULL) - tt_write_string (Reset_Color_String); - else - tt_write_string ("\033[0m\033[m"); - } - - SLtt_normal_video(); - SLtt_reset_scroll_region (); - tt_write_string(Cls_Str); -} - -void SLtt_reverse_index (int n) -{ - if (!n) return; - - SLtt_normal_video(); - - if (Scroll_r1 == Scroll_r2) - { - delete_line_in_scroll_region (); - return; - } - - if (Add_N_Lines_Str != NULL) tt_printf(Add_N_Lines_Str,n, 0); - else - { - while(n--) tt_write_string(Rev_Scroll_Str); - } -} - -int SLtt_Ignore_Beep = 1; -static char *Visible_Bell_Str; - -void SLtt_beep (void) -{ - if (SLtt_Ignore_Beep & 0x1) SLtt_putchar('\007'); - - if (SLtt_Ignore_Beep & 0x2) - { - if (Visible_Bell_Str != NULL) tt_write_string (Visible_Bell_Str); -#ifdef __linux__ - else if (Linux_Console) - { - tt_write_string ("\033[?5h"); - SLtt_flush_output (); - _SLusleep (50000); - tt_write_string ("\033[?5l"); - } -#endif - } - SLtt_flush_output (); -} - -static void del_eol (void) -{ - int c; - - if (Del_Eol_Str != NULL) - { - tt_write_string(Del_Eol_Str); - return; - } - - c = Cursor_c; - /* Avoid writing to the lower right corner. If the terminal does not - * have Del_Eol_Str, then it probably does not have what it takes to play - * games with insert for for a space into that corner. - */ - if (Cursor_r + 1 < SLtt_Screen_Rows) - c++; - - while (c < SLtt_Screen_Cols) - { - tt_write (" ", 1); - c++; - } -} - -void SLtt_del_eol (void) -{ - if (Current_Fgbg != 0xFFFFFFFFU) SLtt_normal_video (); - del_eol (); -} - -typedef struct -{ - char *name; - SLtt_Char_Type color; -} -Color_Def_Type; - -#define MAX_COLOR_NAMES 17 -static Color_Def_Type Color_Defs [MAX_COLOR_NAMES] = -{ - {"black", SLSMG_COLOR_BLACK}, - {"red", SLSMG_COLOR_RED}, - {"green", SLSMG_COLOR_GREEN}, - {"brown", SLSMG_COLOR_BROWN}, - {"blue", SLSMG_COLOR_BLUE}, - {"magenta", SLSMG_COLOR_MAGENTA}, - {"cyan", SLSMG_COLOR_CYAN}, - {"lightgray", SLSMG_COLOR_LGRAY}, - {"gray", SLSMG_COLOR_GRAY}, - {"brightred", SLSMG_COLOR_BRIGHT_RED}, - {"brightgreen", SLSMG_COLOR_BRIGHT_GREEN}, - {"yellow", SLSMG_COLOR_BRIGHT_BROWN}, - {"brightblue", SLSMG_COLOR_BRIGHT_BLUE}, - {"brightmagenta", SLSMG_COLOR_BRIGHT_CYAN}, - {"brightcyan", SLSMG_COLOR_BRIGHT_MAGENTA}, - {"white", SLSMG_COLOR_BRIGHT_WHITE}, -#define SLSMG_COLOR_DEFAULT 0xFF - {"default", SLSMG_COLOR_DEFAULT} -}; - -void SLtt_set_mono (int obj, char *what, SLtt_Char_Type mask) -{ - (void) what; - if ((obj < 0) || (obj >= JMAX_COLORS)) - { - return; - } - Ansi_Color_Map[obj].mono = mask & ATTR_MASK; -} - -static char *check_color_for_digit_form (char *color) -{ - unsigned int i, ich; - char *s = color; - - i = 0; - while ((ich = (int) *s) != 0) - { - if ((ich < '0') || (ich > '9')) - return color; - - i = i * 10 + (ich - '0'); - s++; - } - - if (i < MAX_COLOR_NAMES) - color = Color_Defs[i].name; - - return color; -} - -static int get_default_colors (char **fgp, char **bgp) -{ - static char fg_buf[16], bg_buf[16], *bg, *fg; - static int already_parsed; - char *p, *pmax; - - if (already_parsed == -1) - return -1; - - if (already_parsed) - { - *fgp = fg; - *bgp = bg; - return 0; - } - - already_parsed = -1; - - bg = getenv ("COLORFGBG"); - - if (bg == NULL) - { - bg = getenv ("DEFAULT_COLORS"); - if (bg == NULL) - return -1; - } - - p = fg_buf; - pmax = p + (sizeof (fg_buf) - 1); - - while ((*bg != 0) && (*bg != ';')) - { - if (p < pmax) *p++ = *bg; - bg++; - } - *p = 0; - - if (*bg) bg++; - - p = bg_buf; - pmax = p + (sizeof (bg_buf) - 1); - - /* Mark suggested allowing for extra spplication specific stuff following - * the background color. That is what the check for the semi-colon is for. - */ - while ((*bg != 0) && (*bg != ';')) - { - if (p < pmax) *p++ = *bg; - bg++; - } - *p = 0; - - if (!strcmp (fg_buf, "default") || !strcmp(bg_buf, "default")) - { - *fgp = *bgp = fg = bg = "default"; - } - else - { - *fgp = fg = check_color_for_digit_form (fg_buf); - *bgp = bg = check_color_for_digit_form (bg_buf); - } - already_parsed = 1; - return 0; -} - -static unsigned char FgBg_Stats[JMAX_COLORS]; - -static int Color_0_Modified = 0; - -void SLtt_set_color_object (int obj, SLtt_Char_Type attr) -{ - char *cust_esc; - - if ((obj < 0) || (obj >= JMAX_COLORS)) return; - - cust_esc = Ansi_Color_Map[obj].custom_esc; - if (cust_esc != NULL) - { - SLfree (cust_esc); - FgBg_Stats[(Ansi_Color_Map[obj].fgbg >> 8) & 0x7F] -= 1; - Ansi_Color_Map[obj].custom_esc = NULL; - } - - Ansi_Color_Map[obj].fgbg = attr; - if (obj == 0) Color_0_Modified = 1; - - if (_SLtt_color_changed_hook != NULL) - (*_SLtt_color_changed_hook)(); -} - -SLtt_Char_Type SLtt_get_color_object (int obj) -{ - if ((obj < 0) || (obj >= JMAX_COLORS)) return 0; - return Ansi_Color_Map[obj].fgbg; -} - -void SLtt_add_color_attribute (int obj, SLtt_Char_Type attr) -{ - if ((obj < 0) || (obj >= JMAX_COLORS)) return; - - Ansi_Color_Map[obj].fgbg |= (attr & ATTR_MASK); - if (obj == 0) Color_0_Modified = 1; - if (_SLtt_color_changed_hook != NULL) - (*_SLtt_color_changed_hook)(); -} - -static SLtt_Char_Type fb_to_fgbg (SLtt_Char_Type f, SLtt_Char_Type b) -{ - SLtt_Char_Type attr; - - if (Max_Terminfo_Colors != 8) - { - if (f != SLSMG_COLOR_DEFAULT) f %= Max_Terminfo_Colors; - if (b != SLSMG_COLOR_DEFAULT) b %= Max_Terminfo_Colors; - return ((f << 8) | (b << 16)); - } - - /* Otherwise we have 8 ansi colors. Try to get bright versions - * by using the BOLD and BLINK attributes. - */ - - attr = 0; - - /* Note: If f represents default, it will have the value 0xFF */ - if (f != SLSMG_COLOR_DEFAULT) - { - if (f & 0x8) attr = SLTT_BOLD_MASK; - f &= 0x7; - } - - if (b != SLSMG_COLOR_DEFAULT) - { - if (b & 0x8) attr |= SLTT_BLINK_MASK; - b &= 0x7; - } - - return ((f << 8) | (b << 16) | attr); -} - -/* This looks for colors with name form 'colorN'. If color is of this - * form, N is passed back via paramter list. - */ -static int parse_color_digit_name (char *color, SLtt_Char_Type *f) -{ - unsigned int i; - unsigned char ch; - - if (strncmp (color, "color", 5)) - return -1; - - color += 5; - if (*color == 0) - return -1; - - i = 0; - while (1) - { - ch = (unsigned char) *color++; - if (ch == 0) - break; - if ((ch > '9') || (ch < '0')) - return -1; - i = 10 * i + (ch - '0'); - } - - *f = (SLtt_Char_Type) i; - return 0; -} - -static int make_color_fgbg (char *fg, char *bg, SLtt_Char_Type *fgbg) -{ - SLtt_Char_Type f = 0xFFFFFFFFU, b = 0xFFFFFFFFU; - char *dfg, *dbg; - unsigned int i; - - if ((fg != NULL) && (*fg == 0)) fg = NULL; - if ((bg != NULL) && (*bg == 0)) bg = NULL; - - if ((fg == NULL) || (bg == NULL)) - { - if (-1 == get_default_colors (&dfg, &dbg)) - return -1; - - if (fg == NULL) fg = dfg; - if (bg == NULL) bg = dbg; - } - - if (-1 == parse_color_digit_name (fg, &f)) - { - for (i = 0; i < MAX_COLOR_NAMES; i++) - { - if (strcmp(fg, Color_Defs[i].name)) continue; - f = Color_Defs[i].color; - break; - } - } - - if (-1 == parse_color_digit_name (bg, &b)) - { - for (i = 0; i < MAX_COLOR_NAMES; i++) - { - if (strcmp(bg, Color_Defs[i].name)) continue; - b = Color_Defs[i].color; - break; - } - } - - if ((f == 0xFFFFFFFFU) || (b == 0xFFFFFFFFU)) - return -1; - - *fgbg = fb_to_fgbg (f, b); - return 0; -} - -void SLtt_set_color (int obj, char *what, char *fg, char *bg) -{ - SLtt_Char_Type fgbg; - - (void) what; - if ((obj < 0) || (obj >= JMAX_COLORS)) - return; - - if (-1 != make_color_fgbg (fg, bg, &fgbg)) - SLtt_set_color_object (obj, fgbg); -} - -void SLtt_set_color_fgbg (int obj, SLtt_Char_Type f, SLtt_Char_Type b) -{ - SLtt_set_color_object (obj, fb_to_fgbg (f, b)); -} - -void SLtt_set_color_esc (int obj, char *esc) -{ - char *cust_esc; - SLtt_Char_Type fgbg = 0; - int i; - - if ((obj < 0) || (obj >= JMAX_COLORS)) - { - return; - } - - cust_esc = Ansi_Color_Map[obj].custom_esc; - if (cust_esc != NULL) - { - SLfree (cust_esc); - FgBg_Stats[(Ansi_Color_Map[obj].fgbg >> 8) & 0x7F] -= 1; - } - - cust_esc = (char *) SLmalloc (strlen(esc) + 1); - if (cust_esc != NULL) strcpy (cust_esc, esc); - - Ansi_Color_Map[obj].custom_esc = cust_esc; - if (cust_esc == NULL) fgbg = 0; - else - { - /* The whole point of this is to generate a unique fgbg */ - for (i = 0; i < JMAX_COLORS; i++) - { - if (FgBg_Stats[i] == 0) fgbg = i; - - if (obj == i) continue; - if ((Ansi_Color_Map[i].custom_esc) == NULL) continue; - if (!strcmp (Ansi_Color_Map[i].custom_esc, cust_esc)) - { - fgbg = (Ansi_Color_Map[i].fgbg >> 8) & 0x7F; - break; - } - } - FgBg_Stats[fgbg] += 1; - } - - fgbg |= 0x80; - Ansi_Color_Map[obj].fgbg = (fgbg | (fgbg << 8)) << 8; - if (obj == 0) Color_0_Modified = 1; - if (_SLtt_color_changed_hook != NULL) - (*_SLtt_color_changed_hook)(); -} - -void SLtt_set_alt_char_set (int i) -{ - static int last_i; - if (SLtt_Has_Alt_Charset == 0) return; - if (i == last_i) return; - tt_write_string (i ? Start_Alt_Chars_Str : End_Alt_Chars_Str ); - last_i = i; -} - -static void write_attributes (SLtt_Char_Type fgbg) -{ - int bg0, fg0; - int unknown_attributes; - - if (Worthless_Highlight) return; - if (fgbg == Current_Fgbg) return; - - unknown_attributes = 0; - - /* Before spitting out colors, fix attributes */ - if ((fgbg & ATTR_MASK) != (Current_Fgbg & ATTR_MASK)) - { - if (Current_Fgbg & ATTR_MASK) - { - tt_write_string(Norm_Vid_Str); - /* In case normal video turns off ALL attributes: */ - if (fgbg & SLTT_ALTC_MASK) - Current_Fgbg &= ~SLTT_ALTC_MASK; - SLtt_set_alt_char_set (0); - } - - if ((fgbg & SLTT_ALTC_MASK) - != (Current_Fgbg & SLTT_ALTC_MASK)) - { - SLtt_set_alt_char_set ((int) (fgbg & SLTT_ALTC_MASK)); - } - - if (fgbg & SLTT_ULINE_MASK) tt_write_string (UnderLine_Vid_Str); - if (fgbg & SLTT_BOLD_MASK) SLtt_bold_video (); - if (fgbg & SLTT_REV_MASK) tt_write_string (Rev_Vid_Str); - if (fgbg & SLTT_BLINK_MASK) - { - /* Someday Linux will have a blink mode that set high intensity - * background. Lets be prepared. - */ - if (SLtt_Blink_Mode) tt_write_string (Blink_Vid_Str); - } - unknown_attributes = 1; - } - - if (SLtt_Use_Ansi_Colors) - { - fg0 = (int) GET_FG(fgbg); - bg0 = (int) GET_BG(fgbg); - - if (unknown_attributes - || (fg0 != (int)GET_FG(Current_Fgbg))) - { - if (fg0 == SLSMG_COLOR_DEFAULT) - tt_write_string (Default_Color_Fg_Str); - else - tt_printf (Color_Fg_Str, fg0, 0); - } - - if (unknown_attributes - || (bg0 != (int)GET_BG(Current_Fgbg))) - { - if (bg0 == SLSMG_COLOR_DEFAULT) - tt_write_string (Default_Color_Bg_Str); - else - tt_printf (Color_Bg_Str, bg0, 0); - } - } - - Current_Fgbg = fgbg; -} - -static int Video_Initialized; - -void SLtt_reverse_video (int color) -{ - SLtt_Char_Type fgbg; - char *esc; - - if (Worthless_Highlight) return; - if ((color < 0) || (color >= JMAX_COLORS)) return; - - if (Video_Initialized == 0) - { - if (color == JNORMAL_COLOR) - { - tt_write_string (Norm_Vid_Str); - } - else tt_write_string (Rev_Vid_Str); - Current_Fgbg = 0xFFFFFFFFU; - return; - } - - if (SLtt_Use_Ansi_Colors) - { - fgbg = Ansi_Color_Map[color].fgbg; - if ((esc = Ansi_Color_Map[color].custom_esc) != NULL) - { - if (fgbg != Current_Fgbg) - { - Current_Fgbg = fgbg; - tt_write_string (esc); - return; - } - } - } - else fgbg = Ansi_Color_Map[color].mono; - - if (fgbg == Current_Fgbg) return; - write_attributes (fgbg); -} - -void SLtt_normal_video (void) -{ - SLtt_reverse_video(JNORMAL_COLOR); -} - -void SLtt_narrow_width (void) -{ - tt_write_string("\033[?3l"); -} - -void SLtt_wide_width (void) -{ - tt_write_string("\033[?3h"); -} - -/* Highest bit represents the character set. */ -#define COLOR_MASK 0x7F00 - -#if SLTT_HAS_NON_BCE_SUPPORT -static int bce_color_eqs (unsigned int a, unsigned int b) -{ - a = (a & COLOR_MASK) >> 8; - b = (b & COLOR_MASK) >> 8; - - if (a == b) - return 1; - - if (SLtt_Use_Ansi_Colors == 0) - return Ansi_Color_Map[a].mono == Ansi_Color_Map[b].mono; - - if (Bce_Color_Offset == 0) - return Ansi_Color_Map[a].fgbg == Ansi_Color_Map[b].fgbg; - - /* If either are color 0, then we do not know what that means since the - * terminal does not support BCE */ - if ((a == 0) || (b == 0)) - return 0; - - return Ansi_Color_Map[a-1].fgbg == Ansi_Color_Map[b-1].fgbg; -} -#define COLOR_EQS(a,b) bce_color_eqs (a,b) -#else -# define COLOR_OF(x) (((unsigned int)(x) & COLOR_MASK) >> 8) -# define COLOR_EQS(a, b) \ - (SLtt_Use_Ansi_Colors \ - ? (Ansi_Color_Map[COLOR_OF(a)].fgbg == Ansi_Color_Map[COLOR_OF(b)].fgbg)\ - : (Ansi_Color_Map[COLOR_OF(a)].mono == Ansi_Color_Map[COLOR_OF(b)].mono)) -#endif - -#define CHAR_EQS(a, b) (((a) == (b))\ - || ((((a) & ~COLOR_MASK) == ((b) & ~COLOR_MASK))\ - && COLOR_EQS((a), (b)))) - -/* The whole point of this routine is to prevent writing to the last column - * and last row on terminals with automatic margins. - */ -static void write_string_with_care (char *str) -{ - unsigned int len; - - if (str == NULL) return; - - len = strlen (str); - if (Automatic_Margins && (Cursor_r + 1 == SLtt_Screen_Rows)) - { - if (len + (unsigned int) Cursor_c >= (unsigned int) SLtt_Screen_Cols) - { - /* For now, just do not write there. Later, something more - * sophisticated will be implemented. - */ - if (SLtt_Screen_Cols > Cursor_c) - len = SLtt_Screen_Cols - Cursor_c - 1; - else - len = 0; - } - } - tt_write (str, len); -} - -static void send_attr_str (SLsmg_Char_Type *s) -{ - unsigned char out[256], ch, *p; - register SLtt_Char_Type attr; - register SLsmg_Char_Type sh; - int color, last_color = -1; - - p = out; - while (0 != (sh = *s++)) - { - ch = sh & 0xFF; - color = ((int) sh & 0xFF00) >> 8; - -#if SLTT_HAS_NON_BCE_SUPPORT - if (Bce_Color_Offset - && (color >= Bce_Color_Offset)) - color -= Bce_Color_Offset; -#endif - - if (color != last_color) - { - if (SLtt_Use_Ansi_Colors) attr = Ansi_Color_Map[color & 0x7F].fgbg; - else attr = Ansi_Color_Map[color & 0x7F].mono; - - if (sh & 0x8000) /* alternate char set */ - { - if (SLtt_Use_Blink_For_ACS) - { - if (SLtt_Blink_Mode) attr |= SLTT_BLINK_MASK; - } - else attr |= SLTT_ALTC_MASK; - } - - if (attr != Current_Fgbg) - { - if ((ch != ' ') || - /* it is a space so only consider it different if it - * has different attributes. - */ - (attr & BGALL_MASK) != (Current_Fgbg & BGALL_MASK)) - { - if (p != out) - { - *p = 0; - write_string_with_care ((char *) out); - Cursor_c += (int) (p - out); - p = out; - } - - if (SLtt_Use_Ansi_Colors && (NULL != Ansi_Color_Map[color & 0x7F].custom_esc)) - { - tt_write_string (Ansi_Color_Map[color & 0x7F].custom_esc); - /* Just in case the custom escape sequence screwed up - * the alt character set state... - */ - if ((attr & SLTT_ALTC_MASK) != (Current_Fgbg & SLTT_ALTC_MASK)) - SLtt_set_alt_char_set ((int) (attr & SLTT_ALTC_MASK)); - Current_Fgbg = attr; - } - else write_attributes (attr); - - last_color = color; - } - } - } - *p++ = ch; - } - *p = 0; - if (p != out) write_string_with_care ((char *) out); - Cursor_c += (int) (p - out); -} - -static void forward_cursor (unsigned int n, int row) -{ - char buf [1024]; - - if (n <= 4) - { - SLtt_normal_video (); - SLMEMSET (buf, ' ', n); - buf[n] = 0; - write_string_with_care (buf); - Cursor_c += n; - } - else if (Curs_F_Str != NULL) - { - Cursor_c += n; - n = tt_sprintf(buf, Curs_F_Str, (int) n, 0); - tt_write(buf, n); - } - else SLtt_goto_rc (row, (int) (Cursor_c + n)); -} - - -void SLtt_smart_puts(SLsmg_Char_Type *neww, SLsmg_Char_Type *oldd, int len, int row) -{ - register SLsmg_Char_Type *p, *q, *qmax, *pmax, *buf; - SLsmg_Char_Type buffer[256]; - unsigned int n_spaces; - SLsmg_Char_Type *space_match, *last_buffered_match; -#ifdef HP_GLITCH_CODE - int handle_hp_glitch = 0; -#endif - SLsmg_Char_Type space_char; -#define SLTT_USE_INSERT_HACK 1 -#if SLTT_USE_INSERT_HACK - SLsmg_Char_Type insert_hack_prev = 0; - SLsmg_Char_Type insert_hack_char = 0; - - if ((row + 1 == SLtt_Screen_Rows) - && (len == SLtt_Screen_Cols) - && (len > 1) - && (SLtt_Term_Cannot_Insert == 0) - && Automatic_Margins) - { - insert_hack_char = neww[len-1]; - if (oldd[len-1] == insert_hack_char) - insert_hack_char = 0; - else - insert_hack_prev = neww[len-2]; - } -#endif - - q = oldd; p = neww; - qmax = oldd + len; - pmax = p + len; - - /* Find out where to begin --- while they match, we are ok */ - while (1) - { - if (q == qmax) return; -#if SLANG_HAS_KANJI_SUPPORT - if (*p & 0x80) - { /* new is kanji */ - if ((*q & 0x80) && ((q + 1) < qmax)) - { /* old is also kanji */ - if (((0xFF & *q) != (0xFF & *p)) - || ((0xFF & q[1]) != (0xFF & p[1]))) - break; /* both kanji, but not match */ - - else - { /* kanji match ! */ - if (!COLOR_EQS(*q, *p)) break; - q++; p++; - if (!COLOR_EQS(*q, *p)) break; - /* really match! */ - q++; p++; - continue; - } - } - else break; /* old is not kanji */ - } - else - { /* new is not kanji */ - if (*q & 0x80) break; /* old is kanji */ - } -#endif - if (!CHAR_EQS(*q, *p)) break; - q++; p++; - } - -#ifdef HP_GLITCH_CODE - if (Has_HP_Glitch) - { - SLsmg_Char_Type *qq = q; - - SLtt_goto_rc (row, (int) (p - neww)); - - while (qq < qmax) - { - if (*qq & 0xFF00) - { - SLtt_normal_video (); - SLtt_del_eol (); - qmax = q; - handle_hp_glitch = 1; - break; - } - qq++; - } - } -#endif - /* Find where the last non-blank character on old/new screen is */ - - space_char = ' '; - if ((*(pmax-1) & 0xFF) == ' ') - { - /* If we get here, then we can erase to the end of the line to create - * the final space. However, this will only work _if_ erasing will - * get us the correct color. If the terminal supports BCE, then this - * is easy. If it does not, then we can only perform this operation - * if the color is known via something like COLORFGBG. For now, - * I just will not perform the optimization for such terminals. - */ - if ((Can_Background_Color_Erase) - && SLtt_Use_Ansi_Colors) - space_char = *(pmax - 1); - - while (pmax > p) - { - pmax--; - if (!CHAR_EQS(*pmax, space_char)) - { - pmax++; - break; - } - } - } - - while (qmax > q) - { - qmax--; - if (!CHAR_EQS(*qmax, space_char)) - { - qmax++; - break; - } - } - - last_buffered_match = buf = buffer; /* buffer is empty */ - -#ifdef HP_GLITCH_CODE - if (handle_hp_glitch) - { - while (p < pmax) - { - *buf++ = *p++; - } - } -#endif - -#ifdef HP_GLITCH_CODE - if (Has_HP_Glitch == 0) - { -#endif - /* Try use use erase to bol if possible */ - if ((Del_Bol_Str != NULL) && ((*neww & 0xFF) == 32)) - { - SLsmg_Char_Type *p1; - SLsmg_Char_Type blank; - - p1 = neww; - if ((Can_Background_Color_Erase) - && SLtt_Use_Ansi_Colors) - blank = *p1; - /* black+white attributes do not support bce */ - else - blank = 32; - - while ((p1 < pmax) && (CHAR_EQS (*p1, blank))) - p1++; - - /* Is this optimization worth it? Assume Del_Bol_Str is ESC [ 1 K - * It costs 4 chars + the space needed to properly position the - * cursor, e.g., ESC [ 10;10H. So, it costs at least 13 characters. - */ - if ((p1 > neww + 13) - && (p1 >= p) - /* Avoid erasing from the end of the line */ - && ((p1 != pmax) || (pmax < neww + len))) - { - int ofs = (int) (p1 - neww); - q = oldd + ofs; - p = p1; - SLtt_goto_rc (row, ofs - 1); - SLtt_reverse_video (blank >> 8); - tt_write_string (Del_Bol_Str); - tt_write (" ", 1); - Cursor_c += 1; - } - else - SLtt_goto_rc (row, (int) (p - neww)); - } - else - SLtt_goto_rc (row, (int) (p - neww)); -#ifdef HP_GLITCH_CODE - } -#endif - - - /* loop using overwrite then skip algorithm until done */ - while (1) - { - /* while they do not match and we do not hit a space, buffer them up */ - n_spaces = 0; - while (p < pmax) - { - if (CHAR_EQS(*q, 32) && CHAR_EQS(*p, 32)) - { - /* If *q is not a space, we would have to overwrite it. - * However, if *q is a space, then while *p is also one, - * we only need to skip over the blank field. - */ - space_match = p; - p++; q++; - while ((p < pmax) - && CHAR_EQS(*q, 32) - && CHAR_EQS(*p, 32)) - { - p++; - q++; - } - n_spaces = (unsigned int) (p - space_match); - break; - } -#if SLANG_HAS_KANJI_SUPPORT - if ((*p & 0x80) && ((p + 1) < pmax)) - { /* new is kanji */ - if (*q & 0x80) - { /* old is also kanji */ - if (((0xFF & *q) != (0xFF & *p)) - || ((0xFF & q[1]) != (0xFF & p[1]))) - { - /* both kanji, but not match */ - *buf++ = *p++; - *buf++ = *p++; - q += 2; - continue; - } - else - { /* kanji match ? */ - if (!COLOR_EQS(*q, *p) || !COLOR_EQS(*(q+1), *(p+1))) - { - /* code is match, but color is diff */ - *buf++ = *p++; - *buf++ = *p++; - q += 2; - continue; - } - /* really match ! */ - break; - } - } - else - { /* old is not kanji */ - *buf++ = *p++; - *buf++ = *p++; - q += 2; - continue; - } - } - else - { /* new is not kanji */ - if (*q & 0x80) - { /* old is kanji */ - *buf++ = *p++; - q++; - continue; - } - } -#endif - - if (CHAR_EQS(*q, *p)) break; - *buf++ = *p++; - q++; - } - *buf = 0; - - if (buf != buffer) send_attr_str (buffer); - buf = buffer; - - if (n_spaces - && ((p < pmax) /* erase to eol will achieve this effect*/ - || (space_char != 32)))/* unless space_char is not a simple space */ - { - forward_cursor (n_spaces, row); - } - - /* Now we overwrote what we could and cursor is placed at position - * of a possible match of new and old. If this is the case, skip - * some more. - */ -#if !SLANG_HAS_KANJI_SUPPORT - while ((p < pmax) && CHAR_EQS(*p, *q)) - { - *buf++ = *p++; - q++; - } -#else - /* Kanji */ - while (p < pmax) - { - if ((*p & 0x80) && ((p + 1) < pmax)) - { /* new is kanji */ - if (*q & 0x80) - { /* old is also kanji */ - if (((0xFF & *q) == (0xFF & *p)) - && ((0xFF & q[1]) == (0xFF & p[1]))) - { - /* kanji match ? */ - if (!COLOR_EQS(*q, *p) - || !COLOR_EQS(q[1], p[1])) - break; - - *buf++ = *p++; - q++; - if (p >= pmax) - { - *buf++ = 32; - p++; - break; - } - else - { - *buf++ = *p++; - q++; - continue; - } - } - else break; /* both kanji, but not match */ - } - else break; /* old is not kanji */ - } - else - { /* new is not kanji */ - if (*q & 0x80) break; /* old is kanji */ - if (!CHAR_EQS(*q, *p)) break; - *buf++ = *p++; - q++; - } - } -#endif - last_buffered_match = buf; - if (p >= pmax) break; - - /* jump to new position is it is greater than 5 otherwise - * let it sit in the buffer and output it later. - */ - if ((int) (buf - buffer) >= 5) - { - forward_cursor ((unsigned int) (buf - buffer), row); - last_buffered_match = buf = buffer; - } - } - - if (buf != buffer) - { - if (q < qmax) - { - if ((buf == last_buffered_match) - && ((int) (buf - buffer) >= 5)) - { - forward_cursor ((unsigned int) (buf - buffer), row); - } - else - { - *buf = 0; - send_attr_str (buffer); - } - } - } - - if (q < qmax) - { - SLtt_reverse_video (space_char >> 8); - del_eol (); - } - -#if SLTT_USE_INSERT_HACK - else if (insert_hack_char) - { - SLtt_goto_rc (SLtt_Screen_Rows-1, SLtt_Screen_Cols-2); - buffer[0] = insert_hack_char; - buffer[1] = 0; - send_attr_str (buffer); - SLtt_goto_rc (SLtt_Screen_Rows-1, SLtt_Screen_Cols-2); - buffer[0] = insert_hack_prev; - SLtt_begin_insert (); - send_attr_str (buffer); - SLtt_end_insert (); - } -#endif - - if (Automatic_Margins && (Cursor_c + 1 >= SLtt_Screen_Cols)) Cursor_Set = 0; -} - -static void get_color_info (void) -{ - char *fg, *bg; - - /* Allow easy mechanism to override inadequate termcap/terminfo files. */ - if (SLtt_Use_Ansi_Colors == 0) - SLtt_Use_Ansi_Colors = (NULL != getenv ("COLORTERM")); - - if (SLtt_Use_Ansi_Colors) - Is_Color_Terminal = 1; - -#if SLTT_HAS_NON_BCE_SUPPORT - if (Can_Background_Color_Erase == 0) - Can_Background_Color_Erase = (NULL != getenv ("COLORTERM_BCE")); -#endif - - if (-1 == get_default_colors (&fg, &bg)) - return; - - /* Check to see if application has already set them. */ - if (Color_0_Modified) - return; - - SLtt_set_color (0, NULL, fg, bg); - SLtt_set_color (1, NULL, bg, fg); -} - -/* termcap stuff */ - -#ifdef __unix__ - -static int Termcap_Initalized = 0; - -#ifdef USE_TERMCAP -/* Termcap based system */ -static char Termcap_Buf[4096]; -static char Termcap_String_Buf[4096]; -static char *Termcap_String_Ptr; -extern char *tgetstr(char *, char **); -extern int tgetent(char *, char *); -extern int tgetnum(char *); -extern int tgetflag(char *); -#else -/* Terminfo */ -static SLterminfo_Type *Terminfo; -#endif - -#define TGETFLAG(x) (SLtt_tgetflag(x) > 0) - -static char *fixup_tgetstr (char *what) -{ - register char *w, *w1; - char *wsave; - - if (what == NULL) - return NULL; - - /* Check for AIX brain-damage */ - if (*what == '@') - return NULL; - - /* lose pad info --- with today's technology, term is a loser if - it is really needed */ - while ((*what == '.') || - ((*what >= '0') && (*what <= '9'))) what++; - if (*what == '*') what++; - - /* lose terminfo padding--- looks like $<...> */ - w = what; - while (*w) if ((*w++ == '$') && (*w == '<')) - { - w1 = w - 1; - while (*w && (*w != '>')) w++; - if (*w == 0) break; - w++; - wsave = w1; - while ((*w1++ = *w++) != 0); - w = wsave; - } - - if (*what == 0) what = NULL; - return what; -} - -char *SLtt_tgetstr (char *s) -{ - if (Termcap_Initalized == 0) - return NULL; - -#ifdef USE_TERMCAP - s = tgetstr (s, &Termcap_String_Ptr); -#else - s = _SLtt_tigetstr (Terminfo, s); -#endif - return fixup_tgetstr (s); -} - -int SLtt_tgetnum (char *s) -{ - if (Termcap_Initalized == 0) - return -1; -#ifdef USE_TERMCAP - return tgetnum (s); -#else - return _SLtt_tigetnum (Terminfo, s); -#endif -} - -int SLtt_tgetflag (char *s) -{ - if (Termcap_Initalized == 0) - return -1; -#ifdef USE_TERMCAP - return tgetflag (s); -#else - return _SLtt_tigetflag (Terminfo, s); -#endif -} - -static int Vt100_Like = 0; - -void SLtt_get_terminfo (void) -{ - char *term; - int status; - - term = getenv ("TERM"); - if (term == NULL) - SLang_exit_error("TERM environment variable needs set."); - - if (0 == (status = SLtt_initialize (term))) - return; - - if (status == -1) - { - SLang_exit_error ("Unknown terminal: %s\n\ -Check the TERM environment variable.\n\ -Also make sure that the terminal is defined in the terminfo database.\n\ -Alternatively, set the TERMCAP environment variable to the desired\n\ -termcap entry.", - term); - } - - if (status == -2) - { - SLang_exit_error ("\ -Your terminal lacks the ability to clear the screen or position the cursor.\n"); - } -} - -/* Returns 0 if all goes well, -1 if terminal capabilities cannot be deduced, - * or -2 if terminal cannot position the cursor. - */ -int SLtt_initialize (char *term) -{ - char *t, ch; - int is_xterm; - int almost_vtxxx; - - if (SLang_TT_Write_FD == -1) - { - /* Apparantly, this cannot fail according to the man pages. */ - SLang_TT_Write_FD = fileno (stdout); - } - - if (term == NULL) - { - term = getenv ("TERM"); - if (term == NULL) - return -1; - } - - Linux_Console = (!strncmp (term, "linux", 5) -# ifdef linux - || !strncmp(term, "con", 3) -# endif - ); - - t = term; - - if (strcmp(t, "vt52") && (*t++ == 'v') && (*t++ == 't') - && (ch = *t, (ch >= '1') && (ch <= '9'))) Vt100_Like = 1; - - is_xterm = ((0 == strncmp (term, "xterm", 5)) - || (0 == strncmp (term, "rxvt", 4)) - || (0 == strncmp (term, "Eterm", 5))); - - almost_vtxxx = (Vt100_Like - || Linux_Console - || is_xterm - || !strcmp (term, "screen")); - -# ifndef USE_TERMCAP - if (NULL == (Terminfo = _SLtt_tigetent (term))) - { - if (almost_vtxxx) /* Special cases. */ - { - int vt102 = 1; - if (!strcmp (term, "vt100")) vt102 = 0; - get_color_info (); - SLtt_set_term_vtxxx (&vt102); - return 0; - } - return -1; - } -# else /* USE_TERMCAP */ - if (1 != tgetent(Termcap_Buf, term)) - return -1; - Termcap_String_Ptr = Termcap_String_Buf; -# endif /* NOT USE_TERMCAP */ - - Termcap_Initalized = 1; - - Cls_Str = SLtt_tgetstr ("cl"); - Curs_Pos_Str = SLtt_tgetstr ("cm"); - - if ((NULL == (Ins_Mode_Str = SLtt_tgetstr("im"))) - || ( NULL == (Eins_Mode_Str = SLtt_tgetstr("ei"))) - || ( NULL == (Del_Char_Str = SLtt_tgetstr("dc")))) - SLtt_Term_Cannot_Insert = 1; - - Visible_Bell_Str = SLtt_tgetstr ("vb"); - Curs_Up_Str = SLtt_tgetstr ("up"); - Rev_Scroll_Str = SLtt_tgetstr("sr"); - Del_N_Lines_Str = SLtt_tgetstr("DL"); - Add_N_Lines_Str = SLtt_tgetstr("AL"); - - /* Actually these are used to initialize terminals that use cursor - * addressing. Hard to believe. - */ - Term_Init_Str = SLtt_tgetstr ("ti"); - Term_Reset_Str = SLtt_tgetstr ("te"); - - /* If I do this for vtxxx terminals, arrow keys start sending ESC O A, - * which I do not want. This is mainly for HP terminals. - */ - if ((almost_vtxxx == 0) || SLtt_Force_Keypad_Init) - { - Keypad_Init_Str = SLtt_tgetstr ("ks"); - Keypad_Reset_Str = SLtt_tgetstr ("ke"); - } - - /* Make up for defective termcap/terminfo databases */ - if ((Vt100_Like && (term[2] != '1')) - || Linux_Console - || is_xterm - ) - { - if (Del_N_Lines_Str == NULL) Del_N_Lines_Str = "\033[%dM"; - if (Add_N_Lines_Str == NULL) Add_N_Lines_Str = "\033[%dL"; - } - - Scroll_R_Str = SLtt_tgetstr("cs"); - - SLtt_get_screen_size (); - - if ((Scroll_R_Str == NULL) - || (((NULL == Del_N_Lines_Str) || (NULL == Add_N_Lines_Str)) - && (NULL == Rev_Scroll_Str))) - { - if (is_xterm - || Linux_Console - ) - { - /* Defective termcap mode!!!! */ - SLtt_set_term_vtxxx (NULL); - } - else SLtt_Term_Cannot_Scroll = 1; - } - - Del_Eol_Str = SLtt_tgetstr("ce"); - Del_Bol_Str = SLtt_tgetstr("cb"); - if (is_xterm && (Del_Bol_Str == NULL)) - Del_Bol_Str = "\033[1K"; - if (is_xterm && (Del_Eol_Str == NULL)) - Del_Bol_Str = "\033[K"; - - Rev_Vid_Str = SLtt_tgetstr("mr"); - if (Rev_Vid_Str == NULL) Rev_Vid_Str = SLtt_tgetstr("so"); - - Bold_Vid_Str = SLtt_tgetstr("md"); - - /* Although xterm cannot blink, it does display the blinking characters - * as bold ones. Some Rxvt will display the background as high intensity. - */ - if ((NULL == (Blink_Vid_Str = SLtt_tgetstr("mb"))) - && is_xterm) - Blink_Vid_Str = "\033[5m"; - - UnderLine_Vid_Str = SLtt_tgetstr("us"); - - Start_Alt_Chars_Str = SLtt_tgetstr ("as"); /* smacs */ - End_Alt_Chars_Str = SLtt_tgetstr ("ae"); /* rmacs */ - Enable_Alt_Char_Set = SLtt_tgetstr ("eA"); /* enacs */ - SLtt_Graphics_Char_Pairs = SLtt_tgetstr ("ac"); - - if (NULL == SLtt_Graphics_Char_Pairs) - { - /* make up for defective termcap/terminfo */ - if (Vt100_Like) - { - Start_Alt_Chars_Str = "\016"; - End_Alt_Chars_Str = "\017"; - Enable_Alt_Char_Set = "\033)0"; - } - } - - /* aixterm added by willi */ - if (is_xterm || !strncmp (term, "aixterm", 7)) - { - Start_Alt_Chars_Str = "\016"; - End_Alt_Chars_Str = "\017"; - Enable_Alt_Char_Set = "\033(B\033)0"; - } - - if ((SLtt_Graphics_Char_Pairs == NULL) && - ((Start_Alt_Chars_Str == NULL) || (End_Alt_Chars_Str == NULL))) - { - SLtt_Has_Alt_Charset = 0; - Enable_Alt_Char_Set = NULL; - } - else SLtt_Has_Alt_Charset = 1; - -#ifdef AMIGA - Enable_Alt_Char_Set = Start_Alt_Chars_Str = End_Alt_Chars_Str = NULL; -#endif - - /* status line capabilities */ - if ((SLtt_Has_Status_Line == -1) - && (0 != (SLtt_Has_Status_Line = TGETFLAG ("hs")))) - { - Disable_Status_line_Str = SLtt_tgetstr ("ds"); - Return_From_Status_Line_Str = SLtt_tgetstr ("fs"); - Goto_Status_Line_Str = SLtt_tgetstr ("ts"); - /* Status_Line_Esc_Ok = TGETFLAG("es"); */ - Num_Status_Line_Columns = SLtt_tgetnum ("ws"); - if (Num_Status_Line_Columns < 0) Num_Status_Line_Columns = 0; - } - - if (NULL == (Norm_Vid_Str = SLtt_tgetstr("me"))) - { - Norm_Vid_Str = SLtt_tgetstr("se"); - } - - Cursor_Invisible_Str = SLtt_tgetstr("vi"); - Cursor_Visible_Str = SLtt_tgetstr("ve"); - - Curs_F_Str = SLtt_tgetstr("RI"); - -# if 0 - if (NULL != Curs_F_Str) - { - Len_Curs_F_Str = strlen(Curs_F_Str); - } - else Len_Curs_F_Str = strlen(Curs_Pos_Str); -# endif - - Automatic_Margins = TGETFLAG ("am"); - /* No_Move_In_Standout = !TGETFLAG ("ms"); */ -# ifdef HP_GLITCH_CODE - Has_HP_Glitch = TGETFLAG ("xs"); -# else - Worthless_Highlight = TGETFLAG ("xs"); -# endif - - if (Worthless_Highlight == 0) - { /* Magic cookie glitch */ - Worthless_Highlight = (SLtt_tgetnum ("sg") > 0); - } - - if (Worthless_Highlight) - SLtt_Has_Alt_Charset = 0; - - Reset_Color_String = SLtt_tgetstr ("op"); - Color_Fg_Str = SLtt_tgetstr ("AF"); /* ANSI setaf */ - Color_Bg_Str = SLtt_tgetstr ("AB"); /* ANSI setbf */ - if ((Color_Fg_Str == NULL) || (Color_Bg_Str == NULL)) - { - Color_Fg_Str = SLtt_tgetstr ("Sf"); /* setf */ - Color_Bg_Str = SLtt_tgetstr ("Sb"); /* setb */ - } - - if ((Max_Terminfo_Colors = SLtt_tgetnum ("Co")) < 0) - Max_Terminfo_Colors = 8; - - if ((Color_Bg_Str != NULL) && (Color_Fg_Str != NULL)) - SLtt_Use_Ansi_Colors = 1; - else - { -#if 0 - Color_Fg_Str = "%?%p1%{7}%>%t\033[1;3%p1%{8}%m%dm%e\033[3%p1%dm%;"; - Color_Bg_Str = "%?%p1%{7}%>%t\033[5;4%p1%{8}%m%dm%e\033[4%p1%dm%;"; - Max_Terminfo_Colors = 16; -#else - Color_Fg_Str = "\033[3%dm"; - Color_Bg_Str = "\033[4%dm"; - Max_Terminfo_Colors = 8; -#endif - } - -#if SLTT_HAS_NON_BCE_SUPPORT - Can_Background_Color_Erase = TGETFLAG ("ut"); /* bce */ - /* Modern xterms have the BCE capability as well as the linux console */ - if (Can_Background_Color_Erase == 0) - { - Can_Background_Color_Erase = (Linux_Console -# if SLTT_XTERM_ALWAYS_BCE - || is_xterm -# endif - ); - } -#endif - get_color_info (); - - - if ((Cls_Str == NULL) - || (Curs_Pos_Str == NULL)) - return -2; - - return 0; -} - -#endif -/* Unix */ - -/* specific to vtxxx only */ -void SLtt_enable_cursor_keys (void) -{ -#ifdef __unix__ - if (Vt100_Like) -#endif - tt_write_string("\033=\033[?1l"); -} - -#ifdef VMS -int SLtt_initialize (char *term) -{ - SLtt_get_terminfo (); - return 0; -} - -void SLtt_get_terminfo () -{ - int zero = 0; - - Color_Fg_Str = "\033[3%dm"; - Color_Bg_Str = "\033[4%dm"; - Max_Terminfo_Colors = 8; - - get_color_info (); - - SLtt_set_term_vtxxx(&zero); - Start_Alt_Chars_Str = "\016"; - End_Alt_Chars_Str = "\017"; - SLtt_Has_Alt_Charset = 1; - SLtt_Graphics_Char_Pairs = "aaffgghhjjkkllmmnnooqqssttuuvvwwxx"; - Enable_Alt_Char_Set = "\033(B\033)0"; - SLtt_get_screen_size (); -} -#endif - -/* This sets term for vt102 terminals it parameter vt100 is 0. If vt100 - * is non-zero, set terminal appropriate for a only vt100 - * (no add line capability). */ - -void SLtt_set_term_vtxxx(int *vt100) -{ - Norm_Vid_Str = "\033[m"; - - Scroll_R_Str = "\033[%i%d;%dr"; - Cls_Str = "\033[2J\033[H"; - Rev_Vid_Str = "\033[7m"; - Bold_Vid_Str = "\033[1m"; - Blink_Vid_Str = "\033[5m"; - UnderLine_Vid_Str = "\033[4m"; - Del_Eol_Str = "\033[K"; - Del_Bol_Str = "\033[1K"; - Rev_Scroll_Str = "\033M"; - Curs_F_Str = "\033[%dC"; - /* Len_Curs_F_Str = 5; */ - Curs_Pos_Str = "\033[%i%d;%dH"; - if ((vt100 == NULL) || (*vt100 == 0)) - { - Ins_Mode_Str = "\033[4h"; - Eins_Mode_Str = "\033[4l"; - Del_Char_Str = "\033[P"; - Del_N_Lines_Str = "\033[%dM"; - Add_N_Lines_Str = "\033[%dL"; - SLtt_Term_Cannot_Insert = 0; - } - else - { - Del_N_Lines_Str = NULL; - Add_N_Lines_Str = NULL; - SLtt_Term_Cannot_Insert = 1; - } - SLtt_Term_Cannot_Scroll = 0; - /* No_Move_In_Standout = 0; */ -} - -int SLtt_init_video (void) -{ - /* send_string_to_term("\033[?6h"); */ - /* relative origin mode */ - tt_write_string (Term_Init_Str); - tt_write_string (Keypad_Init_Str); - SLtt_reset_scroll_region(); - SLtt_end_insert(); - tt_write_string (Enable_Alt_Char_Set); - Video_Initialized = 1; - return 0; -} - -int SLtt_reset_video (void) -{ - SLtt_goto_rc (SLtt_Screen_Rows - 1, 0); - Cursor_Set = 0; - SLtt_normal_video (); /* MSKermit requires this */ - tt_write_string(Norm_Vid_Str); - - Current_Fgbg = 0xFFFFFFFFU; - SLtt_set_alt_char_set (0); - if (SLtt_Use_Ansi_Colors) - { - if (Reset_Color_String == NULL) - { - SLtt_Char_Type attr; - if (-1 != make_color_fgbg (NULL, NULL, &attr)) - write_attributes (attr); - else tt_write_string ("\033[0m\033[m"); - } - else tt_write_string (Reset_Color_String); - Current_Fgbg = 0xFFFFFFFFU; - } - SLtt_erase_line (); - tt_write_string (Keypad_Reset_Str); - tt_write_string (Term_Reset_Str); - SLtt_flush_output (); - Video_Initialized = 0; - return 0; -} - -void SLtt_bold_video (void) -{ - tt_write_string (Bold_Vid_Str); -} - -int SLtt_set_mouse_mode (int mode, int force) -{ - char *term; - - if (force == 0) - { - if (NULL == (term = (char *) getenv("TERM"))) return -1; - if (strncmp ("xterm", term, 5)) - return -1; - } - - if (mode) - tt_write_string ("\033[?9h"); - else - tt_write_string ("\033[?9l"); - - return 0; -} - -void SLtt_disable_status_line (void) -{ - if (SLtt_Has_Status_Line > 0) - { - tt_write_string (Disable_Status_line_Str); - SLtt_flush_output (); - } -} - -int SLtt_write_to_status_line (char *s, int col) -{ - if ((SLtt_Has_Status_Line <= 0) - || (Goto_Status_Line_Str == NULL) - || (Return_From_Status_Line_Str == NULL)) - return -1; - - tt_printf (Goto_Status_Line_Str, col, 0); - tt_write_string (s); - tt_write_string (Return_From_Status_Line_Str); - return 0; -} - -void SLtt_get_screen_size (void) -{ -#ifdef VMS - int status, code; - unsigned short chan; - $DESCRIPTOR(dev_dsc, "SYS$INPUT:"); -#endif - int r = 0, c = 0; - -#ifdef TIOCGWINSZ - struct winsize wind_struct; - - do - { - if ((ioctl(1,TIOCGWINSZ,&wind_struct) == 0) - || (ioctl(0, TIOCGWINSZ, &wind_struct) == 0) - || (ioctl(2, TIOCGWINSZ, &wind_struct) == 0)) - { - c = (int) wind_struct.ws_col; - r = (int) wind_struct.ws_row; - break; - } - } - while (errno == EINTR); - -#endif - -#ifdef VMS - status = sys$assign(&dev_dsc,&chan,0,0,0); - if (status & 1) - { - code = DVI$_DEVBUFSIZ; - status = lib$getdvi(&code, &chan,0, &c, 0,0); - if (!(status & 1)) - c = 80; - code = DVI$_TT_PAGE; - status = lib$getdvi(&code, &chan,0, &r, 0,0); - if (!(status & 1)) - r = 24; - sys$dassgn(chan); - } -#endif - - if (r <= 0) - { - char *s = getenv ("LINES"); - if (s != NULL) r = atoi (s); - } - - if (c <= 0) - { - char *s = getenv ("COLUMNS"); - if (s != NULL) c = atoi (s); - } - - if (r <= 0) r = 24; - if (c <= 0) c = 80; -#if 0 - if ((r <= 0) || (r > 200)) r = 24; - if ((c <= 0) || (c > 250)) c = 80; -#endif - SLtt_Screen_Rows = r; - SLtt_Screen_Cols = c; -} - -#if SLTT_HAS_NON_BCE_SUPPORT -int _SLtt_get_bce_color_offset (void) -{ - if ((SLtt_Use_Ansi_Colors == 0) - || Can_Background_Color_Erase - || SLtt_Use_Blink_For_ACS) /* in this case, we cannot lose a color */ - Bce_Color_Offset = 0; - else - { - if (GET_BG(Ansi_Color_Map[0].fgbg) == SLSMG_COLOR_DEFAULT) - Bce_Color_Offset = 0; - else - Bce_Color_Offset = 1; - } - - return Bce_Color_Offset; -} -#endif diff --git a/mdk-stage1/slang/slerr.c b/mdk-stage1/slang/slerr.c deleted file mode 100644 index 139b3859b..000000000 --- a/mdk-stage1/slang/slerr.c +++ /dev/null @@ -1,181 +0,0 @@ -/* error handling common to all routines. */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -void (*SLang_VMessage_Hook) (char *, va_list); -void (*SLang_Error_Hook)(char *); -void (*SLang_Exit_Error_Hook)(char *, va_list); -volatile int SLang_Error = 0; -char *SLang_Error_Message; -volatile int SLKeyBoard_Quit = 0; - -static char *get_error_string (void) -{ - char *str; - - if (!SLang_Error) SLang_Error = SL_UNKNOWN_ERROR; - if (SLang_Error_Message != NULL) str = SLang_Error_Message; - else switch(SLang_Error) - { - case SL_NOT_IMPLEMENTED: str = "Not Implemented"; break; - case SL_APPLICATION_ERROR: str = "Application Error"; break; - case SL_VARIABLE_UNINITIALIZED: str = "Variable Uninitialized"; break; - case SL_MALLOC_ERROR : str = "Malloc Error"; break; - case SL_INTERNAL_ERROR: str = "Internal Error"; break; - case SL_STACK_OVERFLOW: str = "Stack Overflow"; break; - case SL_STACK_UNDERFLOW: str = "Stack Underflow"; break; - case SL_INTRINSIC_ERROR: str = "Intrinsic Error"; break; - case SL_USER_BREAK: str = "User Break"; break; - case SL_UNDEFINED_NAME: str = "Undefined Name"; break; - case SL_SYNTAX_ERROR: str = "Syntax Error"; break; - case SL_DUPLICATE_DEFINITION: str = "Duplicate Definition"; break; - case SL_TYPE_MISMATCH: str = "Type Mismatch"; break; - case SL_READONLY_ERROR: str = "Variable is read-only"; break; - case SL_DIVIDE_ERROR: str = "Divide by zero"; break; - case SL_OBJ_NOPEN: str = "Object not opened"; break; - case SL_OBJ_UNKNOWN: str = "Object unknown"; break; - case SL_INVALID_PARM: str = "Invalid Parameter"; break; - case SL_TYPE_UNDEFINED_OP_ERROR: - str = "Operation not defined for datatype"; break; - case SL_USER_ERROR: - str = "User Error"; break; - case SL_USAGE_ERROR: - str = "Illegal usage of function"; - break; - case SL_FLOATING_EXCEPTION: - str = "Floating Point Exception"; - break; - case SL_UNKNOWN_ERROR: - default: str = "Unknown Error Code"; - } - - SLang_Error_Message = NULL; - return str; -} - -void SLang_doerror (char *error) -{ - char *str = NULL; - char *err; - char *malloced_err_buf; - char err_buf [1024]; - - malloced_err_buf = NULL; - - if (((SLang_Error == SL_USER_ERROR) - || (SLang_Error == SL_USAGE_ERROR)) - && (error != NULL) && (*error != 0)) - err = error; - else - { - char *sle = "S-Lang Error: "; - unsigned int len; - char *fmt; - - str = get_error_string (); - - fmt = "%s%s%s"; - if ((error == NULL) || (*error == 0)) - error = ""; - else if (SLang_Error == SL_UNKNOWN_ERROR) - /* Do not display an unknown error message if error is non-NULL */ - str = ""; - else - fmt = "%s%s: %s"; - - len = strlen (sle) + strlen (str) + strlen(error) + 1; - - err = err_buf; - if (len >= sizeof (err_buf)) - { - if (NULL == (malloced_err_buf = SLmalloc (len))) - err = NULL; - else - err = malloced_err_buf; - } - - if (err != NULL) sprintf (err, fmt, sle, str, error); - else err = "Out of memory"; - } - - if (SLang_Error_Hook == NULL) - { - fputs (err, stderr); - fputs("\r\n", stderr); - fflush (stderr); - } - else - (*SLang_Error_Hook)(err); - - SLfree (malloced_err_buf); -} - -void SLang_verror (int err_code, char *fmt, ...) -{ - va_list ap; - char err [1024]; - - if (err_code == 0) err_code = SL_INTRINSIC_ERROR; - if (SLang_Error == 0) SLang_Error = err_code; - - if (fmt != NULL) - { - va_start(ap, fmt); - (void) _SLvsnprintf (err, sizeof (err), fmt, ap); - fmt = err; - va_end(ap); - } - - SLang_doerror (fmt); -} - -void SLang_exit_error (char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - if (SLang_Exit_Error_Hook != NULL) - { - (*SLang_Exit_Error_Hook) (fmt, ap); - exit (1); - } - - if (fmt != NULL) - { - vfprintf (stderr, fmt, ap); - fputs ("\r\n", stderr); - fflush (stderr); - } - va_end (ap); - - exit (1); -} - -void SLang_vmessage (char *fmt, ...) -{ - va_list ap; - - if (fmt == NULL) - return; - - va_start (ap, fmt); - - if (SLang_VMessage_Hook != NULL) - (*SLang_VMessage_Hook) (fmt, ap); - else - { - vfprintf (stdout, fmt, ap); - fputs ("\r\n", stdout); - } - - va_end (ap); -} diff --git a/mdk-stage1/slang/slerrno.c b/mdk-stage1/slang/slerrno.c deleted file mode 100644 index 662fadde1..000000000 --- a/mdk-stage1/slang/slerrno.c +++ /dev/null @@ -1,219 +0,0 @@ -/* The point of this file is to handle errno values in a system independent - * way so that they may be used in slang scripts. - */ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include -#include "slang.h" -#include "_slang.h" - -typedef struct -{ - char *msg; - int sys_errno; - char *symbolic_name; -} -Errno_Map_Type; - -static Errno_Map_Type Errno_Map [] = -{ -#ifndef EPERM -# define EPERM -1 -#endif - {"Not owner", EPERM, "EPERM"}, -#ifndef ENOENT -# define ENOENT -1 -#endif - {"No such file or directory", ENOENT, "ENOENT"}, -#ifndef ESRCH -# define ESRCH -1 -#endif - {"No such process", ESRCH, "ESRCH"}, -#ifndef EINTR -# define EINTR -1 -#endif - {"Interrupted system call", EINTR, "EINTR"}, -#ifndef EIO -# define EIO -1 -#endif - {"I/O error", EIO, "EIO"}, -#ifndef ENXIO -# define ENXIO -1 -#endif - {"No such device or address", ENXIO, "ENXIO"}, -#ifndef E2BIG -# define E2BIG -1 -#endif - {"Arg list too long", E2BIG, "E2BIG"}, -#ifndef ENOEXEC -# define ENOEXEC -1 -#endif - {"Exec format error", ENOEXEC,"ENOEXEC"}, -#ifndef EBADF -# define EBADF -1 -#endif - {"Bad file number", EBADF, "EBADF"}, -#ifndef ECHILD -# define ECHILD -1 -#endif - {"No children", ECHILD, "ECHILD"}, -#ifndef EAGAIN -# define EAGAIN -1 -#endif - {"Try again", EAGAIN, "EAGAIN"}, -#ifndef ENOMEM -# define ENOMEM -1 -#endif - {"Not enough core", ENOMEM, "ENOMEM"}, -#ifndef EACCES -# define EACCES -1 -#endif - {"Permission denied", EACCES, "EACCES"}, -#ifndef EFAULT -# define EFAULT -1 -#endif - {"Bad address", EFAULT, "EFAULT"}, -#ifndef ENOTBLK -# define ENOTBLK -1 -#endif - {"Block device required", ENOTBLK, "ENOTBLK"}, -#ifndef EBUSY -# define EBUSY -1 -#endif - {"Mount device busy", EBUSY, "EBUSY"}, -#ifndef EEXIST -# define EEXIST -1 -#endif - {"File exists", EEXIST, "EEXIST"}, -#ifndef EXDEV -# define EXDEV -1 -#endif - {"Cross-device link", EXDEV, "EXDEV"}, -#ifndef ENODEV -# define ENODEV -1 -#endif - {"No such device", ENODEV, "ENODEV"}, -#ifndef ENOTDIR -# define ENOTDIR -1 -#endif - {"Not a directory", ENOTDIR, "ENOTDIR"}, -#ifndef EISDIR -# define EISDIR -1 -#endif - {"Is a directory", EISDIR, "EISDIR"}, -#ifndef EINVAL -# define EINVAL -1 -#endif - {"Invalid argument", EINVAL, "EINVAL"}, -#ifndef ENFILE -# define ENFILE -1 -#endif - {"File table overflow", ENFILE, "ENFILE"}, -#ifndef EMFILE -# define EMFILE -1 -#endif - {"Too many open files", EMFILE, "EMFILE"}, -#ifndef ENOTTY -# define ENOTTY -1 -#endif - {"Not a typewriter", ENOTTY, "ENOTTY"}, -#ifndef ETXTBSY -# define ETXTBSY -1 -#endif - {"Text file busy", ETXTBSY, "ETXTBSY"}, -#ifndef EFBIG -# define EFBIG -1 -#endif - {"File too large", EFBIG, "EFBIG"}, -#ifndef ENOSPC -# define ENOSPC -1 -#endif - {"No space left on device", ENOSPC, "ENOSPC"}, -#ifndef ESPIPE -# define ESPIPE -1 -#endif - {"Illegal seek", ESPIPE, "ESPIPE"}, -#ifndef EROFS -# define EROFS -1 -#endif - {"Read-only file system", EROFS, "EROFS"}, -#ifndef EMLINK -# define EMLINK -1 -#endif - {"Too many links", EMLINK, "EMLINK"}, -#ifndef EPIPE -# define EPIPE -1 -#endif - {"Broken pipe", EPIPE, "EPIPE"}, -#ifndef ELOOP -# define ELOOP -1 -#endif - {"Too many levels of symbolic links",ELOOP, "ELOOP"}, -#ifndef ENAMETOOLONG -# define ENAMETOOLONG -1 -#endif - {"File name too long", ENAMETOOLONG, "ENAMETOOLONG"}, - - {NULL, 0, NULL} -}; - -int _SLerrno_errno; - -int SLerrno_set_errno (int sys_errno) -{ - _SLerrno_errno = sys_errno; - return 0; -} - -char *SLerrno_strerror (int sys_errno) -{ - Errno_Map_Type *e; - - e = Errno_Map; - while (e->msg != NULL) - { - if (e->sys_errno == sys_errno) - return e->msg; - - e++; - } - - if (sys_errno == SL_ERRNO_NOT_IMPLEMENTED) - return "System call not available for this platform"; - - return "Unknown error"; -} - -static char *intrin_errno_string (int *sys_errno) -{ - return SLerrno_strerror (*sys_errno); -} - -int _SLerrno_init (void) -{ - static Errno_Map_Type *e; - - if (e != NULL) /* already initialized */ - return 0; - - if ((-1 == SLadd_intrinsic_function ("errno_string", (FVOID_STAR) intrin_errno_string, - SLANG_STRING_TYPE, 1, SLANG_INT_TYPE)) - || (-1 == SLadd_intrinsic_variable ("errno", (VOID_STAR)&_SLerrno_errno, SLANG_INT_TYPE, 1))) - return -1; - - e = Errno_Map; - while (e->msg != NULL) - { - if (-1 == SLadd_intrinsic_variable (e->symbolic_name, (VOID_STAR) &e->sys_errno, SLANG_INT_TYPE, 1)) - return -1; - e++; - } - - return 0; -} diff --git a/mdk-stage1/slang/slgetkey.c b/mdk-stage1/slang/slgetkey.c deleted file mode 100644 index 2f2914f07..000000000 --- a/mdk-stage1/slang/slgetkey.c +++ /dev/null @@ -1,306 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -unsigned int SLang_Input_Buffer_Len = 0; -unsigned char SLang_Input_Buffer [SL_MAX_INPUT_BUFFER_LEN]; - -int SLang_Abort_Char = 7; -int SLang_Ignore_User_Abort = 0; - -/* This has the effect of mapping all characters in the range 128-169 to - * ESC [ something - */ - -unsigned int SLang_getkey (void) -{ - unsigned int imax; - unsigned int ch; - - if (SLang_Input_Buffer_Len) - { - ch = (unsigned int) *SLang_Input_Buffer; - SLang_Input_Buffer_Len--; - imax = SLang_Input_Buffer_Len; - - SLMEMCPY ((char *) SLang_Input_Buffer, - (char *) (SLang_Input_Buffer + 1), imax); - } - else if (SLANG_GETKEY_ERROR == (ch = _SLsys_getkey ())) return ch; - -#if _SLANG_MAP_VTXXX_8BIT -# if !defined(IBMPC_SYSTEM) - if (ch & 0x80) - { - unsigned char i; - i = (unsigned char) (ch & 0x7F); - if (i < ' ') - { - i += 64; - SLang_ungetkey (i); - ch = 27; - } - } -# endif -#endif - return(ch); -} - -int SLang_ungetkey_string (unsigned char *s, unsigned int n) -{ - register unsigned char *bmax, *b, *b1; - if (SLang_Input_Buffer_Len + n + 3 > SL_MAX_INPUT_BUFFER_LEN) - return -1; - - b = SLang_Input_Buffer; - bmax = (b - 1) + SLang_Input_Buffer_Len; - b1 = bmax + n; - while (bmax >= b) *b1-- = *bmax--; - bmax = b + n; - while (b < bmax) *b++ = *s++; - SLang_Input_Buffer_Len += n; - return 0; -} - -int SLang_buffer_keystring (unsigned char *s, unsigned int n) -{ - - if (n + SLang_Input_Buffer_Len + 3 > SL_MAX_INPUT_BUFFER_LEN) return -1; - - SLMEMCPY ((char *) SLang_Input_Buffer + SLang_Input_Buffer_Len, - (char *) s, n); - SLang_Input_Buffer_Len += n; - return 0; -} - -int SLang_ungetkey (unsigned char ch) -{ - return SLang_ungetkey_string(&ch, 1); -} - -int SLang_input_pending (int tsecs) -{ - int n; - unsigned char c; - if (SLang_Input_Buffer_Len) return (int) SLang_Input_Buffer_Len; - - n = _SLsys_input_pending (tsecs); - - if (n <= 0) return 0; - - c = (unsigned char) SLang_getkey (); - SLang_ungetkey_string (&c, 1); - - return n; -} - -void SLang_flush_input (void) -{ - int quit = SLKeyBoard_Quit; - - SLang_Input_Buffer_Len = 0; - SLKeyBoard_Quit = 0; - while (_SLsys_input_pending (0) > 0) - { - (void) _SLsys_getkey (); - /* Set this to 0 because _SLsys_getkey may stuff keyboard buffer if - * key sends key sequence (OS/2, DOS, maybe VMS). - */ - SLang_Input_Buffer_Len = 0; - } - SLKeyBoard_Quit = quit; -} - -#ifdef IBMPC_SYSTEM -static int Map_To_ANSI; -int SLgetkey_map_to_ansi (int enable) -{ - Map_To_ANSI = enable; - return 0; -} - -static int convert_scancode (unsigned int scan, - unsigned int shift, - int getkey, - unsigned int *ret_key) -{ - unsigned char buf[16]; - unsigned char *b; - unsigned char end; - int is_arrow; - - shift &= (_SLTT_KEY_ALT|_SLTT_KEY_SHIFT|_SLTT_KEY_CTRL); - - b = buf; - if (_SLTT_KEY_ALT == shift) - { - shift = 0; - *b++ = 27; - } - *b++ = 27; - *b++ = '['; - - is_arrow = 0; - end = '~'; - if (shift) - { - if (shift == _SLTT_KEY_CTRL) - end = '^'; - else if (shift == _SLTT_KEY_SHIFT) - end = '$'; - else shift = 0; - } - - /* These mappings correspond to what rxvt produces under Linux */ - switch (scan & 0xFF) - { - default: - return -1; - - case 0x47: /* home */ - *b++ = '1'; - break; - case 0x48: /* up */ - end = 'A'; - is_arrow = 1; - break; - case 0x49: /* PgUp */ - *b++ = '5'; - break; - case 0x4B: /* Left */ - end = 'D'; - is_arrow = 1; - break; - case 0x4D: /* Right */ - end = 'C'; - is_arrow = 1; - break; - case 0x4F: /* End */ - *b++ = '4'; - break; - case 0x50: /* Down */ - end = 'B'; - is_arrow = 1; - break; - case 0x51: /* PgDn */ - *b++ = '6'; - break; - case 0x52: /* Insert */ - *b++ = '2'; - break; - case 0x53: /* Delete */ - *b++ = '3'; - break; - case ';': /* F1 */ - *b++ = '1'; - *b++ = '1'; - break; - case '<': /* F2 */ - *b++ = '1'; - *b++ = '2'; - break; - case '=': /* F3 */ - *b++ = '1'; - *b++ = '3'; - break; - - case '>': /* F4 */ - *b++ = '1'; - *b++ = '4'; - break; - - case '?': /* F5 */ - *b++ = '1'; - *b++ = '5'; - break; - - case '@': /* F6 */ - *b++ = '1'; - *b++ = '7'; - break; - - case 'A': /* F7 */ - *b++ = '1'; - *b++ = '8'; - break; - - case 'B': /* F8 */ - *b++ = '1'; - *b++ = '9'; - break; - - case 'C': /* F9 */ - *b++ = '2'; - *b++ = '0'; - break; - - case 'D': /* F10 */ - *b++ = '2'; - *b++ = '1'; - break; - - case 0x57: /* F11 */ - *b++ = '2'; - *b++ = '3'; - break; - - case 0x58: /* F12 */ - *b++ = '2'; - *b++ = '4'; - break; - } - - if (is_arrow && shift) - { - if (shift == _SLTT_KEY_CTRL) - end &= 0x1F; - else - end |= 0x20; - } - *b++ = end; - - if (getkey) - { - (void) SLang_buffer_keystring (buf + 1, (unsigned int) (b - (buf + 1))); - *ret_key = buf[0]; - return 0; - } - - (void) SLang_buffer_keystring (buf, (unsigned int) (b - buf)); - return 0; -} - - -unsigned int _SLpc_convert_scancode (unsigned int scan, - unsigned int shift, - int getkey) -{ - unsigned char buf[16]; - - if (Map_To_ANSI) - { - if (0 == convert_scancode (scan, shift, getkey, &scan)) - return scan; - } - - if (getkey) - { - buf[0] = scan & 0xFF; - SLang_buffer_keystring (buf, 1); - return (scan >> 8) & 0xFF; - } - buf[0] = (scan >> 8) & 0xFF; - buf[1] = scan & 0xFF; - (void) SLang_buffer_keystring (buf, 2); - return 0; -} - -#endif diff --git a/mdk-stage1/slang/slimport.c b/mdk-stage1/slang/slimport.c deleted file mode 100644 index 44b4b25e1..000000000 --- a/mdk-stage1/slang/slimport.c +++ /dev/null @@ -1,281 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -#define SLANG_HAS_DYNAMIC_LINKING 1 - -#ifndef HAVE_DLFCN_H -# undef SLANG_HAS_DYNAMIC_LINKING -# define SLANG_HAS_DYNAMIC_LINKING 0 -#endif - -/* The rest of this file is in the if block */ -#if SLANG_HAS_DYNAMIC_LINKING - -#ifdef HAVE_DLFCN_H -# include -#endif - -static char *Module_Path; -#define MODULE_PATH_ENV_NAME "SLANG_MODULE_PATH" -#ifndef MODULE_INSTALL_DIR -# define MODULE_INSTALL_DIR "/usr/local/lib/slang/modules" -#endif - -typedef struct _Handle_Type -{ - struct _Handle_Type *next; - char *name; - VOID_STAR handle; - void (*deinit_fun) (void); -} -Handle_Type; - -static Handle_Type *Handle_List; - -static void delete_handles (void) -{ - while (Handle_List != NULL) - { - Handle_Type *next = Handle_List->next; - - if (Handle_List->deinit_fun != NULL) - Handle_List->deinit_fun (); - (void) dlclose (Handle_List->handle); - SLang_free_slstring (Handle_List->name); - SLfree ((char *)Handle_List); - Handle_List = next; - } -} - -static Handle_Type *save_handle (char *name, VOID_STAR h, void (*df)(void)) -{ - Handle_Type *l; - - l = (Handle_Type *) SLmalloc (sizeof (Handle_Type)); - if (l == NULL) - return NULL; - memset ((char *) l, 0, sizeof(Handle_Type)); - if (NULL == (l->name = SLang_create_slstring (name))) - { - SLfree ((char *) l); - return NULL; - } - l->handle = h; - l->next = Handle_List; - l->deinit_fun = df; - Handle_List = l; - - return l; -} - -static Handle_Type *find_handle (char *name) -{ - Handle_Type *l; - - l = Handle_List; - while (l != NULL) - { - if (0 == strcmp (l->name, name)) - break; - l = l->next; - } - return l; -} - -static int import_from_library (char *name, - char *init_fun_name, char *deinit_fun_name, - char *file, - char *ns, - char *ns_init_fun_name) -{ - VOID_STAR handle; - int (*init_fun) (void); - int (*ns_init_fun) (char *); - void (*deinit_fun) (void); - char *err; - char filebuf[1024]; - char *fun_name; - - if (NULL != find_handle (name)) - return 0; /* already loaded */ - - while (1) - { -#ifndef RTLD_GLOBAL -# define RTLD_GLOBAL 0 -#endif -#ifdef RTLD_NOW - handle = (VOID_STAR) dlopen (file, RTLD_NOW | RTLD_GLOBAL); -#else - handle = (VOID_STAR) dlopen (file, RTLD_LAZY | RTLD_GLOBAL); -#endif - - if (handle != NULL) - break; - - if (NULL == strchr (file, '/')) - { - _SLsnprintf (filebuf, sizeof (filebuf), "./%s", file); - file = filebuf; - continue; - } - - if (NULL == (err = (char *) dlerror ())) - err = "UNKNOWN"; - - SLang_verror (SL_INTRINSIC_ERROR, - "Error linking to %s: %s", file, err); - return -1; - } - - fun_name = ns_init_fun_name; - ns_init_fun = (int (*)(char *)) dlsym (handle, fun_name); - if (ns_init_fun == NULL) - { - if ((ns != NULL) - && (0 != strcmp (ns, "Global"))) - goto return_error; - - fun_name = init_fun_name; - init_fun = (int (*)(void)) dlsym (handle, fun_name); - if (init_fun == NULL) - goto return_error; - - if (-1 == (*init_fun) ()) - { - dlclose (handle); - return -1; - } - } - else if (-1 == (*ns_init_fun) (ns)) - { - dlclose (handle); - return -1; - } - - - deinit_fun = (void (*)(void)) dlsym (handle, deinit_fun_name); - - (void) save_handle (name, handle, deinit_fun); - return 0; - - return_error: - - if (NULL == (err = (char *) dlerror ())) - err = "UNKNOWN"; - - dlclose (handle); - SLang_verror (SL_INTRINSIC_ERROR, - "Unable to get symbol %s from %s: %s", - name, file, err); - return -1; -} - -static void import_module (void) -{ - char module_name[256]; - char symbol_name[256]; - char deinit_name[256]; - char ns_init_name[256]; - char *path; - char *file; - char *module; - char *ns = NULL; - - if (SLang_Num_Function_Args == 2) - { - if (-1 == SLang_pop_slstring (&ns)) - return; - } - - if (-1 == SLang_pop_slstring (&module)) - { - SLang_free_slstring (ns); /* NULL ok */ - return; - } - - _SLsnprintf (symbol_name, sizeof(symbol_name), "init_%s_module", module); - _SLsnprintf (module_name, sizeof(module_name), "%s-module.so", module); - _SLsnprintf (deinit_name, sizeof(deinit_name), "deinit_%s_module", module); - _SLsnprintf (ns_init_name, sizeof (ns_init_name), "init_%s_module_ns", module); - - if (Module_Path != NULL) - file = SLpath_find_file_in_path (Module_Path, module_name); - else file = NULL; - - if ((file == NULL) - && (NULL != (path = getenv (MODULE_PATH_ENV_NAME)))) - file = SLpath_find_file_in_path (path, module_name); - - if (file == NULL) - file = SLpath_find_file_in_path (MODULE_INSTALL_DIR, module_name); - - if (file != NULL) - { - (void) import_from_library (symbol_name, symbol_name, deinit_name, file, ns, ns_init_name); - SLfree (file); - } - else - { - /* Maybe the system loader can find it in LD_LIBRARY_PATH */ - (void) import_from_library (symbol_name, symbol_name, deinit_name, module_name, ns, ns_init_name); - } -} - -static void set_import_module_path (char *path) -{ - (void) SLang_set_module_load_path (path); -} - -static char *get_import_module_path (void) -{ - char *path; - if (Module_Path != NULL) - return Module_Path; - if (NULL != (path = getenv (MODULE_PATH_ENV_NAME))) - return path; - return MODULE_INSTALL_DIR; -} - -static SLang_Intrin_Fun_Type Module_Intrins [] = -{ - MAKE_INTRINSIC_0("import", import_module, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("set_import_module_path", set_import_module_path, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("get_import_module_path", get_import_module_path, SLANG_STRING_TYPE), - SLANG_END_INTRIN_FUN_TABLE -}; - -#endif /* SLANG_HAS_DYNAMIC_LINKING */ - -int SLang_set_module_load_path (char *path) -{ -#if SLANG_HAS_DYNAMIC_LINKING - if (NULL == (path = SLang_create_slstring (path))) - return -1; - SLang_free_slstring (Module_Path); - Module_Path = path; - return 0; -#else - (void) path; - return -1; -#endif -} - -int SLang_init_import (void) -{ -#if SLANG_HAS_DYNAMIC_LINKING - (void) SLang_add_cleanup_function (delete_handles); - return SLadd_intrin_fun_table (Module_Intrins, "__IMPORT__"); -#else - return 0; -#endif -} diff --git a/mdk-stage1/slang/slinclud.h b/mdk-stage1/slang/slinclud.h deleted file mode 100644 index d60a4423e..000000000 --- a/mdk-stage1/slang/slinclud.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _SLANG_INCLUDE_H_ -#define _SLANG_INCLUDE_H_ - -#include "config.h" -#include "sl-feat.h" - -#include -#include - -#ifdef HAVE_STDLIB_H -# include -#endif - -#ifdef HAVE_UNISTD_H -# include -#endif - -#ifdef HAVE_MALLOC_H -# include -#endif - -#ifdef HAVE_MEMORY_H -# include -#endif - -#endif /* _SLANG_INCLUDE_H_ */ diff --git a/mdk-stage1/slang/slintall.c b/mdk-stage1/slang/slintall.c deleted file mode 100644 index a66b9d6d2..000000000 --- a/mdk-stage1/slang/slintall.c +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -int SLang_init_all (void) -{ - if ((-1 == SLang_init_slang ()) - || (-1 == SLang_init_slmath ()) - || (-1 == SLang_init_posix_dir ()) - || (-1 == SLang_init_posix_process ()) - || (-1 == SLang_init_stdio ()) - || (-1 == SLang_init_array ()) - || (-1 == SLang_init_posix_io ()) - || (-1 == SLang_init_ospath ()) - ) - return -1; - - return 0; -} - diff --git a/mdk-stage1/slang/slistruc.c b/mdk-stage1/slang/slistruc.c deleted file mode 100644 index 06b8fd6ff..000000000 --- a/mdk-stage1/slang/slistruc.c +++ /dev/null @@ -1,218 +0,0 @@ -/* Intrinsic Structure type implementation */ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -/* Intrinsic structures */ - -typedef struct -{ - char *name; - VOID_STAR addr; - SLang_IStruct_Field_Type *fields; -} -_SLang_IStruct_Type; - -static SLang_IStruct_Field_Type *istruct_pop_field (char *name, int no_readonly, VOID_STAR *addr) -{ - _SLang_IStruct_Type *s; - SLang_IStruct_Field_Type *f; - char *struct_addr; - - /* Note: There is no need to free this object */ - if (-1 == SLclass_pop_ptr_obj (SLANG_ISTRUCT_TYPE, (VOID_STAR *) &s)) - return NULL; - - if (NULL == (struct_addr = *(char **)s->addr)) - { - SLang_verror (SL_INTRINSIC_ERROR, - "%s is NULL. Unable to access field", s->name); - return NULL; - } - - f = s->fields; - while (f->field_name != NULL) - { - /* Since both these are slstrings, just test pointers */ - if (f->field_name != name) - { - f++; - continue; - } - - if (no_readonly && f->read_only) - { - SLang_verror (SL_READONLY_ERROR, - "%s.%s is read-only", s->name, name); - return NULL; - } - - *addr = (VOID_STAR) (struct_addr + f->offset); - return f; - } - - SLang_verror (SL_TYPE_MISMATCH, - "%s has no field called %s", s->name, name); - return NULL; -} - -static int istruct_sget (unsigned char type, char *name) -{ - SLang_IStruct_Field_Type *f; - VOID_STAR addr; - SLang_Class_Type *cl; - - if (NULL == (f = istruct_pop_field (name, 0, &addr))) - return -1; - - type = f->type; - cl = _SLclass_get_class (type); - - return (cl->cl_push_intrinsic)(f->type, addr); -} - -static int istruct_sput (unsigned char type, char *name) -{ - SLang_IStruct_Field_Type *f; - VOID_STAR addr; - SLang_Class_Type *cl; - - if (NULL == (f = istruct_pop_field (name, 1, &addr))) - return -1; - - type = f->type; - cl = _SLclass_get_class (type); - - return (*cl->cl_pop) (type, addr); -} - -static int istruct_push (unsigned char type, VOID_STAR ptr) -{ - _SLang_IStruct_Type *s; - - s = *(_SLang_IStruct_Type **) ptr; - if ((s == NULL) - || (s->addr == NULL) - || (*(char **) s->addr == NULL)) - return SLang_push_null (); - - return SLclass_push_ptr_obj (type, (VOID_STAR) s); -} - -static int istruct_pop (unsigned char type, VOID_STAR ptr) -{ - return SLclass_pop_ptr_obj (type, (VOID_STAR *)ptr); -} - -static void istruct_destroy (unsigned char type, VOID_STAR ptr) -{ - (void) type; - (void) ptr; -} - -/* Intrinsic struct objects are not stored in a variable. So, the address that - * is passed here is actually a pointer to the struct. So, pass its address - * to istruct_push since v is a variable. Confusing, n'est pas? - */ -static int istruct_push_intrinsic (unsigned char type, VOID_STAR v) -{ - return istruct_push (type, (VOID_STAR) &v); -} - -static int init_intrin_struct (void) -{ - SLang_Class_Type *cl; - static int initialized; - - if (initialized) - return 0; - - if (NULL == (cl = SLclass_allocate_class ("IStruct_Type"))) - return -1; - - cl->cl_pop = istruct_pop; - cl->cl_push = istruct_push; - cl->cl_sget = istruct_sget; - cl->cl_sput = istruct_sput; - cl->cl_destroy = istruct_destroy; - cl->cl_push_intrinsic = istruct_push_intrinsic; - - if (-1 == SLclass_register_class (cl, SLANG_ISTRUCT_TYPE, sizeof (_SLang_IStruct_Type *), - SLANG_CLASS_TYPE_PTR)) - return -1; - - initialized = 1; - return 0; -} - -int SLadd_istruct_table (SLang_IStruct_Field_Type *fields, VOID_STAR addr, char *name) -{ - _SLang_IStruct_Type *s; - SLang_IStruct_Field_Type *f; - - if (-1 == init_intrin_struct ()) - return -1; - - if (addr == NULL) - { - SLang_verror (SL_INVALID_PARM, - "SLadd_istruct_table: address must be non-NULL"); - return -1; - } - - if (fields == NULL) - return -1; - - /* Make the field names slstrings so that only the pointers need to be - * compared. However, this table may have been already been added for - * another instance of the intrinsic object. So, check for the presence - * of an slstring. - */ - f = fields; - while (f->field_name != NULL) - { - char *fname; - - fname = SLang_create_slstring (f->field_name); - if (fname == NULL) - return -1; - - /* Here is the check for the slstring */ - if (f->field_name == fname) - SLang_free_slstring (fname); - else /* replace string literal with slstring */ - f->field_name = fname; - - f++; - } - - s = (_SLang_IStruct_Type *)SLmalloc (sizeof (_SLang_IStruct_Type)); - if (s == NULL) - return -1; - - memset ((char *)s, 0, sizeof (_SLang_IStruct_Type)); - if (NULL == (s->name = SLang_create_slstring (name))) - { - SLfree ((char *) s); - return -1; - } - - s->addr = addr; - s->fields = fields; - - if (-1 == SLadd_intrinsic_variable (name, (VOID_STAR) s, SLANG_ISTRUCT_TYPE, 1)) - { - SLang_free_slstring (s->name); - SLfree ((char *) s); - return -1; - } - - return 0; -} diff --git a/mdk-stage1/slang/slkeymap.c b/mdk-stage1/slang/slkeymap.c deleted file mode 100644 index dff65433e..000000000 --- a/mdk-stage1/slang/slkeymap.c +++ /dev/null @@ -1,596 +0,0 @@ -/* Keymap routines for SLang. The role of these keymap routines is simple: - * Just read keys from the tty and return a pointer to a keymap structure. - * That is, a keymap is simple a mapping of strings (keys from tty) to - * structures. Also included are routines for managing the keymaps. - */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -/* We need a define a rule for upperand lower case chars that user cannot - change! This could be a problem for international chars! */ - -#define UPPER_CASE_KEY(x) (((x) >= 'a') && ((x) <= 'z') ? (x) - 32 : (x)) -#define LOWER_CASE_KEY(x) (((x) >= 'A') && ((x) <= 'Z') ? (x) + 32 : (x)) - -int SLang_Key_TimeOut_Flag = 0; /* true if more than 1 sec has elapsed - without key in multikey sequence */ - -int SLang_Last_Key_Char; - -SLKeyMap_List_Type SLKeyMap_List[SLANG_MAX_KEYMAPS]; - -static SLang_Key_Type *malloc_key(unsigned char *str) -{ - SLang_Key_Type *neew; - - if (NULL == (neew = (SLang_Key_Type *) SLmalloc(sizeof(SLang_Key_Type)))) - return NULL; - - SLMEMSET ((char *) neew, 0, sizeof (SLang_Key_Type)); - SLMEMCPY((char *) neew->str, (char *) str, (unsigned int) *str); - return(neew); -} - -static SLKeyMap_List_Type *add_keymap (char *name, SLang_Key_Type *map) -{ - int i; - - for (i = 0; i < SLANG_MAX_KEYMAPS; i++) - { - if (SLKeyMap_List[i].keymap == NULL) - { - if (NULL == (name = SLang_create_slstring (name))) - return NULL; - - SLKeyMap_List[i].keymap = map; - SLKeyMap_List[i].name = name; - return &SLKeyMap_List[i]; - } - } - SLang_Error = SL_UNKNOWN_ERROR; - /* SLang_doerror ("Keymap quota exceeded."); */ - return NULL; -} - -FVOID_STAR SLang_find_key_function(char *name, SLKeyMap_List_Type *keymap) -{ - SLKeymap_Function_Type *fp = keymap -> functions; - char ch = *name; - - while ((fp != NULL) && (fp->name != NULL)) - { - if ((ch == *fp->name) - && (0 == strcmp(fp->name, name))) - return (FVOID_STAR) fp->f; - - fp++; - } - return NULL; -} - -#ifdef REAL_UNIX_SYSTEM -/* Expand termcap string specified by s. s as passed will have the format: - * "XY)..." where XY represents a termcap keyname. - */ -static char *process_termcap_string (char *s, char *str, int *ip, int imax) -{ - char c[3], *val; - int i; - - if ((0 == (c[0] = s[0])) - || (0 == (c[1] = s[1])) - || (s[2] != ')')) - { - SLang_verror (SL_SYNTAX_ERROR, "setkey: ^(%s is badly formed", s); - return NULL; - } - s += 3; - - c[2] = 0; - if ((NULL == (val = SLtt_tgetstr (c))) - || (*val == 0)) - return NULL; - - i = *ip; - while ((i < imax) && (*val != 0)) - { - str[i++] = *val++; - } - *ip = i; - - return s; -} -#endif - -/* convert things like "^A" to 1 etc... The 0th char is the strlen INCLUDING - * the length character itself. - */ -char *SLang_process_keystring(char *s) -{ - /* FIXME: v2.0, make this thread safe */ - static char str[32]; - unsigned char ch; - int i; - - i = 1; - while (*s != 0) - { - ch = (unsigned char) *s++; - if (ch == '^') - { - ch = *s++; - if (ch == 0) - { - if (i < 32) - str[i++] = '^'; - break; - } -#ifdef REAL_UNIX_SYSTEM - if (ch == '(') - { - s = process_termcap_string (s, str, &i, 32); - if (s == NULL) - { - str[0] = 1; - return str; - } - continue; - } -#endif - ch = UPPER_CASE_KEY(ch); - if (ch == '?') ch = 127; else ch = ch - 'A' + 1; - } - - if (i >= 32) break; - str[i++] = ch; - } - - if (i > SLANG_MAX_KEYMAP_KEY_SEQ) - { - SLang_verror (SL_INVALID_PARM, "Key sequence is too long"); - return NULL; - } - - str[0] = i; - return(str); -} - -static int key_string_compare (unsigned char *a, unsigned char *b, unsigned int len) -{ - unsigned char *amax = a + len; - int cha, chb, cha_up, chb_up; - - while (a < amax) - { - cha = *a++; - chb = *b++; - - if (cha == chb) continue; - - cha_up = UPPER_CASE_KEY(cha); - chb_up = UPPER_CASE_KEY(chb); - - if (cha_up == chb_up) - { - /* Use case-sensitive result. */ - return cha - chb; - } - /* Use case-insensitive result. */ - return cha_up - chb_up; - } - return 0; -} - -static char *Define_Key_Error = "Inconsistency in define key."; - -/* This function also performs an insertion in an ordered way. */ -static int find_the_key (char *s, SLKeyMap_List_Type *kml, SLang_Key_Type **keyp) -{ - unsigned char ch; - unsigned int str_len; - SLang_Key_Type *key, *last, *neew; - unsigned char *str; - - *keyp = NULL; - - if (NULL == (str = (unsigned char *) SLang_process_keystring(s))) - return -2; - - if (1 == (str_len = str[0])) - return 0; - - ch = str[1]; - key = kml->keymap + ch; - - if (str_len == 2) - { - if (key->next != NULL) - { - SLang_doerror (Define_Key_Error); - return -2; - } - - if (key->type == SLKEY_F_INTERPRET) - SLang_free_slstring (key->f.s); - - key->str[0] = str_len; - key->str[1] = ch; - - *keyp = key; - return 0; - } - - /* insert the key definition */ - while (1) - { - int cmp; - unsigned int key_len, len; - - last = key; - key = key->next; - - if ((key != NULL) && (key->str != NULL)) - { - len = key_len = key->str[0]; - if (len > str_len) len = str_len; - - cmp = key_string_compare (str + 1, key->str + 1, len - 1); - - if (cmp > 0) - continue; - - if (cmp == 0) - { - if (key_len != str_len) - { - SLang_doerror (Define_Key_Error); - return -2; - } - - if (key->type == SLKEY_F_INTERPRET) - SLang_free_slstring (key->f.s); - - *keyp = key; - return 0; - } - /* Drop to cmp < 0 case */ - } - - if (NULL == (neew = malloc_key(str))) return -1; - - neew -> next = key; - last -> next = neew; - - *keyp = neew; - return 0; - } -} - -/* returns -2 if inconsistent, -1 if malloc error, 0 upon success */ -int SLkm_define_key (char *s, FVOID_STAR f, SLKeyMap_List_Type *kml) -{ - SLang_Key_Type *key; - unsigned int type = SLKEY_F_INTRINSIC; - int ret; - - ret = find_the_key (s, kml, &key); - if ((ret != 0) || (key == NULL)) - return ret; - - key->type = type; - key->f.f = f; - return 0; -} - -int SLang_define_key (char *s, char *funct, SLKeyMap_List_Type *kml) -{ - SLang_Key_Type *key; - FVOID_STAR f; - int ret; - - ret = find_the_key (s, kml, &key); - if ((ret != 0) || (key == NULL)) - return ret; - - f = SLang_find_key_function(funct, kml); - - if (f == NULL) /* assume interpreted */ - { - char *str = SLang_create_slstring (funct); - if (str == NULL) return -1; - key->type = SLKEY_F_INTERPRET; - key->f.s = str; - } - else - { - key->type = SLKEY_F_INTRINSIC; - key->f.f = f; - } - return 0; -} - -int SLkm_define_keysym (char *s, unsigned int keysym, SLKeyMap_List_Type *kml) -{ - SLang_Key_Type *key; - int ret; - - ret = find_the_key (s, kml, &key); - - if ((ret != 0) || (key == NULL)) - return ret; - - key->type = SLKEY_F_KEYSYM; - key->f.keysym = keysym; - return 0; -} - -SLang_Key_Type *SLang_do_key(SLKeyMap_List_Type *kml, int (*getkey)(void)) -{ - register SLang_Key_Type *key, *next, *kmax; - unsigned int len; - unsigned char input_ch; - register unsigned char chup, chlow; - unsigned char key_ch = 0; - - SLang_Last_Key_Char = (*getkey)(); - SLang_Key_TimeOut_Flag = 0; - - if (SLANG_GETKEY_ERROR == (unsigned int) SLang_Last_Key_Char) - return NULL; - - input_ch = (unsigned char) SLang_Last_Key_Char; - - key = (SLang_Key_Type *) &((kml->keymap)[input_ch]); - - /* if the next one is null, then we know this MAY be it. */ - while (key->next == NULL) - { - if (key->type != 0) - return key; - - /* Try its opposite case counterpart */ - chlow = LOWER_CASE_KEY(input_ch); - if (input_ch == chlow) - input_ch = UPPER_CASE_KEY(input_ch); - - key = kml->keymap + input_ch; - if (key->type == 0) - return NULL; - } - - /* It appears to be a prefix character in a key sequence. */ - - len = 1; /* already read one character */ - key = key->next; /* Now we are in the key list */ - kmax = NULL; /* set to end of list */ - - while (1) - { - SLang_Key_TimeOut_Flag = 1; - SLang_Last_Key_Char = (*getkey)(); - SLang_Key_TimeOut_Flag = 0; - - len++; - - if ((SLANG_GETKEY_ERROR == (unsigned int) SLang_Last_Key_Char) - || SLKeyBoard_Quit) - break; - - input_ch = (unsigned char) SLang_Last_Key_Char; - - chup = UPPER_CASE_KEY(input_ch); chlow = LOWER_CASE_KEY(input_ch); - - while (key != kmax) - { - if (key->str[0] > len) - { - key_ch = key->str[len]; - if (chup == UPPER_CASE_KEY(key_ch)) - break; - } - key = key->next; - } - - if (key == kmax) break; - - /* If the input character is lowercase, check to see if there is - * a lowercase match. If so, set key to it. Note: the - * algorithm assumes the sorting performed by key_string_compare. - */ - if (input_ch != key_ch) - { - next = key->next; - while (next != kmax) - { - if (next->str[0] > len) - { - unsigned char next_ch = next->str[len]; - if (next_ch == input_ch) - { - key = next; - break; - } - if (next_ch != chup) - break; - } - next = next->next; - } - } - - /* Ok, we found the first position of a possible match. If it - * is exact, we are done. - */ - if ((unsigned int) key->str[0] == len + 1) - return key; - - /* Apparantly, there are some ambiguities. Read next key to resolve - * the ambiguity. Adjust kmax to encompass ambiguities. - */ - - next = key->next; - while (next != kmax) - { - if ((unsigned int) next->str[0] > len) - { - key_ch = next->str[len]; - if (chup != UPPER_CASE_KEY(key_ch)) - break; - } - next = next->next; - } - kmax = next; - } - - return NULL; -} - -void SLang_undefine_key(char *s, SLKeyMap_List_Type *kml) -{ - int n, i; - SLang_Key_Type *key, *next, *last, *key_root, *keymap; - unsigned char *str; - - keymap = kml -> keymap; - if (NULL == (str = (unsigned char *) SLang_process_keystring(s))) - return; - - if (0 == (n = *str++ - 1)) return; - i = *str; - - last = key_root = (SLang_Key_Type *) &(keymap[i]); - key = key_root->next; - - while (key != NULL) - { - next = key->next; - if (0 == SLMEMCMP ((char *)(key->str + 1), (char *) str, n)) - { - if (key->type == SLKEY_F_INTERPRET) - SLang_free_slstring (key->f.s); - - SLfree((char *) key); - last->next = next; - } - else last = key; - key = next; - } - - if (n == 1) - { - *key_root->str = 0; - key_root->f.f = NULL; - key_root->type = 0; - } -} - -char *SLang_make_keystring(unsigned char *s) -{ - static char buf [3 * SLANG_MAX_KEYMAP_KEY_SEQ + 1]; - char *b; - int n; - - n = *s++ - 1; - - if (n > SLANG_MAX_KEYMAP_KEY_SEQ) - { - SLang_verror (SL_INVALID_PARM, "Key sequence is too long"); - return NULL; - } - - b = buf; - while (n--) - { - if (*s < 32) - { - *b++ = '^'; - *b++ = *s + 'A' - 1; - } - else *b++ = *s; - s++; - } - *b = 0; - return(buf); -} - -static SLang_Key_Type *copy_keymap(SLKeyMap_List_Type *kml) -{ - int i; - SLang_Key_Type *neew, *old, *new_root, *km; - - if (NULL == (new_root = (SLang_Key_Type *) SLcalloc(256, sizeof(SLang_Key_Type)))) - return NULL; - - if (kml == NULL) return new_root; - km = kml->keymap; - - for (i = 0; i < 256; i++) - { - old = &(km[i]); - neew = &(new_root[i]); - - if (old->type == SLKEY_F_INTERPRET) - neew->f.s = SLang_create_slstring (old->f.s); - else - neew->f.f = old->f.f; - - neew->type = old->type; - SLMEMCPY((char *) neew->str, (char *) old->str, (unsigned int) *old->str); - - old = old->next; - while (old != NULL) - { - neew->next = malloc_key((unsigned char *) old->str); - neew = neew->next; - - if (old->type == SLKEY_F_INTERPRET) - neew->f.s = SLang_create_slstring (old->f.s); - else - neew->f.f = old->f.f; - - neew->type = old->type; - old = old->next; - } - neew->next = NULL; - } - return(new_root); -} - -SLKeyMap_List_Type *SLang_create_keymap(char *name, SLKeyMap_List_Type *map) -{ - SLang_Key_Type *neew; - SLKeyMap_List_Type *new_map; - - if ((NULL == (neew = copy_keymap(map))) - || (NULL == (new_map = add_keymap(name, neew)))) return NULL; - - if (map != NULL) new_map -> functions = map -> functions; - - return new_map; -} - -SLKeyMap_List_Type *SLang_find_keymap(char *name) -{ - SLKeyMap_List_Type *kmap, *kmap_max; - - kmap = SLKeyMap_List; - kmap_max = kmap + SLANG_MAX_KEYMAPS; - - while (kmap < kmap_max) - { - if ((kmap->name != NULL) - && (0 == strcmp (kmap->name, name))) - return kmap; - - kmap++; - } - return NULL; -} diff --git a/mdk-stage1/slang/slkeypad.c b/mdk-stage1/slang/slkeypad.c deleted file mode 100644 index 524dc80fa..000000000 --- a/mdk-stage1/slang/slkeypad.c +++ /dev/null @@ -1,163 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -static SLKeyMap_List_Type *Keymap_List; - -int SLkp_init (void) -{ - char esc_seq[10]; - int i; - - if (NULL == (Keymap_List = SLang_create_keymap ("_SLKeypad", NULL))) - return -1; - - esc_seq[1] = 0; - for (i = 1; i < 256; i++) - { - esc_seq[0] = (char) i; - SLkm_define_keysym (esc_seq, i, Keymap_List); - } - - /* Now add most common ones. */ -#ifndef IBMPC_SYSTEM - SLkm_define_keysym ("^@", 0, Keymap_List); - - SLkm_define_keysym ("\033[A", SL_KEY_UP, Keymap_List); - SLkm_define_keysym ("\033OA", SL_KEY_UP, Keymap_List); - SLkm_define_keysym ("\033[B", SL_KEY_DOWN, Keymap_List); - SLkm_define_keysym ("\033OB", SL_KEY_DOWN, Keymap_List); - SLkm_define_keysym ("\033[C", SL_KEY_RIGHT, Keymap_List); - SLkm_define_keysym ("\033OC", SL_KEY_RIGHT, Keymap_List); - SLkm_define_keysym ("\033[D", SL_KEY_LEFT, Keymap_List); - SLkm_define_keysym ("\033OD", SL_KEY_LEFT, Keymap_List); - SLkm_define_keysym ("\033[2~", SL_KEY_IC, Keymap_List); - SLkm_define_keysym ("\033[7~", SL_KEY_HOME, Keymap_List); - SLkm_define_keysym ("\033[5~", SL_KEY_PPAGE, Keymap_List); - SLkm_define_keysym ("\033[6~", SL_KEY_NPAGE, Keymap_List); - SLkm_define_keysym ("\033[8~", SL_KEY_END, Keymap_List); - SLkm_define_keysym ("\033[3~", SL_KEY_DELETE, Keymap_List); -#else - /* Note: This will not work if SLgetkey_map_to_ansi (1) has - * been called. - */ - SLkm_define_keysym ("^@\x48", SL_KEY_UP, Keymap_List ); - SLkm_define_keysym ("^@\x50", SL_KEY_DOWN, Keymap_List ); - SLkm_define_keysym ("^@\x4d", SL_KEY_RIGHT, Keymap_List ); - SLkm_define_keysym ("^@\x4b", SL_KEY_LEFT, Keymap_List ); - SLkm_define_keysym ("^@\x47", SL_KEY_HOME, Keymap_List ); - SLkm_define_keysym ("^@\x49", SL_KEY_PPAGE, Keymap_List ); - SLkm_define_keysym ("^@\x51", SL_KEY_NPAGE, Keymap_List ); - SLkm_define_keysym ("^@\x4f", SL_KEY_END, Keymap_List ); - SLkm_define_keysym ("^@\x52", SL_KEY_IC, Keymap_List ); - SLkm_define_keysym ("^@\x53", SL_KEY_DELETE, Keymap_List ); - - SLkm_define_keysym ("\xE0\x48", SL_KEY_UP, Keymap_List ); - SLkm_define_keysym ("\xE0\x50", SL_KEY_DOWN, Keymap_List ); - SLkm_define_keysym ("\xE0\x4d", SL_KEY_RIGHT, Keymap_List ); - SLkm_define_keysym ("\xE0\x4b", SL_KEY_LEFT, Keymap_List ); - SLkm_define_keysym ("\xE0\x47", SL_KEY_HOME, Keymap_List ); - SLkm_define_keysym ("\xE0\x49", SL_KEY_PPAGE, Keymap_List ); - SLkm_define_keysym ("\xE0\x51", SL_KEY_NPAGE, Keymap_List ); - SLkm_define_keysym ("\xE0\x4f", SL_KEY_END, Keymap_List ); - SLkm_define_keysym ("\xE0\x52", SL_KEY_IC, Keymap_List ); - SLkm_define_keysym ("\xE0\x53", SL_KEY_DELETE, Keymap_List ); - - strcpy (esc_seq, "^@ "); /* guarantees esc_seq[3] = 0. */ - - for (i = 0x3b; i < 0x45; i++) - { - esc_seq [2] = i; - SLkm_define_keysym (esc_seq, SL_KEY_F(i - 0x3a), Keymap_List); - } - esc_seq[2] = 0x57; SLkm_define_keysym (esc_seq, SL_KEY_F(11), Keymap_List); - esc_seq[2] = 0x58; SLkm_define_keysym (esc_seq, SL_KEY_F(12), Keymap_List); -#endif - -#ifdef REAL_UNIX_SYSTEM - strcpy (esc_seq, "^(kX)"); - for (i = 0; i <= 9; i++) - { - esc_seq[3] = '0' + i; - SLkm_define_keysym (esc_seq, SL_KEY_F(i), Keymap_List); - } - SLkm_define_keysym ("^(k;)", SL_KEY_F(10), Keymap_List); - - SLkm_define_keysym ("^(ku)", SL_KEY_UP, Keymap_List); - SLkm_define_keysym ("^(kd)", SL_KEY_DOWN, Keymap_List); - SLkm_define_keysym ("^(kl)", SL_KEY_LEFT, Keymap_List); - SLkm_define_keysym ("^(kr)", SL_KEY_RIGHT, Keymap_List); - SLkm_define_keysym ("^(kP)", SL_KEY_PPAGE, Keymap_List); - SLkm_define_keysym ("^(kN)", SL_KEY_NPAGE, Keymap_List); - SLkm_define_keysym ("^(kh)", SL_KEY_HOME, Keymap_List); - SLkm_define_keysym ("^(@7)", SL_KEY_END, Keymap_List); - SLkm_define_keysym ("^(K1)", SL_KEY_A1, Keymap_List); - SLkm_define_keysym ("^(K3)", SL_KEY_A3, Keymap_List); - SLkm_define_keysym ("^(K2)", SL_KEY_B2, Keymap_List); - SLkm_define_keysym ("^(K4)", SL_KEY_C1, Keymap_List); - SLkm_define_keysym ("^(K5)", SL_KEY_C3, Keymap_List); - SLkm_define_keysym ("^(%0)", SL_KEY_REDO, Keymap_List); - SLkm_define_keysym ("^(&8)", SL_KEY_UNDO, Keymap_List); - SLkm_define_keysym ("^(kb)", SL_KEY_BACKSPACE, Keymap_List); - SLkm_define_keysym ("^(@8)", SL_KEY_ENTER, Keymap_List); - SLkm_define_keysym ("^(kD)", SL_KEY_DELETE, Keymap_List); -#endif - - if (SLang_Error) - return -1; - return 0; -} - -int SLkp_getkey (void) -{ - SLang_Key_Type *key; - - key = SLang_do_key (Keymap_List, (int (*)(void)) SLang_getkey); - if ((key == NULL) || (key->type != SLKEY_F_KEYSYM)) - { - SLang_flush_input (); - return SL_KEY_ERR; - } - - return key->f.keysym; -} - -int SLkp_define_keysym (char *keystr, unsigned int keysym) -{ - if (SLkm_define_keysym (keystr, keysym, Keymap_List) < 0) - return -1; - - return 0; -} - -#if 0 -int main (int argc, char **argv) -{ - int ch; - - SLtt_get_terminfo (); - - if (-1 == SLkp_init ()) - return 1; - - SLang_init_tty (-1, 0, 0); - - while ('q' != (ch = SLkp_getkey ())) - { - fprintf (stdout, "Keycode = %d\r\n", ch); - fflush (stdout); - } - - SLang_reset_tty (); - - return 0; -} -#endif - diff --git a/mdk-stage1/slang/sllimits.h b/mdk-stage1/slang/sllimits.h deleted file mode 100644 index c4ae03b83..000000000 --- a/mdk-stage1/slang/sllimits.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -/* sllimits.h */ - -/* slstring.c: Size of the hash table used for strings (prime numbers) */ -#ifdef __MSDOS_16BIT__ -# define SLSTRING_HASH_TABLE_SIZE 601 -# define SLASSOC_HASH_TABLE_SIZE 601 -#else -# define SLSTRING_HASH_TABLE_SIZE 2909 -# define SLASSOC_HASH_TABLE_SIZE 2909 -#endif - -/* slang.c: maximum size of run time stack */ -#ifdef __MSDOS_16BIT__ -# define SLANG_MAX_STACK_LEN 500 -#else -# define SLANG_MAX_STACK_LEN 2500 -#endif - -/* slang.c: This sets the size on the depth of function calls */ -#ifdef __MSDOS_16BIT__ -# define SLANG_MAX_RECURSIVE_DEPTH 50 -#else -# define SLANG_MAX_RECURSIVE_DEPTH 250 -#endif - -/* slang.c: Size of the stack used for local variables */ -#ifdef __MSDOS_16BIT__ -# define SLANG_MAX_LOCAL_STACK 200 -#else -# define SLANG_MAX_LOCAL_STACK 1024 -#endif - -/* slang.c: The size of the hash table used for local and global objects. - * These should be prime numbers. - */ -#define SLGLOBALS_HASH_TABLE_SIZE 2909 -#define SLLOCALS_HASH_TABLE_SIZE 73 -#define SLSTATIC_HASH_TABLE_SIZE 73 - -/* Size of the keyboard buffer use by the ungetkey routines */ -#ifdef __MSDOS_16BIT__ -# define SL_MAX_INPUT_BUFFER_LEN 40 -#else -# define SL_MAX_INPUT_BUFFER_LEN 1024 -#endif - -/* Maximum number of nested switch statements */ -#define SLANG_MAX_NESTED_SWITCH 10 - -/* Size of the block stack (used in byte-compiling) */ -#define SLANG_MAX_BLOCK_STACK_LEN 50 - -/* slfile.c: Max number of open file pointers */ -#ifdef __MSDOS_16BIT__ -# define SL_MAX_FILES 32 -#else -# define SL_MAX_FILES 256 -#endif diff --git a/mdk-stage1/slang/slmalloc.c b/mdk-stage1/slang/slmalloc.c deleted file mode 100644 index be4ed6cae..000000000 --- a/mdk-stage1/slang/slmalloc.c +++ /dev/null @@ -1,165 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#ifdef SL_MALLOC_DEBUG -# undef SL_MALLOC_DEBUG -#endif - -#include "slang.h" -#include "_slang.h" - -#ifdef __alpha -# define Chunk 8 -#else -# define Chunk 4 -#endif - -static long Total_Allocated; -static long Max_Single_Allocation; -static long Max_Allocated; -/* #define SLDEBUG_DOUT */ - -#ifdef SLDEBUG_DOUT -static FILE *dout; -#endif - -void SLmalloc_dump_statistics (void) -{ -#ifdef SLDEBUG_DOUT - fflush (dout); -#endif - fprintf (stderr, "Total Allocated: %ld\nHighest single allocation: %ld\nHighest Total Allocated:%ld\n", - Total_Allocated, Max_Single_Allocation, Max_Allocated); -} - -static void register_at_exit_fun (void) -{ - static int is_registered = 0; - if (is_registered) - return; - is_registered = 1; - -#ifdef SLDEBUG_DOUT - if (dout == NULL) dout = fopen ("malloc.out", "w"); -#endif - SLang_add_cleanup_function (SLmalloc_dump_statistics); -} - -static void fixup (unsigned char *p, unsigned long n, char *what) -{ - register_at_exit_fun (); - - p += Chunk; - *(p - 4)= (unsigned char) ((n >> 24) & 0xFF); - *(p - 3) = (unsigned char) ((n >> 16) & 0xFF); - *(p - 2) = (unsigned char) ((n >> 8) & 0xFF); - *(p - 1) = (unsigned char) (n & 0xFF); - *(p + (int) n) = 27; - *(p + (int) (n + 1)) = 182; - *(p + (int) (n + 2)) = 81; - *(p + (int) (n + 3)) = 86; - Total_Allocated += (long) n; - if (Total_Allocated > Max_Allocated) Max_Allocated = Total_Allocated; - if ((long) n > Max_Single_Allocation) - Max_Single_Allocation = (long) n; - -#ifdef SLDEBUG_DOUT - fprintf (dout, "ALLOC: %s\t%p %ld\n", what, p, (long) n); -#else - (void) what; -#endif -} - -static void SLmalloc_doerror (char *buf) -{ - SLang_doerror (buf); -} - -static int check_memory (unsigned char *p, char *what) -{ - char buf[128]; - unsigned long n; - - register_at_exit_fun (); - - n = ((unsigned long) *(p - 4)) << 24; - n |= ((unsigned long) *(p - 3)) << 16; - n |= ((unsigned long) *(p - 2)) << 8; - n |= (unsigned long) *(p - 1); - - if (n == 0xFFFFFFFFUL) - { - sprintf (buf, "%s: %p: Already FREE! Abort NOW.", what, (void*)p - Chunk); - SLmalloc_doerror (buf); - return -1; - } - - if ((*(p + (int) n) != 27) - || (*(p + (int) (n + 1)) != 182) - || (*(p + (int) (n + 2)) != 81) - || (*(p + (int) (n + 3)) != 86)) - { - sprintf (buf, "\007%s: %p: Memory corrupt! Abort NOW.", what, (void*)p); - SLmalloc_doerror (buf); - return -1; - } - - *(p - 4) = *(p - 3) = *(p - 2) = *(p - 1) = 0xFF; - - Total_Allocated -= (long) n; - if (Total_Allocated < 0) - { - sprintf (buf, "\007%s: %p\nFreed %ld, Allocated is: %ld!\n", - what, (void*)p, (long) n, Total_Allocated); - SLang_doerror (buf); - } -#ifdef SLDEBUG_DOUT - fprintf (dout, "FREE: %s:\t%p %ld\n", what, p, (long) n); -#endif - return 0; -} - -void SLdebug_free (char *p) -{ - if (p == NULL) return; - if (-1 == check_memory ((unsigned char *) p, "FREE")) return; - - SLFREE (p - Chunk); -} - -char *SLdebug_malloc (unsigned long n) -{ - char *p; - - if ((p = (char *) SLMALLOC (n + 2 * Chunk)) == NULL) return NULL; - - fixup ((unsigned char *) p, n, "MALLOC"); - return p + Chunk; -} - -char *SLdebug_realloc (char *p, unsigned long n) -{ - if (-1 == check_memory ((unsigned char *) p, "REALLOC")) return NULL; - if ((p = (char *) SLREALLOC (p - Chunk, n + 2 * Chunk)) == NULL) return NULL; - fixup ((unsigned char *) p, n, "REALLOC"); - return p + Chunk; -} - -char *SLdebug_calloc (unsigned long n, unsigned long size) -{ - char *p; - int m; - - /* This is tough -- hope this is a good assumption!! */ - if (size >= Chunk) m = 1; else m = Chunk; - - if ((p = (char *) SLCALLOC (n + m + m, size)) == NULL) return NULL; - fixup ((unsigned char *) p, size * n, "CALLOC"); - return p + Chunk; -} - diff --git a/mdk-stage1/slang/slmath.c b/mdk-stage1/slang/slmath.c deleted file mode 100644 index 1d61e14d3..000000000 --- a/mdk-stage1/slang/slmath.c +++ /dev/null @@ -1,565 +0,0 @@ -/* sin, cos, etc, for S-Lang */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include - -#include "slang.h" -#include "_slang.h" - -#ifdef PI -# undef PI -#endif -#define PI 3.14159265358979323846264338327950288 - -#if defined(__unix__) -#include -#include - -#define SIGNAL SLsignal - -static void math_floating_point_exception (int sig) -{ - sig = errno; - if (SLang_Error == 0) SLang_Error = SL_FLOATING_EXCEPTION; - (void) SIGNAL (SIGFPE, math_floating_point_exception); - errno = sig; -} -#endif - -double SLmath_hypot (double x, double y) -{ - double fr, fi, ratio; - - fr = fabs(x); - fi = fabs(y); - - if (fr > fi) - { - ratio = y / x; - x = fr * sqrt (1.0 + ratio * ratio); - } - else if (fi == 0.0) x = 0.0; - else - { - ratio = x / y; - x = fi * sqrt (1.0 + ratio * ratio); - } - - return x; -} - -/* usage here is a1 a2 ... an n x ==> a1x^n + a2 x ^(n - 1) + ... + an */ -static double math_poly (void) -{ - int n; - double xn = 1.0, sum = 0.0; - double an, x; - - if ((SLang_pop_double(&x, NULL, NULL)) - || (SLang_pop_integer(&n))) return(0.0); - - while (n-- > 0) - { - if (SLang_pop_double(&an, NULL, NULL)) break; - sum += an * xn; - xn = xn * x; - } - return (double) sum; -} - -static int double_math_op_result (int op, unsigned char a, unsigned char *b) -{ - (void) op; - - if (a != SLANG_FLOAT_TYPE) - *b = SLANG_DOUBLE_TYPE; - else - *b = a; - - return 1; -} - -#ifdef HAVE_ASINH -# define ASINH_FUN asinh -#else -# define ASINH_FUN my_asinh -static double my_asinh (double x) -{ - return log (x + sqrt (x*x + 1)); -} -#endif -#ifdef HAVE_ACOSH -# define ACOSH_FUN acosh -#else -# define ACOSH_FUN my_acosh -static double my_acosh (double x) -{ - return log (x + sqrt(x*x - 1)); /* x >= 1 */ -} -#endif -#ifdef HAVE_ATANH -# define ATANH_FUN atanh -#else -# define ATANH_FUN my_atanh -static double my_atanh (double x) -{ - return 0.5 * log ((1.0 + x)/(1.0 - x)); /* 0 <= x^2 < 1 */ -} -#endif - -static int double_math_op (int op, - unsigned char type, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - double *a, *b; - unsigned int i; - double (*fun) (double); - - (void) type; - a = (double *) ap; - b = (double *) bp; - - switch (op) - { - default: - return 0; - - case SLMATH_SINH: - fun = sinh; - break; - case SLMATH_COSH: - fun = cosh; - break; - case SLMATH_TANH: - fun = tanh; - break; - case SLMATH_TAN: - fun = tan; - break; - case SLMATH_ASIN: - fun = asin; - break; - case SLMATH_ACOS: - fun = acos; - break; - case SLMATH_ATAN: - fun = atan; - break; - case SLMATH_EXP: - fun = exp; - break; - case SLMATH_LOG: - fun = log; - break; - case SLMATH_LOG10: - fun = log10; - break; - case SLMATH_SQRT: - fun = sqrt; - break; - case SLMATH_SIN: - fun = sin; - break; - case SLMATH_COS: - fun = cos; - break; - - case SLMATH_ASINH: - fun = ASINH_FUN; - break; - case SLMATH_ATANH: - fun = ATANH_FUN; - break; - case SLMATH_ACOSH: - fun = ACOSH_FUN; - break; - - case SLMATH_CONJ: - case SLMATH_REAL: - for (i = 0; i < na; i++) - b[i] = a[i]; - return 1; - case SLMATH_IMAG: - for (i = 0; i < na; i++) - b[i] = 0.0; - return 1; - } - - for (i = 0; i < na; i++) - b[i] = (*fun) (a[i]); - - return 1; -} - -static int float_math_op (int op, - unsigned char type, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - float *a, *b; - unsigned int i; - double (*fun) (double); - - (void) type; - a = (float *) ap; - b = (float *) bp; - - - switch (op) - { - default: - return 0; - - case SLMATH_SINH: - fun = sinh; - break; - case SLMATH_COSH: - fun = cosh; - break; - case SLMATH_TANH: - fun = tanh; - break; - case SLMATH_TAN: - fun = tan; - break; - case SLMATH_ASIN: - fun = asin; - break; - case SLMATH_ACOS: - fun = acos; - break; - case SLMATH_ATAN: - fun = atan; - break; - case SLMATH_EXP: - fun = exp; - break; - case SLMATH_LOG: - fun = log; - break; - case SLMATH_LOG10: - fun = log10; - break; - case SLMATH_SQRT: - fun = sqrt; - break; - case SLMATH_SIN: - fun = sin; - break; - case SLMATH_COS: - fun = cos; - break; - - case SLMATH_ASINH: - fun = ASINH_FUN; - break; - case SLMATH_ATANH: - fun = ATANH_FUN; - break; - case SLMATH_ACOSH: - fun = ACOSH_FUN; - break; - - case SLMATH_CONJ: - case SLMATH_REAL: - for (i = 0; i < na; i++) - b[i] = a[i]; - return 1; - case SLMATH_IMAG: - for (i = 0; i < na; i++) - b[i] = 0.0; - return 1; - } - - for (i = 0; i < na; i++) - b[i] = (float) (*fun) ((double) a[i]); - - return 1; -} - -static int generic_math_op (int op, - unsigned char type, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - double *b; - unsigned int i; - SLang_To_Double_Fun_Type to_double; - double (*fun) (double); - unsigned int da; - char *a; - - if (NULL == (to_double = SLarith_get_to_double_fun (type, &da))) - return 0; - - b = (double *) bp; - a = (char *) ap; - - switch (op) - { - default: - return 0; - - case SLMATH_SINH: - fun = sinh; - break; - case SLMATH_COSH: - fun = cosh; - break; - case SLMATH_TANH: - fun = tanh; - break; - case SLMATH_TAN: - fun = tan; - break; - case SLMATH_ASIN: - fun = asin; - break; - case SLMATH_ACOS: - fun = acos; - break; - case SLMATH_ATAN: - fun = atan; - break; - case SLMATH_EXP: - fun = exp; - break; - case SLMATH_LOG: - fun = log; - break; - case SLMATH_LOG10: - fun = log10; - break; - case SLMATH_SQRT: - fun = sqrt; - break; - case SLMATH_SIN: - fun = sin; - break; - case SLMATH_COS: - fun = cos; - break; - - case SLMATH_ASINH: - fun = ASINH_FUN; - break; - case SLMATH_ATANH: - fun = ATANH_FUN; - break; - case SLMATH_ACOSH: - fun = ACOSH_FUN; - break; - - - case SLMATH_CONJ: - case SLMATH_REAL: - for (i = 0; i < na; i++) - { - b[i] = to_double((VOID_STAR) a); - a += da; - } - return 1; - - case SLMATH_IMAG: - for (i = 0; i < na; i++) - b[i] = 0.0; - return 1; - } - - for (i = 0; i < na; i++) - { - b[i] = (*fun) (to_double ((VOID_STAR) a)); - a += da; - } - - return 1; -} - -#if SLANG_HAS_COMPLEX -static int complex_math_op_result (int op, unsigned char a, unsigned char *b) -{ - (void) a; - switch (op) - { - default: - *b = SLANG_COMPLEX_TYPE; - break; - - case SLMATH_REAL: - case SLMATH_IMAG: - *b = SLANG_DOUBLE_TYPE; - break; - } - return 1; -} - -static int complex_math_op (int op, - unsigned char type, VOID_STAR ap, unsigned int na, - VOID_STAR bp) -{ - double *a, *b; - unsigned int i; - unsigned int na2 = na * 2; - double *(*fun) (double *, double *); - - (void) type; - a = (double *) ap; - b = (double *) bp; - - switch (op) - { - default: - return 0; - - case SLMATH_REAL: - for (i = 0; i < na; i++) - b[i] = a[2 * i]; - return 1; - - case SLMATH_IMAG: - for (i = 0; i < na; i++) - b[i] = a[2 * i + 1]; - return 1; - - case SLMATH_CONJ: - for (i = 0; i < na2; i += 2) - { - b[i] = a[i]; - b[i+1] = -a[i+1]; - } - return 1; - - case SLMATH_ATANH: - fun = SLcomplex_atanh; - break; - case SLMATH_ACOSH: - fun = SLcomplex_acosh; - break; - case SLMATH_ASINH: - fun = SLcomplex_asinh; - break; - case SLMATH_EXP: - fun = SLcomplex_exp; - break; - case SLMATH_LOG: - fun = SLcomplex_log; - break; - case SLMATH_LOG10: - fun = SLcomplex_log10; - break; - case SLMATH_SQRT: - fun = SLcomplex_sqrt; - break; - case SLMATH_SIN: - fun = SLcomplex_sin; - break; - case SLMATH_COS: - fun = SLcomplex_cos; - break; - case SLMATH_SINH: - fun = SLcomplex_sinh; - break; - case SLMATH_COSH: - fun = SLcomplex_cosh; - break; - case SLMATH_TANH: - fun = SLcomplex_tanh; - break; - case SLMATH_TAN: - fun = SLcomplex_tan; - break; - case SLMATH_ASIN: - fun = SLcomplex_asin; - break; - case SLMATH_ACOS: - fun = SLcomplex_acos; - break; - case SLMATH_ATAN: - fun = SLcomplex_atan; - break; - } - - for (i = 0; i < na2; i += 2) - (void) (*fun) (b + i, a + i); - - return 1; -} -#endif - -static SLang_DConstant_Type DConst_Table [] = -{ - MAKE_DCONSTANT("E", 2.718281828459045), - MAKE_DCONSTANT("PI", 3.14159265358979323846264338327950288), - SLANG_END_DCONST_TABLE -}; - -static SLang_Math_Unary_Type SLmath_Table [] = -{ - MAKE_MATH_UNARY("sinh", SLMATH_SINH), - MAKE_MATH_UNARY("asinh", SLMATH_ASINH), - MAKE_MATH_UNARY("cosh", SLMATH_COSH), - MAKE_MATH_UNARY("acosh", SLMATH_ACOSH), - MAKE_MATH_UNARY("tanh", SLMATH_TANH), - MAKE_MATH_UNARY("atanh", SLMATH_ATANH), - MAKE_MATH_UNARY("sin", SLMATH_SIN), - MAKE_MATH_UNARY("cos", SLMATH_COS), - MAKE_MATH_UNARY("tan", SLMATH_TAN), - MAKE_MATH_UNARY("atan", SLMATH_ATAN), - MAKE_MATH_UNARY("acos", SLMATH_ACOS), - MAKE_MATH_UNARY("asin", SLMATH_ASIN), - MAKE_MATH_UNARY("exp", SLMATH_EXP), - MAKE_MATH_UNARY("log", SLMATH_LOG), - MAKE_MATH_UNARY("sqrt", SLMATH_SQRT), - MAKE_MATH_UNARY("log10", SLMATH_LOG10), -#if SLANG_HAS_COMPLEX - MAKE_MATH_UNARY("Real", SLMATH_REAL), - MAKE_MATH_UNARY("Imag", SLMATH_IMAG), - MAKE_MATH_UNARY("Conj", SLMATH_CONJ), -#endif - SLANG_END_MATH_UNARY_TABLE -}; - -static SLang_Intrin_Fun_Type SLang_Math_Table [] = -{ - MAKE_INTRINSIC_0("polynom", math_poly, SLANG_DOUBLE_TYPE), - SLANG_END_INTRIN_FUN_TABLE -}; - -int SLang_init_slmath (void) -{ - unsigned char *int_types; - -#if defined(__unix__) - (void) SIGNAL (SIGFPE, math_floating_point_exception); -#endif - - int_types = _SLarith_Arith_Types; - - while (*int_types != SLANG_FLOAT_TYPE) - { - if (-1 == SLclass_add_math_op (*int_types, generic_math_op, double_math_op_result)) - return -1; - int_types++; - } - - if ((-1 == SLclass_add_math_op (SLANG_FLOAT_TYPE, float_math_op, double_math_op_result)) - || (-1 == SLclass_add_math_op (SLANG_DOUBLE_TYPE, double_math_op, double_math_op_result)) -#if SLANG_HAS_COMPLEX - || (-1 == SLclass_add_math_op (SLANG_COMPLEX_TYPE, complex_math_op, complex_math_op_result)) -#endif - ) - return -1; - - if ((-1 == SLadd_math_unary_table (SLmath_Table, "__SLMATH__")) - || (-1 == SLadd_intrin_fun_table (SLang_Math_Table, NULL)) - || (-1 == SLadd_dconstant_table (DConst_Table, NULL))) - return -1; - - return 0; -} - diff --git a/mdk-stage1/slang/slmemchr.c b/mdk-stage1/slang/slmemchr.c deleted file mode 100644 index 1417bc549..000000000 --- a/mdk-stage1/slang/slmemchr.c +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -/* These routines are fast memcpy, memset routines. When available, I - use system rouines. For msdos, I use inline assembly. */ - -/* The current versions only work in the forward direction only!! */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -char *SLmemchr(register char *p, register char c, register int n) -{ - int n2; - register char *pmax; - - pmax = p + (n - 32); - - while (p <= pmax) - { - if ((*p == c) || (*++p == c) || (*++p == c) || (*++p == c) - || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c) - || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c) - || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c) - || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c) - || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c) - || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c) - || (*++p == c) || (*++p == c) || (*++p == c) || (*++p == c)) - return p; - p++; - } - - n2 = n % 32; - - while (n2--) - { - if (*p == c) return p; - p++; - } - return(NULL); -} diff --git a/mdk-stage1/slang/slmemcmp.c b/mdk-stage1/slang/slmemcmp.c deleted file mode 100644 index c5ed50095..000000000 --- a/mdk-stage1/slang/slmemcmp.c +++ /dev/null @@ -1,76 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -/* These routines are fast memcpy, memset routines. When available, I - use system rouines. For msdos, I use inline assembly. */ - -/* The current versions only work in the forward direction only!! */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -/* This is an UNSIGNED comparison designed for systems that either do not have -* this function or performed a signed comparison (SunOS) -*/ -int SLmemcmp(register char *s1, register char *s2, int n) -{ - register int cmp; - register char *s1max; - - s1max = s1 + (n - 32); - - while (s1 <= s1max) - { - if (*s1 != *s2) return ((unsigned char) *s1 - (unsigned char) *s2); - if (*(s1 + 1) != *(s2 + 1)) return ((unsigned char) *(s1 + 1) - (unsigned char) *(s2 + 1)); - if (*(s1 + 2) != *(s2 + 2)) return ((unsigned char) *(s1 + 2) - (unsigned char) *(s2 + 2)); - if (*(s1 + 3) != *(s2 + 3)) return ((unsigned char) *(s1 + 3) - (unsigned char) *(s2 + 3)); - if (*(s1 + 4) != *(s2 + 4)) return ((unsigned char) *(s1 + 4) - (unsigned char) *(s2 + 4)); - if (*(s1 + 5) != *(s2 + 5)) return ((unsigned char) *(s1 + 5) - (unsigned char) *(s2 + 5)); - if (*(s1 + 6) != *(s2 + 6)) return ((unsigned char) *(s1 + 6) - (unsigned char) *(s2 + 6)); - if (*(s1 + 7) != *(s2 + 7)) return ((unsigned char) *(s1 + 7) - (unsigned char) *(s2 + 7)); - if (*(s1 + 8) != *(s2 + 8)) return ((unsigned char) *(s1 + 8) - (unsigned char) *(s2 + 8)); - if (*(s1 + 9) != *(s2 + 9)) return ((unsigned char) *(s1 + 9) - (unsigned char) *(s2 + 9)); - if (*(s1 + 10) != *(s2 + 10)) return ((unsigned char) *(s1 + 10) - (unsigned char) *(s2 + 10)); - if (*(s1 + 11) != *(s2 + 11)) return ((unsigned char) *(s1 + 11) - (unsigned char) *(s2 + 11)); - if (*(s1 + 12) != *(s2 + 12)) return ((unsigned char) *(s1 + 12) - (unsigned char) *(s2 + 12)); - if (*(s1 + 13) != *(s2 + 13)) return ((unsigned char) *(s1 + 13) - (unsigned char) *(s2 + 13)); - if (*(s1 + 14) != *(s2 + 14)) return ((unsigned char) *(s1 + 14) - (unsigned char) *(s2 + 14)); - if (*(s1 + 15) != *(s2 + 15)) return ((unsigned char) *(s1 + 15) - (unsigned char) *(s2 + 15)); - if (*(s1 + 16) != *(s2 + 16)) return ((unsigned char) *(s1 + 16) - (unsigned char) *(s2 + 16)); - if (*(s1 + 17) != *(s2 + 17)) return ((unsigned char) *(s1 + 17) - (unsigned char) *(s2 + 17)); - if (*(s1 + 18) != *(s2 + 18)) return ((unsigned char) *(s1 + 18) - (unsigned char) *(s2 + 18)); - if (*(s1 + 19) != *(s2 + 19)) return ((unsigned char) *(s1 + 19) - (unsigned char) *(s2 + 19)); - if (*(s1 + 20) != *(s2 + 20)) return ((unsigned char) *(s1 + 20) - (unsigned char) *(s2 + 20)); - if (*(s1 + 21) != *(s2 + 21)) return ((unsigned char) *(s1 + 21) - (unsigned char) *(s2 + 21)); - if (*(s1 + 22) != *(s2 + 22)) return ((unsigned char) *(s1 + 22) - (unsigned char) *(s2 + 22)); - if (*(s1 + 23) != *(s2 + 23)) return ((unsigned char) *(s1 + 23) - (unsigned char) *(s2 + 23)); - if (*(s1 + 24) != *(s2 + 24)) return ((unsigned char) *(s1 + 24) - (unsigned char) *(s2 + 24)); - if (*(s1 + 25) != *(s2 + 25)) return ((unsigned char) *(s1 + 25) - (unsigned char) *(s2 + 25)); - if (*(s1 + 26) != *(s2 + 26)) return ((unsigned char) *(s1 + 26) - (unsigned char) *(s2 + 26)); - if (*(s1 + 27) != *(s2 + 27)) return ((unsigned char) *(s1 + 27) - (unsigned char) *(s2 + 27)); - if (*(s1 + 28) != *(s2 + 28)) return ((unsigned char) *(s1 + 28) - (unsigned char) *(s2 + 28)); - if (*(s1 + 29) != *(s2 + 29)) return ((unsigned char) *(s1 + 29) - (unsigned char) *(s2 + 29)); - if (*(s1 + 30) != *(s2 + 30)) return ((unsigned char) *(s1 + 30) - (unsigned char) *(s2 + 30)); - if (*(s1 + 31) != *(s2 + 31)) return ((unsigned char) *(s1 + 31) - (unsigned char) *(s2 + 31)); - s1 += 32; s2 += 32; - } - - s1max = s1 + (n % 32); - - while (s1 < s1max) - { - cmp = (unsigned char) *s1 - (unsigned char) *s2; - if (cmp) return(cmp); - s1++; - s2++; - } - - return(0); -} diff --git a/mdk-stage1/slang/slmemcpy.c b/mdk-stage1/slang/slmemcpy.c deleted file mode 100644 index e8665e4c6..000000000 --- a/mdk-stage1/slang/slmemcpy.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -/* These routines are fast memcpy, memset routines. When available, I - use system rouines. For msdos, I use inline assembly. */ - -/* The current versions only work in the forward direction only!! */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -char *SLmemcpy(char *s1, char *s2, int n) -{ -#if defined(__BORLANDC__) && defined(__MSDOS__) - asm mov ax, ds - asm mov bx, si - asm mov dx, di - asm mov cx, n - asm les di, s1 - asm lds si, s2 - asm cld - asm rep movsb - asm mov ds, ax - asm mov si, bx - asm mov di, dx - return(s1); - -#else - register char *smax, *s = s1; - int n2; - - n2 = n % 4; - smax = s + (n - 4); - while (s <= smax) - { - *s = *s2; *(s + 1) = *(s2 + 1); *(s + 2) = *(s2 + 2); *(s + 3) = *(s2 + 3); - s += 4; - s2 += 4; - } - while (n2--) *s++ = *s2++; - return(s1); -#endif -} diff --git a/mdk-stage1/slang/slmemset.c b/mdk-stage1/slang/slmemset.c deleted file mode 100644 index 3851663c5..000000000 --- a/mdk-stage1/slang/slmemset.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -/* These routines are fast memcpy, memset routines. When available, I - use system rouines. For msdos, I use inline assembly. */ - -/* The current versions only work in the forward direction only!! */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -void SLmemset(char *p, char space, int n) -{ -#if defined(__BORLANDC__) && defined(__MSDOS__) - asm mov al, space - asm mov dx, di - asm mov cx, n - asm les di, p - asm cld - asm rep stosb - asm mov di, dx -#else - register char *pmax; - - pmax = p + (n - 4); - n = n % 4; - while (p <= pmax) - { - *p++ = space; *p++ = space; *p++ = space; *p++= space; - } - while (n--) *p++ = space; -#endif -} diff --git a/mdk-stage1/slang/slmisc.c b/mdk-stage1/slang/slmisc.c deleted file mode 100644 index ccc7a9bdf..000000000 --- a/mdk-stage1/slang/slmisc.c +++ /dev/null @@ -1,330 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -#define DEBUG_MALLOC 0 - -#if DEBUG_MALLOC -# define SLREALLOC_FUN SLdebug_realloc -# define SLMALLOC_FUN SLdebug_malloc -# define SLFREE_FUN SLdebug_free -#else -# define SLREALLOC_FUN SLREALLOC -# define SLMALLOC_FUN SLMALLOC -# define SLFREE_FUN SLFREE -#endif - -/* Version information goes here since this file is always needed. */ -int SLang_Version = SLANG_VERSION; -char *SLang_Version_String = SLANG_VERSION_STRING; - -char *SLmake_string(char *str) -{ - return SLmake_nstring(str, strlen (str)); -} - -char *SLmake_nstring (char *str, unsigned int n) -{ - char *ptr; - - if (NULL == (ptr = SLmalloc(n + 1))) - { - return NULL; - } - SLMEMCPY (ptr, str, n); - ptr[n] = 0; - return(ptr); -} - -void SLmake_lut (unsigned char *lut, unsigned char *range, unsigned char reverse) -{ - register unsigned char *l = lut, *lmax = lut + 256; - int i, r1, r2; - - while (l < lmax) *l++ = reverse; - reverse = !reverse; - - r1 = *range++; - while (r1) - { - r2 = *range++; - if ((r2 == '-') && (*range != 0)) - { - r2 = *range++; - for (i = r1; i <= r2; i++) lut[i] = reverse; - r1 = *range++; - continue; - } - lut[r1] = reverse; - r1 = r2; - } -} - -char *SLmalloc (unsigned int len) -{ - char *p; - - p = (char *) SLMALLOC_FUN (len); - if (p == NULL) - SLang_Error = SL_MALLOC_ERROR; - - return p; -} - -void SLfree (char *p) -{ - if (p != NULL) SLFREE_FUN (p); -} - -char *SLrealloc (char *p, unsigned int len) -{ - if (len == 0) - { - SLfree (p); - return NULL; - } - - if (p == NULL) p = SLmalloc (len); - else - { - p = (char *)SLREALLOC_FUN (p, len); - if (p == NULL) - SLang_Error = SL_MALLOC_ERROR; - } - return p; -} - -char *SLcalloc (unsigned int nelems, unsigned int len) -{ - char *p; - - len = nelems * len; - p = SLmalloc (len); - if (p != NULL) SLMEMSET (p, 0, len); - return p; -} - -/* p and ch may point to the same buffer */ -char *_SLexpand_escaped_char(char *p, char *ch) -{ - int i = 0; - int max = 0, num, base = 0; - char ch1; - - ch1 = *p++; - - switch (ch1) - { - default: num = ch1; break; - case 'n': num = '\n'; break; - case 't': num = '\t'; break; - case 'v': num = '\v'; break; - case 'b': num = '\b'; break; - case 'r': num = '\r'; break; - case 'f': num = '\f'; break; - case 'E': case 'e': num = 27; break; - case 'a': num = 7; - break; - - /* octal */ - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - max = '7'; - base = 8; i = 2; num = ch1 - '0'; - break; - - case 'd': /* decimal -- S-Lang extension */ - base = 10; - i = 3; - max = '9'; - num = 0; - break; - - case 'x': /* hex */ - base = 16; - max = '9'; - i = 2; - num = 0; - break; - } - - while (i--) - { - ch1 = *p; - - if ((ch1 <= max) && (ch1 >= '0')) - { - num = base * num + (ch1 - '0'); - } - else if (base == 16) - { - ch1 |= 0x20; - if ((ch1 < 'a') || ((ch1 > 'f'))) break; - num = base * num + 10 + (ch1 - 'a'); - } - else break; - p++; - } - - *ch = (char) num; - return p; -} - -/* s and t could represent the same space */ -void SLexpand_escaped_string (register char *s, register char *t, - register char *tmax) -{ - char ch; - - while (t < tmax) - { - ch = *t++; - if (ch == '\\') - { - t = _SLexpand_escaped_char (t, &ch); - } - *s++ = ch; - } - *s = 0; -} - -int SLextract_list_element (char *list, unsigned int nth, char delim, - char *elem, unsigned int buflen) -{ - char *el, *elmax; - char ch; - - while (nth > 0) - { - while ((0 != (ch = *list)) && (ch != delim)) - list++; - - if (ch == 0) return -1; - - list++; - nth--; - } - - el = elem; - elmax = el + (buflen - 1); - - while ((0 != (ch = *list)) && (ch != delim) && (el < elmax)) - *el++ = *list++; - *el = 0; - - return 0; -} - -#ifndef HAVE_VSNPRINTF -int _SLvsnprintf (char *buf, unsigned int buflen, char *fmt, va_list ap) -{ -#if 1 - unsigned int len; - - /* On some systems vsprintf returns useless information. So, punt */ - vsprintf (buf, fmt, ap); - len = strlen (buf); - if (len >= buflen) - { - SLang_exit_error ("\ -Your system lacks the vsnprintf system call and vsprintf overflowed a buffer.\n\ -The integrity of this program has been violated.\n"); - return EOF; /* NOT reached */ - } - return (int)len; -#else - int status; - - status = vsprintf (buf, fmt, ap); - if (status >= (int) buflen) - { - /* If we are lucky, we will get this far. The real solution is to - * provide a working version of vsnprintf - */ - SLang_exit_error ("\ -Your system lacks the vsnprintf system call and vsprintf overflowed a buffer.\n\ -The integrity of this program has been violated.\n"); - return EOF; /* NOT reached */ - } - return status; -#endif -} -#endif - -#ifndef HAVE_SNPRINTF -int _SLsnprintf (char *buf, unsigned int buflen, char *fmt, ...) -{ - int status; - - va_list ap; - - va_start (ap, fmt); - status = _SLvsnprintf (buf, buflen, fmt, ap); - va_end (ap); - - return status; -} -#endif - -typedef struct _Cleanup_Function_Type -{ - struct _Cleanup_Function_Type *next; - void (*f)(void); -} -Cleanup_Function_Type; - -static Cleanup_Function_Type *Cleanup_Function_List; - -static void cleanup_slang (void) -{ - while (Cleanup_Function_List != NULL) - { - Cleanup_Function_Type *next = Cleanup_Function_List->next; - (*Cleanup_Function_List->f)(); - SLFREE_FUN ((char *) Cleanup_Function_List); - Cleanup_Function_List = next; - } -} - -#ifndef HAVE_ATEXIT -# ifdef HAVE_ON_EXIT -static void on_exit_cleanup_slang (int arg_unused) -{ - (void) arg_unused; - cleanup_slang (); -} -# endif -#endif - -int SLang_add_cleanup_function (void (*f)(void)) -{ - Cleanup_Function_Type *l; - - l = (Cleanup_Function_Type *) SLMALLOC_FUN (sizeof (Cleanup_Function_Type)); - if (l == NULL) - return -1; - - l->f = f; - l->next = Cleanup_Function_List; - - if (Cleanup_Function_List == NULL) - { -#ifdef HAVE_ATEXIT - (void) atexit (cleanup_slang); -#else -# ifdef HAVE_ON_EXIT - (void) on_exit (on_exit_cleanup_slang, 0); -# endif -#endif - } - Cleanup_Function_List = l; - return 0; -} - diff --git a/mdk-stage1/slang/slnspace.c b/mdk-stage1/slang/slnspace.c deleted file mode 100644 index 174ba7c81..000000000 --- a/mdk-stage1/slang/slnspace.c +++ /dev/null @@ -1,242 +0,0 @@ -/* -*- mode: C; mode: fold; -*- */ -/* slnspace.c --- Name Space implementation */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -static SLang_NameSpace_Type *Namespace_Tables; - -static SLang_NameSpace_Type *find_name_table (char *name) -{ - SLang_NameSpace_Type *table_list; - - table_list = Namespace_Tables; - while (table_list != NULL) - { - if (0 == strcmp (table_list->name, name)) - break; - table_list = table_list->next; - } - return table_list; -} - -SLang_NameSpace_Type *_SLns_find_namespace (char *name) -{ - SLang_NameSpace_Type *table_list; - - table_list = Namespace_Tables; - while (table_list != NULL) - { - if ((table_list->namespace_name != NULL) - && (0 == strcmp (table_list->namespace_name, name))) - break; - table_list = table_list->next; - } - return table_list; -} - -SLang_NameSpace_Type *_SLns_allocate_namespace (char *name, unsigned int size) -{ - SLang_NameSpace_Type *table_list; - SLang_Name_Type **nt; - - if (NULL != (table_list = find_name_table (name))) - return table_list; - - if (NULL == (name = SLang_create_slstring (name))) - return NULL; - - if (NULL == (table_list = (SLang_NameSpace_Type *) - SLmalloc (sizeof (SLang_NameSpace_Type)))) - { - SLang_free_slstring (name); - return NULL; - } - - if (NULL == (nt = (SLang_Name_Type **) SLmalloc (sizeof (SLang_Name_Type *) * size))) - { - SLang_free_slstring (name); - SLfree ((char *)table_list); - return NULL; - } - - memset ((char *)nt, 0, size * sizeof (SLang_Name_Type *)); - memset ((char *) table_list, 0, sizeof (SLang_NameSpace_Type)); - - table_list->name = name; - table_list->table = nt; - table_list->table_size = size; - - table_list->next = Namespace_Tables; - Namespace_Tables = table_list; - - return table_list; -} - -int _SLns_set_namespace_name (SLang_NameSpace_Type *t, char *name) -{ - SLang_NameSpace_Type *t1; - - t1 = _SLns_find_namespace (name); - if (t1 == NULL) - t1 = t; - - if ((t != t1) || (*name == 0)) - { - SLang_verror (SL_INTRINSIC_ERROR, "Namespace \"%s\" already exists", - name); - return -1; - } - - if (NULL == (name = SLang_create_slstring (name))) - return -1; - - SLang_free_slstring (t->namespace_name); /* NULL ok */ - t->namespace_name = name; - - return 0; -} - -SLang_Array_Type *_SLnspace_apropos (SLang_NameSpace_Type *ns, char *pat, unsigned int what) -{ - SLang_Array_Type *at; - unsigned int table_size; - SLang_Name_Type *t, **table; - int num_matches; - unsigned int i; - SLRegexp_Type rexp; - unsigned char rbuf[512]; - unsigned int two; - - at = NULL; - - if ((ns == NULL) - || ((table = ns->table) == NULL)) - return NULL; - - memset ((char *) &rexp, 0, sizeof (SLRegexp_Type)); - rexp.case_sensitive = 1; - rexp.buf = rbuf; - rexp.buf_len = sizeof (rbuf); - rexp.pat = (unsigned char *)pat; - - if (0 != SLang_regexp_compile (&rexp)) - { - SLang_verror (SL_INVALID_PARM, "Invalid regular expression: %s", pat); - return NULL; - } - - table_size = ns->table_size; - - two = 2; - while (two != 0) - { - two--; - - num_matches = 0; - for (i = 0; i < table_size; i++) - { - t = table[i]; - while (t != NULL) - { - unsigned int flags; - char *name = t->name; - - switch (t->name_type) - { - case SLANG_GVARIABLE: - flags = 8; - break; - - case SLANG_ICONSTANT: - case SLANG_DCONSTANT: - case SLANG_RVARIABLE: - case SLANG_IVARIABLE: - flags = 4; - break; - - case SLANG_INTRINSIC: - case SLANG_MATH_UNARY: - case SLANG_APP_UNARY: - flags = 1; - break; - - case SLANG_FUNCTION: - flags = 2; - break; - - default: - flags = 0; - break; - } - - if ((flags & what) - && (NULL != SLang_regexp_match ((unsigned char *)name, strlen (name), &rexp))) - { - if (at != NULL) - { - if (-1 == SLang_set_array_element (at, &num_matches, (VOID_STAR)&name)) - goto return_error; - } - num_matches++; - } - t = t->next; - } - } - - if (at == NULL) - { - at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &num_matches, 1); - if (at == NULL) - goto return_error; - } - } - - return at; - - return_error: - SLang_free_array (at); - return NULL; -} - -SLang_NameSpace_Type *SLns_create_namespace (char *namespace_name) -{ - SLang_NameSpace_Type *ns; - static int num; - char name[64]; - - if (namespace_name == NULL) - namespace_name = "Global"; - - ns = _SLns_find_namespace (namespace_name); - if (ns != NULL) - return ns; - - sprintf (name, " *** internal ns <%d> *** ", num); - - if (NULL == (ns = _SLns_allocate_namespace (name, SLSTATIC_HASH_TABLE_SIZE))) - return NULL; - - num++; - if (-1 == _SLns_set_namespace_name (ns, namespace_name)) - { - SLns_delete_namespace (ns); - return NULL; - } - - return ns; -} - -void SLns_delete_namespace (SLang_NameSpace_Type *ns) -{ - (void) ns; - /* V2.0 */ -} diff --git a/mdk-stage1/slang/slospath.c b/mdk-stage1/slang/slospath.c deleted file mode 100644 index 644931e81..000000000 --- a/mdk-stage1/slang/slospath.c +++ /dev/null @@ -1,73 +0,0 @@ -/* Pathname intrinsic functions */ -/* Copyright (c) 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -static void path_concat (char *a, char *b) -{ - SLang_push_malloced_string (SLpath_dircat (a,b)); -} - -static void path_extname (char *path) -{ -#ifdef VMS - char *p; -#endif - - path = SLpath_extname (path); -#ifndef VMS - SLang_push_string (path); -#else - p = strchr (path, ';'); - if (p == NULL) - (void)SLang_push_string (p); - else - (void)SLang_push_malloced_string (SLmake_nstring (path, (unsigned int)(p - path))); -#endif -} - -static void path_basename (char *path) -{ - (void) SLang_push_string (SLpath_basename (path)); -} - -static void path_dirname (char *path) -{ - (void) SLang_push_malloced_string (SLpath_dirname (path)); -} - -static void path_sans_extname (char *path) -{ - (void) SLang_push_malloced_string (SLpath_pathname_sans_extname (path)); -} - - - -static SLang_Intrin_Fun_Type Path_Name_Table [] = -{ - MAKE_INTRINSIC_SS("path_concat", path_concat, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("path_extname", path_extname, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("path_dirname", path_dirname, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("path_basename", path_basename, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("path_sans_extname", path_sans_extname, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("path_is_absolute", SLpath_is_absolute_path, SLANG_INT_TYPE), - SLANG_END_INTRIN_FUN_TABLE -}; - -int SLang_init_ospath (void) -{ - if (-1 == SLadd_intrin_fun_table(Path_Name_Table, "__OSPATH__")) - return -1; - - return 0; -} - - diff --git a/mdk-stage1/slang/slpack.c b/mdk-stage1/slang/slpack.c deleted file mode 100644 index 53ef63643..000000000 --- a/mdk-stage1/slang/slpack.c +++ /dev/null @@ -1,785 +0,0 @@ -/* Pack objects as a binary string */ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include - -#include "slang.h" -#include "_slang.h" - -#ifndef isdigit -# define isdigit(c) (((c)>='0')&&((c)<= '9')) -#endif -#ifndef isspace -# define isspace(c) (((c)==' ') || ((c)=='\t') || ((c)=='\n')) -#endif - -/* format description: - * - * s = string (null padded) - * S = string (space padded) - * c = signed char - * C = unsigned char - * h = short - * H = unsigned short - * i = int - * I = unsigned int - * l = long - * L = unsigned long - * j = 16 bit signed integer (short) - * J = 16 bit unsigned integer (short) - * k = 32 bit signed integer (long) - * K = 32 bit unsigned integer (long) - * f = float (native format) - * F = 32 bit double - * d = double (native format) - * D = 64 bit double - * x = null pad byte - * > = big-endian mode - * < = little-endian mode - * = = native mode - */ - -#define NATIVE_ORDER 0 -#define BIGENDIAN_ORDER 1 -#define LILENDIAN_ORDER 2 -static int Native_Byte_Order = NATIVE_ORDER; - -typedef struct -{ - char format_type; - unsigned char data_type; - unsigned int repeat; - unsigned int sizeof_type; - char pad; - int byteorder; - int is_scalar; -} -Format_Type; - -static int get_int_type_for_size (unsigned int size, unsigned char *s, unsigned char *u) -{ - if (sizeof (int) == size) - { - if (s != NULL) *s = SLANG_INT_TYPE; - if (u != NULL) *u = SLANG_UINT_TYPE; - return 0; - } - - if (sizeof (short) == size) - { - if (s != NULL) *s = SLANG_SHORT_TYPE; - if (u != NULL) *u = SLANG_USHORT_TYPE; - return 1; - } - - if (sizeof (long) == size) - { - if (s != NULL) *s = SLANG_LONG_TYPE; - if (u != NULL) *u = SLANG_ULONG_TYPE; - return 1; - } - - if (s != NULL) *s = 0; - if (u != NULL) *u = 0; - SLang_verror (SL_NOT_IMPLEMENTED, - "This OS does not support a %u byte int", size); - return -1; -} - -static int get_float_type_for_size (unsigned int size, unsigned char *s) -{ - if (sizeof (float) == size) - { - *s = SLANG_FLOAT_TYPE; - return 0; - } - - if (sizeof (double) == size) - { - *s = SLANG_DOUBLE_TYPE; - return 0; - } - - SLang_verror (SL_NOT_IMPLEMENTED, - "This OS does not support a %u byte float", size); - return -1; -} - -static int parse_a_format (char **format, Format_Type *ft) -{ - char *f; - char ch; - unsigned repeat; - - f = *format; - - while (((ch = *f++) != 0) - && isspace (ch)) - ; - - switch (ch) - { - default: - ft->byteorder = NATIVE_ORDER; - break; - - case '=': - ft->byteorder = NATIVE_ORDER; - ch = *f++; - break; - - case '>': - ft->byteorder = BIGENDIAN_ORDER; - ch = *f++; - break; - - case '<': - ft->byteorder = LILENDIAN_ORDER; - ch = *f++; - break; - } - - if (ch == 0) - { - f--; - *format = f; - return 0; - } - - ft->format_type = ch; - ft->repeat = 1; - - if (isdigit (*f)) - { - repeat = (unsigned int) (*f - '0'); - f++; - - while (isdigit (*f)) - { - unsigned int repeat10 = 10 * repeat + (unsigned int)(*f - '0'); - - /* Check overflow */ - if (repeat != repeat10 / 10) - { - SLang_verror (SL_OVERFLOW, - "Repeat count too large in [un]pack format"); - return -1; - } - repeat = repeat10; - f++; - } - ft->repeat = repeat; - } - - *format = f; - - ft->is_scalar = 1; - ft->pad = 0; - - switch (ft->format_type) - { - default: - SLang_verror (SL_NOT_IMPLEMENTED, - "[un]pack format character '%c' not supported", ft->format_type); - return -1; - - case 'D': - ft->sizeof_type = 8; - if (-1 == get_float_type_for_size (8, &ft->data_type)) - return -1; - break; - - case 'd': - ft->data_type = SLANG_DOUBLE_TYPE; - ft->sizeof_type = sizeof (double); - break; - - case 'F': - ft->sizeof_type = 4; - if (-1 == get_float_type_for_size (4, &ft->data_type)) - return -1; - break; - case 'f': - ft->data_type = SLANG_FLOAT_TYPE; - ft->sizeof_type = sizeof (float); - break; - - case 'h': - ft->data_type = SLANG_SHORT_TYPE; - ft->sizeof_type = sizeof (short); - break; - case 'H': - ft->data_type = SLANG_USHORT_TYPE; - ft->sizeof_type = sizeof (unsigned short); - break; - case 'i': - ft->data_type = SLANG_INT_TYPE; - ft->sizeof_type = sizeof (int); - break; - case 'I': - ft->data_type = SLANG_UINT_TYPE; - ft->sizeof_type = sizeof (unsigned int); - break; - case 'l': - ft->data_type = SLANG_LONG_TYPE; - ft->sizeof_type = sizeof (long); - break; - case 'L': - ft->data_type = SLANG_ULONG_TYPE; - ft->sizeof_type = sizeof (unsigned long); - break; - - /* 16 bit ints */ - case 'j': - ft->sizeof_type = 2; - if (-1 == get_int_type_for_size (2, &ft->data_type, NULL)) - return -1; - break; - case 'J': - ft->sizeof_type = 2; - if (-1 == get_int_type_for_size (2, NULL, &ft->data_type)) - return -1; - break; - - /* 32 bit ints */ - case 'k': - ft->sizeof_type = 4; - if (-1 == get_int_type_for_size (4, &ft->data_type, NULL)) - return -1; - break; - case 'K': - ft->sizeof_type = 4; - if (-1 == get_int_type_for_size (4, NULL, &ft->data_type)) - return -1; - break; - - case 'x': - ft->sizeof_type = 1; - ft->data_type = 0; - break; - - case 'c': - ft->sizeof_type = 1; - ft->data_type = SLANG_CHAR_TYPE; - break; - - case 'C': - ft->data_type = SLANG_UCHAR_TYPE; - ft->sizeof_type = 1; - break; - - case 'S': - case 'A': - ft->pad = ' '; - case 'a': - case 's': - ft->data_type = SLANG_BSTRING_TYPE; - ft->sizeof_type = 1; - ft->is_scalar = 0; - break; - } - return 1; -} - -static int compute_size_for_format (char *format, unsigned int *num_bytes) -{ - unsigned int size; - Format_Type ft; - int status; - - *num_bytes = size = 0; - - while (1 == (status = parse_a_format (&format, &ft))) - size += ft.repeat * ft.sizeof_type; - - *num_bytes = size; - return status; -} - -static void byte_swap64 (unsigned char *ss, unsigned int n) /*{{{*/ -{ - unsigned char *p, *pmax, ch; - - if (n == 0) return; - p = (unsigned char *) ss; - pmax = p + 8 * n; - while (p < pmax) - { - ch = *p; - *p = *(p + 7); - *(p + 7) = ch; - - ch = *(p + 6); - *(p + 6) = *(p + 1); - *(p + 1) = ch; - - ch = *(p + 5); - *(p + 5) = *(p + 2); - *(p + 2) = ch; - - ch = *(p + 4); - *(p + 4) = *(p + 3); - *(p + 3) = ch; - - p += 8; - } -} - -/*}}}*/ -static void byte_swap32 (unsigned char *ss, unsigned int n) /*{{{*/ -{ - unsigned char *p, *pmax, ch; - - p = (unsigned char *) ss; - pmax = p + 4 * n; - while (p < pmax) - { - ch = *p; - *p = *(p + 3); - *(p + 3) = ch; - - ch = *(p + 1); - *(p + 1) = *(p + 2); - *(p + 2) = ch; - p += 4; - } -} - -/*}}}*/ -static void byte_swap16 (unsigned char *p, unsigned int nread) /*{{{*/ -{ - unsigned char *pmax, ch; - - pmax = p + 2 * nread; - while (p < pmax) - { - ch = *p; - *p = *(p + 1); - *(p + 1) = ch; - p += 2; - } -} - -/*}}}*/ - -static int byteswap (int order, unsigned char *b, unsigned int size, unsigned int num) -{ - if (Native_Byte_Order == order) - return 0; - - switch (size) - { - case 2: - byte_swap16 (b, num); - break; - case 4: - byte_swap32 (b, num); - break; - case 8: - byte_swap64 (b, num); - break; - default: - return -1; - } - - return 0; -} - -static void check_native_byte_order (void) -{ - unsigned short x; - - if (Native_Byte_Order != NATIVE_ORDER) - return; - - x = 0xFF; - if (*(unsigned char *)&x == 0xFF) - Native_Byte_Order = LILENDIAN_ORDER; - else - Native_Byte_Order = BIGENDIAN_ORDER; -} - -static SLang_BString_Type * -pack_according_to_format (char *format, unsigned int nitems) -{ - unsigned int size, num; - unsigned char *buf, *b; - SLang_BString_Type *bs; - Format_Type ft; - - buf = NULL; - - if (-1 == compute_size_for_format (format, &size)) - goto return_error; - - if (NULL == (buf = (unsigned char *) SLmalloc (size + 1))) - goto return_error; - - b = buf; - - while (1 == parse_a_format (&format, &ft)) - { - unsigned char *ptr; - unsigned int repeat; - - repeat = ft.repeat; - if (ft.data_type == 0) - { - memset ((char *) b, ft.pad, repeat); - b += repeat; - continue; - } - - if (ft.is_scalar) - { - unsigned char *bstart; - num = repeat; - - bstart = b; - while (repeat != 0) - { - unsigned int nelements; - SLang_Array_Type *at; - - if (nitems == 0) - { - SLang_verror (SL_INVALID_PARM, - "Not enough items for pack format"); - goto return_error; - } - - if (-1 == SLang_pop_array_of_type (&at, ft.data_type)) - goto return_error; - - nelements = at->num_elements; - if (repeat < nelements) - nelements = repeat; - repeat -= nelements; - - nelements = nelements * ft.sizeof_type; - memcpy ((char *)b, (char *)at->data, nelements); - - b += nelements; - SLang_free_array (at); - nitems--; - } - - if (ft.byteorder != NATIVE_ORDER) - byteswap (ft.byteorder, bstart, ft.sizeof_type, num); - - continue; - } - - /* Otherwise we have a string */ - if (-1 == SLang_pop_bstring (&bs)) - goto return_error; - - ptr = SLbstring_get_pointer (bs, &num); - if (repeat < num) num = repeat; - memcpy ((char *)b, (char *)ptr, num); - b += num; - repeat -= num; - memset ((char *)b, ft.pad, repeat); - SLbstring_free (bs); - b += repeat; - nitems--; - } - - *b = 0; - bs = SLbstring_create_malloced (buf, size, 0); - if (bs == NULL) - goto return_error; - - SLdo_pop_n (nitems); - return bs; - - return_error: - SLdo_pop_n (nitems); - if (buf != NULL) - SLfree ((char *) buf); - - return NULL; -} - -void _SLpack (void) -{ - SLang_BString_Type *bs; - char *fmt; - int nitems; - - check_native_byte_order (); - - nitems = SLang_Num_Function_Args; - if (nitems <= 0) - { - SLang_verror (SL_SYNTAX_ERROR, - "pack: not enough arguments"); - return; - } - - if ((-1 == SLreverse_stack (nitems)) - || (-1 == SLang_pop_slstring (&fmt))) - bs = NULL; - else - { - bs = pack_according_to_format (fmt, (unsigned int)nitems - 1); - SLang_free_slstring (fmt); - } - - SLang_push_bstring (bs); - SLbstring_free (bs); -} - -void _SLunpack (char *format, SLang_BString_Type *bs) -{ - Format_Type ft; - unsigned char *b; - unsigned int len; - unsigned int num_bytes; - - check_native_byte_order (); - - if (-1 == compute_size_for_format (format, &num_bytes)) - return; - - b = SLbstring_get_pointer (bs, &len); - if (b == NULL) - return; - - if (len < num_bytes) - { - SLang_verror (SL_INVALID_PARM, - "unpack format %s is too large for input string", - format); - return; - } - - while (1 == parse_a_format (&format, &ft)) - { - char *str, *s; - - if (ft.repeat == 0) - continue; - - if (ft.data_type == 0) - { /* skip padding */ - b += ft.repeat; - continue; - } - - if (ft.is_scalar) - { - SLang_Array_Type *at; - int dims; - - if (ft.repeat == 1) - { - SLang_Class_Type *cl; - - cl = _SLclass_get_class (ft.data_type); - memcpy ((char *)cl->cl_transfer_buf, (char *)b, ft.sizeof_type); - if (ft.byteorder != NATIVE_ORDER) - byteswap (ft.byteorder, (unsigned char *)cl->cl_transfer_buf, ft.sizeof_type, 1); - - if (-1 == (cl->cl_apush (ft.data_type, cl->cl_transfer_buf))) - return; - b += ft.sizeof_type; - continue; - } - - dims = (int) ft.repeat; - at = SLang_create_array (ft.data_type, 0, NULL, &dims, 1); - if (at == NULL) - return; - - num_bytes = ft.repeat * ft.sizeof_type; - memcpy ((char *)at->data, (char *)b, num_bytes); - if (ft.byteorder != NATIVE_ORDER) - byteswap (ft.byteorder, (unsigned char *)at->data, ft.sizeof_type, ft.repeat); - - if (-1 == SLang_push_array (at, 1)) - return; - - b += num_bytes; - continue; - } - - len = ft.repeat; - str = SLmalloc (len + 1); - if (str == NULL) - return; - - memcpy ((char *) str, (char *)b, len); - str [len] = 0; - - if (ft.pad == ' ') - { - unsigned int new_len; - - s = str + len; - while (s > str) - { - s--; - if ((*s != ' ') && (*s != 0)) - { - s++; - break; - } - *s = 0; - } - new_len = (unsigned int) (s - str); - - if (new_len != len) - { - s = SLrealloc (str, new_len + 1); - if (s == NULL) - { - SLfree (str); - return; - } - str = s; - len = new_len; - } - } - - /* Avoid a bstring if possible */ - s = SLmemchr (str, 0, len); - if (s == NULL) - { - if (-1 == SLang_push_malloced_string (str)) - return; - } - else - { - SLang_BString_Type *new_bs; - - new_bs = SLbstring_create_malloced ((unsigned char *)str, len, 1); - if (new_bs == NULL) - return; - - if (-1 == SLang_push_bstring (new_bs)) - { - SLfree (str); - return; - } - SLbstring_free (new_bs); - } - - b += ft.repeat; - } -} - -unsigned int _SLpack_compute_size (char *format) -{ - unsigned int n; - - n = 0; - (void) compute_size_for_format (format, &n); - return n; -} - -void _SLpack_pad_format (char *format) -{ - unsigned int len, max_len; - Format_Type ft; - char *buf, *b; - - check_native_byte_order (); - - /* Just check the syntax */ - if (-1 == compute_size_for_format (format, &max_len)) - return; - - /* This should be sufficient to handle any needed xyy padding characters. - * I cannot see how this will be overrun - */ - max_len = 4 * (strlen (format) + 1); - if (NULL == (buf = SLmalloc (max_len + 1))) - return; - - b = buf; - len = 0; - while (1 == parse_a_format (&format, &ft)) - { - struct { char a; short b; } s_h; - struct { char a; int b; } s_i; - struct { char a; long b; } s_l; - struct { char a; float b; } s_f; - struct { char a; double b; } s_d; - unsigned int pad; - - if (ft.repeat == 0) - continue; - - if (ft.data_type == 0) - { /* pad */ - sprintf (b, "x%u", ft.repeat); - b += strlen (b); - len += ft.repeat; - continue; - } - - switch (ft.data_type) - { - default: - case SLANG_STRING_TYPE: - case SLANG_BSTRING_TYPE: - case SLANG_CHAR_TYPE: - case SLANG_UCHAR_TYPE: - pad = 0; - break; - - case SLANG_SHORT_TYPE: - case SLANG_USHORT_TYPE: - pad = ((unsigned int) ((char *)&s_h.b - (char *)&s_h.a)); - break; - - case SLANG_INT_TYPE: - case SLANG_UINT_TYPE: - pad = ((unsigned int) ((char *)&s_i.b - (char *)&s_i.a)); - break; - - case SLANG_LONG_TYPE: - case SLANG_ULONG_TYPE: - pad = ((unsigned int) ((char *)&s_l.b - (char *)&s_l.a)); - break; - - case SLANG_FLOAT_TYPE: - pad = ((unsigned int) ((char *)&s_f.b - (char *)&s_f.a)); - break; - - case SLANG_DOUBLE_TYPE: - pad = ((unsigned int) ((char *)&s_d.b - (char *)&s_d.a)); - break; - } - - /* Pad to a length that is an integer multiple of pad. */ - if (pad) - pad = pad * ((len + pad - 1)/pad) - len; - - if (pad) - { - sprintf (b, "x%u", pad); - b += strlen (b); - len += pad; - } - - *b++ = ft.format_type; - if (ft.repeat > 1) - { - sprintf (b, "%u", ft.repeat); - b += strlen (b); - } - - len += ft.repeat * ft.sizeof_type; - } - *b = 0; - - (void) SLang_push_malloced_string (buf); -} diff --git a/mdk-stage1/slang/slparse.c b/mdk-stage1/slang/slparse.c deleted file mode 100644 index bc709d1fb..000000000 --- a/mdk-stage1/slang/slparse.c +++ /dev/null @@ -1,1970 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -static SLang_Load_Type *LLT; -int _SLang_Compile_Line_Num_Info; - -static void free_token (_SLang_Token_Type *t) -{ - register unsigned int nrefs = t->num_refs; - - if (nrefs == 0) - return; - - if (nrefs == 1) - { - if (t->free_sval_flag) - { - if (t->type == BSTRING_TOKEN) - SLbstring_free (t->v.b_val); - else - _SLfree_hashed_string (t->v.s_val, strlen (t->v.s_val), t->hash); - t->v.s_val = NULL; - } - } - - t->num_refs = nrefs - 1; -} - -static void init_token (_SLang_Token_Type *t) -{ - memset ((char *) t, 0, sizeof (_SLang_Token_Type)); -#if _SLANG_HAS_DEBUG_CODE - t->line_number = -1; -#endif -} - -/* Allow room for one push back of a token. This is necessary for - * multiple assignment. - */ -static unsigned int Use_Next_Token; -static _SLang_Token_Type Next_Token; -#if _SLANG_HAS_DEBUG_CODE -static int Last_Line_Number = -1; -#endif - -static int unget_token (_SLang_Token_Type *ctok) -{ - if (SLang_Error) - return -1; - if (Use_Next_Token != 0) - { - _SLparse_error ("unget_token failed", ctok, 0); - return -1; - } - - Use_Next_Token++; - Next_Token = *ctok; - init_token (ctok); - return 0; -} - -static int get_token (_SLang_Token_Type *ctok) -{ - if (ctok->num_refs) - free_token (ctok); - - if (Use_Next_Token) - { - Use_Next_Token--; - *ctok = Next_Token; - return ctok->type; - } - - return _SLget_token (ctok); -} - -static int compile_token (_SLang_Token_Type *t) -{ -#if _SLANG_HAS_DEBUG_CODE - if (_SLang_Compile_Line_Num_Info - && (t->line_number != Last_Line_Number) - && (t->line_number != -1)) - { - _SLang_Token_Type tok; - tok.type = LINE_NUM_TOKEN; - tok.v.long_val = Last_Line_Number = t->line_number; - (*_SLcompile_ptr) (&tok); - } -#endif - (*_SLcompile_ptr) (t); - return 0; -} - -typedef struct -{ -#define USE_PARANOID_MAGIC 0 -#if USE_PARANOID_MAGIC - unsigned long magic; -#endif - _SLang_Token_Type *stack; - unsigned int len; - unsigned int size; -} -Token_List_Type; - -#define MAX_TOKEN_LISTS 16 -static Token_List_Type Token_List_Stack [MAX_TOKEN_LISTS]; -static unsigned int Token_List_Stack_Depth = 0; -static Token_List_Type *Token_List = NULL; - -static void init_token_list (Token_List_Type *t) -{ - t->size = 0; - t->len = 0; - t->stack = NULL; -#if USE_PARANOID_MAGIC - t->magic = 0xABCDEF12; -#endif -} - -static void free_token_list (Token_List_Type *t) -{ - _SLang_Token_Type *s; - - if (t == NULL) - return; -#if USE_PARANOID_MAGIC - if (t->magic != 0xABCDEF12) - { - SLang_doerror ("Magic error."); - return; - } -#endif - s = t->stack; - if (s != NULL) - { - _SLang_Token_Type *smax = s + t->len; - while (s != smax) - { - if (s->num_refs) free_token (s); - s++; - } - - SLfree ((char *) t->stack); - } - - memset ((char *) t, 0, sizeof (Token_List_Type)); -} - -static Token_List_Type *push_token_list (void) -{ - if (Token_List_Stack_Depth == MAX_TOKEN_LISTS) - { - _SLparse_error ("Token list stack size exceeded", NULL, 0); - return NULL; - } - - Token_List = Token_List_Stack + Token_List_Stack_Depth; - Token_List_Stack_Depth++; - init_token_list (Token_List); - return Token_List; -} - -static int pop_token_list (int do_free) -{ - if (Token_List_Stack_Depth == 0) - { - if (SLang_Error == 0) - _SLparse_error ("Token list stack underflow", NULL, 0); - return -1; - } - Token_List_Stack_Depth--; - - if (do_free) free_token_list (Token_List); - - if (Token_List_Stack_Depth != 0) - Token_List = Token_List_Stack + (Token_List_Stack_Depth - 1); - else - Token_List = NULL; - - return 0; -} - -static int check_token_list_space (Token_List_Type *t, unsigned int delta_size) -{ - _SLang_Token_Type *st; - unsigned int len; -#if USE_PARANOID_MAGIC - if (t->magic != 0xABCDEF12) - { - SLang_doerror ("Magic error."); - return -1; - } -#endif - len = t->len + delta_size; - if (len <= t->size) return 0; - - if (delta_size < 4) - { - delta_size = 4; - len = t->len + delta_size; - } - - st = (_SLang_Token_Type *) SLrealloc((char *) t->stack, - len * sizeof(_SLang_Token_Type)); - if (st == NULL) - { - _SLparse_error ("Malloc error", NULL, 0); - return -1; - } - - memset ((char *) (st + t->len), 0, delta_size); - - t->stack = st; - t->size = len; - return 0; -} - -static int append_token (_SLang_Token_Type *t) -{ - if (-1 == check_token_list_space (Token_List, 1)) - return -1; - - Token_List->stack [Token_List->len] = *t; - Token_List->len += 1; - t->num_refs = 0; /* stealing it */ - return 0; -} - -static int append_token_of_type (unsigned char t) -{ - _SLang_Token_Type *tok; - - if (-1 == check_token_list_space (Token_List, 1)) - return -1; - - /* The memset when the list was created ensures that the other fields - * are properly initialized. - */ - tok = Token_List->stack + Token_List->len; - init_token (tok); - tok->type = t; - Token_List->len += 1; - return 0; -} - -static _SLang_Token_Type *get_last_token (void) -{ - unsigned int len; - - if ((Token_List == NULL) - || (0 == (len = Token_List->len))) - return NULL; - - len--; - return Token_List->stack + len; -} - -/* This function does NOT free the list. */ -static int compile_token_list_with_fun (int dir, Token_List_Type *list, - int (*f)(_SLang_Token_Type *)) -{ - _SLang_Token_Type *t0, *t1; - - if (list == NULL) - return -1; - - if (f == NULL) - f = compile_token; - - t0 = list->stack; - t1 = t0 + list->len; - - if (dir < 0) - { - /* backwards */ - - while ((SLang_Error == 0) && (t1 > t0)) - { - t1--; - (*f) (t1); - } - return 0; - } - - /* forward */ - while ((SLang_Error == 0) && (t0 < t1)) - { - (*f) (t0); - t0++; - } - return 0; -} - -static int compile_token_list (void) -{ - if (Token_List == NULL) - return -1; - - compile_token_list_with_fun (1, Token_List, NULL); - pop_token_list (1); - return 0; -} - -/* Take all elements in the list from pos2 to the end and exchange them - * with the elements at pos1, e.g., - * ...ABCDEabc ==> ...abcABCDE - * where pos1 denotes A and pos2 denotes a. - */ -static int token_list_element_exchange (unsigned int pos1, unsigned int pos2) -{ - _SLang_Token_Type *s, *s1, *s2; - unsigned int len, nloops; - - if (Token_List == NULL) - return -1; - - s = Token_List->stack; - len = Token_List->len; - - if ((s == NULL) || (len == 0) - || (pos2 >= len)) - return -1; - - /* This may not be the most efficient algorithm but the number to swap - * is most-likely going to be small, e.g, 3 - * The algorithm is to rotate the list. The particular rotation - * direction was chosen to make insert_token fast. - * It works like: - * @ ABCabcde --> BCabcdeA --> CabcdeAB --> abcdefAB - * which is optimal for Abcdef sequence produced by function calls. - * - * Profiling indicates that nloops is almost always 1, whereas the inner - * loop can loop many times (e.g., 9 times). - */ - - s2 = s + (len - 1); - s1 = s + pos1; - nloops = pos2 - pos1; - - while (nloops) - { - _SLang_Token_Type save; - - s = s1; - save = *s; - - while (s < s2) - { - *s = *(s + 1); - s++; - } - *s = save; - - nloops--; - } - return 0; -} - -#if 0 -static int insert_token (_SLang_Token_Type *t, unsigned int pos) -{ - if (-1 == append_token (t)) - return -1; - - return token_list_element_exchange (pos, Token_List->len - 1); -} -#endif -static void compile_token_of_type (unsigned char t) -{ - _SLang_Token_Type tok; - -#if _SLANG_HAS_DEBUG_CODE - tok.line_number = -1; -#endif - tok.type = t; - compile_token(&tok); -} - -static void statement (_SLang_Token_Type *); -static void compound_statement (_SLang_Token_Type *); -static void expression_with_parenthesis (_SLang_Token_Type *); -static void handle_semicolon (_SLang_Token_Type *); -static void statement_list (_SLang_Token_Type *); -static void variable_list (_SLang_Token_Type *, unsigned char); -static void struct_declaration (_SLang_Token_Type *); -static void define_function_args (_SLang_Token_Type *); -static void typedef_definition (_SLang_Token_Type *); -static void function_args_expression (_SLang_Token_Type *, int); -static void expression (_SLang_Token_Type *); -static void expression_with_commas (_SLang_Token_Type *, int); -static void simple_expression (_SLang_Token_Type *); -static void unary_expression (_SLang_Token_Type *); -static void postfix_expression (_SLang_Token_Type *); -static int check_for_lvalue (unsigned char, _SLang_Token_Type *); -/* static void primary_expression (_SLang_Token_Type *); */ -static void block (_SLang_Token_Type *); -static void inline_array_expression (_SLang_Token_Type *); -static void array_index_expression (_SLang_Token_Type *); -static void do_multiple_assignment (_SLang_Token_Type *); -static void try_multiple_assignment (_SLang_Token_Type *); -#if 0 -static void not_implemented (char *what) -{ - char err [256]; - sprintf (err, "Expression not implemented: %s", what); - _SLparse_error (err, NULL, 0); -} -#endif -static void rpn_parse_line (_SLang_Token_Type *tok) -{ - do - { - /* multiple RPN tokens possible when the file looks like: - * . - * . - */ - if (tok->type != RPN_TOKEN) - compile_token (tok); - free_token (tok); - } - while (EOF_TOKEN != _SLget_rpn_token (tok)); -} - -static int get_identifier_token (_SLang_Token_Type *tok) -{ - if (IDENT_TOKEN == get_token (tok)) - return IDENT_TOKEN; - - _SLparse_error ("Expecting identifier", tok, 0); - return tok->type; -} - -static void define_function (_SLang_Token_Type *ctok, unsigned char type) -{ - _SLang_Token_Type fname; - - switch (type) - { - case STATIC_TOKEN: - type = DEFINE_STATIC_TOKEN; - break; - - case PUBLIC_TOKEN: - type = DEFINE_PUBLIC_TOKEN; - break; - - case PRIVATE_TOKEN: - type = DEFINE_PRIVATE_TOKEN; - } - - init_token (&fname); - if (IDENT_TOKEN != get_identifier_token (&fname)) - { - free_token (&fname); - return; - } - - compile_token_of_type(OPAREN_TOKEN); - get_token (ctok); - define_function_args (ctok); - compile_token_of_type(FARG_TOKEN); - - if (ctok->type == OBRACE_TOKEN) - compound_statement(ctok); - - else if (ctok->type != SEMICOLON_TOKEN) - { - _SLparse_error("Expecting {", ctok, 0); - free_token (&fname); - return; - } - - fname.type = type; - compile_token (&fname); - free_token (&fname); -} - -/* statement: - * compound-statement - * if ( expression ) statement - * if ( expression ) statement else statement - * !if ( expression ) statement - * loop ( expression ) statement - * _for ( expression ) statement - * foreach ( expression ) statement - * foreach (expression ) using (expression-list) statement - * while ( expression ) statement - * do statement while (expression) ; - * for ( expressionopt ; expressionopt ; expressionopt ) statement - * ERROR_BLOCK statement - * EXIT_BLOCK statement - * USER_BLOCK0 statement - * USER_BLOCK1 statement - * USER_BLOCK2 statement - * USER_BLOCK3 statement - * USER_BLOCK4 statement - * forever statement - * break ; - * continue ; - * return expressionopt ; - * variable variable-list ; - * struct struct-decl ; - * define identifier function-args ; - * define identifier function-args compound-statement - * switch ( expression ) statement - * rpn-line - * at-line - * push ( expression ) - * ( expression ) = expression ; - * expression ; - * expression : - */ - -/* Note: This function does not return with a new token. It is up to the - * calling routine to handle that. - */ -static void statement (_SLang_Token_Type *ctok) -{ - unsigned char type; - - if (SLang_Error) - return; - - LLT->parse_level += 1; - - switch (ctok->type) - { - case OBRACE_TOKEN: - compound_statement (ctok); - break; - - case IF_TOKEN: - case IFNOT_TOKEN: - type = ctok->type; - get_token (ctok); - expression_with_parenthesis (ctok); - block (ctok); - - if (ELSE_TOKEN != get_token (ctok)) - { - compile_token_of_type (type); - unget_token (ctok); - break; - } - get_token (ctok); - block (ctok); - if (type == IF_TOKEN) type = ELSE_TOKEN; else type = NOTELSE_TOKEN; - compile_token_of_type (type); - break; - - /* case IFNOT_TOKEN: */ - case LOOP_TOKEN: - case _FOR_TOKEN: - type = ctok->type; - get_token (ctok); - expression_with_parenthesis (ctok); - block (ctok); - compile_token_of_type (type); - break; - - case FOREACH_TOKEN: - get_token (ctok); - expression_with_parenthesis (ctok); - - if (NULL == push_token_list ()) - break; - - append_token_of_type (ARG_TOKEN); - if (ctok->type == USING_TOKEN) - { - if (OPAREN_TOKEN != get_token (ctok)) - { - _SLparse_error ("Expected 'using ('", ctok, 0); - break; - } - get_token (ctok); - function_args_expression (ctok, 0); - } - append_token_of_type (EARG_TOKEN); - - compile_token_list (); - - block (ctok); - compile_token_of_type (FOREACH_TOKEN); - break; - - case WHILE_TOKEN: - get_token (ctok); - compile_token_of_type (OBRACE_TOKEN); - expression_with_parenthesis (ctok); - compile_token_of_type (CBRACE_TOKEN); - block (ctok); - compile_token_of_type (WHILE_TOKEN); - break; - - case DO_TOKEN: - get_token (ctok); - block (ctok); - - if (WHILE_TOKEN != get_token (ctok)) - { - _SLparse_error("Expecting while", ctok, 0); - break; - } - - get_token (ctok); - - compile_token_of_type (OBRACE_TOKEN); - expression_with_parenthesis (ctok); - compile_token_of_type (CBRACE_TOKEN); - compile_token_of_type (DOWHILE_TOKEN); - handle_semicolon (ctok); - break; - - case FOR_TOKEN: - - /* Look for (exp_opt ; exp_opt ; exp_opt ) */ - - if (OPAREN_TOKEN != get_token (ctok)) - { - _SLparse_error("Expecting (.", ctok, 0); - break; - } - - if (NULL == push_token_list ()) - break; - - append_token_of_type (OBRACE_TOKEN); - if (SEMICOLON_TOKEN != get_token (ctok)) - { - expression (ctok); - if (ctok->type != SEMICOLON_TOKEN) - { - _SLparse_error("Expecting ;", ctok, 0); - break; - } - } - append_token_of_type (CBRACE_TOKEN); - - append_token_of_type (OBRACE_TOKEN); - if (SEMICOLON_TOKEN != get_token (ctok)) - { - expression (ctok); - if (ctok->type != SEMICOLON_TOKEN) - { - _SLparse_error("Expecting ;", ctok, 0); - break; - } - } - append_token_of_type (CBRACE_TOKEN); - - append_token_of_type (OBRACE_TOKEN); - if (CPAREN_TOKEN != get_token (ctok)) - { - expression (ctok); - if (ctok->type != CPAREN_TOKEN) - { - _SLparse_error("Expecting ).", ctok, 0); - break; - } - } - append_token_of_type (CBRACE_TOKEN); - - compile_token_list (); - - get_token (ctok); - block (ctok); - compile_token_of_type (FOR_TOKEN); - break; - - case ERRBLK_TOKEN: - case EXITBLK_TOKEN: - case USRBLK0_TOKEN: - case USRBLK1_TOKEN: - case USRBLK2_TOKEN: - case USRBLK3_TOKEN: - case USRBLK4_TOKEN: - case FOREVER_TOKEN: - type = ctok->type; - get_token (ctok); - block (ctok); - compile_token_of_type (type); - break; - - case BREAK_TOKEN: - case CONT_TOKEN: - compile_token_of_type (ctok->type); - get_token (ctok); - handle_semicolon (ctok); - break; - - case RETURN_TOKEN: - if (SEMICOLON_TOKEN != get_token (ctok)) - { - if (NULL == push_token_list ()) - break; - - expression (ctok); - - if (ctok->type != SEMICOLON_TOKEN) - { - _SLparse_error ("Expecting ;", ctok, 0); - break; - } - compile_token_list (); - } - compile_token_of_type (RETURN_TOKEN); - handle_semicolon (ctok); - break; - - case STATIC_TOKEN: - case PRIVATE_TOKEN: - case PUBLIC_TOKEN: - type = ctok->type; - get_token (ctok); - if (ctok->type == VARIABLE_TOKEN) - { - get_token (ctok); - variable_list (ctok, type); - handle_semicolon (ctok); - break; - } - if (ctok->type == DEFINE_TOKEN) - { - define_function (ctok, type); - break; - } - _SLparse_error ("Expecting 'variable' or 'define'", ctok, 0); - break; - - case VARIABLE_TOKEN: - get_token (ctok); - variable_list (ctok, OBRACKET_TOKEN); - handle_semicolon (ctok); - break; - - case TYPEDEF_TOKEN: - get_token (ctok); - if (NULL == push_token_list ()) - break; - typedef_definition (ctok); - compile_token_list (); - - handle_semicolon (ctok); - break; - - case DEFINE_TOKEN: - define_function (ctok, DEFINE_TOKEN); - break; - - case SWITCH_TOKEN: - get_token (ctok); - expression_with_parenthesis (ctok); - - while ((SLang_Error == 0) - && (OBRACE_TOKEN == ctok->type)) - { - compile_token_of_type (OBRACE_TOKEN); - compound_statement (ctok); - compile_token_of_type (CBRACE_TOKEN); - get_token (ctok); - } - compile_token_of_type (SWITCH_TOKEN); - unget_token (ctok); - break; - - case EOF_TOKEN: - break; -#if 0 - case PUSH_TOKEN: - get_token (ctok); - expression_list_with_parenthesis (ctok); - handle_semicolon (ctok); - break; -#endif - - case SEMICOLON_TOKEN: - handle_semicolon (ctok); - break; - - case RPN_TOKEN: - if (POUND_TOKEN == get_token (ctok)) - _SLcompile_byte_compiled (); - else if (ctok->type != EOF_TOKEN) - rpn_parse_line (ctok); - break; - - case OPAREN_TOKEN: /* multiple assignment */ - try_multiple_assignment (ctok); - if (ctok->type == COLON_TOKEN) - compile_token_of_type (COLON_TOKEN); - else handle_semicolon (ctok); - break; - - default: - - if (NULL == push_token_list ()) - break; - - expression (ctok); - compile_token_list (); - - if (ctok->type == COLON_TOKEN) - compile_token_of_type (COLON_TOKEN); - else handle_semicolon (ctok); - break; - } - - LLT->parse_level -= 1; -} - -static void block (_SLang_Token_Type *ctok) -{ - compile_token_of_type (OBRACE_TOKEN); - statement (ctok); - compile_token_of_type (CBRACE_TOKEN); -} - -/* - * statement-list: - * statement - * statement-list statement - */ -static void statement_list (_SLang_Token_Type *ctok) -{ - while ((SLang_Error == 0) - && (ctok->type != CBRACE_TOKEN) - && (ctok->type != EOF_TOKEN)) - { - statement(ctok); - get_token (ctok); - } -} - -/* compound-statement: - * { statement-list } - */ -static void compound_statement (_SLang_Token_Type *ctok) -{ - /* ctok->type is OBRACE_TOKEN here */ - get_token (ctok); - statement_list(ctok); - if (CBRACE_TOKEN != ctok->type) - { - _SLparse_error ("Expecting '}'", ctok, 0); - return; - } -} - -/* This function is only called from statement. */ -static void expression_with_parenthesis (_SLang_Token_Type *ctok) -{ - if (ctok->type != OPAREN_TOKEN) - { - _SLparse_error("Expecting (", ctok, 0); - return; - } - - if (NULL == push_token_list ()) - return; - - get_token (ctok); - expression (ctok); - - if (ctok->type != CPAREN_TOKEN) - _SLparse_error("Expecting )", ctok, 0); - - compile_token_list (); - - get_token (ctok); -} - -static void handle_semicolon (_SLang_Token_Type *ctok) -{ - if ((ctok->type == SEMICOLON_TOKEN) - || (ctok->type == EOF_TOKEN)) - return; - - _SLparse_error ("Expecting ;", ctok, 0); -} - -void _SLparse_start (SLang_Load_Type *llt) -{ - _SLang_Token_Type ctok; - SLang_Load_Type *save_llt; - unsigned int save_use_next_token; - _SLang_Token_Type save_next_token; - Token_List_Type *save_list; -#if _SLANG_HAS_DEBUG_CODE - int save_last_line_number = Last_Line_Number; - - Last_Line_Number = -1; -#endif - save_use_next_token = Use_Next_Token; - save_next_token = Next_Token; - save_list = Token_List; - save_llt = LLT; - LLT = llt; - - init_token (&Next_Token); - Use_Next_Token = 0; - init_token (&ctok); - get_token (&ctok); - - llt->parse_level = 0; - statement_list (&ctok); - - if ((SLang_Error == 0) - && (ctok.type != EOF_TOKEN)) - _SLparse_error ("Parse ended prematurely", &ctok, 0); - - - if (SLang_Error) - { - if (SLang_Error < 0) /* severe error */ - save_list = NULL; - - while (Token_List != save_list) - { - if (-1 == pop_token_list (1)) - break; /* ??? when would this happen? */ - } - } - - free_token (&ctok); - LLT = save_llt; - if (Use_Next_Token) - free_token (&Next_Token); - Use_Next_Token = save_use_next_token; - Next_Token = save_next_token; -#if _SLANG_HAS_DEBUG_CODE - Last_Line_Number = save_last_line_number; -#endif -} - -/* variable-list: - * variable-decl - * variable-decl variable-list - * - * variable-decl: - * identifier - * identifier = simple-expression - */ -static void variable_list (_SLang_Token_Type *name_token, unsigned char variable_type) -{ - int declaring; - _SLang_Token_Type tok; - - if (name_token->type != IDENT_TOKEN) - { - _SLparse_error ("Expecting a variable name", name_token, 0); - return; - } - - declaring = 0; - do - { - if (declaring == 0) - { - declaring = 1; - compile_token_of_type (variable_type); - } - - compile_token (name_token); - - init_token (&tok); - if (ASSIGN_TOKEN == get_token (&tok)) - { - compile_token_of_type (CBRACKET_TOKEN); - declaring = 0; - - get_token (&tok); - - push_token_list (); - simple_expression (&tok); - compile_token_list (); - - name_token->type = _SCALAR_ASSIGN_TOKEN; - compile_token (name_token); - } - - free_token (name_token); - *name_token = tok; - } - while ((name_token->type == COMMA_TOKEN) - && (IDENT_TOKEN == get_token (name_token))); - - if (declaring) compile_token_of_type (CBRACKET_TOKEN); -} - -/* struct-declaration: - * struct { struct-field-list }; - * - * struct-field-list: - * struct-field-name , struct-field-list - * struct-field-name - * - * Generates code: "field-name-1" ... "field-name-N" N STRUCT_TOKEN - */ -static void struct_declaration (_SLang_Token_Type *ctok) -{ - int n; - _SLang_Token_Type num_tok; - - if (ctok->type != OBRACE_TOKEN) - { - _SLparse_error ("Expecting {", ctok, 0); - return; - } - - n = 0; - while (IDENT_TOKEN == get_token (ctok)) - { - n++; - ctok->type = STRING_TOKEN; - append_token (ctok); - if (COMMA_TOKEN != get_token (ctok)) - break; - } - - if (ctok->type != CBRACE_TOKEN) - { - _SLparse_error ("Expecting }", ctok, 0); - return; - } - if (n == 0) - { - _SLparse_error ("struct requires at least 1 field", ctok, 0); - return; - } - - init_token (&num_tok); - num_tok.type = INT_TOKEN; - num_tok.v.long_val = n; - append_token (&num_tok); - append_token_of_type (STRUCT_TOKEN); - - get_token (ctok); -} - -/* struct-declaration: - * typedef struct { struct-field-list } Type_Name; - * - * struct-field-list: - * struct-field-name , struct-field-list - * struct-field-name - * - * Generates code: "field-name-1" ... "field-name-N" N STRUCT_TOKEN typedef - */ -static void typedef_definition (_SLang_Token_Type *t) -{ - - if (t->type != STRUCT_TOKEN) - { - _SLparse_error ("Expecting `struct'", t, 0); - return; - } - get_token (t); - - struct_declaration (t); - if (t->type != IDENT_TOKEN) - { - _SLparse_error ("Expecting identifier", t, 0); - return; - } - - t->type = STRING_TOKEN; - append_token (t); - append_token_of_type (TYPEDEF_TOKEN); - - get_token (t); -} - -/* function-args: - * ( args-dec-opt ) - * - * args-decl-opt: - * identifier - * args-decl , identifier - */ -static void define_function_args (_SLang_Token_Type *ctok) -{ - if (CPAREN_TOKEN == get_token (ctok)) - { - get_token (ctok); - return; - } - - compile_token_of_type(OBRACKET_TOKEN); - - while ((SLang_Error == 0) - && (ctok->type == IDENT_TOKEN)) - { - compile_token (ctok); - if (COMMA_TOKEN != get_token (ctok)) - break; - - get_token (ctok); - } - - if (CPAREN_TOKEN != ctok->type) - { - _SLparse_error("Expecting )", ctok, 0); - return; - } - compile_token_of_type(CBRACKET_TOKEN); - - get_token (ctok); -} - -void try_multiple_assignment (_SLang_Token_Type *ctok) -{ - /* This is called with ctok->type == OPAREN_TOKEN. We have no idea - * what follows this. There are various possibilities such as: - * @ () = x; - * @ ( expression ) = x; - * @ ( expression ) ; - * @ ( expression ) OP expression; - * @ ( expression ) [expression] = expression; - * and only the first two constitute a multiple assignment. The last - * two forms create the difficulty. - * - * Here is the plan. First parse (expression) and then check next token. - * If it is an equal operator, then it will be parsed as a multiple - * assignment. In fact, that is the easy part. - * - * The hard part stems from the fact that by parsing (expression), we - * have effectly truncated the parse if (expression) is part of a binary - * or unary expression. Somehow, the parsing must be resumed. The trick - * here is to use a dummy literal that generates no code: NO_OP_LITERAL - * Using it, we just call 'expression' and proceed. - */ - - if (NULL == push_token_list ()) - return; - - get_token (ctok); - - if (ctok->type != CPAREN_TOKEN) - { - expression_with_commas (ctok, 1); - if (ctok->type != CPAREN_TOKEN) - { - _SLparse_error ("Expecting )", ctok, 0); - return; - } - } - - switch (get_token (ctok)) - { - case ASSIGN_TOKEN: - case PLUSEQS_TOKEN: - case MINUSEQS_TOKEN: - case TIMESEQS_TOKEN: - case DIVEQS_TOKEN: - case BOREQS_TOKEN: - case BANDEQS_TOKEN: - do_multiple_assignment (ctok); - pop_token_list (1); - break; - - default: - unget_token (ctok); - ctok->type = NO_OP_LITERAL; - expression (ctok); - compile_token_list (); - break; - } -} - -/* Note: expression never gets compiled directly. Rather, it gets - * appended to the token list and then compiled by a calling - * routine. - */ - -/* expression: - * simple_expression - * simple-expression , expression - * - */ -static void expression_with_commas (_SLang_Token_Type *ctok, int save_comma) -{ - while (SLang_Error == 0) - { - if (ctok->type != COMMA_TOKEN) - { - if (ctok->type == CPAREN_TOKEN) - return; - - simple_expression (ctok); - - if (ctok->type != COMMA_TOKEN) - break; - } - if (save_comma) append_token (ctok); - get_token (ctok); - } -} - -static void expression (_SLang_Token_Type *ctok) -{ - expression_with_commas (ctok, 0); -} - -/* priority levels of binary operations */ -static unsigned char Binop_Level[] = -{ -/* ADD_TOKEN */ 2, -/* SUB_TOKEN */ 2, -/* MUL_TOKEN */ 1, -/* DIV_TOKEN */ 1, -/* LT_TOKEN */ 4, -/* LE_TOKEN */ 4, -/* GT_TOKEN */ 4, -/* GE_TOKEN */ 4, -/* EQ_TOKEN */ 5, -/* NE_TOKEN */ 5, -/* AND_TOKEN */ 9, -/* OR_TOKEN */ 10, -/* MOD_TOKEN */ 1, -/* BAND_TOKEN */ 6, -/* SHL_TOKEN */ 3, -/* SHR_TOKEN */ 3, -/* BXOR_TOKEN */ 7, -/* BOR_TOKEN */ 8, -/* POUND_TOKEN */ 1 /* Matrix Multiplication */ -}; - -/* % Note: simple-expression groups operators OP1 at same level. The - * % actual implementation will not do this. - * simple-expression: - * unary-expression - * binary-expression BINARY-OP unary-expression - * andelse xxelse-expression-list - * orelse xxelse-expression-list - * - * xxelse-expression-list: - * { expression } - * xxelse-expression-list { expression } - * binary-expression: - * unary-expression - * unary-expression BINARY-OP binary-expression - */ -static void simple_expression (_SLang_Token_Type *ctok) -{ - unsigned char type; - unsigned char op_stack [64]; - unsigned char level_stack [64]; - unsigned char level; - unsigned int op_num; - - switch (ctok->type) - { - case ANDELSE_TOKEN: - case ORELSE_TOKEN: - type = ctok->type; - if (OBRACE_TOKEN != get_token (ctok)) - { - _SLparse_error ("Expecting '{'", ctok, 0); - return; - } - - while (ctok->type == OBRACE_TOKEN) - { - append_token (ctok); - get_token (ctok); - expression (ctok); - if (CBRACE_TOKEN != ctok->type) - { - _SLparse_error("Expecting }", ctok, 0); - return; - } - append_token (ctok); - get_token (ctok); - } - append_token_of_type (type); - return; - - /* avoid unary-expression if possible */ - case STRING_TOKEN: - append_token (ctok); - get_token (ctok); - break; - - default: - unary_expression (ctok); - break; - } - - if (SEMICOLON_TOKEN == (type = ctok->type)) - return; - - op_num = 0; - - while ((SLang_Error == 0) - && (IS_BINARY_OP(type))) - { - level = Binop_Level[type - FIRST_BINARY_OP]; - - while ((op_num > 0) && (level_stack [op_num - 1] <= level)) - append_token_of_type (op_stack [--op_num]); - - if (op_num >= sizeof (op_stack) - 1) - { - _SLparse_error ("Binary op stack overflow", ctok, 0); - return; - } - - op_stack [op_num] = type; - level_stack [op_num] = level; - op_num++; - - get_token (ctok); - unary_expression (ctok); - type = ctok->type; - } - - while (op_num > 0) - append_token_of_type(op_stack[--op_num]); -} - -/* unary-expression: - * postfix-expression - * ++ postfix-expression - * -- postfix-expression - * case unary-expression - * OP3 unary-expression - * (OP3: + - ~ & not @) - * - * Note: This grammar permits: case case case WHATEVER - */ -static void unary_expression (_SLang_Token_Type *ctok) -{ - unsigned char save_unary_ops [16]; - unsigned int num_unary_ops; - unsigned char type; - _SLang_Token_Type *last_token; - - num_unary_ops = 0; - while (SLang_Error == 0) - { - type = ctok->type; - - switch (type) - { - case PLUSPLUS_TOKEN: - case MINUSMINUS_TOKEN: - get_token (ctok); - postfix_expression (ctok); - check_for_lvalue (type, NULL); - goto out_of_switch; - - case ADD_TOKEN: - get_token (ctok); /* skip it-- it's unary here */ - break; - - case SUB_TOKEN: - (void) get_token (ctok); - if (IS_INTEGER_TOKEN (ctok->type)) - { - ctok->v.long_val = -ctok->v.long_val; - break; - } - - if (num_unary_ops == 16) - goto stack_overflow_error; - save_unary_ops [num_unary_ops++] = CHS_TOKEN; - break; - - case DEREF_TOKEN: - case BNOT_TOKEN: - case NOT_TOKEN: - case CASE_TOKEN: - if (num_unary_ops == 16) - goto stack_overflow_error; - - save_unary_ops [num_unary_ops++] = type; - get_token (ctok); - break; - - /* Try to avoid ->postfix_expression->primary_expression - * subroutine calls. - */ - case STRING_TOKEN: - append_token (ctok); - get_token (ctok); - goto out_of_switch; - - default: - postfix_expression (ctok); - goto out_of_switch; - } - } - - out_of_switch: - if (num_unary_ops == 0) - return; - - if ((DEREF_TOKEN == save_unary_ops[num_unary_ops - 1]) - && (NULL != (last_token = get_last_token ())) - && (IS_ASSIGN_TOKEN(last_token->type))) - { - /* FIXME: Priority=medium - * This needs generalized so that things like @a.y = 1 will work properly. - */ - if ((num_unary_ops != 1) - || (last_token->type != _SCALAR_ASSIGN_TOKEN)) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "Only derefence assignments to simple variables are possible"); - return; - } - - last_token->type += (_DEREF_ASSIGN_TOKEN - _SCALAR_ASSIGN_TOKEN); - return; - } - - while (num_unary_ops) - { - num_unary_ops--; - append_token_of_type (save_unary_ops [num_unary_ops]); - } - return; - - stack_overflow_error: - _SLparse_error ("Too many unary operators.", ctok, 0); -} - -static int combine_namespace_tokens (_SLang_Token_Type *a, _SLang_Token_Type *b) -{ - char *sa, *sb, *sc; - unsigned int lena, lenb; - unsigned long hash; - - /* This is somewhat of a hack. Combine the TWO identifier names - * (NAMESPACE) and (name) into the form NAMESPACE->name. Then when the - * byte compiler compiles the object it will not be found. It will then - * check for this hack and make the appropriate namespace lookup. - */ - - sa = a->v.s_val; - sb = b->v.s_val; - - lena = strlen (sa); - lenb = strlen (sb); - - sc = SLmalloc (lena + lenb + 3); - if (sc == NULL) - return -1; - - strcpy (sc, sa); - strcpy (sc + lena, "->"); - strcpy (sc + lena + 2, sb); - - sb = _SLstring_make_hashed_string (sc, lena + lenb + 2, &hash); - SLfree (sc); - if (sb == NULL) - return -1; - - /* I can free this string because no other token should be referencing it. - * (num_refs == 1). - */ - _SLfree_hashed_string (sa, lena, a->hash); - a->v.s_val = sb; - a->hash = hash; - - return 0; -} - -static void append_identifier_token (_SLang_Token_Type *ctok) -{ - _SLang_Token_Type *last_token; - - append_token (ctok); - - if (NAMESPACE_TOKEN != get_token (ctok)) - return; - - if (IDENT_TOKEN != get_token (ctok)) - { - _SLparse_error ("Expecting name-space identifier", ctok, 0); - return; - } - - last_token = get_last_token (); - if (-1 == combine_namespace_tokens (last_token, ctok)) - return; - - (void) get_token (ctok); -} - -static int get_identifier_expr_token (_SLang_Token_Type *ctok) -{ - _SLang_Token_Type next_token; - - if (IDENT_TOKEN != get_identifier_token (ctok)) - return -1; - - init_token (&next_token); - if (NAMESPACE_TOKEN != get_token (&next_token)) - { - unget_token (&next_token); - return IDENT_TOKEN; - } - - if (IDENT_TOKEN != get_identifier_token (&next_token)) - { - free_token (&next_token); - return -1; - } - - if (-1 == combine_namespace_tokens (ctok, &next_token)) - { - free_token (&next_token); - return -1; - } - free_token (&next_token); - return IDENT_TOKEN; -} - -/* postfix-expression: - * primary-expression - * postfix-expression [ expression ] - * postfix-expression ( function-args-expression ) - * postfix-expression . identifier - * postfix-expression ^ unary-expression - * postfix-expression ++ - * postfix-expression -- - * postfix-expression = simple-expression - * postfix-expression += simple-expression - * postfix-expression -= simple-expression - * - * primary-expression: - * literal - * identifier-expr - * ( expression_opt ) - * [ inline-array-expression ] - * &identifier-expr - * struct-definition - * __tmp(identifier-expr) - * - * identifier-expr: - * identifier - * identifier->identifier - */ -static void postfix_expression (_SLang_Token_Type *ctok) -{ - unsigned int start_pos, end_pos; - unsigned char type; - - if (Token_List == NULL) - return; - - start_pos = Token_List->len; - - switch (ctok->type) - { - case IDENT_TOKEN: - append_identifier_token (ctok); - break; - - case CHAR_TOKEN: - case SHORT_TOKEN: - case INT_TOKEN: - case LONG_TOKEN: - case UCHAR_TOKEN: - case USHORT_TOKEN: - case UINT_TOKEN: - case ULONG_TOKEN: - case STRING_TOKEN: - case BSTRING_TOKEN: -#ifdef SLANG_HAS_FLOAT - case DOUBLE_TOKEN: - case FLOAT_TOKEN: -#endif -#ifdef SLANG_HAS_COMPLEX - case COMPLEX_TOKEN: -#endif - append_token (ctok); - get_token (ctok); - break; - - case OPAREN_TOKEN: - if (CPAREN_TOKEN != get_token (ctok)) - { - expression (ctok); - if (ctok->type != CPAREN_TOKEN) - _SLparse_error("Expecting )", ctok, 0); - } - get_token (ctok); - break; - - case BAND_TOKEN: - if (IDENT_TOKEN != get_identifier_expr_token (ctok)) - break; - - ctok->type = _REF_TOKEN; - append_token (ctok); - get_token (ctok); - break; - - case OBRACKET_TOKEN: - get_token (ctok); - inline_array_expression (ctok); - break; - - case NO_OP_LITERAL: - /* This token was introduced by try_multiple_assignment. There, - * a new token_list was pushed and (expression) was evaluated. - * NO_OP_LITERAL represents the result of expression. However, - * we need to tweak the start_pos variable to point to the beginning - * of the token list to complete the equivalence. - */ - start_pos = 0; - get_token (ctok); - break; - - case STRUCT_TOKEN: - get_token (ctok); - struct_declaration (ctok); - break; - - case TMP_TOKEN: - get_token (ctok); - if (ctok->type == OPAREN_TOKEN) - { - if (IDENT_TOKEN == get_identifier_expr_token (ctok)) - { - ctok->type = TMP_TOKEN; - append_token (ctok); - get_token (ctok); - if (ctok->type == CPAREN_TOKEN) - { - get_token (ctok); - break; - } - } - } - _SLparse_error ("Expecting form __tmp(NAME)", ctok, 0); - break; - - default: - if (IS_INTERNAL_FUNC(ctok->type)) - { - append_token (ctok); - get_token (ctok); - } - else - _SLparse_error("Expecting a PRIMARY", ctok, 0); - } - - while (SLang_Error == 0) - { - end_pos = Token_List->len; - type = ctok->type; - switch (type) - { - case OBRACKET_TOKEN: /* X[args] ==> [args] X ARRAY */ - get_token (ctok); - append_token_of_type (ARG_TOKEN); - if (ctok->type != CBRACKET_TOKEN) - array_index_expression (ctok); - - if (ctok->type != CBRACKET_TOKEN) - { - _SLparse_error ("Expecting ']'", ctok, 0); - return; - } - get_token (ctok); - /* append_token_of_type (EARG_TOKEN); -- ARRAY_TOKEN implicitely does this */ - token_list_element_exchange (start_pos, end_pos); - append_token_of_type (ARRAY_TOKEN); - break; - - case OPAREN_TOKEN: - /* f(args) ==> args f */ - if (CPAREN_TOKEN != get_token (ctok)) - { - function_args_expression (ctok, 1); - token_list_element_exchange (start_pos, end_pos); - } - else get_token (ctok); - break; - - case DOT_TOKEN: - /* S.a ==> "a" S DOT - * This means that if S is X[b], then X[b].a ==> a b X ARRAY DOT - * and f(a).X[b].c ==> "c" b "X" a f . ARRAY . - * Also, f(a).X[b] = g(x); ==> x g b "X" a f . - */ - if (IDENT_TOKEN != get_identifier_token (ctok)) - return; - - ctok->type = DOT_TOKEN; - append_token (ctok); - get_token (ctok); - break; - - case PLUSPLUS_TOKEN: - case MINUSMINUS_TOKEN: - check_for_lvalue (type, NULL); - get_token (ctok); - break; - - case ASSIGN_TOKEN: - case PLUSEQS_TOKEN: - case MINUSEQS_TOKEN: - case TIMESEQS_TOKEN: - case DIVEQS_TOKEN: - case BOREQS_TOKEN: - case BANDEQS_TOKEN: - check_for_lvalue (type, NULL); - get_token (ctok); - simple_expression (ctok); - token_list_element_exchange (start_pos, end_pos); - break; - - case POW_TOKEN: - get_token (ctok); - unary_expression (ctok); - append_token_of_type (POW_TOKEN); - break; - - default: - return; - } - } -} - -static void function_args_expression (_SLang_Token_Type *ctok, int handle_num_args) -{ - unsigned char last_type, this_type; - - if (handle_num_args) append_token_of_type (ARG_TOKEN); - - last_type = COMMA_TOKEN; - - while (SLang_Error == 0) - { - this_type = ctok->type; - - switch (this_type) - { - case COMMA_TOKEN: - if (last_type == COMMA_TOKEN) - append_token_of_type (_NULL_TOKEN); - get_token (ctok); - break; - - case CPAREN_TOKEN: - if (last_type == COMMA_TOKEN) - append_token_of_type (_NULL_TOKEN); - if (handle_num_args) append_token_of_type (EARG_TOKEN); - get_token (ctok); - return; - - default: - simple_expression (ctok); - if ((ctok->type != COMMA_TOKEN) - && (ctok->type != CPAREN_TOKEN)) - { - _SLparse_error ("Expecting ')'", ctok, 0); - break; - } - } - last_type = this_type; - } -} - -static int check_for_lvalue (unsigned char eqs_type, _SLang_Token_Type *ctok) -{ - unsigned char type; - - if ((ctok == NULL) - && (NULL == (ctok = get_last_token ()))) - return -1; - - type = ctok->type; - - eqs_type -= ASSIGN_TOKEN; - - if (type == IDENT_TOKEN) - eqs_type += _SCALAR_ASSIGN_TOKEN; - else if (type == ARRAY_TOKEN) - eqs_type += _ARRAY_ASSIGN_TOKEN; - else if (type == DOT_TOKEN) - eqs_type += _STRUCT_ASSIGN_TOKEN; - else - { - _SLparse_error ("Expecting LVALUE", ctok, 0); - return -1; - } - - ctok->type = eqs_type; - return 0; -} - -static void array_index_expression (_SLang_Token_Type *ctok) -{ - unsigned int num_commas; - - num_commas = 0; - while (1) - { - switch (ctok->type) - { - case COLON_TOKEN: - if (num_commas) - _SLparse_error ("Misplaced ':'", ctok, 0); - return; - - case TIMES_TOKEN: - append_token_of_type (_INLINE_WILDCARD_ARRAY_TOKEN); - get_token (ctok); - break; - - case COMMA_TOKEN: - _SLparse_error ("Misplaced ','", ctok, 0); - return; - - default: - simple_expression (ctok); - } - - if (ctok->type != COMMA_TOKEN) - return; - num_commas++; - get_token (ctok); - } -} - -/* inline-array-expression: - * array_index_expression - * simple_expression : simple_expression - * simple_expression : simple_expression : simple_expression - */ -static void inline_array_expression (_SLang_Token_Type *ctok) -{ - int num_colons = 0; - - append_token_of_type (ARG_TOKEN); - - if (ctok->type == COLON_TOKEN) /* [:...] */ - append_token_of_type (_NULL_TOKEN); - else if (ctok->type != CBRACKET_TOKEN) - array_index_expression (ctok); - - if (ctok->type == COLON_TOKEN) - { - num_colons++; - if ((COLON_TOKEN == get_token (ctok)) - || (ctok->type == CBRACKET_TOKEN)) - append_token_of_type (_NULL_TOKEN); - else - simple_expression (ctok); - - if (ctok->type == COLON_TOKEN) - { - num_colons++; - get_token (ctok); - simple_expression (ctok); - } - } - - if (ctok->type != CBRACKET_TOKEN) - { - _SLparse_error ("Expecting ']'", ctok, 0); - return; - } - - /* append_token_of_type (EARG_TOKEN); */ - if (num_colons) - append_token_of_type (_INLINE_IMPLICIT_ARRAY_TOKEN); - else - append_token_of_type (_INLINE_ARRAY_TOKEN); - get_token (ctok); -} - -static void do_multiple_assignment (_SLang_Token_Type *ctok) -{ - _SLang_Token_Type *s; - unsigned int i, k, len; - unsigned char assign_type; - - assign_type = ctok->type; - - /* The LHS token list has already been pushed. Here we do the RHS - * so push to another token list, process it, then come back to - * LHS for assignment. - */ - if (NULL == push_token_list ()) - return; - - get_token (ctok); - expression (ctok); - compile_token_list (); - - if (SLang_Error) - return; - - /* Finally compile the LHS of the assignment expression - * that has been saved. - */ - s = Token_List->stack; - len = Token_List->len; - - if (len == 0) - { - compile_token_of_type (POP_TOKEN); - return; - } - - while (len > 0) - { - /* List is of form: - * a , b, c d e, f , g , , , h , - * The missing expressions will be replaced by a POP - * ,,a - */ - - /* Start from back looking for a COMMA */ - k = len - 1; - if (s[k].type == COMMA_TOKEN) - { - compile_token_of_type (POP_TOKEN); - len = k; - continue; - } - - if (-1 == check_for_lvalue (assign_type, s + k)) - return; - - i = 0; - while (1) - { - if (s[k].type == COMMA_TOKEN) - { - i = k + 1; - break; - } - - if (k == 0) - break; - - k--; - } - - while (i < len) - { - compile_token (s + i); - i++; - } - - len = k; - } - - if (s[0].type == COMMA_TOKEN) - compile_token_of_type (POP_TOKEN); -} - diff --git a/mdk-stage1/slang/slpath.c b/mdk-stage1/slang/slpath.c deleted file mode 100644 index 831bd34df..000000000 --- a/mdk-stage1/slang/slpath.c +++ /dev/null @@ -1,344 +0,0 @@ -/* Pathname and filename functions */ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#ifdef HAVE_IO_H -# include -#endif - -#include -#include -#include -#include - -#include -#include - -#include "slang.h" -#include "_slang.h" - -/* In this file, all file names are assumed to be specified in the Unix - * format, or in the native format. - * - * Aboout VMS: - * VMS pathnames are a mess. In general, they look like - * node::device:[dir.dir]file.ext;version - * and I do not know of a well-defined Unix representation for them. So, - * I am going to punt and encourage users to stick to the native - * representation. - */ - -#if defined(IBMPC_SYSTEM) -# define PATH_SEP '\\' -# define DRIVE_SPECIFIER ':' -# define SEARCH_PATH_DELIMITER ';' -# define THIS_DIR_STRING "." -#else -# if defined(VMS) -# define PATH_SEP ']' -# define DRIVE_SPECIFIER ':' -# define SEARCH_PATH_DELIMITER ' ' -# define THIS_DIR_STRING "[]" /* Is this correct?? */ -# else -# define PATH_SEP '/' -# define UNIX_PATHNAMES_OK -# define SEARCH_PATH_DELIMITER ':' -# define THIS_DIR_STRING "." -# endif -#endif - -#ifdef UNIX_PATHNAMES_OK -# define IS_PATH_SEP(x) ((x) == PATH_SEP) -#else -# define IS_PATH_SEP(x) (((x) == PATH_SEP) || ((x) == '/')) -#endif - -/* If file is /a/b/c/basename, this function returns a pointer to basename */ -char *SLpath_basename (char *file) -{ - char *b; - - if (file == NULL) return NULL; - b = file + strlen (file); - - while (b != file) - { - b--; - if (IS_PATH_SEP(*b)) - return b + 1; -#ifdef DRIVE_SPECIFIER - if (*b == DRIVE_SPECIFIER) - return b + 1; -#endif - } - - return b; -} - -/* Returns a malloced string */ -char *SLpath_pathname_sans_extname (char *file) -{ - char *b; - - file = SLmake_string (file); - if (file == NULL) - return NULL; - - b = file + strlen (file); - - while (b != file) - { - b--; - if (*b == '.') - { - *b = 0; - return file; - } - } - - return file; -} - -/* If path looks like: A/B/C/D/whatever, it returns A/B/C/D as a malloced - * string. - */ -char *SLpath_dirname (char *file) -{ - char *b; - - if (file == NULL) return NULL; - b = file + strlen (file); - - while (b != file) - { - b--; - if (IS_PATH_SEP(*b)) - { - if (b == file) b++; - break; - } - -#ifdef DRIVE_SPECIFIER - if (*b == DRIVE_SPECIFIER) - { - b++; - break; - } -#endif - } - - if (b == file) - return SLmake_string (THIS_DIR_STRING); - - return SLmake_nstring (file, (unsigned int) (b - file)); -} - -/* Note: VMS filenames also contain version numbers. The caller will have - * to deal with that. - * - * The extension includes the '.'. If no extension is present, "" is returned. - */ -char *SLpath_extname (char *file) -{ - char *b; - - if (NULL == (file = SLpath_basename (file))) - return NULL; - - b = file + strlen (file); - while (b != file) - { - b--; - if (*b == '.') - return b; - } - - if (*b == '.') - return b; - - /* Do not return a literal "" */ - return file + strlen (file); -} - -#ifdef IBMPC_SYSTEM -static void convert_slashes (char *f) -{ - while (*f) - { - if (*f == '/') *f = PATH_SEP; - f++; - } -} -#endif - -int SLpath_is_absolute_path (char *name) -{ -#ifdef UNIX_PATHNAMES_OK - return (*name == '/'); -#else - if (IS_PATH_SEP (*name)) - return 1; - -# ifdef DRIVE_SPECIFIER - /* Look for a drive specifier */ - while (*name) - { - if (*name == DRIVE_SPECIFIER) - return 1; - - name++; - } -# endif - - return 0; -#endif -} - -/* This returns a MALLOCED string */ -char *SLpath_dircat (char *dir, char *name) -{ - unsigned int len, dirlen; - char *file; -#ifndef VMS - int requires_fixup; -#endif - - if (name == NULL) - name = ""; - - if ((dir == NULL) || (SLpath_is_absolute_path (name))) - dir = ""; - - /* Both VMS and MSDOS have default directories associated with each drive. - * That is, the meaning of something like C:X depends upon more than just - * the syntax of the string. Since this concept has more power under VMS - * it will be honored here. However, I am going to treat C:X as C:\X - * under MSDOS. - * - * Note!!! - * VMS has problems of its own regarding path names, so I am simply - * going to strcat. Hopefully the VMS RTL is smart enough to deal with - * the result. - */ - dirlen = strlen (dir); -#ifndef VMS - requires_fixup = (dirlen && (0 == IS_PATH_SEP(dir[dirlen - 1]))); -#endif - - len = dirlen + strlen (name) + 2; - if (NULL == (file = SLmalloc (len))) - return NULL; - - strcpy (file, dir); - -#ifndef VMS - if (requires_fixup) - file[dirlen++] = PATH_SEP; -#endif - - strcpy (file + dirlen, name); - -#if defined(IBMPC_SYSTEM) - convert_slashes (file); -#endif - - return file; -} - -int SLpath_file_exists (char *file) -{ - struct stat st; - int m; - -#if defined(__os2__) && !defined(S_IFMT) -/* IBM VA3 doesn't declare S_IFMT */ -# define S_IFMT (S_IFDIR | S_IFCHR | S_IFREG) -#endif - -#ifdef _S_IFDIR -# ifndef S_IFDIR -# define S_IFDIR _S_IFDIR -# endif -#endif - -#ifndef S_ISDIR -# ifdef S_IFDIR -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -# else -# define S_ISDIR(m) 0 -# endif -#endif - - if (file == NULL) - return -1; - - if (stat(file, &st) < 0) return 0; - m = st.st_mode; - - if (S_ISDIR(m)) return (2); - return 1; -} - -char *SLpath_find_file_in_path (char *path, char *name) -{ - unsigned int max_path_len; - unsigned int this_path_len; - char *file, *dir; - char *p; - unsigned int nth; - - if ((path == NULL) || (*path == 0) - || (name == NULL) || (*name == 0)) - return NULL; - - max_path_len = 0; - this_path_len = 0; - p = path; - while (*p != 0) - { - if (*p++ == SEARCH_PATH_DELIMITER) - { - if (this_path_len > max_path_len) max_path_len = this_path_len; - this_path_len = 0; - } - else this_path_len++; - } - if (this_path_len > max_path_len) max_path_len = this_path_len; - max_path_len++; - - if (NULL == (dir = SLmalloc (max_path_len))) - return NULL; - - nth = 0; - while (-1 != SLextract_list_element (path, nth, SEARCH_PATH_DELIMITER, - dir, max_path_len)) - { - nth++; - if (*dir == 0) - continue; - - if (NULL == (file = SLpath_dircat (dir, name))) - { - SLfree (dir); - return NULL; - } - - if (1 == SLpath_file_exists (file)) - { - SLfree (dir); - return file; - } - - SLfree (file); - } - - SLfree (dir); - return NULL; -} - diff --git a/mdk-stage1/slang/slposdir.c b/mdk-stage1/slang/slposdir.c deleted file mode 100644 index 33799e574..000000000 --- a/mdk-stage1/slang/slposdir.c +++ /dev/null @@ -1,1057 +0,0 @@ -/* file intrinsics for S-Lang */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#if defined(__unix__) || (defined (__os2__) && defined (__EMX__)) -# include -#endif - -#ifdef HAVE_IO_H -# include /* for chmod */ -#endif - -#if defined(__BORLANDC__) -# include -# include -#endif - -#ifdef HAVE_FCNTL_H -# include -#endif -#ifdef HAVE_SYS_FCNTL_H -# include -#endif - -#ifdef __unix__ -# include -#endif - -#if defined(__BORLANDC__) -# include -#endif - -#if defined(_MSC_VER) -# include -#endif - -#if defined(__DECC) && defined(VMS) -# include -# include -#endif - -#ifdef VMS -# include -#else -# include -#endif - -#if defined(VMS) -# define USE_LISTDIR_INTRINSIC 0 -#else -# define USE_LISTDIR_INTRINSIC 1 -#endif - -#if USE_LISTDIR_INTRINSIC - -#if defined(__WIN32__) -# include -#else -# if defined(__OS2__) && defined(__IBMC__) -# define INCL_DOS -# define INCL_ERRORS -# include -# include -# include -# else -# ifdef HAVE_DIRENT_H -# include -# else -# ifdef HAVE_DIRECT_H -# include -# else -# define dirent direct -# define NEED_D_NAMLEN -# if HAVE_SYS_NDIR_H -# include -# endif -# if HAVE_SYS_DIR_H -# include -# endif -# if HAVE_NDIR_H -# include -# endif -# endif -# endif -# endif -#endif - -#endif /* USE_LISTDIR_INTRINSIC */ - -#include - -#include "slang.h" -#include "_slang.h" - -static int push_stat_struct (struct stat *st, int opt_attrs) -{ - char *field_names [12]; - unsigned char field_types[12]; - VOID_STAR field_values [12]; - int int_values [12]; - unsigned int i; - - field_names [0] = "st_dev"; int_values [0] = (int) st->st_dev; - field_names [1] = "st_ino"; int_values [1] = (int) st->st_ino; - field_names [2] = "st_mode"; int_values [2] = (int) st->st_mode; - field_names [3] = "st_nlink"; int_values [3] = (int) st->st_nlink; - field_names [4] = "st_uid"; int_values [4] = (int) st->st_uid; - field_names [5] = "st_gid"; int_values [5] = (int) st->st_gid; - field_names [6] = "st_rdev"; int_values [6] = (int) st->st_rdev; - field_names [7] = "st_size"; int_values [7] = (int) st->st_size; - field_names [8] = "st_atime"; int_values [8] = (int) st->st_atime; - field_names [9] = "st_mtime"; int_values [9] = (int) st->st_mtime; - field_names [10] = "st_ctime"; int_values [10] = (int) st->st_ctime; - - field_names [11] = "st_opt_attrs"; int_values[11] = opt_attrs; - - for (i = 0; i < 12; i++) - { - field_types [i] = SLANG_INT_TYPE; - field_values [i] = (VOID_STAR) (int_values + i); - } - - return SLstruct_create_struct (12, field_names, field_types, field_values); -} - -static void stat_cmd (char *file) -{ - struct stat st; - int status; - int opt_attrs; - - status = stat (file, &st); - -#if defined(__MSDOS__) || defined(__WIN32__) - if (status == -1) - { - unsigned int len = strlen (file); - if (len && ((file[len-1] == '\\') || (file[len-1] == '/'))) - { - file = SLmake_nstring (file, len-1); - if (file == NULL) - return; - - status = stat (file, &st); - SLfree (file); - } - } -#endif - if (status == -1) - { - _SLerrno_errno = errno; - SLang_push_null (); - return; - } - -#ifdef __WIN32__ - opt_attrs = GetFileAttributes (file); -#else - opt_attrs = 0; -#endif - - push_stat_struct (&st, opt_attrs); -} - -static void lstat_cmd (char *file) -{ -#ifdef HAVE_LSTAT - struct stat st; - int opt_attrs; - - if (-1 == lstat (file, &st)) - { - _SLerrno_errno = errno; - SLang_push_null (); - return; - } - -#ifdef __WIN32__ - opt_attrs = GetFileAttributes (file); -#else - opt_attrs = 0; -#endif - - push_stat_struct (&st, opt_attrs); -#else - stat_cmd (file); -#endif -} - -/* Well, it appears that on some systems, these are not defined. Here I - * provide them. These are derived from the Linux stat.h file. - */ - -#ifdef __os2__ -# ifdef __IBMC__ -/* IBM VA3 doesn't declare S_IFMT */ -# define S_IFMT (S_IFDIR | S_IFCHR | S_IFREG) -# endif -#endif - -#ifndef S_ISLNK -# ifdef S_IFLNK -# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) -# else -# define S_ISLNK(m) 0 -# endif -#endif - -#ifndef S_ISREG -# ifdef S_IFREG -# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -# else -# define S_ISREG(m) 0 -# endif -#endif - -#ifndef S_ISDIR -# ifdef S_IFDIR -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -# else -# define S_ISDIR(m) 0 -# endif -#endif - -#ifndef S_ISCHR -# ifdef S_IFCHR -# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) -# else -# define S_ISCHR(m) 0 -# endif -#endif - -#ifndef S_ISBLK -# ifdef S_IFBLK -# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) -# else -# define S_ISBLK(m) 0 -# endif -#endif - -#ifndef S_ISFIFO -# ifdef S_IFIFO -# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) -# else -# define S_ISFIFO(m) 0 -# endif -#endif - -#ifndef S_ISSOCK -# ifdef S_IFSOCK -# define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) -# else -# define S_ISSOCK(m) 0 -# endif -#endif - -static char stat_is_cmd (char *what, int *mode_ptr) -{ - int ret; - int st_mode = *mode_ptr; - - if (!strcmp (what, "sock")) ret = S_ISSOCK(st_mode); - else if (!strcmp (what, "fifo")) ret = S_ISFIFO(st_mode); - else if (!strcmp (what, "blk")) ret = S_ISBLK(st_mode); - else if (!strcmp (what, "chr")) ret = S_ISCHR(st_mode); - else if (!strcmp (what, "dir")) ret = S_ISDIR(st_mode); - else if (!strcmp (what, "reg")) ret = S_ISREG(st_mode); - else if (!strcmp (what, "lnk")) ret = S_ISLNK(st_mode); - else - { - SLang_verror (SL_INVALID_PARM, "stat_is: Unrecognized type: %s", what); - return -1; - } - - return (char) (ret != 0); -} - -#ifdef HAVE_READLINK -static void readlink_cmd (char *s) -{ - char buf[2048]; - int n; - - n = readlink (s, buf, sizeof (buf)-1); - if (n == -1) - { - _SLerrno_errno = errno; - s = NULL; - } - else - { - buf[n] = 0; - s = buf; - } - - (void) SLang_push_string (s); -} -#endif - -static int chmod_cmd (char *file, int *mode) -{ - if (-1 == chmod(file, (mode_t) *mode)) - { - _SLerrno_errno = errno; - return -1; - } - return 0; -} - -#ifdef HAVE_CHOWN -static int chown_cmd (char *file, int *owner, int *group) -{ - int ret; - - if (-1 == (ret = chown(file, (uid_t) *owner, (gid_t) *group))) - _SLerrno_errno = errno; - return ret; -} -#endif - -/* add trailing slash to dir */ -static void fixup_dir (char *dir) -{ -#ifndef VMS - int n; - - if ((n = strlen(dir)) > 1) - { - n--; -#if defined(IBMPC_SYSTEM) - if ( dir[n] != '/' && dir[n] != '\\' ) - strcat(dir, "\\" ); -#else - if (dir[n] != '/' ) - strcat(dir, "/" ); -#endif - } -#endif /* !VMS */ -} - -static void slget_cwd (void) -{ - char cwd[1024]; - char *p; - -#ifndef HAVE_GETCWD - p = getwd (cwd); -#else -# if defined (__EMX__) - p = _getcwd2(cwd, 1022); /* includes drive specifier */ -# else - p = getcwd(cwd, 1022); /* djggp includes drive specifier */ -# endif -#endif - - if (p == NULL) - { - _SLerrno_errno = errno; - SLang_push_null (); - return; - } - -#ifndef VMS -#ifdef __GO32__ - /* You never know about djgpp since it favors unix */ - { - char ch; - p = cwd; - while ((ch = *p) != 0) - { - if (ch == '/') *p = '\\'; - p++; - } - } -#endif - fixup_dir (cwd); -#endif - SLang_push_string (cwd); -} - -static int chdir_cmd (char *s) -{ - int ret; - - while (-1 == (ret = chdir (s))) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - _SLerrno_errno = errno; - break; - } - return ret; -} - -#ifdef VMS -static int remove_cmd (char *); -/* If the file looks like xxx, then change it to xxx.dir. If - * it looks like A:[B.xxx] then change it to A:[B]xxx.dir. - */ - -static char *vms_convert_dirspec_to_vms_dir (char *str) -{ - char *s; - char *version; - unsigned int len; - char *dot; - - len = strlen (str); - - version = strchr (str, ';'); - if (version == NULL) - version = str + len; - /* version points to the version of the input string */ - - - if (NULL == (s = SLmalloc (len + 8)))/* allow extra space to work with */ - return NULL; - - len = (unsigned int) (version - str); - strncpy (s, str, len); - s[len] = 0; - str = s; - - /* Lowercase the whole thing */ - while (*s != 0) - { - *s = LOWER_CASE(*s); - s++; - } - - if ((s > str) - && (s[-1] != ']')) - { - if ((s >= str + 4) - && (0 == strcmp (s - 4, ".dir"))) - s -= 4; - goto add_dir_version; - } - - /* Check for one of two possibilities: - * - * dev:[x] --> dev:x - * dev:[a.x] --> dev:[a]x - */ - - if (NULL == (dot = strchr (str, '.'))) - { - /* First possibility */ - if (NULL == (s = strchr (str, '['))) - return str; /* let someone else figure this out */ - while (s[1] != ']') - { - s[0] = s[1]; - s++; - } - *s = 0; - goto add_dir_version; - } - - while (NULL != (s = strchr (dot + 1, '.'))) - dot = s; - - *dot = ']'; - s = str + (len - 1); - - /* Drop */ - - add_dir_version: - strcpy (s, ".dir"); - strcpy (s+4, version); - return str; -} -#endif - -static int rmdir_cmd (char *s) -{ -#ifdef VMS - int status; - - if (NULL == (s = vms_convert_dirspec_to_vms_dir (s))) - return -1; - - status = remove_cmd (s); - SLfree (s); - - return status; - -#else - int ret; - - while (-1 == (ret = rmdir (s))) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - _SLerrno_errno = errno; - break; - } - return ret; -#endif -} - -static int remove_cmd (char *s) -{ - int ret; -#ifdef VMS -# define REMOVE delete -#else -# ifdef REAL_UNIX_SYSTEM -# define REMOVE unlink -# else -# define REMOVE remove -# endif -#endif - - while (-1 == (ret = REMOVE (s))) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - _SLerrno_errno = errno; - break; - } - return ret; -} - -static int rename_cmd (char *oldpath, char *newpath) -{ - int ret; - while (-1 == (ret = rename (oldpath, newpath))) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - _SLerrno_errno = errno; - break; - } - return ret; -} - -static int mkdir_cmd (char *s, int *mode_ptr) -{ - int ret; - - (void) mode_ptr; - errno = 0; - -#if defined (__MSDOS__) && !defined(__GO32__) -# define MKDIR(x,y) mkdir(x) -#else -# if defined (__os2__) && !defined (__EMX__) -# define MKDIR(x,y) mkdir(x) -# else -# if defined (__WIN32__) && !defined (__CYGWIN32__) -# define MKDIR(x,y) mkdir(x) -# else -# define MKDIR mkdir -# endif -# endif -#endif - - while (-1 == (ret = MKDIR(s, *mode_ptr))) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - _SLerrno_errno = errno; - break; - } - return ret; -} - -#ifdef HAVE_MKFIFO -static int mkfifo_cmd (char *path, int *mode) -{ - if (-1 == mkfifo (path, *mode)) - { - _SLerrno_errno = errno; - return -1; - } - return 0; -} -#endif - -#if USE_LISTDIR_INTRINSIC - -static void free_dir_list (char **list, unsigned int num) -{ - unsigned int i; - - if (list == NULL) - return; - - for (i = 0; i < num; i++) - SLang_free_slstring (list[i]); - SLfree ((char *) list); -} - -#if defined(__WIN32__) || defined(__os2__) && defined(__IBMC__) -static int build_dirlist (char *file, char *opt, char ***listp, unsigned int *nump, unsigned int *maxnum) -{ -# ifdef __WIN32__ - DWORD status; - HANDLE h; - WIN32_FIND_DATA fd; -# else - APIRET rc; - FILESTATUS3 status; - HDIR h; - FILEFINDBUF3 fd; - ULONG cFileNames; -# endif - char *pat; - unsigned int len; - char **list; - unsigned int num; - unsigned int max_num; - int hok; - - /* If an option is present, assume ok to list hidden files. Later - * I will formalize this. - */ - hok = (opt != NULL); - -# ifdef __WIN32__ - status = GetFileAttributes (file); -# else - rc = DosQueryPathInfo(file, FIL_STANDARD, &status, sizeof(FILESTATUS3)); -# endif - - -# ifdef __WIN32__ - if (status == (DWORD)-1) - { - _SLerrno_errno = ENOENT; - return -1; - } - if (0 == (status & FILE_ATTRIBUTE_DIRECTORY)) - { - _SLerrno_errno = ENOTDIR; - return -1; - } -# else - if ((rc != 0) || (status.attrFile & FILE_DIRECTORY) == 0) - { - /* ENOTDIR isn't defined in VA3. */ - _SLerrno_errno = ENOENT; - return -1; - } -# endif - - len = strlen (file); - pat = SLmalloc (len + 3); - if (pat == NULL) - return -1; - - strcpy (pat, file); - file = pat; - while (*file != 0) - { - if (*file == '/') *file = '\\'; - file++; - } - - if (len && (pat[len-1] != '\\')) - { - pat[len] = '\\'; - len++; - } - pat[len++] = '*'; - pat[len] = 0; - - num = 0; - max_num = 50; - list = (char **)SLmalloc (max_num * sizeof(char *)); - if (list == NULL) - { - SLfree (pat); - return -1; - } - -# ifdef __WIN32__ - h = FindFirstFile(pat, &fd); - if (h == INVALID_HANDLE_VALUE) - { - if (ERROR_NO_MORE_FILES != GetLastError()) - { - SLfree (pat); - SLfree ((char *)list); - return -1; - } - } -# else - h = HDIR_CREATE; - cFileNames = 1; - rc = DosFindFirst(pat, &h, FILE_READONLY | FILE_DIRECTORY | - FILE_ARCHIVED, &fd, sizeof(fd), &cFileNames, FIL_STANDARD); - if (rc != 0) - { - if (rc != ERROR_NO_MORE_FILES) - { - SLfree (pat); - SLfree ((char *)list); - return -1; - } - } -# endif - else while (1) - { - /* Do not include hidden files in the list. Also, do not - * include "." and ".." entries. - */ -#ifdef __WIN32__ - file = fd.cFileName; -#else - file = fd.achName; -#endif - if ( -#ifdef __WIN32__ - (hok || (0 == (fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))) -#else - (hok || (0 == (fd.attrFile & FILE_HIDDEN))) -#endif - && ((*file != '.') - || ((0 != strcmp (file, ".")) - && (0 != strcmp (file, ".."))))) - { - if (num == max_num) - { - char **new_list; - - max_num += 100; - new_list = (char **)SLrealloc ((char *)list, max_num * sizeof (char *)); - if (new_list == NULL) - goto return_error; - - list = new_list; - } - - file = SLang_create_slstring (file); - if (file == NULL) - goto return_error; - - list[num] = file; - num++; - } - -#ifdef __WIN32__ - if (FALSE == FindNextFile(h, &fd)) - { - if (ERROR_NO_MORE_FILES == GetLastError()) - { - FindClose (h); - break; - } - - _SLerrno_errno = errno; - FindClose (h); - goto return_error; - } -#else - cFileNames = 1; - rc = DosFindNext(h, &fd, sizeof(fd), &cFileNames); - if (rc != 0) - { - if (rc == ERROR_NO_MORE_FILES) - { - DosFindClose (h); - break; - } - - _SLerrno_errno = errno; - DosFindClose (h); - goto return_error; - } -#endif - } - - SLfree (pat); - *maxnum = max_num; - *nump = num; - *listp = list; - return 0; - - return_error: - free_dir_list (list, num); - SLfree (pat); - return -1; -} - -#else /* NOT __WIN32__ */ - -static int build_dirlist (char *dir, char *opt, char ***listp, unsigned int *nump, unsigned int *maxnum) -{ - DIR *dp; - struct dirent *ep; - unsigned int num_files; - unsigned int max_num_files; - char **list; - - (void) opt; - - if (NULL == (dp = opendir (dir))) - { - _SLerrno_errno = errno; - return -1; - } - - num_files = max_num_files = 0; - list = NULL; - while (NULL != (ep = readdir (dp))) - { - unsigned int len; - char *name; - - name = ep->d_name; -# ifdef NEED_D_NAMLEN - len = ep->d_namlen; -# else - len = strlen (name); -# endif - if ((*name == '.') && (len <= 2)) - { - if (len == 1) continue; - if (name [1] == '.') continue; - } - - if (num_files == max_num_files) - { - char **new_list; - - max_num_files += 100; - if (NULL == (new_list = (char **) SLrealloc ((char *)list, max_num_files * sizeof(char *)))) - goto return_error; - - list = new_list; - } - - if (NULL == (list[num_files] = SLang_create_nslstring (name, len))) - goto return_error; - - num_files++; - } - - closedir (dp); - *nump = num_files; - *maxnum = max_num_files; - *listp = list; - return 0; - - return_error: - if (dp != NULL) - closedir (dp); - free_dir_list (list, num_files); - return -1; -} -# endif /* NOT __WIN32__ */ - -static void listdir_cmd (char *dir, char *opt) -{ - SLang_Array_Type *at; - unsigned int num_files; - unsigned int max_num_files; - int inum_files; - char **list; - - if (-1 == build_dirlist (dir, opt, &list, &num_files, &max_num_files)) - { - SLang_push_null (); - return; - } - /* If max_num_files == 0, then num_files == 0 and list == NULL. - * The realloc step below will malloc list for us. - */ - if (num_files + 1 < max_num_files) - { - char **new_list; - if (NULL == (new_list = (char **) SLrealloc ((char *)list, (num_files + 1)* sizeof(char*)))) - { - free_dir_list (list, num_files); - SLang_push_null (); - return; - } - list = new_list; - } - - inum_files = (int) num_files; - if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) list, &inum_files, 1))) - { - free_dir_list (list, num_files); - SLang_push_null (); - return; - } - - /* Allow the array to free this list if push fails */ - if (-1 == SLang_push_array (at, 1)) - SLang_push_null (); -} - -static void listdir_cmd_wrap (void) -{ - char *s, *sopt; - - sopt = NULL; - switch (SLang_Num_Function_Args) - { - case 2: - if (-1 == SLang_pop_slstring (&sopt)) - return; - case 1: - if (-1 == SLang_pop_slstring (&s)) - { - SLang_free_slstring (sopt); - return; - } - break; - default: - SLang_verror (SL_INVALID_PARM, "usage: listdir (string, [opt-string]"); - return; - } - - listdir_cmd (s, sopt); - SLang_free_slstring (s); - SLang_free_slstring (sopt); -} - -#endif /* USE_LISTDIR_INTRINSIC */ - -#ifdef HAVE_UMASK -static int umask_cmd (int *u) -{ - return umask (*u); -} -#endif - -static SLang_Intrin_Fun_Type PosixDir_Name_Table [] = -{ -#ifdef HAVE_READLINK - MAKE_INTRINSIC_S("readlink", readlink_cmd, SLANG_VOID_TYPE), -#endif - MAKE_INTRINSIC_S("lstat_file", lstat_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("stat_file", stat_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SI("stat_is", stat_is_cmd, SLANG_CHAR_TYPE), -#ifdef HAVE_MKFIFO - MAKE_INTRINSIC_SI("mkfifo", mkfifo_cmd, SLANG_INT_TYPE), -#endif -#ifdef HAVE_CHOWN - MAKE_INTRINSIC_SII("chown", chown_cmd, SLANG_INT_TYPE), -#endif - MAKE_INTRINSIC_SI("chmod", chmod_cmd, SLANG_INT_TYPE), -#ifdef HAVE_UMASK - MAKE_INTRINSIC_I("umask", umask_cmd, SLANG_INT_TYPE), -#endif - MAKE_INTRINSIC_0("getcwd", slget_cwd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SI("mkdir", mkdir_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_S("chdir", chdir_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_S("rmdir", rmdir_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_S("remove", remove_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_SS("rename", rename_cmd, SLANG_INT_TYPE), -#if USE_LISTDIR_INTRINSIC - MAKE_INTRINSIC("listdir", listdir_cmd_wrap, SLANG_VOID_TYPE, 0), -#endif - SLANG_END_INTRIN_FUN_TABLE -}; - -static SLang_IConstant_Type PosixDir_Consts [] = -{ -#ifndef S_IRWXU -# define S_IRWXU 00700 -#endif - MAKE_ICONSTANT("S_IRWXU", S_IRWXU), -#ifndef S_IRUSR -# define S_IRUSR 00400 -#endif - MAKE_ICONSTANT("S_IRUSR", S_IRUSR), -#ifndef S_IWUSR -# define S_IWUSR 00200 -#endif - MAKE_ICONSTANT("S_IWUSR", S_IWUSR), -#ifndef S_IXUSR -# define S_IXUSR 00100 -#endif - MAKE_ICONSTANT("S_IXUSR", S_IXUSR), -#ifndef S_IRWXG -# define S_IRWXG 00070 -#endif - MAKE_ICONSTANT("S_IRWXG", S_IRWXG), -#ifndef S_IRGRP -# define S_IRGRP 00040 -#endif - MAKE_ICONSTANT("S_IRGRP", S_IRGRP), -#ifndef S_IWGRP -# define S_IWGRP 00020 -#endif - MAKE_ICONSTANT("S_IWGRP", S_IWGRP), -#ifndef S_IXGRP -# define S_IXGRP 00010 -#endif - MAKE_ICONSTANT("S_IXGRP", S_IXGRP), -#ifndef S_IRWXO -# define S_IRWXO 00007 -#endif - MAKE_ICONSTANT("S_IRWXO", S_IRWXO), -#ifndef S_IROTH -# define S_IROTH 00004 -#endif - MAKE_ICONSTANT("S_IROTH", S_IROTH), -#ifndef S_IWOTH -# define S_IWOTH 00002 -#endif - MAKE_ICONSTANT("S_IWOTH", S_IWOTH), -#ifndef S_IXOTH -# define S_IXOTH 00001 -#endif - MAKE_ICONSTANT("S_IXOTH", S_IXOTH), -#ifdef __WIN32__ - MAKE_ICONSTANT("FILE_ATTRIBUTE_ARCHIVE", FILE_ATTRIBUTE_ARCHIVE), - MAKE_ICONSTANT("FILE_ATTRIBUTE_COMPRESSED", FILE_ATTRIBUTE_COMPRESSED), - MAKE_ICONSTANT("FILE_ATTRIBUTE_NORMAL", FILE_ATTRIBUTE_NORMAL), - MAKE_ICONSTANT("FILE_ATTRIBUTE_DIRECTORY", FILE_ATTRIBUTE_DIRECTORY), - MAKE_ICONSTANT("FILE_ATTRIBUTE_HIDDEN", FILE_ATTRIBUTE_HIDDEN), - MAKE_ICONSTANT("FILE_ATTRIBUTE_READONLY", FILE_ATTRIBUTE_READONLY), - MAKE_ICONSTANT("FILE_ATTRIBUTE_SYSTEM", FILE_ATTRIBUTE_SYSTEM), - MAKE_ICONSTANT("FILE_ATTRIBUTE_TEMPORARY", FILE_ATTRIBUTE_TEMPORARY), -#endif - SLANG_END_ICONST_TABLE -}; - -static int Initialized; - -int SLang_init_posix_dir (void) -{ - if (Initialized) - return 0; - - if ((-1 == SLadd_intrin_fun_table(PosixDir_Name_Table, "__POSIX_DIR__")) - || (-1 == SLadd_iconstant_table (PosixDir_Consts, NULL)) - || (-1 == _SLerrno_init ())) - return -1; - - Initialized = 1; - - return 0; -} - diff --git a/mdk-stage1/slang/slposio.c b/mdk-stage1/slang/slposio.c deleted file mode 100644 index ab1e9f689..000000000 --- a/mdk-stage1/slang/slposio.c +++ /dev/null @@ -1,568 +0,0 @@ -/* This module implements an interface to posix system calls */ -/* file stdio intrinsics for S-Lang */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#if defined(__unix__) || (defined (__os2__) && defined (__EMX__)) -# include -#endif - -#ifdef HAVE_FCNTL_H -# include -#endif -#ifdef HAVE_SYS_FCNTL_H -# include -#endif - -#ifdef __unix__ -# include -#endif - -#ifdef HAVE_IO_H -# include -#endif - -#if defined(__BORLANDC__) -# include -#endif - -#if defined(__DECC) && defined(VMS) -# include -# include -#endif - -#ifdef VMS -# include -#else -# include -#endif - -#include - -#include "slang.h" -#include "_slang.h" - -struct _SLFile_FD_Type -{ - char *name; - unsigned int num_refs; /* reference counting */ - int fd; - SLang_MMT_Type *stdio_mmt; /* fdopen'd stdio object */ - - /* methods */ - int (*close)(int); - int (*read) (int, char *, unsigned int *); - int (*write)(int, char *, unsigned int *); -}; - -static int close_method (int fd) -{ - return close (fd); -} - -static int write_method (int fd, char *buf, unsigned int *nump) -{ - int num; - - if (-1 == (num = write (fd, buf, *nump))) - { - *nump = 0; - return -1; - } - - *nump = (unsigned int) num; - return 0; -} - -static int read_method (int fd, char *buf, unsigned int *nump) -{ - int num; - - num = read (fd, buf, *nump); - if (num == -1) - { - *nump = 0; - return -1; - } - *nump = (unsigned int) num; - return 0; -} - -static int check_fd (int fd) -{ - if (fd == -1) - { -#ifdef EBADF - _SLerrno_errno = EBADF; -#endif - return -1; - } - - return 0; -} - -static int posix_close (SLFile_FD_Type *f) -{ - if (-1 == check_fd (f->fd)) - return -1; - - if ((f->close != NULL) - && (-1 == f->close (f->fd))) - { - _SLerrno_errno = errno; - return -1; - } - - if (f->stdio_mmt != NULL) - { - SLang_free_mmt (f->stdio_mmt); - f->stdio_mmt = NULL; - } - - f->fd = -1; - return 0; -} - -/* Usage: Uint write (f, buf); */ -static void posix_write (SLFile_FD_Type *f, SLang_BString_Type *bstr) -{ - unsigned int len; - char *p; - - if ((-1 == check_fd (f->fd)) - || (NULL == (p = (char *)SLbstring_get_pointer (bstr, &len)))) - { - SLang_push_integer (-1); - return; - } - - if (-1 == f->write (f->fd, p, &len)) - { - _SLerrno_errno = errno; - SLang_push_integer (-1); - return; - } - - (void) SLang_push_uinteger (len); -} - -/* Usage: nn = read (f, &buf, n); */ -static void posix_read (SLFile_FD_Type *f, SLang_Ref_Type *ref, unsigned int *nbytes) -{ - unsigned int len; - char *b; - SLang_BString_Type *bstr; - - b = NULL; - - len = *nbytes; - if ((-1 == check_fd (f->fd)) - || (NULL == (b = SLmalloc (len + 1)))) - goto return_error; - - if (-1 == f->read (f->fd, b, &len)) - { - _SLerrno_errno = errno; - goto return_error; - } - - if (len != *nbytes) - { - char *b1 = SLrealloc (b, len + 1); - if (b1 == NULL) - goto return_error; - b = b1; - } - - bstr = SLbstring_create_malloced ((unsigned char *) b, len, 0); - if (bstr != NULL) - { - if ((-1 != SLang_assign_to_ref (ref, SLANG_BSTRING_TYPE, (VOID_STAR)&bstr)) - && (-1 != SLang_push_uinteger (len))) - return; - - SLbstring_free (bstr); - b = NULL; - /* drop */ - } - - return_error: - if (b != NULL) SLfree ((char *)b); - (void) SLang_assign_to_ref (ref, SLANG_NULL_TYPE, NULL); - (void) SLang_push_integer (-1); -} - -SLFile_FD_Type *SLfile_create_fd (char *name, int fd) -{ - SLFile_FD_Type *f; - - if (NULL == (f = (SLFile_FD_Type *) SLmalloc (sizeof (SLFile_FD_Type)))) - return NULL; - - memset ((char *) f, 0, sizeof (SLFile_FD_Type)); - if (NULL == (f->name = SLang_create_slstring (name))) - { - SLfree ((char *)f); - return NULL; - } - - f->fd = fd; - f->num_refs = 1; - - f->close = close_method; - f->read = read_method; - f->write = write_method; - - return f; -} - -SLFile_FD_Type *SLfile_dup_fd (SLFile_FD_Type *f0) -{ - SLFile_FD_Type *f; - int fd0, fd; - - if (f0 == NULL) - return NULL; - fd0 = f0->fd; - if (-1 == check_fd (fd0)) - return NULL; - - while (-1 == (fd = dup (fd0))) - { -#ifdef EINTR - if (errno == EINTR) - continue; -#endif - _SLerrno_errno = errno; - return NULL; - } - - if (NULL == (f = SLfile_create_fd (f0->name, fd))) - { - f0->close (fd); - return NULL; - } - - return f; -} - -int SLfile_get_fd (SLFile_FD_Type *f, int *fd) -{ - if (f == NULL) - return -1; - - *fd = f->fd; - if (-1 == check_fd (*fd)) - return -1; - - return 0; -} - -void SLfile_free_fd (SLFile_FD_Type *f) -{ - if (f == NULL) - return; - - if (f->num_refs > 1) - { - f->num_refs -= 1; - return; - } - - if (f->fd != -1) - { - if (f->close != NULL) - (void) f->close (f->fd); - - f->fd = -1; - } - - if (f->stdio_mmt != NULL) - SLang_free_mmt (f->stdio_mmt); - - SLfree ((char *) f); -} - -static int pop_string_int (char **s, int *i) -{ - *s = NULL; - if ((-1 == SLang_pop_integer (i)) - || (-1 == SLang_pop_slstring (s))) - return -1; - - return 0; -} - -static int pop_string_int_int (char **s, int *a, int *b) -{ - *s = NULL; - if ((-1 == SLang_pop_integer (b)) - || (-1 == pop_string_int (s, a))) - return -1; - - return 0; -} - -static void posix_open (void) -{ - char *file; - int mode, flags; - SLFile_FD_Type *f; - - switch (SLang_Num_Function_Args) - { - case 3: - if (-1 == pop_string_int_int (&file, &flags, &mode)) - { - SLang_push_null (); - return; - } - break; - - case 2: - default: - if (-1 == pop_string_int (&file, &flags)) - return; - mode = 0777; - break; - } - - f = SLfile_create_fd (file, -1); - if (f == NULL) - { - SLang_free_slstring (file); - SLang_push_null (); - return; - } - SLang_free_slstring (file); - - if (-1 == (f->fd = open (f->name, flags, mode))) - { - _SLerrno_errno = errno; - SLfile_free_fd (f); - SLang_push_null (); - return; - } - - if (-1 == SLfile_push_fd (f)) - SLang_push_null (); - SLfile_free_fd (f); -} - -static void posix_fileno (void) -{ - FILE *fp; - SLang_MMT_Type *mmt; - int fd; - SLFile_FD_Type *f; - char *name; - - if (-1 == SLang_pop_fileptr (&mmt, &fp)) - { - SLang_push_null (); - return; - } - name = SLang_get_name_from_fileptr (mmt); - fd = fileno (fp); - - f = SLfile_create_fd (name, fd); - if (f != NULL) - f->close = NULL; /* prevent fd from being closed - * when it goes out of scope - */ - SLang_free_mmt (mmt); - - if (-1 == SLfile_push_fd (f)) - SLang_push_null (); - SLfile_free_fd (f); -} - -static void posix_fdopen (SLFile_FD_Type *f, char *mode) -{ - if (f->stdio_mmt == NULL) - { - if (-1 == _SLstdio_fdopen (f->name, f->fd, mode)) - return; - - if (NULL == (f->stdio_mmt = SLang_pop_mmt (SLANG_FILE_PTR_TYPE))) - return; - } - - (void) SLang_push_mmt (f->stdio_mmt); -} - -static long posix_lseek (SLFile_FD_Type *f, long ofs, int whence) -{ - long status; - - if (-1 == (status = lseek (f->fd, ofs, whence))) - _SLerrno_errno = errno; - - return status; -} - -static int posix_isatty (void) -{ - int ret; - SLFile_FD_Type *f; - - if (SLang_peek_at_stack () == SLANG_FILE_PTR_TYPE) - { - SLang_MMT_Type *mmt; - FILE *fp; - - if (-1 == SLang_pop_fileptr (&mmt, &fp)) - return 0; /* invalid descriptor */ - - ret = isatty (fileno (fp)); - SLang_free_mmt (mmt); - return ret; - } - - if (-1 == SLfile_pop_fd (&f)) - return 0; - - ret = isatty (f->fd); - SLfile_free_fd (f); - - return ret; -} - -static void posix_dup (SLFile_FD_Type *f) -{ - if ((NULL == (f = SLfile_dup_fd (f))) - || (-1 == SLfile_push_fd (f))) - SLang_push_null (); - - SLfile_free_fd (f); -} - -#define I SLANG_INT_TYPE -#define V SLANG_VOID_TYPE -#define F SLANG_FILE_FD_TYPE -#define B SLANG_BSTRING_TYPE -#define R SLANG_REF_TYPE -#define U SLANG_UINT_TYPE -#define S SLANG_STRING_TYPE -#define L SLANG_LONG_TYPE -static SLang_Intrin_Fun_Type Fd_Name_Table [] = -{ - MAKE_INTRINSIC_0("fileno", posix_fileno, V), - MAKE_INTRINSIC_0("isatty", posix_isatty, I), - MAKE_INTRINSIC_0("open", posix_open, V), - MAKE_INTRINSIC_3("read", posix_read, V, F, R, U), - MAKE_INTRINSIC_3("lseek", posix_lseek, L, F, L, I), - MAKE_INTRINSIC_2("fdopen", posix_fdopen, V, F, S), - MAKE_INTRINSIC_2("write", posix_write, V, F, B), - MAKE_INTRINSIC_1("dup_fd", posix_dup, V, F), - MAKE_INTRINSIC_1("close", posix_close, I, F), - SLANG_END_INTRIN_FUN_TABLE -}; -#undef I -#undef V -#undef F -#undef B -#undef R -#undef S -#undef L -#undef U - -static SLang_IConstant_Type PosixIO_Consts [] = -{ -#ifdef O_RDONLY - MAKE_ICONSTANT("O_RDONLY", O_RDONLY), -#endif -#ifdef O_WRONLY - MAKE_ICONSTANT("O_WRONLY", O_WRONLY), -#endif -#ifdef O_RDWR - MAKE_ICONSTANT("O_RDWR", O_RDWR), -#endif -#ifdef O_APPEND - MAKE_ICONSTANT("O_APPEND", O_APPEND), -#endif -#ifdef O_CREAT - MAKE_ICONSTANT("O_CREAT", O_CREAT), -#endif -#ifdef O_EXCL - MAKE_ICONSTANT("O_EXCL", O_EXCL), -#endif -#ifdef O_NOCTTY - MAKE_ICONSTANT("O_NOCTTY", O_NOCTTY), -#endif -#ifdef O_NONBLOCK - MAKE_ICONSTANT("O_NONBLOCK", O_NONBLOCK), -#endif -#ifdef O_TRUNC - MAKE_ICONSTANT("O_TRUNC", O_TRUNC), -#endif -#ifndef O_BINARY -# define O_BINARY 0 -#endif - MAKE_ICONSTANT("O_BINARY", O_BINARY), -#ifndef O_TEXT -# define O_TEXT 0 -#endif - MAKE_ICONSTANT("O_TEXT", O_TEXT), - - SLANG_END_ICONST_TABLE -}; - -int SLfile_push_fd (SLFile_FD_Type *f) -{ - if (f == NULL) - return SLang_push_null (); - - f->num_refs += 1; - - if (0 == SLclass_push_ptr_obj (SLANG_FILE_FD_TYPE, (VOID_STAR) f)) - return 0; - - f->num_refs -= 1; - - return -1; -} - -int SLfile_pop_fd (SLFile_FD_Type **f) -{ - return SLclass_pop_ptr_obj (SLANG_FILE_FD_TYPE, (VOID_STAR *) f); -} - -static void destroy_fd_type (unsigned char type, VOID_STAR ptr) -{ - (void) type; - SLfile_free_fd (*(SLFile_FD_Type **) ptr); -} - -static int fd_push (unsigned char type, VOID_STAR v) -{ - (void) type; - return SLfile_push_fd (*(SLFile_FD_Type **)v); -} - -int SLang_init_posix_io (void) -{ - SLang_Class_Type *cl; - - if (NULL == (cl = SLclass_allocate_class ("FD_Type"))) - return -1; - cl->cl_destroy = destroy_fd_type; - (void) SLclass_set_push_function (cl, fd_push); - - if (-1 == SLclass_register_class (cl, SLANG_FILE_FD_TYPE, sizeof (SLFile_FD_Type), SLANG_CLASS_TYPE_PTR)) - return -1; - - if ((-1 == SLadd_intrin_fun_table(Fd_Name_Table, "__POSIXIO__")) - || (-1 == SLadd_iconstant_table (PosixIO_Consts, NULL)) - || (-1 == _SLerrno_init ())) - return -1; - - return 0; -} - diff --git a/mdk-stage1/slang/slprepr.c b/mdk-stage1/slang/slprepr.c deleted file mode 100644 index 358eeb874..000000000 --- a/mdk-stage1/slang/slprepr.c +++ /dev/null @@ -1,427 +0,0 @@ -/* Copyright (c) 1996, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -/*--------------------------------*-C-*---------------------------------* - * File: slprepr.c - * - * preprocessing routines - */ -/*{{{ notes: */ -/* - * various preprocessing tokens supported - * - * #ifdef TOKEN1 TOKEN2 ... - * - True if any of TOKEN1 TOKEN2 ... are defined - * - * #ifndef TOKEN1 TOKEN2 ... - * - True if none of TOKEN1 TOKEN2 ... are defined - * - * #iftrue - * #ifnfalse - * - always True - * - * #iffalse - * #ifntrue - * - always False - * - * #if$ENV - * - True if the enviroment variable ENV is set - * - * #ifn$ENV - * - True if the enviroment variable ENV is not set - * - * #if$ENV TOKEN1 TOKEN2 ... - * - True if the contents of enviroment variable ENV match - * any of TOKEN1 TOKEN2 ... - * - * #ifn$ENV TOKEN1 TOKEN2 ... - * - True if the contents of enviroment variable ENV do not match - * any of TOKEN1 TOKEN2 ... - * - * NB: For $ENV, the tokens may contain wildcard characters: - * '?' - match any single character - * '*' - match any number of characters - * - * #elif... - * #else - * #endif - * - * - * mj olesen - *----------------------------------------------------------------------*/ -/*}}}*/ -/*{{{ includes: */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" -/*}}}*/ - -int (*SLprep_exists_hook) (char *, char); -int (*_SLprep_eval_hook) (char *); - -/*{{{ SLprep_open_prep (), SLprep_close_prep () */ -int SLprep_open_prep (SLPreprocess_Type *pt) -{ - pt->this_level = 0; - pt->exec_level = 0; - pt->prev_exec_level = 0; - pt->comment_char = '%'; - pt->preprocess_char = '#'; - pt->flags = 0; - return 0; -} - -void SLprep_close_prep (SLPreprocess_Type *pt) -{ - (void) pt; -} -/*}}}*/ - -/*{{{ SLwildcard () */ -/*----------------------------------------------------------------------* - * Does `string' match `pattern' ? - * - * '*' in pattern matches any sub-string (including the null string) - * '?' matches any single char. - * - * Code taken from that donated by Paul Hudson - * to the fvwm project. - * It is public domain, no strings attached. No guarantees either. - *----------------------------------------------------------------------*/ -static int SLwildcard (char *pattern, char *string) -{ - if (pattern == NULL || *pattern == '\0' || !strcmp (pattern, "*")) - return 1; - else if (string == NULL) - return 0; - - while (*pattern && *string) switch (*pattern) - { - case '?': - /* match any single character */ - pattern++; - string++; - break; - - case '*': - /* see if rest of pattern matches any trailing */ - /* substring of the string. */ - if (*++pattern == '\0') - return 1; /* trailing * must match rest */ - - while (*string) - { - if (SLwildcard (pattern, string)) return 1; - string++; - } - return 0; - - /* break; */ - - default: - if (*pattern == '\\') - { - if (*++pattern == '\0') - pattern--; /* don't skip trailing backslash */ - } - if (*pattern++ != *string++) return 0; - break; - } - - return ((*string == '\0') - && ((*pattern == '\0') || !strcmp (pattern, "*"))); -} -/*}}}*/ - -#if defined(__16_BIT_SYSTEM__) -# define MAX_DEFINES 10 -#else -# define MAX_DEFINES 128 -#endif - -/* The extra one is for NULL termination */ -char *_SLdefines [MAX_DEFINES + 1]; - -int SLdefine_for_ifdef (char *s) /*{{{*/ -{ - unsigned int i; - - for (i = 0; i < MAX_DEFINES; i++) - { - char *s1 = _SLdefines [i]; - - if (s1 == s) - return 0; /* already defined (hashed string) */ - - if (s1 != NULL) - continue; - - s = SLang_create_slstring (s); - if (s == NULL) - return -1; - - _SLdefines[i] = s; - return 0; - } - return -1; -} -/*}}}*/ - -/*{{{ static functions */ -static int is_any_defined(char *buf, char comment) /*{{{*/ -{ - char *sys; - unsigned int i; - - while (1) - { - register char ch; - - /* Skip whitespace */ - while (((ch = *buf) == ' ') || (ch == '\t')) - buf++; - - if ((ch == '\n') || (ch == 0) || (ch == comment)) - return 0; - - i = 0; - while (NULL != (sys = _SLdefines [i++])) - { - unsigned int n; - - if (*sys != ch) - continue; - - n = strlen (sys); - if (0 == strncmp (buf, sys, n)) - { - char ch1 = *(buf + n); - - if ((ch1 == '\n') || (ch1 == 0) || - (ch1 == ' ') || (ch1 == '\t') || (ch1 == comment)) - return 1; - } - } - - /* Skip past word */ - while (((ch = *buf) != ' ') - && (ch != '\n') - && (ch != 0) - && (ch != '\t') - && (ch != comment)) - buf++; - } -} -/*}}}*/ - -static unsigned char *tokenize (unsigned char *buf, char *token, unsigned int len) -{ - register char *token_end; - - token_end = token + (len - 1); /* allow room for \0 */ - - while ((token < token_end) && (*buf > ' ')) - *token++ = *buf++; - - if (*buf > ' ') return NULL; /* token too long */ - - *token = '\0'; - - while ((*buf == ' ') || (*buf == '\t')) buf++; - - return buf; -} - -static int is_env_defined (char *buf, char comment) /*{{{*/ -{ - char * env, token [32]; - - if ((*buf <= ' ') || (*buf == comment)) return 0; /* no token */ - - if (NULL == (buf = (char *) tokenize ((unsigned char *) buf, - token, sizeof (token)))) - return 0; - - if (NULL == (env = getenv (token))) - return 0; /* ENV not defined */ - - if ((*buf == '\0') || (*buf == '\n') || (*buf == comment)) - return 1; /* no tokens, but getenv() worked */ - - do - { - buf = (char *) tokenize ((unsigned char *) buf, token, sizeof (token)); - if (buf == NULL) return 0; - - if (SLwildcard (token, env)) - return 1; - } - while (*buf && (*buf != '\n') && (*buf != comment)); - - return 0; -} -/*}}}*/ -/*}}}*/ - -int SLprep_line_ok (char *buf, SLPreprocess_Type *pt) /*{{{*/ -{ - int level, prev_exec_level, exec_level; - - if ((buf == NULL) || (pt == NULL)) return 1; - - if (*buf != pt->preprocess_char) - { - if (pt->this_level != pt->exec_level) - return 0; - - if (*buf == '\n') return pt->flags & SLPREP_BLANK_LINES_OK; - if (*buf == pt->comment_char) return pt->flags & SLPREP_COMMENT_LINES_OK; - - return 1; - } - - level = pt->this_level; - exec_level = pt->exec_level; - prev_exec_level = pt->prev_exec_level; - - buf++; - - /* Allow '#!' to pass. This could be a shell script with something - like '#! /local/bin/slang' */ - if ((*buf == '!') && (pt->preprocess_char == '#')) - return 0; - - /* Allow whitespace as in '# ifdef' */ - while ((*buf == ' ') || (*buf == '\t')) buf++; - if (*buf < 'a') return (level == exec_level); - - if (!strncmp(buf, "endif", 5)) - { - if (level == exec_level) - { - exec_level--; - prev_exec_level = exec_level; - } - level--; - if (level < prev_exec_level) prev_exec_level = level; - goto done; - } - - if ((buf[0] == 'e') && (buf[1] == 'l')) /* else, elifdef, ... */ - { - if ((level == exec_level + 1) - && (prev_exec_level != level)) - { - /* We are in position to execute */ - buf += 2; - if ((buf[0] == 's') && (buf[1] == 'e')) - { - /* "else" */ - exec_level = level; - goto done; - } - - /* drop through to ifdef testing. First set variable - * to values appropriate for ifdef testing. - */ - level--; /* now == to exec level */ - } - else - { - if (level == exec_level) - { - exec_level--; - } - goto done; - } - } - - if ((buf[0] == 'i') && (buf[1] == 'f')) - { - int truth; - - if (level != exec_level) - { - /* Not interested */ - level++; - goto done; - } - - level++; - - buf += 2; - if (buf[0] == 'n') - { - truth = 0; - buf++; - } - else truth = 1; - - if (!strncmp (buf, "def", 3)) - truth = (truth == is_any_defined(buf + 3, pt->comment_char)); - - else if (!strncmp (buf, "false", 5)) - truth = !truth; - - else if (*buf == '$') - truth = (truth == is_env_defined (buf + 1, pt->comment_char)); - - else if (!strncmp (buf, "exists", 6) - && (SLprep_exists_hook != NULL)) - truth = (truth == (*SLprep_exists_hook)(buf + 6, pt->comment_char)); - - else if (!strncmp (buf, "eval", 4) - && (_SLprep_eval_hook != NULL)) - truth = (truth == (*_SLprep_eval_hook) (buf + 4)); - - else if (0 != strncmp (buf, "true", 4)) - return 1; /* let it bomb */ - - if (truth) - { - exec_level = level; - prev_exec_level = exec_level; - } - } - else return 1; /* let it bomb. */ - - done: - - if (exec_level < 0) return 1; - - pt->this_level = level; - pt->exec_level = exec_level; - pt->prev_exec_level = prev_exec_level; - return 0; -} -/*}}}*/ - -/*{{{ main() - for testing only */ -#if 0 -int main () -{ - char buf[1024]; - SLPreprocess_Type pt; - - SLprep_open_prep (&pt); - - SLdefine_for_ifdef ("UNIX"); - - while (NULL != fgets (buf, sizeof (buf) - 1, stdin)) - { - if (SLprep_line_ok (buf, &pt)) - { - fputs (buf, stdout); - } - } - - SLprep_close_prep (&pt); - return 0; -} -#endif -/*}}}*/ diff --git a/mdk-stage1/slang/slproc.c b/mdk-stage1/slang/slproc.c deleted file mode 100644 index 8b266f28f..000000000 --- a/mdk-stage1/slang/slproc.c +++ /dev/null @@ -1,155 +0,0 @@ -/* Process specific system calls */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#ifdef HAVE_IO_H -# include /* for chmod */ -#endif - -#ifdef HAVE_PROCESS_H -# include /* for getpid */ -#endif - -#if defined(__BORLANDC__) -# include -#endif - -#include -#include -#include -#include - -#include - -#include "slang.h" -#include "_slang.h" - -#ifdef HAVE_KILL -static int kill_cmd (int *pid, int *sig) -{ - int ret; - - if (-1 == (ret = kill ((pid_t) *pid, *sig))) - _SLerrno_errno = errno; - return ret; -} -#endif - -static int getpid_cmd (void) -{ - return getpid (); -} - -#ifdef HAVE_GETPPID -static int getppid_cmd (void) -{ - return getppid (); -} -#endif - -#ifdef HAVE_GETGID -static int getgid_cmd (void) -{ - return getgid (); -} -#endif - -#ifdef HAVE_GETEGID -static int getegid_cmd (void) -{ - return getegid (); -} -#endif - -#ifdef HAVE_GETEUID -static int geteuid_cmd (void) -{ - return geteuid (); -} -#endif - -#ifdef HAVE_GETUID -static int getuid_cmd (void) -{ - return getuid (); -} -#endif - -#ifdef HAVE_SETGID -static int setgid_cmd (int *gid) -{ - if (0 == setgid (*gid)) - return 0; - _SLerrno_errno = errno; - return -1; -} -#endif - -#ifdef HAVE_SETPGID -static int setpgid_cmd (int *pid, int *pgid) -{ - if (0 == setpgid (*pid, *pgid)) - return 0; - _SLerrno_errno = errno; - return -1; -} -#endif - -#ifdef HAVE_SETUID -static int setuid_cmd (int *uid) -{ - if (0 == setuid (*uid)) - return 0; - _SLerrno_errno = errno; - return -1; -} -#endif - -static SLang_Intrin_Fun_Type Process_Name_Table[] = -{ - MAKE_INTRINSIC_0("getpid", getpid_cmd, SLANG_INT_TYPE), - -#ifdef HAVE_GETPPID - MAKE_INTRINSIC_0("getppid", getppid_cmd, SLANG_INT_TYPE), -#endif -#ifdef HAVE_GETGID - MAKE_INTRINSIC_0("getgid", getgid_cmd, SLANG_INT_TYPE), -#endif -#ifdef HAVE_GETEGID - MAKE_INTRINSIC_0("getegid", getegid_cmd, SLANG_INT_TYPE), -#endif -#ifdef HAVE_GETEUID - MAKE_INTRINSIC_0("geteuid", geteuid_cmd, SLANG_INT_TYPE), -#endif -#ifdef HAVE_GETUID - MAKE_INTRINSIC_0("getuid", getuid_cmd, SLANG_INT_TYPE), -#endif -#ifdef HAVE_SETGID - MAKE_INTRINSIC_I("setgid", setgid_cmd, SLANG_INT_TYPE), -#endif -#ifdef HAVE_SETPGID - MAKE_INTRINSIC_II("setpgid", setpgid_cmd, SLANG_INT_TYPE), -#endif -#ifdef HAVE_SETUID - MAKE_INTRINSIC_I("setuid", setuid_cmd, SLANG_INT_TYPE), -#endif - -#ifdef HAVE_KILL - MAKE_INTRINSIC_II("kill", kill_cmd, SLANG_INT_TYPE), -#endif - SLANG_END_INTRIN_FUN_TABLE -}; - -int SLang_init_posix_process (void) -{ - if ((-1 == SLadd_intrin_fun_table (Process_Name_Table, "__POSIX_PROCESS__")) - || (-1 == _SLerrno_init ())) - return -1; - return 0; -} diff --git a/mdk-stage1/slang/slregexp.c b/mdk-stage1/slang/slregexp.c deleted file mode 100644 index 6592a5a63..000000000 --- a/mdk-stage1/slang/slregexp.c +++ /dev/null @@ -1,935 +0,0 @@ -/* ed style regular expressions */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -#define SET_BIT(b, n) b[(unsigned int) (n) >> 3] |= 1 << ((unsigned int) (n) % 8) -#define TEST_BIT(b, n) (b[(unsigned int)(n) >> 3] & (1 << ((unsigned int) (n) % 8))) -#define LITERAL 1 -#define RANGE 2 /* [...] */ -#define ANY 3 /* . */ -#define BOL 4 /* ^ */ -#define EOL 5 /* $ */ -#define NTH_MATCH 6 /* \1 \2 ... \9 */ -#define OPAREN 7 /* \( */ -#define CPAREN 0x8 /* \) */ -#define ANY_DIGIT 0x9 /* \d */ -#define BOW 0xA /* \< */ -#define EOW 0xB /* \> */ -#if 0 -#define NOT_LITERAL 0xC /* \~ */ -#endif -#define STAR 0x80 /* * */ -#define LEAST_ONCE 0x40 /* + */ -#define MAYBE_ONCE 0x20 /* ? */ -#define MANY 0x10 /* {n,m} */ -/* The rest are additions */ -#define YES_CASE (STAR | BOL) -#define NO_CASE (STAR | EOL) - -#define UPPERCASE(x) (cs ? (x) : UPPER_CASE(x)) -#define LOWERCASE(x) (cs ? (x) : LOWER_CASE(x)) - -static unsigned char Word_Chars[256]; -#define IS_WORD_CHAR(x) Word_Chars[(unsigned int) (x)] - -#if 0 -static int ctx->open_paren_number; -static char Closed_Paren_Matches[10]; - -static SLRegexp_Type *This_Reg; -static unsigned char *This_Str; -#endif - -typedef struct -{ - SLRegexp_Type *reg; - unsigned char *str; - unsigned int len; - char closed_paren_matches[10]; - int open_paren_number; -} -Re_Context_Type; - -static unsigned char *do_nth_match (Re_Context_Type *ctx, int n, unsigned char *str, unsigned char *estr) -{ - unsigned char *bpos; - - if (ctx->closed_paren_matches[n] == 0) - return NULL; - - bpos = ctx->reg->beg_matches[n] + ctx->str; - n = ctx->reg->end_matches[n]; - if (n == 0) return(str); - if (n > (int) (estr - str)) return (NULL); - - /* This needs fixed for case sensitive match */ - if (0 != strncmp((char *) str, (char *) bpos, (unsigned int) n)) return (NULL); - str += n; - return (str); -} - -/* returns pointer to the end of regexp or NULL */ -static unsigned char *regexp_looking_at (Re_Context_Type *ctx, register unsigned char *str, unsigned char *estr, unsigned char *buf, register int cs) -{ - register unsigned char p, p1; - unsigned char *save_str, *tmpstr; - int n, n0, n1; - int save_num_open; - char save_closed_matches[10]; - - p = *buf++; - - while (p != 0) - { - /* p1 = UPPERCASE(*buf); */ - /* if (str < estr) c = UPPERCASE(*str); */ - - switch((unsigned char) p) - { - case BOW: - if ((str != ctx->str) - && ((str >= estr) - || IS_WORD_CHAR(*(str - 1)) - || (0 == IS_WORD_CHAR(*str)))) return NULL; - break; - - case EOW: - if ((str < estr) - && IS_WORD_CHAR (*str)) return NULL; - break; - - case YES_CASE: cs = 1; break; - case NO_CASE: cs = 0; break; - - case OPAREN: - ctx->open_paren_number++; - ctx->reg->beg_matches[ctx->open_paren_number] = (int) (str - ctx->str); - break; - case CPAREN: - n = ctx->open_paren_number; - while (n > 0) - { - if (ctx->closed_paren_matches[n] != 0) - { - n--; - continue; - } - ctx->closed_paren_matches[n] = 1; - ctx->reg->end_matches[n] = (unsigned int) (str - (ctx->str + ctx->reg->beg_matches[n])); - break; - } - break; -#ifdef NOT_LITERAL - case NOT_LITERAL: - if ((str >= estr) || (*buf == UPPERCASE(*str))) return (NULL); - str++; buf++; - break; - - case MAYBE_ONCE | NOT_LITERAL: - save_str = str; - if ((str < estr) && (*buf != UPPERCASE(*str))) str++; - buf++; - goto match_rest; - - case NOT_LITERAL | LEAST_ONCE: /* match at least once */ - if ((str >= estr) || (UPPERCASE(*str) == UPPERCASE(*buf))) return (NULL); - str++; - /* drop */ - case STAR | NOT_LITERAL: - save_str = str; p1 = *buf; - while ((str < estr) && (UPPERCASE(*str) != p1)) str++; - buf++; - goto match_rest; - - /* this type consists of the expression + two bytes that - determine number of matches to perform */ - case MANY | NOT_LITERAL: - p1 = *buf; buf++; - n = n0 = (int) (unsigned char) *buf++; - /* minimum number to match--- could be 0 */ - n1 = (int) (unsigned char) *buf++; - /* maximum number to match */ - - while (n && (str < estr) && (p1 != *str)) - { - n--; - str++; - } - if (n) return (NULL); - - save_str = str; - n = n1 - n0; - while (n && (str < estr) && (p1 != *str)) - { - n--; - str++; - } - goto match_rest; -#endif /* NOT_LITERAL */ - case LITERAL: - if ((str >= estr) || (*buf != UPPERCASE(*str))) return (NULL); - str++; buf++; - break; - - case MAYBE_ONCE | LITERAL: - save_str = str; - if ((str < estr) && (*buf == UPPERCASE(*str))) str++; - buf++; - goto match_rest; - - case LITERAL | LEAST_ONCE: /* match at least once */ - if ((str >= estr) || (UPPERCASE(*str) != UPPERCASE(*buf))) return (NULL); - str++; - /* drop */ - case STAR | LITERAL: - save_str = str; p1 = *buf; - while ((str < estr) && (UPPERCASE(*str) == p1)) str++; - buf++; - goto match_rest; - - /* this type consists of the expression + two bytes that - determine number of matches to perform */ - case MANY | LITERAL: - p1 = *buf; buf++; - n = n0 = (int) (unsigned char) *buf++; - /* minimum number to match--- could be 0 */ - n1 = (int) (unsigned char) *buf++; - /* maximum number to match */ - - while (n && (str < estr) && (p1 == *str)) - { - n--; - str++; - } - if (n) return (NULL); - - save_str = str; - n = n1 - n0; - while (n && (str < estr) && (p1 == *str)) - { - n--; - str++; - } - goto match_rest; - - case NTH_MATCH: - if ((str = do_nth_match(ctx, (int) (unsigned char) *buf, str, estr)) == NULL) return(NULL); - buf++; - break; - - case MAYBE_ONCE | NTH_MATCH: - save_str = str; - tmpstr = do_nth_match (ctx, (int) (unsigned char) *buf, str, estr); - buf++; - if (tmpstr != NULL) - { - str = tmpstr; - goto match_rest; - } - continue; - - case LEAST_ONCE | NTH_MATCH: - if ((str = do_nth_match(ctx, (int) (unsigned char) *buf, str, estr)) == NULL) return(NULL); - /* drop */ - case STAR | NTH_MATCH: - save_str = str; - while (NULL != (tmpstr = do_nth_match(ctx, (int) (unsigned char) *buf, str, estr))) - { - str = tmpstr; - } - buf++; - goto match_rest; - - case MANY | NTH_MATCH: return(NULL); - /* needs done */ - - case RANGE: - if (str >= estr) return (NULL); - if (TEST_BIT(buf, UPPERCASE(*str)) == 0) return (NULL); - buf += 32; str++; - break; - - case MAYBE_ONCE | RANGE: - save_str = str; - if ((str < estr) && TEST_BIT(buf, UPPERCASE(*str))) str++; - buf += 32; - goto match_rest; - - case LEAST_ONCE | RANGE: - if ((str >= estr) || (0 == TEST_BIT(buf, UPPERCASE(*str)))) return NULL; - str++; - /* drop */ - case STAR | RANGE: - save_str = str; - while ((str < estr) && TEST_BIT(buf, UPPERCASE(*str))) str++; - buf += 32; - goto match_rest; - - /* The first 32 bytes correspond to the range and the two - * following bytes indicate the min and max number of matches. - */ - case MANY | RANGE: - /* minimum number to match--- could be 0 */ - n = n0 = (int) (unsigned char) *(buf + 32); - /* maximum number to match */ - n1 = (int) (unsigned char) *(buf + 33); - - while (n && (str < estr) && (TEST_BIT(buf, UPPERCASE(*str)))) - { - n--; - str++; - } - if (n) return (NULL); - save_str = str; - n = n1 - n0; - while (n && (str < estr) && (TEST_BIT(buf, UPPERCASE(*str)))) - { - n--; - str++; - } - buf += 34; /* 32 + 2 */ - goto match_rest; - - case ANY_DIGIT: - if ((str >= estr) || (*str > '9') || (*str < '0')) return (NULL); - str++; - break; - - case MAYBE_ONCE | ANY_DIGIT: - save_str = str; - if ((str < estr) && ((*str > '9') || (*str < '0'))) str++; - goto match_rest; - - case LEAST_ONCE | ANY_DIGIT: - if ((str >= estr) || ((*str > '9') || (*str < '0'))) return NULL; - str++; - /* drop */ - case STAR | ANY_DIGIT: - save_str = str; - while ((str < estr) && ((*str <= '9') && (*str >= '0'))) str++; - goto match_rest; - - case MANY | ANY_DIGIT: - /* needs finished */ - return (NULL); - - case ANY: - if ((str >= estr) || (*str == '\n')) return (NULL); - str++; - break; - - case MAYBE_ONCE | ANY: - save_str = str; - if ((str < estr) && (*str != '\n')) str++; - goto match_rest; - - case LEAST_ONCE | ANY: - if ((str >= estr) || (*str == '\n')) return (NULL); - str++; - /* drop */ - case STAR | ANY: - save_str = str; - while ((str < estr) && (*str != '\n')) str++; - goto match_rest; - - case MANY | ANY: - return (NULL); - /* needs finished */ - - case EOL: - if ((str >= estr) || (*str == '\n')) return (str); - return(NULL); - - default: return (NULL); - } - p = *buf++; - continue; - - match_rest: - if (save_str == str) - { - p = *buf++; - continue; - } - - /* if (p == EOL) - * { - * if (str < estr) return (NULL); else return (str); - * } - */ - - SLMEMCPY(save_closed_matches, ctx->closed_paren_matches, sizeof(save_closed_matches)); - save_num_open = ctx->open_paren_number; - while (str >= save_str) - { - tmpstr = regexp_looking_at (ctx, str, estr, buf, cs); - if (tmpstr != NULL) return(tmpstr); - SLMEMCPY(ctx->closed_paren_matches, save_closed_matches, sizeof(ctx->closed_paren_matches)); - ctx->open_paren_number = save_num_open; - str--; - } - return NULL; - } - if ((p != 0) && (p != EOL)) return (NULL); else return (str); -} - -static void -fixup_beg_end_matches (Re_Context_Type *ctx, SLRegexp_Type *r, unsigned char *str, unsigned char *epos) -{ - int i; - - if (str == NULL) - { - r->beg_matches[0] = -1; - r->end_matches[0] = 0; - SLMEMSET(ctx->closed_paren_matches, 0, sizeof(ctx->closed_paren_matches)); - } - else - { - r->beg_matches[0] = (int) (str - ctx->str); - r->end_matches[0] = (unsigned int) (epos - str); - } - - for (i = 1; i < 10; i++) - { - if (ctx->closed_paren_matches [i] == 0) - { - r->beg_matches[i] = -1; - r->end_matches[i] = 0; - } - } -} - -static void init_re_context (Re_Context_Type *ctx, SLRegexp_Type *reg, - unsigned char *str, unsigned int len) -{ - memset ((char *) ctx, 0, sizeof (Re_Context_Type)); - ctx->reg = reg; - ctx->str = str; - ctx->len = len; -} - -unsigned char *SLang_regexp_match(unsigned char *str, - unsigned int len, SLRegexp_Type *reg) -{ - register unsigned char c = 0, *estr = str + len; - int cs = reg->case_sensitive, lit = 0; - unsigned char *buf = reg->buf, *epos = NULL; - Re_Context_Type ctx_buf; - - if (reg->min_length > len) return NULL; - - init_re_context (&ctx_buf, reg, str, len); - - if (*buf == BOL) - { - if (NULL == (epos = regexp_looking_at (&ctx_buf, str, estr, buf + 1, cs))) - str = NULL; - - fixup_beg_end_matches (&ctx_buf, reg, str, epos); - return str; - } - - if (*buf == NO_CASE) - { - buf++; cs = 0; - } - - if (*buf == YES_CASE) - { - buf++; cs = 1; - } - - if (*buf == LITERAL) - { - lit = 1; - c = *(buf + 1); - } - else if ((*buf == OPAREN) && (*(buf + 1) == LITERAL)) - { - lit = 1; - c = *(buf + 2); - } - - while (str < estr) - { - ctx_buf.open_paren_number = 0; - memset (ctx_buf.closed_paren_matches, 0, sizeof(ctx_buf.closed_paren_matches)); - /* take care of leading chars */ - if (lit) - { - while ((str < estr) && (c != UPPERCASE(*str))) str++; - if (str >= estr) - break; /* failed */ - } - - if (NULL != (epos = regexp_looking_at(&ctx_buf, str, estr, buf, cs))) - { - fixup_beg_end_matches (&ctx_buf, reg, str, epos); - return str; - } - str++; - } - fixup_beg_end_matches (&ctx_buf, reg, NULL, epos); - return NULL; -} - -static unsigned char *convert_digit(unsigned char *pat, int *nn) -{ - int n = 0, m = 0; - unsigned char c; - while (c = (unsigned char) *pat, (c <= '9') && (c >= '0')) - { - pat++; - n = 10 * n + (c - '0'); - m++; - } - if (m == 0) - { - return (NULL); - } - *nn = n; - return pat; -} - -#define ERROR return (int) (pat - reg->pat) - -/* Returns 0 if successful or offset in pattern of error */ -int SLang_regexp_compile (SLRegexp_Type *reg) -{ - register unsigned char *buf, *ebuf, *pat; - unsigned char *last = NULL, *tmppat; - register unsigned char c; - int i, reverse = 0, n, cs; - int oparen = 0, nparen = 0; - /* substring stuff */ - int count, last_count, this_max_mm = 0, max_mm = 0, ordinary_search, - no_osearch = 0, min_length = 0; - unsigned char *mm_p = NULL, *this_mm_p = NULL; - static int already_initialized; - - reg->beg_matches[0] = reg->end_matches[0] = 0; - buf = reg->buf; - ebuf = (reg->buf + reg->buf_len) - 2; /* make some room */ - pat = reg->pat; - cs = reg->case_sensitive; - - if (already_initialized == 0) - { - SLang_init_case_tables (); -#ifdef IBMPC_SYSTEM - SLmake_lut (Word_Chars, (unsigned char *) "_0-9a-zA-Z\200-\232\240-\245\341-\353", 0); -#else - SLmake_lut (Word_Chars, (unsigned char *) "_0-9a-zA-Z\277-\326\330-\336\340-\366\370-\376", 0); -#endif - already_initialized = 1; - } - - i = 1; while (i < 10) - { - reg->beg_matches[i] = -1; - reg->end_matches[i] = 0; - i++; - } - - if (*pat == '\\') - { - if (pat[1] == 'c') - { - cs = 1; - pat += 2; - no_osearch = 1; - } - else if (pat[1] == 'C') - { - cs = 0; - pat += 2; - no_osearch = 1; - } - } - - if (*pat == '^') - { - pat++; - *buf++ = BOL; - reg->must_match_bol = 1; - } - else reg->must_match_bol = 0; - - if (cs != reg->case_sensitive) - { - if (cs) *buf++ = YES_CASE; - else *buf++ = NO_CASE; - } - - *buf = 0; - - last_count = count = 0; - while ((c = *pat++) != 0) - { - if (buf >= ebuf - 3) - { - SLang_doerror ("Pattern too large to be compiled."); - ERROR; - } - - count++; - switch (c) - { - case '$': - if (*pat != 0) goto literal_char; - *buf++ = EOL; - break; - - case '\\': - c = *pat++; - no_osearch = 1; - switch(c) - { - case 'e': c = 033; goto literal_char; - case 'n': c = '\n'; goto literal_char; - case 't': c = '\t'; goto literal_char; - case 'C': cs = 0; *buf++ = NO_CASE; break; - case 'c': cs = 1; *buf++ = YES_CASE; break; - case '1': case '2': case '3': case '4': case '5': - case '6': case '7': case '8': case '9': - c = c - '0'; - if ((int) c > nparen) ERROR; - last = buf; - *buf++ = NTH_MATCH; *buf++ = c; - break; -#ifdef NOT_LITERAL - case '~': /* slang extension */ - if ((c = *pat) == 0) ERROR; - pat++; - last = buf; - *buf++ = NOT_LITERAL; - *buf++ = c; - min_length++; - break; -#endif - case 'd': /* slang extension */ - last = buf; - *buf++ = ANY_DIGIT; - min_length++; - break; - - case '<': - last = NULL; - *buf++ = BOW; - break; - - case '>': - last = NULL; - *buf++ = EOW; - break; - - case '{': - if (last == NULL) goto literal_char; - *last |= MANY; - tmppat = convert_digit(pat, &n); - if (tmppat == NULL) ERROR; - pat = tmppat; - *buf++ = n; - - min_length += (n - 1); - - if (*pat == '\\') - { - *buf++ = n; - } - else if (*pat == ',') - { - pat++; - if (*pat == '\\') - { - n = 255; - } - else - { - tmppat = convert_digit(pat, &n); - if (tmppat == NULL) ERROR; - pat = tmppat; - if (*pat != '\\') ERROR; - } - *buf++ = n; - } - else ERROR; - last = NULL; - pat++; - if (*pat != '}') ERROR; - pat++; - break; /* case '{' */ - - case '(': - oparen++; - if (oparen > 9) ERROR; - *buf++ = OPAREN; - break; - case ')': - if (oparen == 0) ERROR; - oparen--; - nparen++; - *buf++ = CPAREN; - break; - - case 0: ERROR; - default: - goto literal_char; - } - break; - - case '[': - - *buf = RANGE; - last = buf++; - - if (buf + 32 >= ebuf) ERROR; - - for (i = 0; i < 32; i++) buf[i] = 0; - c = *pat++; - if (c == '^') - { - reverse = 1; - SET_BIT(buf, '\n'); - c = *pat++; - } - - if (c == ']') - { - SET_BIT(buf, c); - c = *pat++; - } - while (c && (c != ']')) - { - if (c == '\\') - { - c = *pat++; - switch(c) - { - case 'n': c = '\n'; break; - case 't': c = '\t'; break; - case 0: ERROR; - } - } - - if (*pat == '-') - { - pat++; - while (c < *pat) - { - if (cs == 0) - { - SET_BIT(buf, UPPERCASE(c)); - SET_BIT(buf, LOWERCASE(c)); - } - else SET_BIT(buf, c); - c++; - } - } - if (cs == 0) - { - SET_BIT(buf, UPPERCASE(c)); - SET_BIT(buf, LOWERCASE(c)); - } - else SET_BIT(buf, c); - c = *pat++; - } - if (c != ']') ERROR; - if (reverse) for (i = 0; i < 32; i++) buf[i] = buf[i] ^ 0xFF; - reverse = 0; - buf += 32; - min_length++; - break; - - case '.': - last = buf; - *buf++ = ANY; - min_length++; - break; - - case '*': - if (last == NULL) goto literal_char; - *last |= STAR; - min_length--; - last = NULL; - break; - - case '+': - if (last == NULL) goto literal_char; - *last |= LEAST_ONCE; - last = NULL; - break; - - case '?': - if (last == NULL) goto literal_char; - *last |= MAYBE_ONCE; - last = NULL; - min_length--; - break; - - literal_char: - default: - /* This is to keep track of longest substring */ - min_length++; - this_max_mm++; - if (last_count + 1 == count) - { - if (this_max_mm == 1) - { - this_mm_p = buf; - } - else if (max_mm < this_max_mm) - { - mm_p = this_mm_p; - max_mm = this_max_mm; - } - } - else - { - this_mm_p = buf; - this_max_mm = 1; - } - - last_count = count; - - last = buf; - *buf++ = LITERAL; - *buf++ = UPPERCASE(c); - } - } - *buf = 0; - /* Check for ordinary search */ - ebuf = buf; - buf = reg->buf; - - if (no_osearch) ordinary_search = 0; - else - { - ordinary_search = 1; - while (buf < ebuf) - { - if (*buf != LITERAL) - { - ordinary_search = 0; - break; - } - buf += 2; - } - } - - reg->osearch = ordinary_search; - reg->must_match_str[15] = 0; - reg->min_length = (min_length > 0) ? (unsigned int) min_length : 0; - if (ordinary_search) - { - strncpy((char *) reg->must_match_str, (char *) reg->pat, 15); - reg->must_match = 1; - return(0); - } - /* check for longest substring of pattern */ - reg->must_match = 0; - if ((mm_p == NULL) && (this_mm_p != NULL)) mm_p = this_mm_p; - if (mm_p == NULL) - { - return (0); - } - n = 15; - pat = reg->must_match_str; - buf = mm_p; - while (n--) - { - if (*buf++ != LITERAL) break; - *pat++ = *buf++; - } - *pat = 0; - if (pat != reg->must_match_str) reg->must_match = 1; - return(0); -} - -char *SLregexp_quote_string (char *re, char *buf, unsigned int buflen) -{ - char ch; - char *b, *bmax; - - if (re == NULL) return NULL; - - b = buf; - bmax = buf + buflen; - - while (b < bmax) - { - switch (ch = *re++) - { - case 0: - *b = 0; - return buf; - - case '$': - case '\\': - case '[': - case ']': - case '.': - case '^': - case '*': - case '+': - case '?': - *b++ = '\\'; - if (b == bmax) break; - /* drop */ - - default: - *b++ = ch; - } - } - return NULL; -} - -#if 0 -#define MAX_EXP 4096 -int main(int argc, char **argv) -{ - FILE *fp; - char *regexp, *file; - char expbuf[MAX_EXP], buf[512]; - SLRegexp_Type reg; - - file = argv[2]; - regexp = argv[1]; - - if (NULL == (fp = fopen(file, "r"))) - { - fprintf(stderr, "File not open\n"); - return(1); - } - - reg.buf = expbuf; - reg.buf_len = MAX_EXP; - reg.pat = regexp; - reg.case_sensitive = 1; - - if (!regexp_compile(®)) while (NULL != fgets(buf, 511, fp)) - { - if (reg.osearch) - { - if (NULL == strstr(buf, reg.pat)) continue; - } - else - { - if (reg.must_match && (NULL == strstr(buf, reg.must_match_str))) continue; - if (0 == regexp_match(buf, buf + strlen(buf), ®)) continue; - } - - fputs(buf, stdout); - } - return (0); -} -#endif diff --git a/mdk-stage1/slang/slrline.c b/mdk-stage1/slang/slrline.c deleted file mode 100644 index 1874be0bb..000000000 --- a/mdk-stage1/slang/slrline.c +++ /dev/null @@ -1,836 +0,0 @@ -/* SLang_read_line interface --- uses SLang tty stuff */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -#ifdef REAL_UNIX_SYSTEM -int SLang_RL_EOF_Char = 4; -#else -int SLang_RL_EOF_Char = 26; -#endif - -int SLang_Rline_Quit; -static SLang_RLine_Info_Type *This_RLI; - -static unsigned char Char_Widths[256]; -static void position_cursor (int); - -static void rl_beep (void) -{ - putc(7, stdout); - fflush (stdout); -} - -/* editing functions */ -static int rl_bol (void) -{ - if (This_RLI->point == 0) return 0; - This_RLI->point = 0; - return 1; -} - -static int rl_eol (void) -{ - if (This_RLI->point == This_RLI->len) return 0; - This_RLI->point = This_RLI->len; - return 1; -} - -static int rl_right (void) -{ - if (This_RLI->point == This_RLI->len) return 0; - This_RLI->point++; - return 1; -} - -static int rl_left (void) -{ - if (This_RLI->point == 0) return 0; - This_RLI->point--; - return 1; -} - -static int rl_self_insert (void) -{ - unsigned char *pmin, *p; - - if (This_RLI->len == This_RLI->buf_len) - { - rl_beep (); - return 0; - } - - pmin = This_RLI->buf + This_RLI->point; - p = This_RLI->buf + This_RLI->len; - while (p > pmin) - { - *p = *(p - 1); - p--; - } - *pmin = SLang_Last_Key_Char; - - This_RLI->len++; - This_RLI->point++; - if ((This_RLI->curs_pos + 2 >= This_RLI->edit_width) - || (This_RLI->tt_insert == NULL) - || (Char_Widths[SLang_Last_Key_Char] != 1)) return 1; - - (*This_RLI->tt_insert)((char) SLang_Last_Key_Char); - /* update screen buf */ - p = This_RLI->old_upd + (This_RLI->len - 1); - pmin = This_RLI->old_upd + (This_RLI->point - 1); - while (p > pmin) - { - *p = *(p - 1); - p--; - } - *pmin = SLang_Last_Key_Char; - return 0; -} - -int SLang_rline_insert (char *s) -{ - unsigned char *pmin, *p; - int n; - - n = strlen (s); - if (n > This_RLI->buf_len - This_RLI->len) - n = This_RLI->buf_len - This_RLI->len; - - if (n == 0) return 0; - - pmin = This_RLI->buf + This_RLI->point; - p = This_RLI->buf + (This_RLI->len - 1); - - while (p >= pmin) - { - *(p + n) = *p; - p--; - } - SLMEMCPY ((char *) pmin, s, n); - - This_RLI->len += n; - This_RLI->point += n; - return n; -} - -static int rl_deln (int n) -{ - unsigned char *pmax, *p; - - p = This_RLI->buf + This_RLI->point; - pmax = This_RLI->buf + This_RLI->len; - - if (p + n > pmax) n = (int) (pmax - p); - while (p < pmax) - { - *p = *(p + n); - p++; - } - This_RLI->len -= n; - return n; -} - -static int rl_del (void) -{ - return rl_deln(1); -} - -static int rl_quote_insert (void) -{ - int err = SLang_Error; - SLang_Error = 0; - SLang_Last_Key_Char = (*This_RLI->getkey)(); - rl_self_insert (); - if (SLang_Error == SL_USER_BREAK) SLang_Error = 0; - else SLang_Error = err; - return 1; -} - -static int rl_trim (void) -{ - unsigned char *p, *pmax, *p1; - p = This_RLI->buf + This_RLI->point; - pmax = This_RLI->buf + This_RLI->len; - - if (p == pmax) - { - if (p == This_RLI->buf) return 0; - p--; - } - - if ((*p != ' ') && (*p != '\t')) return 0; - p1 = p; - while ((p1 < pmax) && ((*p1 == ' ') || (*p1 == '\t'))) p1++; - pmax = p1; - p1 = This_RLI->buf; - - while ((p >= p1) && ((*p == ' ') || (*p == '\t'))) p--; - if (p == pmax) return 0; - p++; - - This_RLI->point = (int) (p - p1); - return rl_deln ((int) (pmax - p)); -} - -static int rl_bdel (void) -{ - if (rl_left()) return rl_del(); - return 0; -} - -static int rl_deleol (void) -{ - if (This_RLI->point == This_RLI->len) return 0; - *(This_RLI->buf + This_RLI->point) = 0; - This_RLI->len = This_RLI->point; - return 1; -} - -static int rl_delete_line (void) -{ - This_RLI->point = 0; - *(This_RLI->buf + This_RLI->point) = 0; - This_RLI->len = 0; - return 1; -} - -static int rl_enter (void) -{ - *(This_RLI->buf + This_RLI->len) = 0; - SLang_Rline_Quit = 1; - return 1; -} - -static SLKeyMap_List_Type *RL_Keymap; - -/* This update is designed for dumb terminals. It assumes only that the - * terminal can backspace via ^H, and move cursor to start of line via ^M. - * There is a hook so the user can provide a more sophisticated update if - * necessary. - */ - -static void position_cursor (int col) -{ - unsigned char *p, *pmax; - int dc; - - if (col == This_RLI->curs_pos) - { - fflush (stdout); - return; - } - - if (This_RLI->tt_goto_column != NULL) - { - (*This_RLI->tt_goto_column)(col); - This_RLI->curs_pos = col; - fflush (stdout); - return; - } - - dc = This_RLI->curs_pos - col; - if (dc < 0) - { - p = This_RLI->new_upd + This_RLI->curs_pos; - pmax = This_RLI->new_upd + col; - while (p < pmax) putc((char) *p++, stdout); - } - else - { - if (dc < col) - { - while (dc--) putc(8, stdout); - } - else - { - putc('\r', stdout); - p = This_RLI->new_upd; - pmax = This_RLI->new_upd + col; - while (p < pmax) putc((char) *p++, stdout); - } - } - This_RLI->curs_pos = col; - fflush (stdout); -} - -static void erase_eol (SLang_RLine_Info_Type *rli) -{ - unsigned char *p, *pmax; - - p = rli->old_upd + rli->curs_pos; - pmax = rli->old_upd + rli->old_upd_len; - - while (p++ < pmax) putc(' ', stdout); - - rli->curs_pos = rli->old_upd_len; -} - -static unsigned char *spit_out(SLang_RLine_Info_Type *rli, unsigned char *p) -{ - unsigned char *pmax; - position_cursor ((int) (p - rli->new_upd)); - pmax = rli->new_upd + rli->new_upd_len; - while (p < pmax) putc((char) *p++, stdout); - rli->curs_pos = rli->new_upd_len; - return pmax; -} - -static void really_update (SLang_RLine_Info_Type *rli, int new_curs_position) -{ - unsigned char *b = rli->old_upd, *p = rli->new_upd, chb, chp; - unsigned char *pmax; - - if (rli->update_hook != NULL) - { - (*rli->update_hook)(p, rli->edit_width, new_curs_position); - } - else - { - pmax = p + rli->edit_width; - while (p < pmax) - { - chb = *b++; chp = *p++; - if (chb == chp) continue; - - if (rli->old_upd_len <= rli->new_upd_len) - { - /* easy one */ - (void) spit_out (rli, p - 1); - break; - } - spit_out(rli, p - 1); - erase_eol (rli); - break; - } - position_cursor (new_curs_position); - } - - /* update finished, so swap */ - - rli->old_upd_len = rli->new_upd_len; - p = rli->old_upd; - rli->old_upd = rli->new_upd; - rli->new_upd = p; -} - -static void RLupdate (SLang_RLine_Info_Type *rli) -{ - int len, dlen, start_len = 0, prompt_len = 0, tw = 0, count; - int want_cursor_pos; - unsigned char *b, chb, *b_point, *p; - int no_echo; - - no_echo = rli->flags & SL_RLINE_NO_ECHO; - - b_point = (unsigned char *) (rli->buf + rli->point); - *(rli->buf + rli->len) = 0; - - /* expand characters for output buffer --- handle prompt first. - * Do two passes --- first to find out where to begin upon horiz - * scroll and the second to actually fill the buffer. */ - len = 0; - count = 2; /* once for prompt and once for buf */ - - b = (unsigned char *) rli->prompt; - while (count--) - { - if ((count == 0) && no_echo) - break; - - /* The prompt could be NULL */ - if (b != NULL) while ((chb = *b) != 0) - { - /* This will ensure that the screen is scrolled a third of the edit - * width each time */ - if (b_point == b) break; - dlen = Char_Widths[chb]; - if ((chb == '\t') && tw) - { - dlen = tw * ((len - prompt_len) / tw + 1) - (len - prompt_len); - } - len += dlen; - b++; - } - tw = rli->tab; - b = (unsigned char *) rli->buf; - if (count == 1) want_cursor_pos = prompt_len = len; - } - - if (len < rli->edit_width - rli->dhscroll) start_len = 0; - else if ((rli->start_column > len) - || (rli->start_column + rli->edit_width <= len)) - { - start_len = len - (rli->edit_width - rli->dhscroll); - if (start_len < 0) start_len = 0; - } - else start_len = rli->start_column; - rli->start_column = start_len; - - want_cursor_pos = len - start_len; - - /* second pass */ - p = rli->new_upd; - - len = 0; - count = 2; - b = (unsigned char *) rli->prompt; - if (b == NULL) b = (unsigned char *) ""; - - while ((len < start_len) && (*b)) - { - len += Char_Widths[*b++]; - } - - tw = 0; - if (*b == 0) - { - b = (unsigned char *) rli->buf; - while (len < start_len) - { - len += Char_Widths[*b++]; - } - tw = rli->tab; - count--; - } - - len = 0; - while (count--) - { - if ((count == 0) && (no_echo)) - break; - - while ((len < rli->edit_width) && ((chb = *b++) != 0)) - { - dlen = Char_Widths[chb]; - if (dlen == 1) *p++ = chb; - else - { - if ((chb == '\t') && tw) - { - dlen = tw * ((len + start_len - prompt_len) / tw + 1) - (len + start_len - prompt_len); - len += dlen; /* ok since dlen comes out 0 */ - if (len > rli->edit_width) dlen = len - rli->edit_width; - while (dlen--) *p++ = ' '; - dlen = 0; - } - else - { - if (dlen == 3) - { - chb &= 0x7F; - *p++ = '~'; - } - - *p++ = '^'; - if (chb == 127) *p++ = '?'; - else *p++ = chb + '@'; - } - } - len += dlen; - } - /* if (start_len > prompt_len) break; */ - tw = rli->tab; - b = (unsigned char *) rli->buf; - } - - rli->new_upd_len = (int) (p - rli->new_upd); - while (p < rli->new_upd + rli->edit_width) *p++ = ' '; - really_update (rli, want_cursor_pos); -} - -void SLrline_redraw (SLang_RLine_Info_Type *rli) -{ - unsigned char *p = rli->new_upd; - unsigned char *pmax = p + rli->edit_width; - while (p < pmax) *p++ = ' '; - rli->new_upd_len = rli->edit_width; - really_update (rli, 0); - RLupdate (rli); -} - -static int rl_eof_insert (void) -{ - if (This_RLI->len == 0) - { - SLang_Last_Key_Char = SLang_RL_EOF_Char; - /* rl_self_insert (); */ - return rl_enter (); - } - return 0; -} - -/* This is very naive. It knows very little about nesting and nothing - * about quoting. - */ -static void blink_match (SLang_RLine_Info_Type *rli) -{ - unsigned char bra, ket; - unsigned int delta_column; - unsigned char *p, *pmin; - int dq_level, sq_level; - int level; - - pmin = rli->buf; - p = pmin + rli->point; - if (pmin == p) - return; - - ket = SLang_Last_Key_Char; - switch (ket) - { - case ')': - bra = '('; - break; - case ']': - bra = '['; - break; - case '}': - bra = '{'; - break; - default: - return; - } - - level = 0; - sq_level = dq_level = 0; - - delta_column = 0; - while (p > pmin) - { - char ch; - - p--; - delta_column++; - ch = *p; - - if (ch == ket) - { - if ((dq_level == 0) && (sq_level == 0)) - level++; - } - else if (ch == bra) - { - if ((dq_level != 0) || (sq_level != 0)) - continue; - - level--; - if (level == 0) - { - rli->point -= delta_column; - RLupdate (rli); - (*rli->input_pending)(10); - rli->point += delta_column; - RLupdate (rli); - break; - } - if (level < 0) - break; - } - else if (ch == '"') dq_level = !dq_level; - else if (ch == '\'') sq_level = !sq_level; - } -} - -int SLang_read_line (SLang_RLine_Info_Type *rli) -{ - unsigned char *p, *pmax; - SLang_Key_Type *key; - - SLang_Rline_Quit = 0; - This_RLI = rli; - p = rli->old_upd; pmax = p + rli->edit_width; - while (p < pmax) *p++ = ' '; - - /* Sanity checking */ - rli->len = strlen ((char *) rli->buf); - if (rli->len >= rli->buf_len) - { - rli->len = 0; - *rli->buf = 0; - } - if (rli->point > rli->len) rli->point = rli->len; - if (rli->point < 0) rli->point = 0; - - rli->curs_pos = rli->start_column = 0; - rli->new_upd_len = rli->old_upd_len = 0; - - This_RLI->last_fun = NULL; - if (rli->update_hook == NULL) - putc ('\r', stdout); - - RLupdate (rli); - - while (1) - { - key = SLang_do_key (RL_Keymap, (int (*)(void)) rli->getkey); - - if ((key == NULL) || (key->f.f == NULL)) - rl_beep (); - else - { - if ((SLang_Last_Key_Char == SLang_RL_EOF_Char) - && (*key->str == 2) - && (This_RLI->len == 0)) - rl_eof_insert (); - else if (key->type == SLKEY_F_INTRINSIC) - { - if ((key->f.f)()) - RLupdate (rli); - - if ((rli->flags & SL_RLINE_BLINK_MATCH) - && (rli->input_pending != NULL)) - blink_match (rli); - } - - if (SLang_Rline_Quit) - { - This_RLI->buf[This_RLI->len] = 0; - if (SLang_Error == SL_USER_BREAK) - { - SLang_Error = 0; - return -1; - } - return This_RLI->len; - } - } - if (key != NULL) - This_RLI->last_fun = key->f.f; - } -} - -static int rl_abort (void) -{ - rl_delete_line (); - return rl_enter (); -} - -/* TTY interface --- ANSI */ - -static void ansi_goto_column (int n) -{ - putc('\r', stdout); - if (n) fprintf(stdout, "\033[%dC", n); -} - -static void rl_select_line (SLang_Read_Line_Type *p) -{ - This_RLI->last = p; - strcpy ((char *) This_RLI->buf, (char *) p->buf); - This_RLI->point = This_RLI->len = strlen((char *) p->buf); -} -static int rl_next_line (void); -static int rl_prev_line (void) -{ - SLang_Read_Line_Type *prev; - - if (((This_RLI->last_fun != (FVOID_STAR) rl_prev_line) - && (This_RLI->last_fun != (FVOID_STAR) rl_next_line)) - || (This_RLI->last == NULL)) - { - prev = This_RLI->tail; - } - else prev = This_RLI->last->prev; - - if (prev == NULL) - { - rl_beep (); - return 0; - } - - rl_select_line (prev); - return 1; -} -static int rl_redraw (void) -{ - SLrline_redraw (This_RLI); - return 1; -} - -static int rl_next_line (void) -{ - SLang_Read_Line_Type *next; - - if (((This_RLI->last_fun != (FVOID_STAR) rl_prev_line) - && (This_RLI->last_fun != (FVOID_STAR) rl_next_line)) - || (This_RLI->last == NULL)) - { - rl_beep (); - return 0; - } - - next = This_RLI->last->next; - - if (next == NULL) - { - This_RLI->len = This_RLI->point = 0; - *This_RLI->buf = 0; - This_RLI->last = NULL; - } - else rl_select_line (next); - return 1; -} - -static SLKeymap_Function_Type SLReadLine_Functions[] = -{ - {"up", rl_prev_line}, - {"down", rl_next_line}, - {"bol", rl_bol}, - {"eol", rl_eol}, - {"right", rl_right}, - {"left", rl_left}, - {"self_insert", rl_self_insert}, - {"bdel", rl_bdel}, - {"del", rl_del}, - {"deleol", rl_deleol}, - {"enter", rl_enter}, - {"trim", rl_trim}, - {"quoted_insert", rl_quote_insert}, - {(char *) NULL, NULL} -}; - -int SLang_init_readline (SLang_RLine_Info_Type *rli) -{ - int ch; - char simple[2]; - - if (RL_Keymap == NULL) - { - simple[1] = 0; - if (NULL == (RL_Keymap = SLang_create_keymap ("ReadLine", NULL))) - return -1; - - RL_Keymap->functions = SLReadLine_Functions; - - /* This breaks under some DEC ALPHA compilers (scary!) */ -#ifndef __DECC - for (ch = ' '; ch < 256; ch++) - { - simple[0] = (char) ch; - SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap); - } -#else - ch = ' '; - while (1) - { - simple[0] = (char) ch; - SLkm_define_key (simple, (FVOID_STAR) rl_self_insert, RL_Keymap); - ch = ch + 1; - if (ch == 256) break; - } -#endif /* NOT __DECC */ - - simple[0] = SLang_Abort_Char; - SLkm_define_key (simple, (FVOID_STAR) rl_abort, RL_Keymap); - simple[0] = SLang_RL_EOF_Char; - SLkm_define_key (simple, (FVOID_STAR) rl_eof_insert, RL_Keymap); - -#ifndef IBMPC_SYSTEM - SLkm_define_key ("^[[A", (FVOID_STAR) rl_prev_line, RL_Keymap); - SLkm_define_key ("^[[B", (FVOID_STAR) rl_next_line, RL_Keymap); - SLkm_define_key ("^[[C", (FVOID_STAR) rl_right, RL_Keymap); - SLkm_define_key ("^[[D", (FVOID_STAR) rl_left, RL_Keymap); - SLkm_define_key ("^[OA", (FVOID_STAR) rl_prev_line, RL_Keymap); - SLkm_define_key ("^[OB", (FVOID_STAR) rl_next_line, RL_Keymap); - SLkm_define_key ("^[OC", (FVOID_STAR) rl_right, RL_Keymap); - SLkm_define_key ("^[OD", (FVOID_STAR) rl_left, RL_Keymap); -#else - SLkm_define_key ("^@H", (FVOID_STAR) rl_prev_line, RL_Keymap); - SLkm_define_key ("^@P", (FVOID_STAR) rl_next_line, RL_Keymap); - SLkm_define_key ("^@M", (FVOID_STAR) rl_right, RL_Keymap); - SLkm_define_key ("^@K", (FVOID_STAR) rl_left, RL_Keymap); - SLkm_define_key ("^@S", (FVOID_STAR) rl_del, RL_Keymap); - SLkm_define_key ("^@O", (FVOID_STAR) rl_eol, RL_Keymap); - SLkm_define_key ("^@G", (FVOID_STAR) rl_bol, RL_Keymap); - - SLkm_define_key ("\xE0H", (FVOID_STAR) rl_prev_line, RL_Keymap); - SLkm_define_key ("\xE0P", (FVOID_STAR) rl_next_line, RL_Keymap); - SLkm_define_key ("\xE0M", (FVOID_STAR) rl_right, RL_Keymap); - SLkm_define_key ("\xE0K", (FVOID_STAR) rl_left, RL_Keymap); - SLkm_define_key ("\xE0S", (FVOID_STAR) rl_del, RL_Keymap); - SLkm_define_key ("\xE0O", (FVOID_STAR) rl_eol, RL_Keymap); - SLkm_define_key ("\xE0G", (FVOID_STAR) rl_bol, RL_Keymap); -#endif - SLkm_define_key ("^C", (FVOID_STAR) rl_abort, RL_Keymap); - SLkm_define_key ("^E", (FVOID_STAR) rl_eol, RL_Keymap); - SLkm_define_key ("^G", (FVOID_STAR) rl_abort, RL_Keymap); - SLkm_define_key ("^I", (FVOID_STAR) rl_self_insert, RL_Keymap); - SLkm_define_key ("^A", (FVOID_STAR) rl_bol, RL_Keymap); - SLkm_define_key ("\r", (FVOID_STAR) rl_enter, RL_Keymap); - SLkm_define_key ("\n", (FVOID_STAR) rl_enter, RL_Keymap); - SLkm_define_key ("^K", (FVOID_STAR) rl_deleol, RL_Keymap); - SLkm_define_key ("^L", (FVOID_STAR) rl_deleol, RL_Keymap); - SLkm_define_key ("^V", (FVOID_STAR) rl_del, RL_Keymap); - SLkm_define_key ("^D", (FVOID_STAR) rl_del, RL_Keymap); - SLkm_define_key ("^F", (FVOID_STAR) rl_right, RL_Keymap); - SLkm_define_key ("^B", (FVOID_STAR) rl_left, RL_Keymap); - SLkm_define_key ("^?", (FVOID_STAR) rl_bdel, RL_Keymap); - SLkm_define_key ("^H", (FVOID_STAR) rl_bdel, RL_Keymap); - SLkm_define_key ("^P", (FVOID_STAR) rl_prev_line, RL_Keymap); - SLkm_define_key ("^N", (FVOID_STAR) rl_next_line, RL_Keymap); - SLkm_define_key ("^R", (FVOID_STAR) rl_redraw, RL_Keymap); - SLkm_define_key ("`", (FVOID_STAR) rl_quote_insert, RL_Keymap); - SLkm_define_key ("\033\\", (FVOID_STAR) rl_trim, RL_Keymap); - if (SLang_Error) return -1; - } - - if (rli->prompt == NULL) rli->prompt = ""; - if (rli->keymap == NULL) rli->keymap = RL_Keymap; - rli->old_upd = rli->upd_buf1; - rli->new_upd = rli->upd_buf2; - *rli->buf = 0; - rli->point = 0; - - if (rli->flags & SL_RLINE_USE_ANSI) - { - if (rli->tt_goto_column == NULL) rli->tt_goto_column = ansi_goto_column; - } - - if (Char_Widths[0] == 2) return 0; - - for (ch = 0; ch < 32; ch++) Char_Widths[ch] = 2; - for (ch = 32; ch < 256; ch++) Char_Widths[ch] = 1; - Char_Widths[127] = 2; -#ifndef IBMPC_SYSTEM - for (ch = 128; ch < 160; ch++) Char_Widths[ch] = 3; -#endif - - return 0; -} - -SLang_Read_Line_Type *SLang_rline_save_line (SLang_RLine_Info_Type *rli) -{ - SLang_Read_Line_Type *rl = NULL; - unsigned char *buf; - - if ((rli == NULL) || (rli->buf == NULL)) - return NULL; - - if (NULL == (rl = (SLang_Read_Line_Type *) SLmalloc (sizeof (SLang_Read_Line_Type))) - || (NULL == (buf = (unsigned char *) SLmake_string ((char *)rli->buf)))) - { - SLfree ((char *)rl); - return NULL; - } - rl->buf = buf; - rl->buf_len = strlen ((char *)buf); - rl->num = rl->misc = 0; - rl->next = rl->prev = NULL; - - if (rli->tail != NULL) - { - rli->tail->next = rl; - rl->prev = rli->tail; - } - rli->tail = rl; - - return rl; -} diff --git a/mdk-stage1/slang/slscanf.c b/mdk-stage1/slang/slscanf.c deleted file mode 100644 index 5bd93ff41..000000000 --- a/mdk-stage1/slang/slscanf.c +++ /dev/null @@ -1,718 +0,0 @@ -/* sscanf function for S-Lang */ -/* Copyright (c) 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" -#include -#include -#include - -#include "slang.h" -#include "_slang.h" - -static char *skip_whitespace (char *s) -{ - while (isspace (*s)) - s++; - - return s; -} - -static void init_map (unsigned char map[256], int base) -{ - memset ((char *) map, 0xFF, 256); - - map['0'] = 0; map['1'] = 1; map['2'] = 2; map['3'] = 3; - map['4'] = 4; map['5'] = 5; map['6'] = 6; map['7'] = 7; - if (base == 8) - return; - - map['8'] = 8; map['9'] = 9; - if (base == 10) - return; - - map['A'] = 10; map['B'] = 11; map['C'] = 12; map['D'] = 13; - map['E'] = 14; map['F'] = 15; map['a'] = 10; map['b'] = 11; - map['c'] = 12; map['d'] = 13; map['e'] = 14; map['f'] = 15; -} - -static char *get_sign (char *s, char *smax, int *sign) -{ - *sign = 1; - if (s + 1 < smax) - { - if (*s == '+') s++; - else if (*s == '-') - { - s++; - *sign = -1; - } - } - return s; -} - - -static int parse_long (char **sp, char *smax, long *np, - long base, unsigned char map[256]) -{ - char *s, *s0; - long n; - int sign; - - s = s0 = get_sign (*sp, smax, &sign); - - n = 0; - while (s < smax) - { - unsigned char value; - - value = map [(unsigned char) *s]; - if (value == 0xFF) - break; - - n = base * n + value; - s++; - } - - *sp = s; - if (s == s0) - return 0; - - *np = n * sign; - - return 1; -} - - -static int parse_int (char **sp, char *smax, int *np, - long base, unsigned char map[256]) -{ - long n; - int status; - - if (1 == (status = parse_long (sp, smax, &n, base, map))) - *np = (int) n; - return status; -} - -static int parse_short (char **sp, char *smax, short *np, - long base, unsigned char map[256]) -{ - long n; - int status; - - if (1 == (status = parse_long (sp, smax, &n, base, map))) - *np = (short) n; - return status; -} - -static int parse_ulong (char **sp, char *smax, unsigned long *np, - long base, unsigned char map[256]) -{ - return parse_long (sp, smax, (long *) np, base, map); -} - -static int parse_uint (char **sp, char *smax, unsigned int *np, - long base, unsigned char map[256]) -{ - return parse_int (sp, smax, (int *) np, base, map); -} - -static int parse_ushort (char **sp, char *smax, unsigned short *np, - long base, unsigned char map[256]) -{ - return parse_short (sp, smax, (short *) np, base, map); -} - -#if SLANG_HAS_FLOAT -/* - * In an ideal world, strtod would be the correct function to use. However, - * there may be problems relying on this function because some systems do - * not support and some that do get it wrong. So, I will handle the parsing - * of the string and let atof or strtod handle the arithmetic. - */ -static int parse_double (char **sp, char *smax, double *d) -{ - char *s, *s0; - int sign; - int expon; - unsigned char map[256]; - char buf[128]; - int has_leading_zeros; - char *start_pos, *sign_pos; - char *b, *bmax; - - start_pos = *sp; - s = get_sign (start_pos, smax, &sign); - if (s >= smax) - { - errno = _SLerrno_errno = EINVAL; - return 0; - } - - /* Prepare the buffer that will be passed to strtod */ - /* Allow the exponent to be 5 significant digits: E+xxxxx\0 */ - bmax = buf + (sizeof (buf) - 8); - buf[0] = '0'; buf[1] = '.'; - b = buf + 2; - - init_map (map, 10); - - /* Skip leading 0s */ - s0 = s; - while ((s < smax) && (*s == '0')) - s++; - has_leading_zeros = (s != s0); - - expon = 0; - while (s < smax) - { - unsigned char value = map [(unsigned char) *s]; - - if (value == 0xFF) - break; - - if (b < bmax) - *b++ = *s; - - expon++; - s++; - } - - if ((s < smax) && (*s == '.')) - { - s++; - if (b == buf + 2) /* nothing added yet */ - { - while ((s < smax) && (*s == '0')) - { - expon--; - s++; - } - } - - while (s < smax) - { - unsigned char value = map [(unsigned char) *s]; - - if (value == 0xFF) - break; - - if (b < bmax) - *b++ = *s; - s++; - } - } - - if ((b == buf + 2) - && (has_leading_zeros == 0)) - { - *sp = start_pos; - errno = EINVAL; - return 0; - } - - if ((s + 1 < smax) && ((*s == 'E') || (*s == 'e'))) - { - int e; - int esign; - - s0 = s; - s = get_sign (s + 1, smax, &esign); - sign_pos = s; - e = 0; - while (s < smax) - { - unsigned char value = map [(unsigned char) *s]; - if (value == 0xFF) - break; - if (e < 25000) /* avoid overflow if 16 bit */ - e = 10 * e + value; - s++; - } -#ifdef ERANGE - if (e >= 25000) - errno = ERANGE; -#endif - if (s == sign_pos) - s = s0; /* ...E-X */ - else - { - e = esign * e; - expon += e; - } - } - - if (expon != 0) - sprintf (b, "e%d", expon); - else - *b = 0; - - *sp = s; -#if HAVE_STRTOD - *d = sign * strtod (buf, NULL); -#else - *d = sign * atof (buf); -#endif - return 1; -} - -static int parse_float (char **sp, char *smax, float *d) -{ - double x; - if (1 == parse_double (sp, smax, &x)) - { - *d = (float) x; - return 1; - } - return 0; -} -#endif /* SLANG_HAS_FLOAT */ - -static int parse_string (char **sp, char *smax, char **str) -{ - char *s, *s0; - - s0 = s = *sp; - while (s < smax) - { - if (isspace (*s)) - break; - s++; - } - if (NULL == (*str = SLang_create_nslstring (s0, (unsigned int) (s - s0)))) - return -1; - - *sp = s; - return 1; -} - -static int parse_bstring (char **sp, char *smax, char **str) -{ - char *s; - - s = *sp; - if (NULL == (*str = SLang_create_nslstring (s, (unsigned int) (smax - s)))) - return -1; - - *sp = smax; - return 1; -} - -static int parse_range (char **sp, char *smax, char **fp, char **str) -{ - char *s, *s0; - char *range; - char *f; - unsigned char map[256]; - unsigned char reverse; - - /* How can one represent a range with just '^'? The naive answer is - * is [^]. However, this may be interpreted as meaning any character - * but ']' and others. Let's assume that the user will not use a range - * to match '^'. - */ - f = *fp; - /* f is a pointer to (one char after) [...]. */ - if (*f == '^') - { - f++; - reverse = 1; - } - else reverse = 0; - - s0 = f; - if (*f == ']') - f++; - - while (1) - { - char ch = *f; - - if (ch == 0) - { - SLang_verror (SL_INVALID_PARM, "Unexpected end of range in format"); - return -1; - } - if (ch == ']') - break; - f++; - } - if (NULL == (range = SLmake_nstring (s0, (unsigned int) (f - s0)))) - return -1; - *fp = f + 1; /* skip ] */ - - SLmake_lut (map, (unsigned char *) range, reverse); - SLfree (range); - - s0 = s = *sp; - while ((s < smax) && map [(unsigned char) *s]) - s++; - - if (NULL == (*str = SLang_create_nslstring (s0, (unsigned int) (s - s0)))) - return -1; - - *sp = s; - return 1; -} - - -int _SLang_sscanf (void) -{ - int num; - unsigned int num_refs; - char *format; - char *input_string, *input_string_max; - char *f, *s; - unsigned char map8[256], map10[256], map16[256]; - - if (SLang_Num_Function_Args < 2) - { - SLang_verror (SL_INVALID_PARM, "Int_Type sscanf (str, format, ...)"); - return -1; - } - - num_refs = (unsigned int) SLang_Num_Function_Args; - if (-1 == SLreverse_stack (num_refs)) - return -1; - num_refs -= 2; - - if (-1 == SLang_pop_slstring (&input_string)) - return -1; - - if (-1 == SLang_pop_slstring (&format)) - { - SLang_free_slstring (input_string); - return -1; - } - - f = format; - s = input_string; - input_string_max = input_string + strlen (input_string); - - init_map (map8, 8); - init_map (map10, 10); - init_map (map16, 16); - - num = 0; - - while (num_refs != 0) - { - SLang_Object_Type obj; - SLang_Ref_Type *ref; - char *smax; - unsigned char *map; - int base; - int no_assign; - int is_short; - int is_long; - int status; - char chf; - unsigned int width; - int has_width; - - chf = *f++; - - if (chf == 0) - { - /* Hmmm.... what is the most useful thing to do?? */ -#if 1 - break; -#else - SLang_verror (SL_INVALID_PARM, "sscanf: format not big enough for output list"); - goto return_error; -#endif - } - - if (isspace (chf)) - { - s = skip_whitespace (s); - continue; - } - - if ((chf != '%') - || ((chf = *f++) == '%')) - { - if (*s != chf) - break; - s++; - continue; - } - - no_assign = 0; - is_short = 0; - is_long = 0; - width = 0; - smax = input_string_max; - - /* Look for the flag character */ - if (chf == '*') - { - no_assign = 1; - chf = *f++; - } - - /* Width */ - has_width = isdigit (chf); - if (has_width) - { - f--; - (void) parse_uint (&f, f + strlen(f), &width, 10, map10); - chf = *f++; - } - - /* Now the type modifier */ - switch (chf) - { - case 'h': - is_short = 1; - chf = *f++; - break; - - case 'L': /* not implemented */ - case 'l': - is_long = 1; - chf = *f++; - break; - } - - status = -1; - - if ((chf != 'c') && (chf != '[')) - s = skip_whitespace (s); - - if (has_width) - { - if (width > (unsigned int) (input_string_max - s)) - width = (unsigned int) (input_string_max - s); - smax = s + width; - } - - /* Now the format descriptor */ - - map = map10; - base = 10; - - try_again: /* used by i, x, and o, conversions */ - switch (chf) - { - case 0: - SLang_verror (SL_INVALID_PARM, "sscanf: Unexpected end of format"); - goto return_error; - case 'D': - is_long = 1; - case 'd': - if (is_short) - { - obj.data_type = SLANG_SHORT_TYPE; - status = parse_short (&s, smax, &obj.v.short_val, base, map); - } - else if (is_long) - { - obj.data_type = SLANG_LONG_TYPE; - status = parse_long (&s, smax, &obj.v.long_val, base, map); - } - else - { - obj.data_type = SLANG_INT_TYPE; - status = parse_int (&s, smax, &obj.v.int_val, base, map); - } - break; - - - case 'U': - is_long = 1; - case 'u': - if (is_short) - { - obj.data_type = SLANG_USHORT_TYPE; - status = parse_ushort (&s, smax, &obj.v.ushort_val, base, map); - } - else if (is_long) - { - obj.data_type = SLANG_ULONG_TYPE; - status = parse_ulong (&s, smax, &obj.v.ulong_val, base, map); - } - else - { - obj.data_type = SLANG_INT_TYPE; - status = parse_uint (&s, smax, &obj.v.uint_val, base, map); - } - break; - - case 'I': - is_long = 1; - case 'i': - if ((s + 1 >= smax) - || (*s != 0)) - chf = 'd'; - else if (((s[1] == 'x') || (s[1] == 'X')) - && (s + 2 < smax)) - { - s += 2; - chf = 'x'; - } - else chf = 'o'; - goto try_again; - - case 'O': - is_long = 1; - case 'o': - map = map8; - base = 8; - chf = 'd'; - goto try_again; - - case 'X': - is_long = 1; - case 'x': - base = 16; - map = map16; - chf = 'd'; - goto try_again; - - case 'E': - case 'F': - is_long = 1; - case 'e': - case 'f': - case 'g': -#if SLANG_HAS_FLOAT - if (is_long) - { - obj.data_type = SLANG_DOUBLE_TYPE; - status = parse_double (&s, smax, &obj.v.double_val); - } - else - { - obj.data_type = SLANG_FLOAT_TYPE; - status = parse_float (&s, smax, &obj.v.float_val); - } -#else - SLang_verror (SL_NOT_IMPLEMENTED, - "This version of the S-Lang does not support floating point"); - status = -1; -#endif - break; - - case 's': - obj.data_type = SLANG_STRING_TYPE; - status = parse_string (&s, smax, &obj.v.s_val); - break; - - case 'c': - if (has_width == 0) - { - obj.data_type = SLANG_UCHAR_TYPE; - obj.v.uchar_val = *s++; - status = 1; - break; - } - obj.data_type = SLANG_STRING_TYPE; - status = parse_bstring (&s, smax, &obj.v.s_val); - break; - - case '[': - obj.data_type = SLANG_STRING_TYPE; - status = parse_range (&s, smax, &f, &obj.v.s_val); - break; - - case 'n': - obj.data_type = SLANG_UINT_TYPE; - obj.v.uint_val = (unsigned int) (s - input_string); - status = 1; - break; - - default: - status = -1; - SLang_verror (SL_NOT_IMPLEMENTED, "format specifier '%c' is not supported", chf); - break; - } - - if (status == 0) - break; - - if (status == -1) - goto return_error; - - if (no_assign) - { - SLang_free_object (&obj); - continue; - } - - if (-1 == SLang_pop_ref (&ref)) - { - SLang_free_object (&obj); - goto return_error; - } - - if (-1 == SLang_push (&obj)) - { - SLang_free_object (&obj); - SLang_free_ref (ref); - goto return_error; - } - - if (-1 == _SLang_deref_assign (ref)) - { - SLang_free_ref (ref); - goto return_error; - } - SLang_free_ref (ref); - - num++; - num_refs--; - } - - if (-1 == SLdo_pop_n (num_refs)) - goto return_error; - - SLang_free_slstring (format); - SLang_free_slstring (input_string); - return num; - - return_error: - /* NULLS ok */ - SLang_free_slstring (format); - SLang_free_slstring (input_string); - return -1; -} - - -# if SLANG_HAS_FLOAT - -#ifndef HAVE_STDLIB_H -/* Oh dear. Where is the prototype for atof? If not in stdlib, then - * I do not know where. Not in math.h on some systems either. - */ -extern double atof (); -#endif - -double _SLang_atof (char *s) -{ - double x; - - s = skip_whitespace (s); - errno = 0; - - if (1 != parse_double (&s, s + strlen (s), &x)) - { - if ((0 == strcmp ("NaN", s)) - || (0 == strcmp ("-Inf", s)) - || (0 == strcmp ("Inf", s))) - return atof (s); /* let this deal with it */ -#ifdef EINVAL - errno = _SLerrno_errno = EINVAL; -#endif - return 0.0; - } - if (errno) - _SLerrno_errno = errno; - return x; -} -#endif diff --git a/mdk-stage1/slang/slscroll.c b/mdk-stage1/slang/slscroll.c deleted file mode 100644 index 358296116..000000000 --- a/mdk-stage1/slang/slscroll.c +++ /dev/null @@ -1,450 +0,0 @@ -/* SLang Scrolling Window Routines */ -/* Copyright (c) 1996, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -static void find_window_bottom (SLscroll_Window_Type *win) -{ - unsigned int nrows; - unsigned int hidden_mask; - SLscroll_Type *bot, *cline, *last_bot; - unsigned int row; - - nrows = win->nrows; - hidden_mask = win->hidden_mask; - cline = win->current_line; - - win->window_row = row = 0; - last_bot = bot = win->top_window_line; - - while (row < nrows) - { - if (bot == cline) - win->window_row = row; - - last_bot = bot; - - if (bot == NULL) - break; - - bot = bot->next; - - if (hidden_mask) - { - while ((bot != NULL) && (bot->flags & hidden_mask)) - bot = bot->next; - } - - row++; - } - - win->bot_window_line = last_bot; -} - -static int find_top_to_recenter (SLscroll_Window_Type *win) -{ - unsigned int nrows; - unsigned int hidden_mask; - SLscroll_Type *prev, *last_prev, *cline; - - nrows = win->nrows; - cline = win->current_line; - hidden_mask = win->hidden_mask; - - nrows = nrows / 2; - - last_prev = prev = cline; - - while (nrows && (prev != NULL)) - { - nrows--; - last_prev = prev; - do - { - prev = prev->prev; - } - while (hidden_mask - && (prev != NULL) - && (prev->flags & hidden_mask)); - } - - if (prev == NULL) prev = last_prev; - - win->top_window_line = prev; - find_window_bottom (win); - - return 0; -} - -#define HAS_BORDER_CODE 1 -int SLscroll_find_top (SLscroll_Window_Type *win) -{ - unsigned int i; - SLscroll_Type *cline, *prev, *next; - SLscroll_Type *top_window_line; - unsigned int nrows; - unsigned int hidden_mask; - int scroll_mode; - unsigned int border; - - cline = win->current_line; - nrows = win->nrows; - scroll_mode = win->cannot_scroll; - border = win->border; - if (scroll_mode == 2) - border = 0; - - if ((cline == NULL) || (nrows <= 1)) - { - win->top_window_line = cline; - find_window_bottom (win); - return 0; - } - - hidden_mask = win->hidden_mask; - - /* Note: top_window_line might be a bogus pointer. This means that I cannot - * access it unless it really corresponds to a pointer in the buffer. - */ - top_window_line = win->top_window_line; - - if (top_window_line == NULL) - return find_top_to_recenter (win); - - /* Chances are that the current line is visible in the window. This means - * that the top window line should be above it. - */ - prev = cline; - - i = 0; - - while ((i < nrows) && (prev != NULL)) - { - if (prev == top_window_line) - { - SLscroll_Type *twl = top_window_line; - int dir = 0; - - if (i < border) dir = -1; else if (i + border >= nrows) dir = 1; - - if (dir) while (border) - { - if (dir < 0) twl = twl->prev; - else twl = twl->next; - - if (twl == NULL) - { - twl = top_window_line; - break; - } - if ((hidden_mask == 0) - || (0 == (twl->flags & hidden_mask))) - border--; - } - - win->top_window_line = twl; - find_window_bottom (win); - return 0; - } - - do - { - prev = prev->prev; - } - while (hidden_mask - && (prev != NULL) - && (prev->flags & hidden_mask)); - i++; - } - - /* Now check the borders of the window. Perhaps the current line lies - * outsider the border by a line. Only do this if terminal can scroll. - */ - - if (scroll_mode == 1) - return find_top_to_recenter (win); - else if (scroll_mode == -1) - scroll_mode = 0; - - next = cline->next; - while (hidden_mask - && (next != NULL) - && (next->flags & hidden_mask)) - next = next->next; - - if ((next != NULL) - && (next == top_window_line)) - { - /* The current line is one line above the window. This means user - * has moved up past the top of the window. If scroll_mode is set - * to scroll by pages, we need to do a page up. - */ - - win->top_window_line = cline; - find_window_bottom (win); - - if (scroll_mode) return SLscroll_pageup (win); - - return 0; - } - - prev = cline->prev; - - while (hidden_mask - && (prev != NULL) - && (prev->flags & hidden_mask)) - prev = prev->prev; - - if ((prev == NULL) - || (prev != win->bot_window_line)) - return find_top_to_recenter (win); - - /* It looks like cline is below window by one line. See what line should - * be at top to scroll it into view. Only do this unless we are scrolling - * by pages. - */ - if (scroll_mode) - { - win->top_window_line = cline; - find_window_bottom (win); - return 0; - } - - i = 2; - while ((i < nrows) && (prev != NULL)) - { - do - { - prev = prev->prev; - } - while (hidden_mask - && (prev != NULL) - && (prev->flags & hidden_mask)); - i++; - } - - if (prev != NULL) - { - win->top_window_line = prev; - find_window_bottom (win); - return 0; - } - - return find_top_to_recenter (win); -} - -int SLscroll_find_line_num (SLscroll_Window_Type *win) -{ - SLscroll_Type *cline, *l; - unsigned int n; - unsigned int hidden_mask; - - if (win == NULL) return -1; - - hidden_mask = win->hidden_mask; - cline = win->current_line; - - n = 1; - - l = win->lines; - while (l != cline) - { - if ((hidden_mask == 0) - || (0 == (l->flags & hidden_mask))) - n++; - - l = l->next; - } - - win->line_num = n; - n--; - - while (l != NULL) - { - if ((hidden_mask == 0) - || (0 == (l->flags & hidden_mask))) - n++; - l = l->next; - } - win->num_lines = n; - - return 0; -} - -unsigned int SLscroll_next_n (SLscroll_Window_Type *win, unsigned int n) -{ - unsigned int i; - unsigned int hidden_mask; - SLscroll_Type *l, *cline; - - if ((win == NULL) - || (NULL == (cline = win->current_line))) - return 0; - - hidden_mask = win->hidden_mask; - l = cline; - i = 0; - while (i < n) - { - l = l->next; - while (hidden_mask - && (l != NULL) && (l->flags & hidden_mask)) - l = l->next; - - if (l == NULL) - break; - - i++; - cline = l; - } - - win->current_line = cline; - win->line_num += i; - return i; -} - -unsigned int SLscroll_prev_n (SLscroll_Window_Type *win, unsigned int n) -{ - unsigned int i; - unsigned int hidden_mask; - SLscroll_Type *l, *cline; - - if ((win == NULL) - || (NULL == (cline = win->current_line))) - return 0; - - hidden_mask = win->hidden_mask; - l = cline; - i = 0; - while (i < n) - { - l = l->prev; - while (hidden_mask - && (l != NULL) && (l->flags & hidden_mask)) - l = l->prev; - - if (l == NULL) - break; - - i++; - cline = l; - } - - win->current_line = cline; - win->line_num -= i; - return i; -} - -int SLscroll_pageup (SLscroll_Window_Type *win) -{ - SLscroll_Type *l, *top; - unsigned int nrows, hidden_mask; - unsigned int n; - - if (win == NULL) - return -1; - - (void) SLscroll_find_top (win); - - nrows = win->nrows; - - if ((NULL != (top = win->top_window_line)) - && (nrows > 2)) - { - n = 0; - hidden_mask = win->hidden_mask; - l = win->current_line; - while ((l != NULL) && (l != top)) - { - l = l->prev; - if ((hidden_mask == 0) - || ((l != NULL) && (0 == (l->flags & hidden_mask)))) - n++; - } - - if (l != NULL) - { - unsigned int save_line_num; - int ret = 0; - - win->current_line = l; - win->line_num -= n; - - /* Compute a new top/bottom header */ - save_line_num = win->line_num; - - if ((0 == SLscroll_prev_n (win, nrows - 1)) - && (n == 0)) - ret = -1; - - win->top_window_line = win->current_line; - win->current_line = l; - win->line_num = save_line_num; - - find_window_bottom (win); - return ret; - } - } - - if (nrows < 2) nrows++; - if (0 == SLscroll_prev_n (win, nrows - 1)) - return -1; - return 0; -} - -int SLscroll_pagedown (SLscroll_Window_Type *win) -{ - SLscroll_Type *l, *bot; - unsigned int nrows, hidden_mask; - unsigned int n; - - if (win == NULL) - return -1; - - (void) SLscroll_find_top (win); - - nrows = win->nrows; - - if ((NULL != (bot = win->bot_window_line)) - && (nrows > 2)) - { - n = 0; - hidden_mask = win->hidden_mask; - l = win->current_line; - while ((l != NULL) && (l != bot)) - { - l = l->next; - if ((hidden_mask == 0) - || ((l != NULL) && (0 == (l->flags & hidden_mask)))) - n++; - } - - if (l != NULL) - { - win->current_line = l; - win->top_window_line = l; - win->line_num += n; - - find_window_bottom (win); - - if (n || (bot != win->bot_window_line)) - return 0; - - return -1; - } - } - - if (nrows < 2) nrows++; - if (0 == SLscroll_next_n (win, nrows - 1)) - return -1; - return 0; -} - diff --git a/mdk-stage1/slang/slsearch.c b/mdk-stage1/slang/slsearch.c deleted file mode 100644 index a9a427a7d..000000000 --- a/mdk-stage1/slang/slsearch.c +++ /dev/null @@ -1,239 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -#ifdef upcase -# undef upcase -#endif - -#define upcase(ch) (cs ? ch : UPPER_CASE(ch)) - -static unsigned char *search_forward (register unsigned char *beg, - unsigned char *end, - unsigned char *key, - register int key_len, int cs, int *ind) -{ - register unsigned char char1; - unsigned char *pos; - int j, str_len; - register unsigned char ch; - register int db; - - str_len = (int) (end - beg); - if (str_len < key_len) return (NULL); - - if (key_len == 0) - return NULL; - - char1 = key[key_len - 1]; - beg += (key_len - 1); - - while(1) - { - if (cs) while (beg < end) - { - ch = *beg; - db = ind[(unsigned char) ch]; - if ((db < key_len) && (ch == char1)) break; - beg += db; /* ind[(unsigned char) ch]; */ - } - else while (beg < end) - { - ch = *beg; - db = ind[(unsigned char) ch]; - if ((db < key_len) && - (UPPER_CASE(ch) == char1)) break; - beg += db; /* ind[(unsigned char) ch]; */ - } - - if (beg >= end) return(NULL); - - pos = beg - (key_len - 1); - for (j = 0; j < key_len; j++) - { - ch = upcase(pos[j]); - if (ch != (unsigned char) key[j]) break; - } - - if (j == key_len) return(pos); - beg += 1; - } -} - -static unsigned char *search_backward (unsigned char *beg,unsigned char *end, - unsigned char *key, int key_len, - int cs, int *ind) -{ - unsigned char ch, char1; - int j, str_len, ofs; - - str_len = (int) (end - beg); - if (str_len < key_len) return (NULL); - - if (key_len == 0) - return NULL; - - /* end -= (key_len - 1); */ - end -= key_len; - - char1 = key[0]; - - while(1) - { - while ((beg <= end) && (ch = *end, ch = upcase(ch), ch != char1)) - { - ofs = ind[(unsigned char) ch]; -#ifdef __MSDOS__ - /* This is needed for msdos segment wrapping problems */ - if (beg + ofs > end) return(NULL); -#endif - end -= ofs; - } - if (beg > end) return(NULL); - for (j = 1; j < key_len; j++) - { - ch = upcase(end[j]); - if (ch != key[j]) break; - } - if (j == key_len) return(end); - end--; - } -} - -unsigned char *SLsearch (unsigned char *pmin, unsigned char *pmax, - SLsearch_Type *st) -{ - if (st->dir > 0) return search_forward (pmin, pmax, st->key, - st->key_len, st->cs, st->ind); - else return search_backward (pmin, pmax, st->key, - st->key_len, st->cs, st->ind); -} - -static int Case_Tables_Ok; - -int SLsearch_init (char *str, int dir, int cs, SLsearch_Type *st) -{ - int i, maxi; - register int max = strlen(str); - unsigned char *w, *work = st->key; - register int *indp, *indpm; - int *ind = st->ind; - - if (max >= (int) sizeof (st->key)) - { - SLang_doerror ("Search string too long."); - return -1; - } - - st->dir = dir; st->cs = cs; - - if (!Case_Tables_Ok) SLang_init_case_tables (); - - if (dir > 0) - { - w = work; - } - else - { - maxi = max - 1; - str = str + maxi; - w = work + maxi; - } - - /* for (i = 0; i < 256; i++) ind[i] = max; */ - indp = ind; indpm = ind + 256; - while (indp < indpm) - { - *indp++ = max; - *indp++ = max; - *indp++ = max; - *indp++ = max; - } - - i = 0; - if (cs) while (i < max) - { - i++; - maxi = max - i; - *w = *str; - ind[(unsigned char) *str] = maxi; - str += dir; w += dir; - } - else while (i < max) - { - i++; - maxi = max - i; - *w = UPPER_CASE(*str); - ind[(unsigned char) *w] = maxi; - ind[(unsigned char) LOWER_CASE(*str)] = maxi; - str += dir; w += dir; - } - - work[max] = 0; - st->key_len = max; - return max; -} - -/* 8bit clean upper and lowercase macros */ -unsigned char _SLChg_LCase_Lut[256]; -unsigned char _SLChg_UCase_Lut[256]; - -void SLang_define_case (int *u, int *l) -{ - unsigned char up = (unsigned char) *u, dn = (unsigned char) *l; - - _SLChg_LCase_Lut[up] = dn; - _SLChg_LCase_Lut[dn] = dn; - _SLChg_UCase_Lut[dn] = up; - _SLChg_UCase_Lut[up] = up; -} - -void SLang_init_case_tables (void) -{ - int i, j; - if (Case_Tables_Ok) return; - - for (i = 0; i < 256; i++) - { - _SLChg_UCase_Lut[i] = i; - _SLChg_LCase_Lut[i] = i; - } - - for (i = 'A'; i <= 'Z'; i++) - { - j = i + 32; - _SLChg_UCase_Lut[j] = i; - _SLChg_LCase_Lut[i] = j; - } -#ifdef PC_SYSTEM - /* Initialize for DOS code page 437. */ - _SLChg_UCase_Lut[135] = 128; _SLChg_LCase_Lut[128] = 135; - _SLChg_UCase_Lut[132] = 142; _SLChg_LCase_Lut[142] = 132; - _SLChg_UCase_Lut[134] = 143; _SLChg_LCase_Lut[143] = 134; - _SLChg_UCase_Lut[130] = 144; _SLChg_LCase_Lut[144] = 130; - _SLChg_UCase_Lut[145] = 146; _SLChg_LCase_Lut[146] = 145; - _SLChg_UCase_Lut[148] = 153; _SLChg_LCase_Lut[153] = 148; - _SLChg_UCase_Lut[129] = 154; _SLChg_LCase_Lut[154] = 129; - _SLChg_UCase_Lut[164] = 165; _SLChg_LCase_Lut[165] = 164; -#else - /* ISO Latin */ - for (i = 192; i <= 221; i++) - { - j = i + 32; - _SLChg_UCase_Lut[j] = i; - _SLChg_LCase_Lut[i] = j; - } - _SLChg_UCase_Lut[215] = 215; _SLChg_LCase_Lut[215] = 215; - _SLChg_UCase_Lut[223] = 223; _SLChg_LCase_Lut[223] = 223; - _SLChg_UCase_Lut[247] = 247; _SLChg_LCase_Lut[247] = 247; - _SLChg_UCase_Lut[255] = 255; _SLChg_LCase_Lut[255] = 255; -#endif - Case_Tables_Ok = 1; -} diff --git a/mdk-stage1/slang/slsignal.c b/mdk-stage1/slang/slsignal.c deleted file mode 100644 index 30707dea5..000000000 --- a/mdk-stage1/slang/slsignal.c +++ /dev/null @@ -1,336 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include - -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_WAIT_H -# include -#endif - -#include - -#include "slang.h" -#include "_slang.h" - -/* Do not trust these environments */ -#if defined(__CYGWIN32__) || defined(__MINGW32__) || defined(AMIGA) -# ifdef SLANG_POSIX_SIGNALS -# undef SLANG_POSIX_SIGNALS -# endif -#endif - -/* This function will cause system calls to be restarted after signal if possible */ -SLSig_Fun_Type *SLsignal (int sig, SLSig_Fun_Type *f) -{ -#if defined(SLANG_POSIX_SIGNALS) - struct sigaction old_sa, new_sa; - -# ifdef SIGALRM - /* We want system calls to be interrupted by SIGALRM. */ - if (sig == SIGALRM) return SLsignal_intr (sig, f); -# endif - - sigemptyset (&new_sa.sa_mask); - new_sa.sa_handler = f; - - new_sa.sa_flags = 0; -# ifdef SA_RESTART - new_sa.sa_flags |= SA_RESTART; -# endif - - if (-1 == sigaction (sig, &new_sa, &old_sa)) - return (SLSig_Fun_Type *) SIG_ERR; - - return old_sa.sa_handler; -#else - /* Not POSIX. */ - return signal (sig, f); -#endif -} - -/* This function will NOT cause system calls to be restarted after - * signal if possible - */ -SLSig_Fun_Type *SLsignal_intr (int sig, SLSig_Fun_Type *f) -{ -#ifdef SLANG_POSIX_SIGNALS - struct sigaction old_sa, new_sa; - - sigemptyset (&new_sa.sa_mask); - new_sa.sa_handler = f; - - new_sa.sa_flags = 0; -# ifdef SA_INTERRUPT - new_sa.sa_flags |= SA_INTERRUPT; -# endif - - if (-1 == sigaction (sig, &new_sa, &old_sa)) - return (SLSig_Fun_Type *) SIG_ERR; - - return old_sa.sa_handler; -#else - /* Not POSIX. */ - return signal (sig, f); -#endif -} - -/* We are primarily interested in blocking signals that would cause the - * application to reset the tty. These include suspend signals and - * possibly interrupt signals. - */ -#ifdef SLANG_POSIX_SIGNALS -static sigset_t Old_Signal_Mask; -#endif - -static volatile unsigned int Blocked_Depth; - -int SLsig_block_signals (void) -{ -#ifdef SLANG_POSIX_SIGNALS - sigset_t new_mask; -#endif - - Blocked_Depth++; - if (Blocked_Depth != 1) - { - return 0; - } - -#ifdef SLANG_POSIX_SIGNALS - sigemptyset (&new_mask); -# ifdef SIGQUIT - sigaddset (&new_mask, SIGQUIT); -# endif -# ifdef SIGTSTP - sigaddset (&new_mask, SIGTSTP); -# endif -# ifdef SIGINT - sigaddset (&new_mask, SIGINT); -# endif -# ifdef SIGTTIN - sigaddset (&new_mask, SIGTTIN); -# endif -# ifdef SIGTTOU - sigaddset (&new_mask, SIGTTOU); -# endif -# ifdef SIGWINCH - sigaddset (&new_mask, SIGWINCH); -# endif - - (void) sigprocmask (SIG_BLOCK, &new_mask, &Old_Signal_Mask); - return 0; -#else - /* Not implemented. */ - return -1; -#endif -} - -int SLsig_unblock_signals (void) -{ - if (Blocked_Depth == 0) - return -1; - - Blocked_Depth--; - - if (Blocked_Depth != 0) - return 0; - -#ifdef SLANG_POSIX_SIGNALS - (void) sigprocmask (SIG_SETMASK, &Old_Signal_Mask, NULL); - return 0; -#else - return -1; -#endif -} - -#ifdef MSWINDOWS -int SLsystem (char *cmd) -{ - SLang_verror (SL_NOT_IMPLEMENTED, "system not implemented"); - return -1; -} - -#else -int SLsystem (char *cmd) -{ -#ifdef SLANG_POSIX_SIGNALS - pid_t pid; - int status; - struct sigaction ignore; -# ifdef SIGINT - struct sigaction save_intr; -# endif -# ifdef SIGQUIT - struct sigaction save_quit; -# endif -# ifdef SIGCHLD - sigset_t child_mask, save_mask; -# endif - - if (cmd == NULL) return 1; - - ignore.sa_handler = SIG_IGN; - sigemptyset (&ignore.sa_mask); - ignore.sa_flags = 0; - -# ifdef SIGINT - if (-1 == sigaction (SIGINT, &ignore, &save_intr)) - return -1; -# endif - -# ifdef SIGQUIT - if (-1 == sigaction (SIGQUIT, &ignore, &save_quit)) - { - (void) sigaction (SIGINT, &save_intr, NULL); - return -1; - } -# endif - -# ifdef SIGCHLD - sigemptyset (&child_mask); - sigaddset (&child_mask, SIGCHLD); - if (-1 == sigprocmask (SIG_BLOCK, &child_mask, &save_mask)) - { -# ifdef SIGINT - (void) sigaction (SIGINT, &save_intr, NULL); -# endif -# ifdef SIGQUIT - (void) sigaction (SIGQUIT, &save_quit, NULL); -# endif - return -1; - } -# endif - - pid = fork(); - - if (pid == -1) - status = -1; - else if (pid == 0) - { - /* Child */ -# ifdef SIGINT - (void) sigaction (SIGINT, &save_intr, NULL); -# endif -# ifdef SIGQUIT - (void) sigaction (SIGQUIT, &save_quit, NULL); -# endif -# ifdef SIGCHLD - (void) sigprocmask (SIG_SETMASK, &save_mask, NULL); -# endif - - execl ("/bin/sh", "sh", "-c", cmd, NULL); - _exit (127); - } - else - { - /* parent */ - while (-1 == waitpid (pid, &status, 0)) - { -# ifdef EINTR - if (errno == EINTR) - continue; -# endif -# ifdef ERESTARTSYS - if (errno == ERESTARTSYS) - continue; -# endif - status = -1; - break; - } - } -# ifdef SIGINT - if (-1 == sigaction (SIGINT, &save_intr, NULL)) - status = -1; -# endif -# ifdef SIGQUIT - if (-1 == sigaction (SIGQUIT, &save_quit, NULL)) - status = -1; -# endif -# ifdef SIGCHLD - if (-1 == sigprocmask (SIG_SETMASK, &save_mask, NULL)) - status = -1; -# endif - - return status; - -#else /* No POSIX Signals */ -# ifdef SIGINT - void (*sint)(int); -# endif -# ifdef SIGQUIT - void (*squit)(int); -# endif - int status; - -# ifdef SIGQUIT - squit = SLsignal (SIGQUIT, SIG_IGN); -# endif -# ifdef SIGINT - sint = SLsignal (SIGINT, SIG_IGN); -# endif - status = system (cmd); -# ifdef SIGINT - SLsignal (SIGINT, sint); -# endif -# ifdef SIGQUIT - SLsignal (SIGQUIT, squit); -# endif - return status; -#endif /* POSIX_SIGNALS */ -} -#endif - -#if 0 -#include -static int msw_system (char *cmd) -{ - STARTUPINFO startup_info; - PROCESS_INFORMATION process_info; - int status; - - if (cmd == NULL) return -1; - - memset ((char *) &startup_info, 0, sizeof (STARTUPINFO)); - startup_info.cb = sizeof(STARTUPINFO); - startup_info.dwFlags = STARTF_USESHOWWINDOW; - startup_info.wShowWindow = SW_SHOWDEFAULT; - - if (FALSE == CreateProcess (NULL, - cmd, - NULL, - NULL, - FALSE, - NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE, - NULL, - NULL, - &startup_info, - &process_info)) - { - SLang_verror (0, "%s: CreateProcess failed.", cmd); - return -1; - } - - status = -1; - - if (0xFFFFFFFFUL != WaitForSingleObject (process_info.hProcess, INFINITE)) - { - DWORD exit_code; - - if (TRUE == GetExitCodeProcess (process_info.hProcess, &exit_code)) - status = (int) exit_code; - } - - CloseHandle (process_info.hThread); - CloseHandle (process_info.hProcess); - - return status; -} -#endif diff --git a/mdk-stage1/slang/slsmg.c b/mdk-stage1/slang/slsmg.c deleted file mode 100644 index 088557f27..000000000 --- a/mdk-stage1/slang/slsmg.c +++ /dev/null @@ -1,1584 +0,0 @@ -/* SLang Screen management routines */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -typedef struct Screen_Type - { - int n; /* number of chars written last time */ - int flags; /* line untouched, etc... */ - SLsmg_Char_Type *old, *neew; -#ifndef IBMPC_SYSTEM - unsigned long old_hash, new_hash; -#endif - } -Screen_Type; - -#define TOUCHED 0x1 -#define TRASHED 0x2 -static int Screen_Trashed; - -#if !defined(__MSDOS_16BIT__) -# define MAX_SCREEN_SIZE 256 -#else -# define MAX_SCREEN_SIZE 75 -#endif - -Screen_Type SL_Screen[MAX_SCREEN_SIZE]; -static int Start_Col, Start_Row; -static int Screen_Cols, Screen_Rows; -static int This_Row, This_Col; -static int This_Color; /* only the first 8 bits of this - * are used. The highest bit is used - * to indicate an alternate character - * set. This leaves 127 userdefineable - * color combination. - */ - -#ifndef IBMPC_SYSTEM -#define ALT_CHAR_FLAG 0x80 -#else -#define ALT_CHAR_FLAG 0x00 -#endif - -#if SLTT_HAS_NON_BCE_SUPPORT && !defined(IBMPC_SYSTEM) -#define REQUIRES_NON_BCE_SUPPORT 1 -static int Bce_Color_Offset; -#endif - -int SLsmg_Newline_Behavior = 0; -int SLsmg_Backspace_Moves = 0; -/* Backward compatibility. Not used. */ -/* int SLsmg_Newline_Moves; */ - -static void (*tt_normal_video)(void) = SLtt_normal_video; -static void (*tt_goto_rc)(int, int) = SLtt_goto_rc; -static void (*tt_cls) (void) = SLtt_cls; -static void (*tt_del_eol) (void) = SLtt_del_eol; -static void (*tt_smart_puts) (SLsmg_Char_Type *, SLsmg_Char_Type *, int, int) = SLtt_smart_puts; -static int (*tt_flush_output) (void) = SLtt_flush_output; -static int (*tt_reset_video) (void) = SLtt_reset_video; -static int (*tt_init_video) (void) = SLtt_init_video; -static int *tt_Screen_Rows = &SLtt_Screen_Rows; -static int *tt_Screen_Cols = &SLtt_Screen_Cols; - -#ifndef IBMPC_SYSTEM -static void (*tt_set_scroll_region)(int, int) = SLtt_set_scroll_region; -static void (*tt_reverse_index)(int) = SLtt_reverse_index; -static void (*tt_reset_scroll_region)(void) = SLtt_reset_scroll_region; -static void (*tt_delete_nlines)(int) = SLtt_delete_nlines; -#endif - -#ifndef IBMPC_SYSTEM -static int *tt_Term_Cannot_Scroll = &SLtt_Term_Cannot_Scroll; -static int *tt_Has_Alt_Charset = &SLtt_Has_Alt_Charset; -static char **tt_Graphics_Char_Pairs = &SLtt_Graphics_Char_Pairs; -static int *tt_Use_Blink_For_ACS = &SLtt_Use_Blink_For_ACS; -#endif - -static int Smg_Inited; - -static void blank_line (SLsmg_Char_Type *p, int n, unsigned char ch) -{ - register SLsmg_Char_Type *pmax = p + n; - register SLsmg_Char_Type color_ch; - - color_ch = SLSMG_BUILD_CHAR(ch,This_Color); - - while (p < pmax) - { - *p++ = color_ch; - } -} - -static void clear_region (int row, int n) -{ - int i; - int imax = row + n; - - if (imax > Screen_Rows) imax = Screen_Rows; - for (i = row; i < imax; i++) - { - if (i >= 0) - { - blank_line (SL_Screen[i].neew, Screen_Cols, ' '); - SL_Screen[i].flags |= TOUCHED; - } - } -} - -void SLsmg_erase_eol (void) -{ - int r, c; - - if (Smg_Inited == 0) return; - - c = This_Col - Start_Col; - r = This_Row - Start_Row; - - if ((r < 0) || (r >= Screen_Rows)) return; - if (c < 0) c = 0; else if (c >= Screen_Cols) return; - blank_line (SL_Screen[This_Row].neew + c , Screen_Cols - c, ' '); - SL_Screen[This_Row].flags |= TOUCHED; -} - -static void scroll_up (void) -{ - unsigned int i, imax; - SLsmg_Char_Type *neew; - - neew = SL_Screen[0].neew; - imax = Screen_Rows - 1; - for (i = 0; i < imax; i++) - { - SL_Screen[i].neew = SL_Screen[i + 1].neew; - SL_Screen[i].flags |= TOUCHED; - } - SL_Screen[i].neew = neew; - SL_Screen[i].flags |= TOUCHED; - blank_line (neew, Screen_Cols, ' '); - This_Row--; -} - -void SLsmg_gotorc (int r, int c) -{ - This_Row = r; - This_Col = c; -} - -int SLsmg_get_row (void) -{ - return This_Row; -} - -int SLsmg_get_column (void) -{ - return This_Col; -} - -void SLsmg_erase_eos (void) -{ - if (Smg_Inited == 0) return; - - SLsmg_erase_eol (); - clear_region (This_Row + 1, Screen_Rows); -} - -static int This_Alt_Char; - -void SLsmg_set_char_set (int i) -{ -#ifdef IBMPC_SYSTEM - (void) i; -#else - if ((tt_Use_Blink_For_ACS != NULL) - && (*tt_Use_Blink_For_ACS != 0)) - return;/* alt chars not used and the alt bit - * is used to indicate a blink. - */ - - if (i) This_Alt_Char = ALT_CHAR_FLAG; - else This_Alt_Char = 0; - - This_Color &= 0x7F; - This_Color |= This_Alt_Char; -#endif -} - -void SLsmg_set_color (int color) -{ - if (color < 0) return; -#ifdef REQUIRES_NON_BCE_SUPPORT - color += Bce_Color_Offset; -#endif - This_Color = color | This_Alt_Char; -} - -void SLsmg_reverse_video (void) -{ - SLsmg_set_color (1); -} - -void SLsmg_normal_video (void) -{ - SLsmg_set_color (0); -} - -static int point_visible (int col_too) -{ - return ((This_Row >= Start_Row) && (This_Row < Start_Row + Screen_Rows) - && ((col_too == 0) - || ((This_Col >= Start_Col) - && (This_Col < Start_Col + Screen_Cols)))); -} - -void SLsmg_write_string (char *str) -{ - SLsmg_write_nchars (str, strlen (str)); -} - -void SLsmg_write_nstring (char *str, unsigned int n) -{ - unsigned int width; - char blank = ' '; - - /* Avoid a problem if a user accidently passes a negative value */ - if ((int) n < 0) - return; - - if (str == NULL) width = 0; - else - { - width = strlen (str); - if (width > n) width = n; - SLsmg_write_nchars (str, width); - } - while (width++ < n) SLsmg_write_nchars (&blank, 1); -} - -void SLsmg_write_wrapped_string (char *s, int r, int c, - unsigned int dr, unsigned int dc, - int fill) -{ - register char ch, *p; - int maxc = (int) dc; - - if ((dr == 0) || (dc == 0)) return; - p = s; - dc = 0; - while (1) - { - ch = *p++; - if ((ch == 0) || (ch == '\n')) - { - int diff; - - diff = maxc - (int) dc; - - SLsmg_gotorc (r, c); - SLsmg_write_nchars (s, dc); - if (fill && (diff > 0)) - { - while (diff--) SLsmg_write_char (' '); - } - if ((ch == 0) || (dr == 1)) break; - - r++; - dc = 0; - dr--; - s = p; - } - else if ((int) dc == maxc) - { - SLsmg_gotorc (r, c); - SLsmg_write_nchars (s, dc + 1); - if (dr == 1) break; - - r++; - dc = 0; - dr--; - s = p; - } - else dc++; - } -} - -int SLsmg_Tab_Width = 8; - -/* Minimum value for which eight bit char is displayed as is. */ - -#ifndef IBMPC_SYSTEM -int SLsmg_Display_Eight_Bit = 160; -static unsigned char Alt_Char_Set[129];/* 129th is used as a flag */ -#else -int SLsmg_Display_Eight_Bit = 128; -#endif - -void SLsmg_write_nchars (char *str, unsigned int n) -{ - register SLsmg_Char_Type *p, old, neew, color; - unsigned char ch; - unsigned int flags; - int len, start_len, max_len; - char *str_max; - int newline_flag; -#ifndef IBMPC_SYSTEM - int alt_char_set_flag; - - alt_char_set_flag = ((This_Color & ALT_CHAR_FLAG) - && ((tt_Use_Blink_For_ACS == NULL) - || (*tt_Use_Blink_For_ACS == 0))); -#endif - - if (Smg_Inited == 0) return; - - str_max = str + n; - color = This_Color; - - top: /* get here only on newline */ - - newline_flag = 0; - start_len = Start_Col; - - if (point_visible (0) == 0) return; - - len = This_Col; - max_len = start_len + Screen_Cols; - - p = SL_Screen[This_Row - Start_Row].neew; - if (len > start_len) p += (len - start_len); - - flags = SL_Screen[This_Row - Start_Row].flags; - while ((len < max_len) && (str < str_max)) - { - ch = (unsigned char) *str++; - -#ifndef IBMPC_SYSTEM - if (alt_char_set_flag) - ch = Alt_Char_Set [ch & 0x7F]; -#endif - if (((ch >= ' ') && (ch < 127)) - || (ch >= (unsigned char) SLsmg_Display_Eight_Bit) -#ifndef IBMPC_SYSTEM - || alt_char_set_flag -#endif - ) - { - len += 1; - if (len > start_len) - { - old = *p; - neew = SLSMG_BUILD_CHAR(ch,color); - if (old != neew) - { - flags |= TOUCHED; - *p = neew; - } - p++; - } - } - - else if ((ch == '\t') && (SLsmg_Tab_Width > 0)) - { - n = len; - n += SLsmg_Tab_Width; - n = SLsmg_Tab_Width - (n % SLsmg_Tab_Width); - if ((unsigned int) len + n > (unsigned int) max_len) - n = (unsigned int) (max_len - len); - neew = SLSMG_BUILD_CHAR(' ',color); - while (n--) - { - len += 1; - if (len > start_len) - { - if (*p != neew) - { - flags |= TOUCHED; - *p = neew; - } - p++; - } - } - } - else if ((ch == '\n') - && (SLsmg_Newline_Behavior != SLSMG_NEWLINE_PRINTABLE)) - { - newline_flag = 1; - break; - } - else if ((ch == 0x8) && SLsmg_Backspace_Moves) - { - if (len != 0) len--; - } - else - { - if (ch & 0x80) - { - neew = SLSMG_BUILD_CHAR('~',color); - len += 1; - if (len > start_len) - { - if (*p != neew) - { - *p = neew; - flags |= TOUCHED; - } - p++; - if (len == max_len) break; - ch &= 0x7F; - } - } - - len += 1; - if (len > start_len) - { - neew = SLSMG_BUILD_CHAR('^',color); - if (*p != neew) - { - *p = neew; - flags |= TOUCHED; - } - p++; - if (len == max_len) break; - } - - if (ch == 127) ch = '?'; else ch = ch + '@'; - len++; - if (len > start_len) - { - neew = SLSMG_BUILD_CHAR(ch,color); - if (*p != neew) - { - *p = neew; - flags |= TOUCHED; - } - p++; - } - } - } - - SL_Screen[This_Row - Start_Row].flags = flags; - This_Col = len; - - if (SLsmg_Newline_Behavior == 0) - return; - - if (newline_flag == 0) - { - while (str < str_max) - { - if (*str == '\n') break; - str++; - } - if (str == str_max) return; - str++; - } - - This_Row++; - This_Col = 0; - if (This_Row == Start_Row + Screen_Rows) - { - if (SLsmg_Newline_Behavior == SLSMG_NEWLINE_SCROLLS) scroll_up (); - } - goto top; -} - -void SLsmg_write_char (char ch) -{ - SLsmg_write_nchars (&ch, 1); -} - -static int Cls_Flag; - -void SLsmg_cls (void) -{ - int tac; - if (Smg_Inited == 0) return; - - tac = This_Alt_Char; This_Alt_Char = 0; - SLsmg_set_color (0); - clear_region (0, Screen_Rows); - This_Alt_Char = tac; - SLsmg_set_color (0); - Cls_Flag = 1; -} -#if 0 -static void do_copy (SLsmg_Char_Type *a, SLsmg_Char_Type *b) -{ - SLsmg_Char_Type *amax = a + Screen_Cols; - - while (a < amax) *a++ = *b++; -} -#endif - -#ifndef IBMPC_SYSTEM -int SLsmg_Scroll_Hash_Border = 0; -static unsigned long compute_hash (SLsmg_Char_Type *s, int n) -{ - register unsigned long h = 0, g; - register unsigned long sum = 0; - register SLsmg_Char_Type *smax, ch; - int is_blank = 2; - - s += SLsmg_Scroll_Hash_Border; - smax = s + (n - SLsmg_Scroll_Hash_Border); - while (s < smax) - { - ch = *s++; - if (is_blank && (SLSMG_EXTRACT_CHAR(ch) != 32)) is_blank--; - - sum += ch; - - h = sum + (h << 3); - if ((g = h & 0xE0000000UL) != 0) - { - h = h ^ (g >> 24); - h = h ^ g; - } - } - if (is_blank) return 0; - return h; -} - -static unsigned long Blank_Hash; - -static int try_scroll_down (int rmin, int rmax) -{ - int i, r1, r2, di, j; - unsigned long hash; - int did_scroll; - int color; - SLsmg_Char_Type *tmp; - int ignore; - - did_scroll = 0; - for (i = rmax; i > rmin; i--) - { - hash = SL_Screen[i].new_hash; - if (hash == Blank_Hash) continue; - - if ((hash == SL_Screen[i].old_hash) -#if 0 - || ((i + 1 < Screen_Rows) && (hash == SL_Screen[i + 1].old_hash)) - || ((i - 1 > rmin) && (SL_Screen[i].old_hash == SL_Screen[i - 1].new_hash)) -#endif - ) - continue; - - for (j = i - 1; j >= rmin; j--) - { - if (hash == SL_Screen[j].old_hash) break; - } - if (j < rmin) continue; - - r2 = i; /* end scroll region */ - - di = i - j; - j--; - ignore = 0; - while ((j >= rmin) && (SL_Screen[j].old_hash == SL_Screen[j + di].new_hash)) - { - if (SL_Screen[j].old_hash == Blank_Hash) ignore++; - j--; - } - r1 = j + 1; - - /* If this scroll only scrolls this line into place, don't do it. - */ - if ((di > 1) && (r1 + di + ignore == r2)) continue; - - /* If there is anything in the scrolling region that is ok, abort the - * scroll. - */ - - for (j = r1; j <= r2; j++) - { - if ((SL_Screen[j].old_hash != Blank_Hash) - && (SL_Screen[j].old_hash == SL_Screen[j].new_hash)) - { - /* See if the scroll is happens to scroll this one into place. */ - if ((j + di > r2) || (SL_Screen[j].old_hash != SL_Screen[j + di].new_hash)) - break; - } - } - if (j <= r2) continue; - - color = This_Color; This_Color = 0; - did_scroll = 1; - (*tt_normal_video) (); - (*tt_set_scroll_region) (r1, r2); - (*tt_goto_rc) (0, 0); - (*tt_reverse_index) (di); - (*tt_reset_scroll_region) (); - /* Now we have a hole in the screen. - * Make the virtual screen look like it. - * - * Note that if the terminal does not support BCE, then we have - * no idea what color the hole is. So, for this case, we do not - * want to add Bce_Color_Offset to This_Color since if Bce_Color_Offset - * is non-zero, then This_Color = 0 does not match any valid color - * obtained by adding Bce_Color_Offset. - */ - for (j = r1; j <= r2; j++) SL_Screen[j].flags = TOUCHED; - - while (di--) - { - tmp = SL_Screen[r2].old; - for (j = r2; j > r1; j--) - { - SL_Screen[j].old = SL_Screen[j - 1].old; - SL_Screen[j].old_hash = SL_Screen[j - 1].old_hash; - } - SL_Screen[r1].old = tmp; - blank_line (SL_Screen[r1].old, Screen_Cols, ' '); - SL_Screen[r1].old_hash = Blank_Hash; - r1++; - } - This_Color = color; - } - - return did_scroll; -} - -static int try_scroll_up (int rmin, int rmax) -{ - int i, r1, r2, di, j; - unsigned long hash; - int did_scroll; - int color; - SLsmg_Char_Type *tmp; - int ignore; - - did_scroll = 0; - for (i = rmin; i < rmax; i++) - { - hash = SL_Screen[i].new_hash; - if (hash == Blank_Hash) continue; - if (hash == SL_Screen[i].old_hash) - continue; - /* find a match further down screen */ - for (j = i + 1; j <= rmax; j++) - { - if (hash == SL_Screen[j].old_hash) break; - } - if (j > rmax) continue; - - r1 = i; /* beg scroll region */ - di = j - i; /* number of lines to scroll */ - j++; /* since we know this is a match */ - - /* find end of scroll region */ - ignore = 0; - while ((j <= rmax) && (SL_Screen[j].old_hash == SL_Screen[j - di].new_hash)) - { - if (SL_Screen[j].old_hash == Blank_Hash) ignore++; - j++; - } - r2 = j - 1; /* end of scroll region */ - - /* If this scroll only scrolls this line into place, don't do it. - */ - if ((di > 1) && (r1 + di + ignore == r2)) continue; - - /* If there is anything in the scrolling region that is ok, abort the - * scroll. - */ - - for (j = r1; j <= r2; j++) - { - if ((SL_Screen[j].old_hash != Blank_Hash) - && (SL_Screen[j].old_hash == SL_Screen[j].new_hash)) - { - if ((j - di < r1) || (SL_Screen[j].old_hash != SL_Screen[j - di].new_hash)) - break; - } - - } - if (j <= r2) continue; - - did_scroll = 1; - - /* See the above comments about BCE */ - color = This_Color; This_Color = 0; - (*tt_normal_video) (); - (*tt_set_scroll_region) (r1, r2); - (*tt_goto_rc) (0, 0); /* relative to scroll region */ - (*tt_delete_nlines) (di); - (*tt_reset_scroll_region) (); - /* Now we have a hole in the screen. Make the virtual screen look - * like it. - */ - for (j = r1; j <= r2; j++) SL_Screen[j].flags = TOUCHED; - - while (di--) - { - tmp = SL_Screen[r1].old; - for (j = r1; j < r2; j++) - { - SL_Screen[j].old = SL_Screen[j + 1].old; - SL_Screen[j].old_hash = SL_Screen[j + 1].old_hash; - } - SL_Screen[r2].old = tmp; - blank_line (SL_Screen[r2].old, Screen_Cols, ' '); - SL_Screen[r2].old_hash = Blank_Hash; - r2--; - } - This_Color = color; - } - return did_scroll; -} - -static void try_scroll (void) -{ - int r1, rmin, rmax; - int num_up, num_down; - /* find region limits. */ - - for (rmax = Screen_Rows - 1; rmax > 0; rmax--) - { - if (SL_Screen[rmax].new_hash != SL_Screen[rmax].old_hash) - { - r1 = rmax - 1; - if ((r1 == 0) - || (SL_Screen[r1].new_hash != SL_Screen[r1].old_hash)) - break; - - rmax = r1; - } - } - - for (rmin = 0; rmin < rmax; rmin++) - { - if (SL_Screen[rmin].new_hash != SL_Screen[rmin].old_hash) - { - r1 = rmin + 1; - if ((r1 == rmax) - || (SL_Screen[r1].new_hash != SL_Screen[r1].old_hash)) - break; - - rmin = r1; - } - } - - /* Below, we have two scrolling algorithms. The first has the effect of - * scrolling lines down. This is usually appropriate when one moves - * up the display, e.g., with the UP arrow. The second algorithm is - * appropriate for going the other way. It is important to choose the - * correct one. - */ - - num_up = 0; - for (r1 = rmin; r1 < rmax; r1++) - { - if (SL_Screen[r1].new_hash == SL_Screen[r1 + 1].old_hash) - num_up++; - } - - num_down = 0; - for (r1 = rmax; r1 > rmin; r1--) - { - if (SL_Screen[r1 - 1].old_hash == SL_Screen[r1].new_hash) - num_down++; - } - - if (num_up > num_down) - { - if (try_scroll_up (rmin, rmax)) - return; - - (void) try_scroll_down (rmin, rmax); - } - else - { - if (try_scroll_down (rmin, rmax)) - return; - - (void) try_scroll_up (rmin, rmax); - } -} -#endif /* NOT IBMPC_SYSTEM */ - - -#ifdef REQUIRES_NON_BCE_SUPPORT -static void adjust_colors (void) -{ - int bce; - int i; - - bce = Bce_Color_Offset; - Bce_Color_Offset = _SLtt_get_bce_color_offset (); - if (bce == Bce_Color_Offset) - return; - - if ((tt_Use_Blink_For_ACS != NULL) - && (*tt_Use_Blink_For_ACS != 0)) - return; /* this mode does not support non-BCE - * terminals. - */ - - for (i = 0; i < Screen_Rows; i++) - { - SLsmg_Char_Type *s, *smax; - - SL_Screen[i].flags |= TRASHED; - s = SL_Screen[i].neew; - smax = s + Screen_Cols; - - while (s < smax) - { - int color = (int) SLSMG_EXTRACT_COLOR(*s); - int acs; - - if (color < 0) - { - s++; - continue; - } - - acs = color & 0x80; - color = (color & 0x7F) - bce; - color += Bce_Color_Offset; - if (color >= 0) - { - unsigned char ch = SLSMG_EXTRACT_CHAR(*s); - *s = SLSMG_BUILD_CHAR(ch, ((color&0x7F)|acs)); - } - s++; - } - } -} -#endif - -void SLsmg_refresh (void) -{ - int i; -#ifndef IBMPC_SYSTEM - int trashed = 0; -#endif - - if (Smg_Inited == 0) return; - - if (Screen_Trashed) - { - Cls_Flag = 1; - for (i = 0; i < Screen_Rows; i++) - SL_Screen[i].flags |= TRASHED; -#ifdef REQUIRES_NON_BCE_SUPPORT - adjust_colors (); -#endif - } - -#ifndef IBMPC_SYSTEM - for (i = 0; i < Screen_Rows; i++) - { - if (SL_Screen[i].flags == 0) continue; - SL_Screen[i].new_hash = compute_hash (SL_Screen[i].neew, Screen_Cols); - trashed = 1; - } -#endif - - if (Cls_Flag) - { - (*tt_normal_video) (); (*tt_cls) (); - } -#ifndef IBMPC_SYSTEM - else if (trashed && (*tt_Term_Cannot_Scroll == 0)) try_scroll (); -#endif - - for (i = 0; i < Screen_Rows; i++) - { - if (SL_Screen[i].flags == 0) continue; - - if (Cls_Flag || SL_Screen[i].flags & TRASHED) - { - int color = This_Color; - - if (Cls_Flag == 0) - { - (*tt_goto_rc) (i, 0); - (*tt_del_eol) (); - } - This_Color = 0; - blank_line (SL_Screen[i].old, Screen_Cols, ' '); - This_Color = color; - } - - SL_Screen[i].old[Screen_Cols] = 0; - SL_Screen[i].neew[Screen_Cols] = 0; - - (*tt_smart_puts) (SL_Screen[i].neew, SL_Screen[i].old, Screen_Cols, i); - - SLMEMCPY ((char *) SL_Screen[i].old, (char *) SL_Screen[i].neew, - Screen_Cols * sizeof (SLsmg_Char_Type)); - - SL_Screen[i].flags = 0; -#ifndef IBMPC_SYSTEM - SL_Screen[i].old_hash = SL_Screen[i].new_hash; -#endif - } - - if (point_visible (1)) (*tt_goto_rc) (This_Row - Start_Row, This_Col - Start_Col); - (*tt_flush_output) (); - Cls_Flag = 0; - Screen_Trashed = 0; -} - -static int compute_clip (int row, int n, int box_start, int box_end, - int *rmin, int *rmax) -{ - int row_max; - - if (n < 0) return 0; - if (row >= box_end) return 0; - row_max = row + n; - if (row_max <= box_start) return 0; - - if (row < box_start) row = box_start; - if (row_max >= box_end) row_max = box_end; - *rmin = row; - *rmax = row_max; - return 1; -} - -void SLsmg_touch_lines (int row, unsigned int n) -{ - int i; - int r1, r2; - - /* Allow this function to be called even when we are not initialied. - * Calling this function is useful after calling SLtt_set_color - * to force the display to be redrawn - */ - - if (Smg_Inited == 0) - return; - - if (0 == compute_clip (row, (int) n, Start_Row, Start_Row + Screen_Rows, &r1, &r2)) - return; - - r1 -= Start_Row; - r2 -= Start_Row; - for (i = r1; i < r2; i++) - { - SL_Screen[i].flags |= TRASHED; - } -} - -void SLsmg_touch_screen (void) -{ - Screen_Trashed = 1; -} - - -#ifndef IBMPC_SYSTEM -static char Fake_Alt_Char_Pairs [] = "a:j+k+l+m+q-t+u+v+w+x|n+`+f\\g#~o,<+>.v-^h#0#"; - -static void init_alt_char_set (void) -{ - int i; - unsigned char *p, *pmax, ch; - - if (Alt_Char_Set[128] == 128) return; - - i = 32; - memset ((char *)Alt_Char_Set, ' ', i); - while (i <= 128) - { - Alt_Char_Set [i] = i; - i++; - } - - /* Map to VT100 */ - if (*tt_Has_Alt_Charset) - { - if (tt_Graphics_Char_Pairs == NULL) p = NULL; - else p = (unsigned char *) *tt_Graphics_Char_Pairs; - if (p == NULL) return; - } - else p = (unsigned char *) Fake_Alt_Char_Pairs; - pmax = p + strlen ((char *) p); - - /* Some systems have messed up entries for this */ - while (p < pmax) - { - ch = *p++; - ch &= 0x7F; /* should be unnecessary */ - Alt_Char_Set [ch] = *p; - p++; - } -} -#endif - -#ifndef IBMPC_SYSTEM -# define BLOCK_SIGNALS SLsig_block_signals () -# define UNBLOCK_SIGNALS SLsig_unblock_signals () -#else -# define BLOCK_SIGNALS (void)0 -# define UNBLOCK_SIGNALS (void)0 -#endif - -static int Smg_Suspended; -int SLsmg_suspend_smg (void) -{ - BLOCK_SIGNALS; - - if (Smg_Suspended == 0) - { - (*tt_reset_video) (); - Smg_Suspended = 1; - } - - UNBLOCK_SIGNALS; - return 0; -} - -int SLsmg_resume_smg (void) -{ - BLOCK_SIGNALS; - - if (Smg_Suspended == 0) - { - UNBLOCK_SIGNALS; - return 0; - } - - Smg_Suspended = 0; - - if (-1 == (*tt_init_video) ()) - { - UNBLOCK_SIGNALS; - return -1; - } - - Cls_Flag = 1; - SLsmg_touch_screen (); - SLsmg_refresh (); - - UNBLOCK_SIGNALS; - return 0; -} - - -static void reset_smg (void) -{ - int i; - if (Smg_Inited == 0) - return; - - for (i = 0; i < Screen_Rows; i++) - { - SLfree ((char *)SL_Screen[i].old); - SLfree ((char *)SL_Screen[i].neew); - SL_Screen[i].old = SL_Screen[i].neew = NULL; - } - This_Alt_Char = This_Color = 0; - Smg_Inited = 0; -} - - -static int init_smg (void) -{ - int i, len; - SLsmg_Char_Type *old, *neew; - - Smg_Inited = 0; - -#ifdef REQUIRES_NON_BCE_SUPPORT - Bce_Color_Offset = _SLtt_get_bce_color_offset (); -#endif - - Screen_Rows = *tt_Screen_Rows; - if (Screen_Rows > MAX_SCREEN_SIZE) - Screen_Rows = MAX_SCREEN_SIZE; - - Screen_Cols = *tt_Screen_Cols; - - This_Col = This_Row = Start_Col = Start_Row = 0; - - This_Alt_Char = 0; - SLsmg_set_color (0); - Cls_Flag = 1; -#ifndef IBMPC_SYSTEM - init_alt_char_set (); -#endif - len = Screen_Cols + 3; - for (i = 0; i < Screen_Rows; i++) - { - if ((NULL == (old = (SLsmg_Char_Type *) SLmalloc (sizeof(SLsmg_Char_Type) * len))) - || ((NULL == (neew = (SLsmg_Char_Type *) SLmalloc (sizeof(SLsmg_Char_Type) * len))))) - { - SLfree ((char *) old); - return -1; - } - blank_line (old, len, ' '); - blank_line (neew, len, ' '); - SL_Screen[i].old = old; - SL_Screen[i].neew = neew; - SL_Screen[i].flags = 0; -#ifndef IBMPC_SYSTEM - Blank_Hash = compute_hash (old, Screen_Cols); - SL_Screen[i].new_hash = SL_Screen[i].old_hash = Blank_Hash; -#endif - } - - _SLtt_color_changed_hook = SLsmg_touch_screen; - Screen_Trashed = 1; - Smg_Inited = 1; - return 0; -} - - -int SLsmg_init_smg (void) -{ - int ret; - - BLOCK_SIGNALS; - - if (Smg_Inited) - SLsmg_reset_smg (); - - if (-1 == (*tt_init_video) ()) - { - UNBLOCK_SIGNALS; - return -1; - } - - if (-1 == (ret = init_smg ())) - (void) (*tt_reset_video)(); - - UNBLOCK_SIGNALS; - return ret; -} - -int SLsmg_reinit_smg (void) -{ - int ret; - - if (Smg_Inited == 0) - return SLsmg_init_smg (); - - BLOCK_SIGNALS; - reset_smg (); - ret = init_smg (); - UNBLOCK_SIGNALS; - return ret; -} - -void SLsmg_reset_smg (void) -{ - if (Smg_Inited == 0) - return; - - BLOCK_SIGNALS; - - reset_smg (); - (*tt_reset_video)(); - - UNBLOCK_SIGNALS; -} - -SLsmg_Char_Type SLsmg_char_at (void) -{ - if (Smg_Inited == 0) return 0; - - if (point_visible (1)) - { - return SL_Screen[This_Row - Start_Row].neew[This_Col - Start_Col]; - } - return 0; -} - -void SLsmg_vprintf (char *fmt, va_list ap) -{ - char buf[1024]; - - if (Smg_Inited == 0) return; - - (void) _SLvsnprintf (buf, sizeof (buf), fmt, ap); - SLsmg_write_string (buf); -} - -void SLsmg_printf (char *fmt, ...) -{ - va_list ap; - unsigned int len; - char *f; - - if (Smg_Inited == 0) return; - - va_start(ap, fmt); - - f = fmt; - while (*f && (*f != '%')) - f++; - len = (unsigned int) (f - fmt); - if (len) SLsmg_write_nchars (fmt, len); - - if (*f != 0) - SLsmg_vprintf (f, ap); - - va_end (ap); -} - -void SLsmg_set_screen_start (int *r, int *c) -{ - int orow = Start_Row, oc = Start_Col; - - if (Smg_Inited == 0) return; - - if (c == NULL) Start_Col = 0; - else - { - Start_Col = *c; - *c = oc; - } - if (r == NULL) Start_Row = 0; - else - { - Start_Row = *r; - *r = orow; - } -} - -void SLsmg_draw_object (int r, int c, unsigned char object) -{ - This_Row = r; This_Col = c; - - if (Smg_Inited == 0) return; - - if (point_visible (1)) - { - int color = This_Color; - This_Color |= ALT_CHAR_FLAG; - SLsmg_write_char (object); - This_Color = color; - } - - This_Col = c + 1; -} - -void SLsmg_draw_hline (unsigned int n) -{ - static unsigned char hbuf[16]; - int count; - int cmin, cmax; - int final_col = This_Col + (int) n; - int save_color; - - if (Smg_Inited == 0) return; - - if ((This_Row < Start_Row) || (This_Row >= Start_Row + Screen_Rows) - || (0 == compute_clip (This_Col, n, Start_Col, Start_Col + Screen_Cols, - &cmin, &cmax))) - { - This_Col = final_col; - return; - } - - if (hbuf[0] == 0) - { - SLMEMSET ((char *) hbuf, SLSMG_HLINE_CHAR, 16); - } - - n = (unsigned int)(cmax - cmin); - count = n / 16; - - save_color = This_Color; - This_Color |= ALT_CHAR_FLAG; - This_Col = cmin; - - SLsmg_write_nchars ((char *) hbuf, n % 16); - while (count-- > 0) - { - SLsmg_write_nchars ((char *) hbuf, 16); - } - - This_Color = save_color; - This_Col = final_col; -} - -void SLsmg_draw_vline (int n) -{ - unsigned char ch = SLSMG_VLINE_CHAR; - int c = This_Col, rmin, rmax; - int final_row = This_Row + n; - int save_color; - - if (Smg_Inited == 0) return; - - if (((c < Start_Col) || (c >= Start_Col + Screen_Cols)) || - (0 == compute_clip (This_Row, n, Start_Row, Start_Row + Screen_Rows, - &rmin, &rmax))) - { - This_Row = final_row; - return; - } - - save_color = This_Color; - This_Color |= ALT_CHAR_FLAG; - - for (This_Row = rmin; This_Row < rmax; This_Row++) - { - This_Col = c; - SLsmg_write_nchars ((char *) &ch, 1); - } - - This_Col = c; This_Row = final_row; - This_Color = save_color; -} - -void SLsmg_draw_box (int r, int c, unsigned int dr, unsigned int dc) -{ - if (Smg_Inited == 0) return; - - if (!dr || !dc) return; - This_Row = r; This_Col = c; - dr--; dc--; - SLsmg_draw_hline (dc); - SLsmg_draw_vline (dr); - This_Row = r; This_Col = c; - SLsmg_draw_vline (dr); - SLsmg_draw_hline (dc); - SLsmg_draw_object (r, c, SLSMG_ULCORN_CHAR); - SLsmg_draw_object (r, c + (int) dc, SLSMG_URCORN_CHAR); - SLsmg_draw_object (r + (int) dr, c, SLSMG_LLCORN_CHAR); - SLsmg_draw_object (r + (int) dr, c + (int) dc, SLSMG_LRCORN_CHAR); - This_Row = r; This_Col = c; -} - -void SLsmg_fill_region (int r, int c, unsigned int dr, unsigned int dc, unsigned char ch) -{ - static unsigned char hbuf[16]; - int count; - int dcmax, rmax; - - if (Smg_Inited == 0) return; - - SLsmg_gotorc (r, c); - r = This_Row; c = This_Col; - - dcmax = Screen_Cols - This_Col; - if (dcmax < 0) - return; - - if (dc > (unsigned int) dcmax) dc = (unsigned int) dcmax; - - rmax = This_Row + dr; - if (rmax > Screen_Rows) rmax = Screen_Rows; - -#if 0 - ch = Alt_Char_Set[ch]; -#endif - if (ch != hbuf[0]) SLMEMSET ((char *) hbuf, (char) ch, 16); - - for (This_Row = r; This_Row < rmax; This_Row++) - { - This_Col = c; - count = dc / 16; - SLsmg_write_nchars ((char *) hbuf, dc % 16); - while (count-- > 0) - { - SLsmg_write_nchars ((char *) hbuf, 16); - } - } - - This_Row = r; -} - -void SLsmg_forward (int n) -{ - This_Col += n; -} - -void SLsmg_write_color_chars (SLsmg_Char_Type *s, unsigned int len) -{ - SLsmg_Char_Type *smax, sh; - char buf[32], *b, *bmax; - int color, save_color; - - if (Smg_Inited == 0) return; - - smax = s + len; - b = buf; - bmax = b + sizeof (buf); - - save_color = This_Color; - - while (s < smax) - { - sh = *s++; - - color = SLSMG_EXTRACT_COLOR(sh); - -#if REQUIRES_NON_BCE_SUPPORT - if (Bce_Color_Offset) - { - if (color & 0x80) - color = ((color & 0x7F) + Bce_Color_Offset) | 0x80; - else - color = ((color & 0x7F) + Bce_Color_Offset) & 0x7F; - } -#endif - - if ((color != This_Color) || (b == bmax)) - { - if (b != buf) - { - SLsmg_write_nchars (buf, (int) (b - buf)); - b = buf; - } - This_Color = color; - } - *b++ = (char) SLSMG_EXTRACT_CHAR(sh); - } - - if (b != buf) - SLsmg_write_nchars (buf, (unsigned int) (b - buf)); - - This_Color = save_color; -} - -unsigned int SLsmg_read_raw (SLsmg_Char_Type *buf, unsigned int len) -{ - unsigned int r, c; - - if (Smg_Inited == 0) return 0; - - if (0 == point_visible (1)) return 0; - - r = (unsigned int) (This_Row - Start_Row); - c = (unsigned int) (This_Col - Start_Col); - - if (c + len > (unsigned int) Screen_Cols) - len = (unsigned int) Screen_Cols - c; - - memcpy ((char *) buf, (char *) (SL_Screen[r].neew + c), len * sizeof (SLsmg_Char_Type)); - return len; -} - -unsigned int SLsmg_write_raw (SLsmg_Char_Type *buf, unsigned int len) -{ - unsigned int r, c; - SLsmg_Char_Type *dest; - - if (Smg_Inited == 0) return 0; - - if (0 == point_visible (1)) return 0; - - r = (unsigned int) (This_Row - Start_Row); - c = (unsigned int) (This_Col - Start_Col); - - if (c + len > (unsigned int) Screen_Cols) - len = (unsigned int) Screen_Cols - c; - - dest = SL_Screen[r].neew + c; - - if (0 != memcmp ((char *) dest, (char *) buf, len * sizeof (SLsmg_Char_Type))) - { - memcpy ((char *) dest, (char *) buf, len * sizeof (SLsmg_Char_Type)); - SL_Screen[r].flags |= TOUCHED; - } - return len; -} - -void -SLsmg_set_color_in_region (int color, int r, int c, unsigned int dr, unsigned int dc) -{ - int cmax, rmax; - SLsmg_Char_Type char_mask; - - if (Smg_Inited == 0) return; - - c -= Start_Col; - r -= Start_Row; - - cmax = c + (int) dc; - rmax = r + (int) dr; - - if (cmax > Screen_Cols) cmax = Screen_Cols; - if (rmax > Screen_Rows) rmax = Screen_Rows; - - if (c < 0) c = 0; - if (r < 0) r = 0; - -#if REQUIRES_NON_BCE_SUPPORT - if (Bce_Color_Offset) - { - if (color & 0x80) - color = ((color & 0x7F) + Bce_Color_Offset) | 0x80; - else - color = ((color & 0x7F) + Bce_Color_Offset) & 0x7F; - } -#endif - color = color << 8; - - char_mask = 0xFF; - -#ifndef IBMPC_SYSTEM - if ((tt_Use_Blink_For_ACS == NULL) - || (0 == *tt_Use_Blink_For_ACS)) - char_mask = 0x80FF; -#endif - - while (r < rmax) - { - SLsmg_Char_Type *s, *smax; - - SL_Screen[r].flags |= TOUCHED; - s = SL_Screen[r].neew; - smax = s + cmax; - s += c; - - while (s < smax) - { - *s = (*s & char_mask) | color; - s++; - } - r++; - } -} - -void SLsmg_set_terminal_info (SLsmg_Term_Type *tt) -{ - if (tt == NULL) /* use default */ - return; - - if ((tt->tt_normal_video == NULL) - || (tt->tt_goto_rc == NULL) - || (tt->tt_cls == NULL) - || (tt->tt_del_eol == NULL) - || (tt->tt_smart_puts == NULL) - || (tt->tt_flush_output == NULL) - || (tt->tt_reset_video == NULL) - || (tt->tt_init_video == NULL) -#ifndef IBMPC_SYSTEM - || (tt->tt_set_scroll_region == NULL) - || (tt->tt_reverse_index == NULL) - || (tt->tt_reset_scroll_region == NULL) - || (tt->tt_delete_nlines == NULL) - /* Variables */ - || (tt->tt_term_cannot_scroll == NULL) - || (tt->tt_has_alt_charset == NULL) -#if 0 /* These can be NULL */ - || (tt->tt_use_blink_for_acs == NULL) - || (tt->tt_graphic_char_pairs == NULL) -#endif - || (tt->tt_screen_cols == NULL) - || (tt->tt_screen_rows == NULL) -#endif - ) - SLang_exit_error ("Terminal not powerful enough for SLsmg"); - - tt_normal_video = tt->tt_normal_video; - tt_goto_rc = tt->tt_goto_rc; - tt_cls = tt->tt_cls; - tt_del_eol = tt->tt_del_eol; - tt_smart_puts = tt->tt_smart_puts; - tt_flush_output = tt->tt_flush_output; - tt_reset_video = tt->tt_reset_video; - tt_init_video = tt->tt_init_video; - -#ifndef IBMPC_SYSTEM - tt_set_scroll_region = tt->tt_set_scroll_region; - tt_reverse_index = tt->tt_reverse_index; - tt_reset_scroll_region = tt->tt_reset_scroll_region; - tt_delete_nlines = tt->tt_delete_nlines; - - tt_Term_Cannot_Scroll = tt->tt_term_cannot_scroll; - tt_Has_Alt_Charset = tt->tt_has_alt_charset; - tt_Use_Blink_For_ACS = tt->tt_use_blink_for_acs; - tt_Graphics_Char_Pairs = tt->tt_graphic_char_pairs; -#endif - - tt_Screen_Cols = tt->tt_screen_cols; - tt_Screen_Rows = tt->tt_screen_rows; -} - diff --git a/mdk-stage1/slang/slstd.c b/mdk-stage1/slang/slstd.c deleted file mode 100644 index b05dfcddb..000000000 --- a/mdk-stage1/slang/slstd.c +++ /dev/null @@ -1,724 +0,0 @@ -/* -*- mode: C; mode: fold; -*- */ -/* Standard intrinsic functions for S-Lang. Included here are string - and array operations */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" -/*{{{ Include Files */ - -#include - -#ifndef __QNX__ -# if defined(__GO32__) || defined(__WATCOMC__) -# include -# include -# endif -#endif - -#if SLANG_HAS_FLOAT -# include -#endif - -#include "slang.h" -#include "_slang.h" - -/*}}}*/ - -/* builtin stack manipulation functions */ -int SLdo_pop(void) /*{{{*/ -{ - return SLdo_pop_n (1); -} - -/*}}}*/ - -int SLdo_pop_n (unsigned int n) -{ - SLang_Object_Type x; - - while (n--) - { - if (SLang_pop(&x)) return -1; - SLang_free_object (&x); - } - - return 0; -} - -static void do_dup(void) /*{{{*/ -{ - (void) SLdup_n (1); -} - -/*}}}*/ - -static int length_cmd (void) -{ - SLang_Class_Type *cl; - SLang_Object_Type obj; - VOID_STAR p; - unsigned int length; - int len; - - if (-1 == SLang_pop (&obj)) - return -1; - - cl = _SLclass_get_class (obj.data_type); - p = _SLclass_get_ptr_to_value (cl, &obj); - - len = 1; - if (cl->cl_length != NULL) - { - if (0 == (*cl->cl_length)(obj.data_type, p, &length)) - len = (int) length; - else - len = -1; - } - - SLang_free_object (&obj); - return len; -} - -/* convert integer to a string of length 1 */ -static void char_cmd (int *x) /*{{{*/ -{ - char ch, buf[2]; - - ch = (char) *x; - buf[0] = ch; - buf[1] = 0; - SLang_push_string (buf); -} - -/*}}}*/ - -/* format object into a string and returns slstring */ -char *_SLstringize_object (SLang_Object_Type *obj) /*{{{*/ -{ - SLang_Class_Type *cl; - unsigned char stype; - VOID_STAR p; - char *s, *s1; - - stype = obj->data_type; - p = (VOID_STAR) &obj->v.ptr_val; - - cl = _SLclass_get_class (stype); - - s = (*cl->cl_string) (stype, p); - if (s != NULL) - { - s1 = SLang_create_slstring (s); - SLfree (s); - s = s1; - } - return s; -} -/*}}}*/ - -int SLang_run_hooks(char *hook, unsigned int num_args, ...) -{ - unsigned int i; - va_list ap; - - if (SLang_Error) return -1; - - if (0 == SLang_is_defined (hook)) - return 0; - - (void) SLang_start_arg_list (); - va_start (ap, num_args); - for (i = 0; i < num_args; i++) - { - char *arg; - - arg = va_arg (ap, char *); - if (-1 == SLang_push_string (arg)) - break; - } - va_end (ap); - (void) SLang_end_arg_list (); - - if (SLang_Error) return -1; - return SLang_execute_function (hook); -} - -static void intrin_getenv_cmd (char *s) -{ - SLang_push_string (getenv (s)); -} - -#ifdef HAVE_PUTENV -static void intrin_putenv (void) /*{{{*/ -{ - char *s; - - /* Some putenv implementations required malloced strings. */ - if (SLpop_string(&s)) return; - - if (putenv (s)) - { - SLang_Error = SL_INTRINSIC_ERROR; - SLfree (s); - } - - /* Note that s is NOT freed */ -} - -/*}}}*/ - -#endif - -static void lang_print_stack (void) /*{{{*/ -{ - char buf[32]; - unsigned int n; - - n = (unsigned int) (_SLStack_Pointer - _SLRun_Stack); - while (n) - { - n--; - sprintf (buf, "(%u)", n); - _SLdump_objects (buf, _SLRun_Stack + n, 1, 1); - } -} - -/*}}}*/ - -static void byte_compile_file (char *f, int *m) -{ - SLang_byte_compile_file (f, *m); -} - -static void intrin_type_info1 (void) -{ - SLang_Object_Type obj; - unsigned int type; - - if (-1 == SLang_pop (&obj)) - return; - - type = obj.data_type; - if (type == SLANG_ARRAY_TYPE) - type = obj.v.array_val->data_type; - - SLang_free_object (&obj); - - _SLang_push_datatype (type); -} - -static void intrin_type_info (void) -{ - SLang_Object_Type obj; - - if (-1 == SLang_pop (&obj)) - return; - - _SLang_push_datatype (obj.data_type); - SLang_free_object (&obj); -} - -void _SLstring_intrinsic (void) /*{{{*/ -{ - SLang_Object_Type x; - char *s; - - if (SLang_pop (&x)) return; - if (NULL != (s = _SLstringize_object (&x))) - _SLang_push_slstring (s); - - SLang_free_object (&x); -} - -/*}}}*/ - -static void intrin_typecast (void) -{ - unsigned char to_type; - if (0 == _SLang_pop_datatype (&to_type)) - (void) SLclass_typecast (to_type, 0, 1); -} - -#if SLANG_HAS_FLOAT -static void intrin_double (void) -{ - (void) SLclass_typecast (SLANG_DOUBLE_TYPE, 0, 1); -} - -#endif - -static void intrin_int (void) /*{{{*/ -{ - (void) SLclass_typecast (SLANG_INT_TYPE, 0, 1); -} - -/*}}}*/ - -static char * -intrin_function_name (void) -{ - if (NULL == _SLang_Current_Function_Name) - return ""; - return _SLang_Current_Function_Name; -} - -static void intrin_message (char *s) -{ - SLang_vmessage ("%s", s); -} - -static void intrin_error (char *s) -{ - SLang_verror (SL_USER_ERROR, "%s", s); -} - -static void intrin_pop_n (int *n) -{ - SLdo_pop_n ((unsigned int) *n); -} - -static void intrin_reverse_stack (int *n) -{ - SLreverse_stack (*n); -} - -static void intrin_roll_stack (int *n) -{ - SLroll_stack (*n); -} - -static void usage (void) -{ - char *msg; - - _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1); /* do not include format */ - - if (-1 == SLang_pop_slstring (&msg)) - return; - - SLang_verror (SL_USAGE_ERROR, "Usage: %s", msg); - SLang_free_slstring (msg); -} - -/* Convert string to integer */ -static int intrin_integer (char *s) -{ - int i; - - i = SLatoi ((unsigned char *) s); - - if (SLang_Error) - SLang_verror (SL_TYPE_MISMATCH, "Unable to convert string to integer"); - return i; -} -/*}}}*/ - -static void guess_type (char *s) -{ - _SLang_push_datatype (SLang_guess_type(s)); -} - -static int load_file (char *s) -{ - if (-1 == SLang_load_file (s)) - return 0; - return 1; -} - -static void get_doc_string (char *file, char *topic) -{ - FILE *fp; - char line[1024]; - unsigned int topic_len, str_len; - char *str; - char ch; - - if (NULL == (fp = fopen (file, "r"))) - { - SLang_push_null (); - return; - } - - topic_len = strlen (topic); - ch = *topic; - - while (1) - { - if (NULL == fgets (line, sizeof(line), fp)) - { - fclose (fp); - (void) SLang_push_null (); - return; - } - - if ((ch == *line) - && (0 == strncmp (line, topic, topic_len)) - && ((line[topic_len] == '\n') || (line [topic_len] == 0) - || (line[topic_len] == ' ') || (line[topic_len] == '\t'))) - break; - } - - if (NULL == (str = SLmake_string (line))) - { - fclose (fp); - (void) SLang_push_null (); - return; - } - str_len = strlen (str); - - while (NULL != fgets (line, sizeof (line), fp)) - { - unsigned int len; - char *new_str; - - ch = *line; - if (ch == '#') continue; - if (ch == '-') break; - - len = strlen (line); - if (NULL == (new_str = SLrealloc (str, str_len + len + 1))) - { - SLfree (str); - str = NULL; - break; - } - str = new_str; - strcpy (str + str_len, line); - str_len += len; - } - - fclose (fp); - - (void) SLang_push_malloced_string (str); -} - -static int push_string_array_elements (SLang_Array_Type *at) -{ - char **strs; - unsigned int num; - unsigned int i; - - if (at == NULL) - return -1; - - strs = (char **)at->data; - num = at->num_elements; - for (i = 0; i < num; i++) - { - if (-1 == SLang_push_string (strs[i])) - { - SLdo_pop_n (i); - return -1; - } - } - SLang_push_integer ((int) num); - return 0; -} - - -static void intrin_apropos (void) -{ - int num_args; - char *pat; - char *namespace_name; - unsigned int flags; - SLang_Array_Type *at; - - num_args = SLang_Num_Function_Args; - - if (-1 == SLang_pop_uinteger (&flags)) - return; - if (-1 == SLang_pop_slstring (&pat)) - return; - - namespace_name = NULL; - at = NULL; - if (num_args == 3) - { - if (-1 == SLang_pop_slstring (&namespace_name)) - goto free_and_return; - } - - at = _SLang_apropos (namespace_name, pat, flags); - if (num_args == 3) - { - (void) SLang_push_array (at, 0); - goto free_and_return; - } - - /* Maintain compatibility with old version of the function. That version - * did not take three arguments and returned everything to the stack. - * Yuk. - */ - (void) push_string_array_elements (at); - - free_and_return: - /* NULLs ok */ - SLang_free_slstring (namespace_name); - SLang_free_slstring (pat); - SLang_free_array (at); -} - -static int intrin_get_defines (void) -{ - int n = 0; - char **s = _SLdefines; - - while (*s != NULL) - { - if (-1 == SLang_push_string (*s)) - { - SLdo_pop_n ((unsigned int) n); - return -1; - } - s++; - n++; - } - return n; -} - -static void intrin_get_reference (char *name) -{ - _SLang_push_ref (1, (VOID_STAR) _SLlocate_name (name)); -} - -#ifdef HAVE_SYS_UTSNAME_H -# include -#endif - -static void uname_cmd (void) -{ -#ifdef HAVE_UNAME - struct utsname u; - char *field_names [6]; - unsigned char field_types[6]; - VOID_STAR field_values [6]; - char *ptrs[6]; - int i; - - if (-1 == uname (&u)) - (void) SLang_push_null (); - - field_names[0] = "sysname"; ptrs[0] = u.sysname; - field_names[1] = "nodename"; ptrs[1] = u.nodename; - field_names[2] = "release"; ptrs[2] = u.release; - field_names[3] = "version"; ptrs[3] = u.version; - field_names[4] = "machine"; ptrs[4] = u.machine; - - for (i = 0; i < 5; i++) - { - field_types[i] = SLANG_STRING_TYPE; - field_values[i] = (VOID_STAR) &ptrs[i]; - } - - if (0 == SLstruct_create_struct (5, field_names, field_types, field_values)) - return; -#endif - - SLang_push_null (); -} - -static void uninitialize_ref_intrin (SLang_Ref_Type *ref) -{ - (void) _SLang_uninitialize_ref (ref); -} - -static SLang_Intrin_Fun_Type SLang_Basic_Table [] = /*{{{*/ -{ - MAKE_INTRINSIC_1("__is_initialized", _SLang_is_ref_initialized, SLANG_INT_TYPE, SLANG_REF_TYPE), - MAKE_INTRINSIC_S("__get_reference", intrin_get_reference, SLANG_VOID_TYPE), - MAKE_INTRINSIC_1("__uninitialize", uninitialize_ref_intrin, SLANG_VOID_TYPE, SLANG_REF_TYPE), - MAKE_INTRINSIC_SS("get_doc_string_from_file", get_doc_string, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SS("autoload", SLang_autoload, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("is_defined", SLang_is_defined, SLANG_INT_TYPE), - MAKE_INTRINSIC_0("string", _SLstring_intrinsic, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("uname", uname_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("getenv", intrin_getenv_cmd, SLANG_VOID_TYPE), -#ifdef HAVE_PUTENV - MAKE_INTRINSIC_0("putenv", intrin_putenv, SLANG_VOID_TYPE), -#endif - MAKE_INTRINSIC_S("evalfile", load_file, SLANG_INT_TYPE), - MAKE_INTRINSIC_I("char", char_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("eval", SLang_load_string, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("dup", do_dup, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("integer", intrin_integer, SLANG_INT_TYPE), - MAKE_INTRINSIC_S("system", SLsystem, SLANG_INT_TYPE), - MAKE_INTRINSIC_0("_apropos", intrin_apropos, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("_trace_function", _SLang_trace_fun, SLANG_VOID_TYPE), -#if SLANG_HAS_FLOAT - MAKE_INTRINSIC_S("atof", _SLang_atof, SLANG_DOUBLE_TYPE), - MAKE_INTRINSIC_0("double", intrin_double, SLANG_VOID_TYPE), -#endif - MAKE_INTRINSIC_0("int", intrin_int, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("typecast", intrin_typecast, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("_stkdepth", _SLstack_depth, SLANG_INT_TYPE), - MAKE_INTRINSIC_I("_stk_reverse", intrin_reverse_stack, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("typeof", intrin_type_info, VOID_TYPE), - MAKE_INTRINSIC_0("_typeof", intrin_type_info1, VOID_TYPE), - MAKE_INTRINSIC_I("_pop_n", intrin_pop_n, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("_print_stack", lang_print_stack, SLANG_VOID_TYPE), - MAKE_INTRINSIC_I("_stk_roll", intrin_roll_stack, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SI("byte_compile_file", byte_compile_file, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("_clear_error", _SLang_clear_error, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("_function_name", intrin_function_name, SLANG_STRING_TYPE), -#if SLANG_HAS_FLOAT - MAKE_INTRINSIC_S("set_float_format", _SLset_double_format, SLANG_VOID_TYPE), -#endif - MAKE_INTRINSIC_S("_slang_guess_type", guess_type, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("error", intrin_error, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("message", intrin_message, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("__get_defined_symbols", intrin_get_defines, SLANG_INT_TYPE), - MAKE_INTRINSIC_I("__pop_args", _SLstruct_pop_args, SLANG_VOID_TYPE), - MAKE_INTRINSIC_1("__push_args", _SLstruct_push_args, SLANG_VOID_TYPE, SLANG_ARRAY_TYPE), - MAKE_INTRINSIC_0("usage", usage, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("implements", _SLang_implements_intrinsic, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("use_namespace", _SLang_use_namespace_intrinsic, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("current_namespace", _SLang_cur_namespace_intrinsic, SLANG_STRING_TYPE), - MAKE_INTRINSIC_0("length", length_cmd, SLANG_INT_TYPE), - SLANG_END_INTRIN_FUN_TABLE -}; - -/*}}}*/ - -#ifdef SLANG_DOC_DIR -char *SLang_Doc_Dir = SLANG_DOC_DIR; -#else -char *SLang_Doc_Dir = ""; -#endif - -static SLang_Intrin_Var_Type Intrin_Vars[] = -{ - MAKE_VARIABLE("_debug_info", &_SLang_Compile_Line_Num_Info, SLANG_INT_TYPE, 0), - MAKE_VARIABLE("_auto_declare", &_SLang_Auto_Declare_Globals, SLANG_INT_TYPE, 0), - MAKE_VARIABLE("_traceback", &SLang_Traceback, SLANG_INT_TYPE, 0), - MAKE_VARIABLE("_slangtrace", &_SLang_Trace, SLANG_INT_TYPE, 0), - MAKE_VARIABLE("_slang_version", &SLang_Version, SLANG_INT_TYPE, 1), - MAKE_VARIABLE("_slang_version_string", &SLang_Version_String, SLANG_STRING_TYPE, 1), - MAKE_VARIABLE("_NARGS", &SLang_Num_Function_Args, SLANG_INT_TYPE, 1), - MAKE_VARIABLE("_slang_doc_dir", &SLang_Doc_Dir, SLANG_STRING_TYPE, 1), - MAKE_VARIABLE("NULL", NULL, SLANG_NULL_TYPE, 1), - SLANG_END_INTRIN_VAR_TABLE -}; - -int SLang_init_slang (void) /*{{{*/ -{ - char name[3]; - unsigned int i; - char **s; - static char *sys_defines [] = - { -#if defined(__os2__) - "OS2", -#endif -#if defined(__MSDOS__) - "MSDOS", -#endif -#if defined(__WIN16__) - "WIN16", -#endif -#if defined (__WIN32__) - "WIN32", -#endif -#if defined(__NT__) - "NT", -#endif -#if defined (VMS) - "VMS", -#endif -#ifdef REAL_UNIX_SYSTEM - "UNIX", -#endif -#if SLANG_HAS_FLOAT - "SLANG_DOUBLE_TYPE", -#endif - NULL - }; - - if (-1 == _SLregister_types ()) return -1; - - if ((-1 == SLadd_intrin_fun_table(SLang_Basic_Table, NULL)) - || (-1 == SLadd_intrin_var_table (Intrin_Vars, NULL)) - || (-1 == _SLang_init_slstrops ()) - || (-1 == _SLang_init_sltime ()) - || (-1 == _SLstruct_init ()) -#if SLANG_HAS_COMPLEX - || (-1 == _SLinit_slcomplex ()) -#endif -#if SLANG_HAS_ASSOC_ARRAYS - || (-1 == SLang_init_slassoc ()) -#endif - ) - return -1; - - SLadd_global_variable (SLANG_SYSTEM_NAME); - - s = sys_defines; - while (*s != NULL) - { - if (-1 == SLdefine_for_ifdef (*s)) return -1; - s++; - } - - /* give temp global variables $0 --> $9 */ - name[2] = 0; name[0] = '$'; - for (i = 0; i < 10; i++) - { - name[1] = (char) (i + '0'); - SLadd_global_variable (name); - } - - SLang_init_case_tables (); - - /* Now add a couple of macros */ - SLang_load_string (".(_NARGS 1 - Sprintf error)verror"); - SLang_load_string (".(_NARGS 1 - Sprintf message)vmessage"); - - if (SLang_Error) - return -1; - - return 0; -} - -/*}}}*/ - -int SLang_set_argc_argv (int argc, char **argv) -{ - static int this_argc; - static char **this_argv; - int i; - - if (argc < 0) argc = 0; - this_argc = argc; - - if (NULL == (this_argv = (char **) SLmalloc ((argc + 1) * sizeof (char *)))) - return -1; - memset ((char *) this_argv, 0, sizeof (char *) * (argc + 1)); - - for (i = 0; i < argc; i++) - { - if (NULL == (this_argv[i] = SLang_create_slstring (argv[i]))) - goto return_error; - } - - if (-1 == SLadd_intrinsic_variable ("__argc", (VOID_STAR)&this_argc, - SLANG_INT_TYPE, 1)) - goto return_error; - - if (-1 == SLang_add_intrinsic_array ("__argv", SLANG_STRING_TYPE, 1, - (VOID_STAR) this_argv, 1, argc)) - goto return_error; - - return 0; - - return_error: - for (i = 0; i < argc; i++) - SLang_free_slstring (this_argv[i]); /* NULL ok */ - SLfree ((char *) this_argv); - - return -1; -} diff --git a/mdk-stage1/slang/slstdio.c b/mdk-stage1/slang/slstdio.c deleted file mode 100644 index 05db1af77..000000000 --- a/mdk-stage1/slang/slstdio.c +++ /dev/null @@ -1,1050 +0,0 @@ -/* file stdio intrinsics for S-Lang */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#if defined(__unix__) || (defined (__os2__) && defined (__EMX__)) -# include -#endif - -#ifdef HAVE_FCNTL_H -# include -#endif -#ifdef HAVE_SYS_FCNTL_H -# include -#endif - -#ifdef __unix__ -# include -#endif - -#if defined(__BORLANDC__) -# include -# include -#endif - -#if defined(__DECC) && defined(VMS) -# include -# include -#endif - -#ifdef VMS -# include -#else -# include -#endif - -#include - -#define SL_APP_WANTS_FOREACH -#include "slang.h" -#include "_slang.h" - -typedef struct -{ - FILE *fp; /* kind of obvious */ - char *file; /* file name associated with pointer */ - - unsigned int flags; /* modes, etc... */ -#define SL_READ 0x0001 -#define SL_WRITE 0x0002 -#define SL_BINARY 0x0004 -#define SL_FDOPEN 0x2000 -#define SL_PIPE 0x4000 -#define SL_INUSE 0x8000 -} -SL_File_Table_Type; - -static SL_File_Table_Type *SL_File_Table; - -static SL_File_Table_Type *get_free_file_table_entry (void) -{ - SL_File_Table_Type *t = SL_File_Table, *tmax; - - tmax = t + SL_MAX_FILES; - while (t < tmax) - { - if (t->flags == 0) - { - memset ((char *) t, 0, sizeof (SL_File_Table_Type)); - return t; - } - t++; - } - - return NULL; -} - -static unsigned int file_process_flags (char *mode) -{ - char ch; - unsigned int flags = 0; - - while (1) - { - ch = *mode++; - switch (ch) - { - case 'r': flags |= SL_READ; - break; - case 'w': - case 'a': - case 'A': - flags |= SL_WRITE; - break; - case '+': flags |= SL_WRITE | SL_READ; - break; - case 'b': flags |= SL_BINARY; - break; - case 0: - return flags; - - default: - SLang_verror (SL_INVALID_PARM, "File flag %c is not supported", ch); - return 0; - } - } -} - -static int open_file_type (char *file, int fd, char *mode, - FILE *(*open_fun)(char *, char *), - int (*close_fun)(FILE *), - unsigned int xflags) -{ - FILE *fp; - SL_File_Table_Type *t; - unsigned int flags; - SLang_MMT_Type *mmt; - - fp = NULL; - t = NULL; - mmt = NULL; - - if ((NULL == (t = get_free_file_table_entry ())) - || (0 == (flags = file_process_flags(mode)))) - goto return_error; - - if (fd != -1) - fp = fdopen (fd, mode); - else - fp = open_fun (file, mode); - - if (fp == NULL) - { - _SLerrno_errno = errno; - goto return_error; - } - - if (NULL == (mmt = SLang_create_mmt (SLANG_FILE_PTR_TYPE, (VOID_STAR) t))) - goto return_error; - - t->fp = fp; - t->flags = flags | xflags; - fp = NULL; /* allow free_mmt to close fp */ - - if ((NULL != (t->file = SLang_create_slstring (file))) - && (0 == SLang_push_mmt (mmt))) - return 0; - - /* drop */ - - return_error: - if (fp != NULL) (*close_fun) (fp); - if (mmt != NULL) SLang_free_mmt (mmt); - (void) SLang_push_null (); - return -1; -} - -/* Since some compilers do not have popen/pclose prototyped and in scope, - * and pc compilers sometimes have silly prototypes involving PASCAL, etc. - * use wrappers around the function to avoid compilation errors. - */ - -static FILE *fopen_fun (char *f, char *m) -{ - return fopen (f, m); -} -static int fclose_fun (FILE *fp) -{ - return fclose (fp); -} - -static void stdio_fopen (char *file, char *mode) -{ - (void) open_file_type (file, -1, mode, fopen_fun, fclose_fun, 0); -} - -int _SLstdio_fdopen (char *file, int fd, char *mode) -{ - if (fd == -1) - { - _SLerrno_errno = EBADF; - (void) SLang_push_null (); - return -1; - } - - return open_file_type (file, fd, mode, NULL, fclose_fun, SL_FDOPEN); -} - -#ifdef HAVE_POPEN -static int pclose_fun (FILE *fp) -{ - return pclose (fp); -} - -static FILE *popen_fun (char *file, char *mode) -{ - return popen (file, mode); -} - -static void stdio_popen (char *file, char *mode) -{ - (void) open_file_type (file, -1, mode, popen_fun, pclose_fun, SL_PIPE); -} -#endif - -/* returns pointer to file entry if it is open and consistent with - flags. Returns NULL otherwise */ -static SLang_MMT_Type *pop_fp (unsigned int flags, FILE **fp_ptr) -{ - SL_File_Table_Type *t; - SLang_MMT_Type *mmt; - - *fp_ptr = NULL; - - if (NULL == (mmt = SLang_pop_mmt (SLANG_FILE_PTR_TYPE))) - return NULL; - - t = (SL_File_Table_Type *) SLang_object_from_mmt (mmt); - if ((t->flags & flags) - && (NULL != (*fp_ptr = t->fp))) - return mmt; - - SLang_free_mmt (mmt); - return NULL; -} - -static FILE *check_fp (SL_File_Table_Type *t, unsigned flags) -{ - if ((t != NULL) && (t->flags & flags)) - return t->fp; - - return NULL; -} - -char *SLang_get_name_from_fileptr (SLang_MMT_Type *mmt) -{ - SL_File_Table_Type *ft; - - ft = (SL_File_Table_Type *) SLang_object_from_mmt (mmt); - if (ft == NULL) - return NULL; - return ft->file; -} - -int SLang_pop_fileptr (SLang_MMT_Type **mmt, FILE **fp) -{ - if (NULL == (*mmt = pop_fp (0xFFFF, fp))) - { -#ifdef EBADF - _SLerrno_errno = EBADF; -#endif - return -1; - } - - return 0; -} - -static int close_file_type (SL_File_Table_Type *t) -{ - int ret = 0; - FILE *fp; - - if (t == NULL) - return -1; - - fp = t->fp; - - if (NULL == fp) ret = -1; - else - { - if (0 == (t->flags & SL_PIPE)) - { - if (EOF == (ret = fclose (fp))) - _SLerrno_errno = errno; - } -#ifdef HAVE_POPEN - else - { - if (-1 == (ret = pclose (fp))) - _SLerrno_errno = errno; - } -#endif - } - - if (t->file != NULL) SLang_free_slstring (t->file); - memset ((char *) t, 0, sizeof (SL_File_Table_Type)); - return ret; -} - -static int stdio_fclose (SL_File_Table_Type *t) -{ - int ret; - - if (NULL == check_fp (t, 0xFFFF)) - return -1; - - ret = close_file_type (t); - - t->flags = SL_INUSE; - return ret; -} - -static int read_one_line (FILE *fp, char **strp, unsigned int *lenp) -{ - char buf[512]; - char *str; - unsigned int len; - - *strp = NULL; - len = 0; - str = NULL; - - while (NULL != fgets (buf, sizeof (buf), fp)) - { - unsigned int dlen; - char *new_str; - int done_flag; - - dlen = strlen (buf); - /* Note: If the file contains embedded \0 characters, then this - * fails to work properly since dlen will not be correct. - */ - done_flag = ((dlen + 1 < sizeof (buf)) - || (buf[dlen - 1] == '\n')); - - if (done_flag && (str == NULL)) - { - /* Avoid the malloc */ - str = buf; - len = dlen; - break; - } - - if (NULL == (new_str = SLrealloc (str, len + dlen + 1))) - { - SLfree (str); - return -1; - } - - str = new_str; - strcpy (str + len, buf); - len += dlen; - - if (done_flag) break; - } - - if (str == NULL) - return 0; - - *strp = SLang_create_nslstring (str, len); - if (str != buf) SLfree (str); - - if (*strp == NULL) return -1; - - *lenp = len; - return 1; -} - -/* returns number of characters read and pushes the string to the stack. - If it fails, it returns -1 */ -static int stdio_fgets (SLang_Ref_Type *ref, SL_File_Table_Type *t) -{ - char *s; - unsigned int len; - FILE *fp; - int status; - - if (NULL == (fp = check_fp (t, SL_READ))) - return -1; - - status = read_one_line (fp, &s, &len); - if (status <= 0) - return -1; - - status = SLang_assign_to_ref (ref, SLANG_STRING_TYPE, (VOID_STAR)&s); - SLang_free_slstring (s); - - if (status == -1) - return -1; - - return (int) len; -} - -static void stdio_fgetslines_internal (FILE *fp, unsigned int n) -{ - unsigned int num_lines, max_num_lines; - char **list; - SLang_Array_Type *at; - int inum_lines; - - if (n > 1024) - max_num_lines = 1024; - else - { - max_num_lines = n; - if (max_num_lines == 0) - max_num_lines++; - } - - list = (char **) SLmalloc (sizeof (char *) * max_num_lines); - if (list == NULL) - return; - - num_lines = 0; - while (num_lines < n) - { - int status; - char *line; - unsigned int len; - - status = read_one_line (fp, &line, &len); - if (status == -1) - goto return_error; - - if (status == 0) - break; - - if (max_num_lines == num_lines) - { - char **new_list; - - if (max_num_lines + 4096 > n) - max_num_lines = n; - else - max_num_lines += 4096; - - new_list = (char **) SLrealloc ((char *)list, sizeof (char *) * max_num_lines); - if (new_list == NULL) - { - SLang_free_slstring (line); - goto return_error; - } - list = new_list; - } - - list[num_lines] = line; - num_lines++; - } - - if (num_lines != max_num_lines) - { - char **new_list; - - new_list = (char **)SLrealloc ((char *)list, sizeof (char *) * (num_lines + 1)); - if (new_list == NULL) - goto return_error; - - list = new_list; - } - - inum_lines = (int) num_lines; - if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) list, &inum_lines, 1))) - goto return_error; - - if (-1 == SLang_push_array (at, 1)) - SLang_push_null (); - return; - - return_error: - while (num_lines > 0) - { - num_lines--; - SLfree (list[num_lines]); - } - SLfree ((char *)list); - SLang_push_null (); -} - -static void stdio_fgetslines (void) -{ - unsigned int n; - FILE *fp; - SLang_MMT_Type *mmt; - - n = (unsigned int)-1; - - if (SLang_Num_Function_Args == 2) - { - if (-1 == SLang_pop_uinteger (&n)) - return; - } - - if (NULL == (mmt = pop_fp (SL_READ, &fp))) - { - SLang_push_null (); - return; - } - - stdio_fgetslines_internal (fp, n); - SLang_free_mmt (mmt); -} - - -static int stdio_fputs (char *s, SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, SL_WRITE))) - return -1; - - if (EOF == fputs(s, fp)) return -1; - return (int) strlen (s); -} - -static int stdio_fflush (SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, SL_WRITE))) - return -1; - - if (EOF == fflush (fp)) - { - _SLerrno_errno = errno; - return -1; - } - - return 0; -} - -/* Usage: n = fread (&str, data-type, nelems, fp); */ -static void stdio_fread (SLang_Ref_Type *ref, int *data_typep, unsigned int *num_elemns, SL_File_Table_Type *t) -{ - char *s; - FILE *fp; - int ret; - unsigned int num_read, num_to_read; - unsigned int nbytes; - SLang_Class_Type *cl; - unsigned int sizeof_type; - int data_type; - - ret = -1; - s = NULL; - cl = NULL; - - if (NULL == (fp = check_fp (t, SL_READ))) - goto the_return; - - /* FIXME: priority = low : I should add some mechanism to support - * other types. - */ - data_type = *data_typep; - - cl = _SLclass_get_class ((unsigned char) data_type); - - if (cl->cl_fread == NULL) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "fread does not support %s objects", - cl->cl_name); - goto the_return; - } - - sizeof_type = cl->cl_sizeof_type; - - num_to_read = *num_elemns; - nbytes = (unsigned int) num_to_read * sizeof_type; - - s = SLmalloc (nbytes + 1); - if (s == NULL) - goto the_return; - - ret = cl->cl_fread (data_type, fp, (VOID_STAR)s, num_to_read, &num_read); - - if ((num_read == 0) - && (num_read != num_to_read)) - ret = -1; - - if ((ret == -1) && ferror (fp)) - _SLerrno_errno = errno; - - if ((ret == 0) - && (num_read != num_to_read)) - { - char *new_s; - - nbytes = num_read * sizeof_type; - new_s = SLrealloc (s, nbytes + 1); - if (new_s == NULL) - ret = -1; - else - s = new_s; - } - - if (ret == 0) - { - if (num_read == 1) - { - ret = SLang_assign_to_ref (ref, data_type, (VOID_STAR)s); - SLfree (s); - } - else if ((data_type == SLANG_CHAR_TYPE) - || (data_type == SLANG_UCHAR_TYPE)) - { - SLang_BString_Type *bs; - - bs = SLbstring_create_malloced ((unsigned char *)s, num_read, 1); - ret = SLang_assign_to_ref (ref, SLANG_BSTRING_TYPE, (VOID_STAR)&bs); - SLbstring_free (bs); - } - else - { - SLang_Array_Type *at; - int inum_read = (int) num_read; - at = SLang_create_array (data_type, 0, (VOID_STAR)s, &inum_read, 1); - ret = SLang_assign_to_ref (ref, SLANG_ARRAY_TYPE, (VOID_STAR)&at); - SLang_free_array (at); - } - s = NULL; - } - - the_return: - - if (s != NULL) - SLfree (s); - - if (ret == -1) - SLang_push_integer (ret); - else - SLang_push_uinteger (num_read); -} - -/* Usage: n = fwrite (str, fp); */ -static void stdio_fwrite (SL_File_Table_Type *t) -{ - FILE *fp; - unsigned char *s; - unsigned int num_to_write, num_write; - int ret; - SLang_BString_Type *b; - SLang_Array_Type *at; - SLang_Class_Type *cl; - - ret = -1; - b = NULL; - at = NULL; - - switch (SLang_peek_at_stack ()) - { - case SLANG_BSTRING_TYPE: - case SLANG_STRING_TYPE: - if (-1 == SLang_pop_bstring (&b)) - goto the_return; - - if (NULL == (s = SLbstring_get_pointer (b, &num_to_write))) - goto the_return; - - cl = _SLclass_get_class (SLANG_UCHAR_TYPE); - break; - - default: - if (-1 == SLang_pop_array (&at, 1)) - goto the_return; - - cl = at->cl; - num_to_write = at->num_elements; - s = (unsigned char *) at->data; - } - - if (NULL == (fp = check_fp (t, SL_WRITE))) - goto the_return; - - if (cl->cl_fwrite == NULL) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "fwrite does not support %s objects", cl->cl_name); - goto the_return; - } - - ret = cl->cl_fwrite (cl->cl_data_type, fp, s, num_to_write, &num_write); - - if ((ret == -1) && ferror (fp)) - _SLerrno_errno = errno; - - /* drop */ - the_return: - if (b != NULL) - SLbstring_free (b); - if (at != NULL) - SLang_free_array (at); - - if (ret == -1) - SLang_push_integer (ret); - else - SLang_push_uinteger (num_write); -} - -static int stdio_fseek (SL_File_Table_Type *t, int *ofs, int *whence) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, 0xFFFF))) - return -1; - - if (-1 == fseek (fp, (long) *ofs, *whence)) - { - _SLerrno_errno = errno; - return -1; - } - - return 0; -} - -static int stdio_ftell (SL_File_Table_Type *t) -{ - FILE *fp; - long ofs; - - if (NULL == (fp = check_fp (t, 0xFFFF))) - return -1; - - if (-1L == (ofs = ftell (fp))) - { - _SLerrno_errno = errno; - return -1; - } - - return (int) ofs; -} - -static int stdio_feof (SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, 0xFFFF))) - return -1; - - return feof (fp); -} - -static int stdio_ferror (SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL == (fp = check_fp (t, 0xFFFF))) - return -1; - - return ferror (fp); -} - -static void stdio_clearerr (SL_File_Table_Type *t) -{ - FILE *fp; - - if (NULL != (fp = check_fp (t, 0xFFFF))) - clearerr (fp); -} - -/* () = fprintf (fp, "FORMAT", arg...); */ -static int stdio_fprintf (void) -{ - char *s; - FILE *fp; - SLang_MMT_Type *mmt; - int status; - - if (-1 == _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 2)) - return -1; - - if (-1 == SLang_pop_slstring (&s)) - return -1; - - if (NULL == (mmt = pop_fp (SL_WRITE, &fp))) - { - SLang_free_slstring (s); - return -1; - } - - if (EOF == fputs(s, fp)) - status = -1; - else - status = (int) strlen (s); - - SLang_free_mmt (mmt); - SLang_free_slstring (s); - return status; -} - -static int stdio_printf (void) -{ - char *s; - int status; - - if (-1 == _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1)) - return -1; - - if (-1 == SLang_pop_slstring (&s)) - return -1; - - if (EOF == fputs(s, stdout)) - status = -1; - else - status = (int) strlen (s); - - SLang_free_slstring (s); - return status; -} - - -#define F SLANG_FILE_PTR_TYPE -#define R SLANG_REF_TYPE -#define I SLANG_INT_TYPE -#define V SLANG_VOID_TYPE -#define S SLANG_STRING_TYPE -#define B SLANG_BSTRING_TYPE -#define U SLANG_UINT_TYPE -#define D SLANG_DATATYPE_TYPE -static SLang_Intrin_Fun_Type Stdio_Name_Table[] = -{ - MAKE_INTRINSIC_0("fgetslines", stdio_fgetslines, V), - MAKE_INTRINSIC_SS("fopen", stdio_fopen, V), - MAKE_INTRINSIC_1("feof", stdio_feof, I, F), - MAKE_INTRINSIC_1("ferror", stdio_ferror, I, F), - MAKE_INTRINSIC_1("fclose", stdio_fclose, I, F), - MAKE_INTRINSIC_2("fgets", stdio_fgets, I, R, F), - MAKE_INTRINSIC_1("fflush", stdio_fflush, I, F), - MAKE_INTRINSIC_2("fputs", stdio_fputs, I, S, F), - MAKE_INTRINSIC_0("fprintf", stdio_fprintf, I), - MAKE_INTRINSIC_0("printf", stdio_printf, I), - MAKE_INTRINSIC_3("fseek", stdio_fseek, I, F, I, I), - MAKE_INTRINSIC_1("ftell", stdio_ftell, I, F), - MAKE_INTRINSIC_1("clearerr", stdio_clearerr, V, F), - MAKE_INTRINSIC_4("fread", stdio_fread, V, R, D, U, F), - MAKE_INTRINSIC_1("fwrite", stdio_fwrite, V, F), -#ifdef HAVE_POPEN - MAKE_INTRINSIC_SS("popen", stdio_popen, V), - MAKE_INTRINSIC_1("pclose", stdio_fclose, I, F), -#endif - SLANG_END_INTRIN_FUN_TABLE -}; -#undef F -#undef I -#undef R -#undef V -#undef S -#undef B -#undef U -#undef D - -#ifndef SEEK_SET -# define SEEK_SET 0 -#endif -#ifndef SEEK_CUR -# define SEEK_CUR 1 -#endif -#ifndef SEEK_END -# define SEEK_END 2 -#endif - -static SLang_IConstant_Type Stdio_Consts [] = -{ - MAKE_ICONSTANT("SEEK_SET", SEEK_SET), - MAKE_ICONSTANT("SEEK_END", SEEK_END), - MAKE_ICONSTANT("SEEK_CUR", SEEK_CUR), - SLANG_END_ICONST_TABLE -}; - -static void destroy_file_type (unsigned char type, VOID_STAR ptr) -{ - (void) type; - (void) close_file_type ((SL_File_Table_Type *) ptr); -} - - -struct _SLang_Foreach_Context_Type -{ - SLang_MMT_Type *mmt; - FILE *fp; -#define CTX_USE_LINE 1 -#define CTX_USE_CHAR 2 - unsigned char type; -}; - - -static SLang_Foreach_Context_Type * -cl_foreach_open (unsigned char type, unsigned int num) -{ - SLang_Foreach_Context_Type *c; - SLang_MMT_Type *mmt; - FILE *fp; - - if (NULL == (mmt = pop_fp (SL_READ, &fp))) - return NULL; - - type = CTX_USE_LINE; - - switch (num) - { - char *s; - - case 0: - type = CTX_USE_LINE; - break; - - case 1: - if (-1 == SLang_pop_slstring (&s)) - { - SLang_free_mmt (mmt); - return NULL; - } - if (0 == strcmp (s, "char")) - type = CTX_USE_CHAR; - else if (0 == strcmp (s, "line")) - type = CTX_USE_LINE; - else - { - SLang_verror (SL_NOT_IMPLEMENTED, - "using '%s' not supported by File_Type", - s); - SLang_free_slstring (s); - SLang_free_mmt (mmt); - return NULL; - } - SLang_free_slstring (s); - break; - - default: - SLdo_pop_n (num); - SLang_verror (SL_NOT_IMPLEMENTED, - "Usage: foreach (File_Type) using ([line|char])"); - SLang_free_mmt (mmt); - return NULL; - } - - if (NULL == (c = (SLang_Foreach_Context_Type *) SLmalloc (sizeof (SLang_Foreach_Context_Type)))) - { - SLang_free_mmt (mmt); - return NULL; - } - memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type)); - - c->type = type; - c->mmt = mmt; - c->fp = fp; - - return c; -} - -static void cl_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c) -{ - (void) type; - if (c == NULL) return; - SLang_free_mmt (c->mmt); - SLfree ((char *) c); -} - -static int cl_foreach (unsigned char type, SLang_Foreach_Context_Type *c) -{ - int status; - int ch; - unsigned int len; - char *s; - - (void) type; - - if (c == NULL) - return -1; - - switch (c->type) - { - case CTX_USE_CHAR: - if (EOF == (ch = getc (c->fp))) - return 0; - if (-1 == SLang_push_uchar ((unsigned char) ch)) - return -1; - return 1; - - case CTX_USE_LINE: - status = read_one_line (c->fp, &s, &len); - if (status <= 0) - return status; - if (0 == _SLang_push_slstring (s)) - return 1; - return -1; - } - - return -1; -} - -static int Stdio_Initialized; -static SLang_MMT_Type *Stdio_Mmts[3]; - -int SLang_init_stdio (void) -{ - unsigned int i; - SL_File_Table_Type *s; - SLang_Class_Type *cl; - char *names[3]; - - if (Stdio_Initialized) - return 0; - - SL_File_Table = (SL_File_Table_Type *)SLcalloc(sizeof (SL_File_Table_Type), SL_MAX_FILES); - if (SL_File_Table == NULL) - return -1; - - if (NULL == (cl = SLclass_allocate_class ("File_Type"))) - return -1; - cl->cl_destroy = destroy_file_type; - cl->cl_foreach_open = cl_foreach_open; - cl->cl_foreach_close = cl_foreach_close; - cl->cl_foreach = cl_foreach; - - - if (-1 == SLclass_register_class (cl, SLANG_FILE_PTR_TYPE, sizeof (SL_File_Table_Type), SLANG_CLASS_TYPE_MMT)) - return -1; - - if ((-1 == SLadd_intrin_fun_table(Stdio_Name_Table, "__STDIO__")) - || (-1 == SLadd_iconstant_table (Stdio_Consts, NULL)) - || (-1 == _SLerrno_init ())) - return -1; - - names[0] = "stdin"; - names[1] = "stdout"; - names[2] = "stderr"; - - s = SL_File_Table; - s->fp = stdin; s->flags = SL_READ; - - s++; - s->fp = stdout; s->flags = SL_WRITE; - - s++; - s->fp = stderr; s->flags = SL_WRITE|SL_READ; - - s = SL_File_Table; - for (i = 0; i < 3; i++) - { - if (NULL == (s->file = SLang_create_slstring (names[i]))) - return -1; - - if (NULL == (Stdio_Mmts[i] = SLang_create_mmt (SLANG_FILE_PTR_TYPE, (VOID_STAR) s))) - return -1; - SLang_inc_mmt (Stdio_Mmts[i]); - - if (-1 == SLadd_intrinsic_variable (s->file, (VOID_STAR)&Stdio_Mmts[i], SLANG_FILE_PTR_TYPE, 1)) - return -1; - s++; - } - - Stdio_Initialized = 1; - return 0; -} - diff --git a/mdk-stage1/slang/slstring.c b/mdk-stage1/slang/slstring.c deleted file mode 100644 index 529c41827..000000000 --- a/mdk-stage1/slang/slstring.c +++ /dev/null @@ -1,546 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -typedef struct _SLstring_Type -{ - struct _SLstring_Type *next; - unsigned int ref_count; - char bytes [1]; -} -SLstring_Type; - -static SLstring_Type *String_Hash_Table [SLSTRING_HASH_TABLE_SIZE]; -static char Single_Char_Strings [256 * 2]; - -#if _SLANG_OPTIMIZE_FOR_SPEED -#define MAX_FREE_STORE_LEN 32 -static SLstring_Type *SLS_Free_Store [MAX_FREE_STORE_LEN]; - -# define NUM_CACHED_STRINGS 601 -typedef struct -{ - unsigned long hash; - SLstring_Type *sls; - unsigned int len; -} -Cached_String_Type; -static Cached_String_Type Cached_Strings [NUM_CACHED_STRINGS]; - -#define GET_CACHED_STRING(s) \ - (Cached_Strings + (unsigned int)(((unsigned long) (s)) % NUM_CACHED_STRINGS)) - -_INLINE_ -static void cache_string (SLstring_Type *sls, unsigned int len, unsigned long hash) -{ - Cached_String_Type *cs; - - cs = GET_CACHED_STRING(sls->bytes); - cs->sls = sls; - cs->hash = hash; - cs->len = len; -} - -_INLINE_ -static void uncache_string (char *s) -{ - Cached_String_Type *cs; - - cs = GET_CACHED_STRING(s); - if ((cs->sls != NULL) - && (cs->sls->bytes == s)) - cs->sls = NULL; -} -#endif - - - -_INLINE_ -unsigned long _SLstring_hash (unsigned char *s, unsigned char *smax) -{ - register unsigned long h = 0; - register unsigned long sum = 0; - unsigned char *smax4; - - smax4 = smax - 4; - - while (s < smax4) - { - sum += s[0]; - h = sum + (h << 1); - sum += s[1]; - h = sum + (h << 1); - sum += s[2]; - h = sum + (h << 1); - sum += s[3]; - h = sum + (h << 1); - - s += 4; - } - - while (s < smax) - { - sum += *s++; - h ^= sum + (h << 3); /* slightly different */ - } - - return h; -} - -unsigned long _SLcompute_string_hash (char *s) -{ -#if _SLANG_OPTIMIZE_FOR_SPEED - Cached_String_Type *cs; - SLstring_Type *sls; - - cs = GET_CACHED_STRING(s); - if (((sls = cs->sls) != NULL) - && (sls->bytes == s)) - return cs->hash; -#endif - return _SLstring_hash ((unsigned char *) s, (unsigned char *) s + strlen (s)); -} - -_INLINE_ -/* This routine works with any (long) string */ -static SLstring_Type *find_string (char *s, unsigned int len, unsigned long hash) -{ - SLstring_Type *sls; - char ch; - - sls = String_Hash_Table [(unsigned int)(hash % SLSTRING_HASH_TABLE_SIZE)]; - - if (sls == NULL) - return NULL; - - ch = s[0]; - do - { - char *bytes = sls->bytes; - - /* Note that we need to actually make sure that bytes[len] == 0. - * In this case, it is not enough to just compare pointers. In fact, - * this is called from create_nstring, etc... It is unlikely that the - * pointer is a slstring - */ - if ((/* (s == bytes) || */ ((ch == bytes[0]) - && (0 == strncmp (s, bytes, len)))) - && (bytes [len] == 0)) - break; - - sls = sls->next; - } - while (sls != NULL); - - return sls; -} - -_INLINE_ -static SLstring_Type *find_slstring (char *s, unsigned long hash) -{ - SLstring_Type *sls; - - sls = String_Hash_Table [(unsigned int)(hash % SLSTRING_HASH_TABLE_SIZE)]; - while (sls != NULL) - { - if (s == sls->bytes) - return sls; - - sls = sls->next; - } - return sls; -} - -_INLINE_ -static SLstring_Type *allocate_sls (unsigned int len) -{ - SLstring_Type *sls; - -#if _SLANG_OPTIMIZE_FOR_SPEED - if ((len < MAX_FREE_STORE_LEN) - && (NULL != (sls = SLS_Free_Store [len]))) - { - SLS_Free_Store[len] = NULL; - return sls; - } -#endif - /* FIXME: use structure padding */ - return (SLstring_Type *) SLmalloc (len + sizeof (SLstring_Type)); -} - -_INLINE_ -static void free_sls (SLstring_Type *sls, unsigned int len) -{ -#if _SLANG_OPTIMIZE_FOR_SPEED - if ((len < MAX_FREE_STORE_LEN) - && (SLS_Free_Store[len] == NULL)) - { - SLS_Free_Store [len] = sls; - return; - } -#else - (void) len; -#endif - SLfree ((char *)sls); -} - -_INLINE_ -static char *create_long_string (char *s, unsigned int len, unsigned long hash) -{ - SLstring_Type *sls; - - sls = find_string (s, len, hash); - - if (sls != NULL) - { - sls->ref_count++; - s = sls->bytes; - -#if _SLANG_OPTIMIZE_FOR_SPEED - cache_string (sls, len, hash); -#endif - return s; - } - - sls = allocate_sls (len); - if (sls == NULL) - return NULL; - - strncpy (sls->bytes, s, len); - sls->bytes[len] = 0; - sls->ref_count = 1; - -#if _SLANG_OPTIMIZE_FOR_SPEED - cache_string (sls, len, hash); -#endif - - hash = hash % SLSTRING_HASH_TABLE_SIZE; - sls->next = String_Hash_Table [(unsigned int)hash]; - String_Hash_Table [(unsigned int)hash] = sls; - - return sls->bytes; -} - -_INLINE_ -static char *create_short_string (char *s, unsigned int len) -{ - char ch; - - /* Note: if len is 0, then it does not matter what *s is. This is - * important for SLang_create_nslstring. - */ - if (len) ch = *s; else ch = 0; - - len = 2 * (unsigned int) ((unsigned char) ch); - Single_Char_Strings [len] = ch; - Single_Char_Strings [len + 1] = 0; - return Single_Char_Strings + len; -} - -/* s cannot be NULL */ -_INLINE_ -static char *create_nstring (char *s, unsigned int len, unsigned long *hash_ptr) -{ - unsigned long hash; - - if (len < 2) - return create_short_string (s, len); - - hash = _SLstring_hash ((unsigned char *) s, (unsigned char *) (s + len)); - *hash_ptr = hash; - - return create_long_string (s, len, hash); -} - -char *SLang_create_nslstring (char *s, unsigned int len) -{ - unsigned long hash; - return create_nstring (s, len, &hash); -} - -char *_SLstring_make_hashed_string (char *s, unsigned int len, unsigned long *hashptr) -{ - unsigned long hash; - - if (s == NULL) return NULL; - - hash = _SLstring_hash ((unsigned char *) s, (unsigned char *) s + len); - *hashptr = hash; - - if (len < 2) - return create_short_string (s, len); - - return create_long_string (s, len, hash); -} - -char *_SLstring_dup_hashed_string (char *s, unsigned long hash) -{ - unsigned int len; -#if _SLANG_OPTIMIZE_FOR_SPEED - Cached_String_Type *cs; - SLstring_Type *sls; - - if (s == NULL) return NULL; - if (s[0] == 0) - return create_short_string (s, 0); - if (s[1] == 0) - return create_short_string (s, 1); - - cs = GET_CACHED_STRING(s); - if (((sls = cs->sls) != NULL) - && (sls->bytes == s)) - { - sls->ref_count += 1; - return s; - } -#else - if (s == NULL) return NULL; -#endif - - len = strlen (s); -#if !_SLANG_OPTIMIZE_FOR_SPEED - if (len < 2) return create_short_string (s, len); -#endif - - return create_long_string (s, len, hash); -} - -char *_SLstring_dup_slstring (char *s) -{ - SLstring_Type *sls; - unsigned int len; - unsigned long hash; -#if _SLANG_OPTIMIZE_FOR_SPEED - Cached_String_Type *cs; - - cs = GET_CACHED_STRING(s); - if (((sls = cs->sls) != NULL) - && (sls->bytes == s)) - { - sls->ref_count += 1; - return s; - } -#endif - - if ((s == NULL) || ((len = strlen (s)) < 2)) - return s; - - hash = _SLstring_hash ((unsigned char *)s, (unsigned char *)(s + len)); - - sls = find_slstring (s, hash); - if (sls == NULL) - { - SLang_Error = SL_INTERNAL_ERROR; - return NULL; - } - - sls->ref_count++; -#if _SLANG_OPTIMIZE_FOR_SPEED - cache_string (sls, len, hash); -#endif - return s; -} - -static void free_sls_string (SLstring_Type *sls, char *s, unsigned int len, - unsigned long hash) -{ - SLstring_Type *sls1, *prev; - -#if _SLANG_OPTIMIZE_FOR_SPEED - uncache_string (s); -#endif - - hash = hash % SLSTRING_HASH_TABLE_SIZE; - - sls1 = String_Hash_Table [(unsigned int) hash]; - - prev = NULL; - - /* This should not fail. */ - while (sls1 != sls) - { - prev = sls1; - sls1 = sls1->next; - } - - if (prev != NULL) - prev->next = sls->next; - else - String_Hash_Table [(unsigned int) hash] = sls->next; - - free_sls (sls, len); -} - -_INLINE_ -static void free_long_string (char *s, unsigned int len, unsigned long hash) -{ - SLstring_Type *sls; - - if (NULL == (sls = find_slstring (s, hash))) - { - SLang_doerror ("Application internal error: invalid attempt to free string"); - return; - } - - sls->ref_count--; - if (sls->ref_count != 0) - { -#if _SLANG_OPTIMIZE_FOR_SPEED - /* cache_string (sls, len, hash); */ -#endif - return; - } - - - free_sls_string (sls, s, len, hash); -} - -/* This routine may be passed NULL-- it is not an error. */ -void SLang_free_slstring (char *s) -{ - unsigned long hash; - unsigned int len; -#if _SLANG_OPTIMIZE_FOR_SPEED - Cached_String_Type *cs; - SLstring_Type *sls; - - cs = GET_CACHED_STRING(s); - if (((sls = cs->sls) != NULL) - && (sls->bytes == s)) - { - if (sls->ref_count <= 1) - free_sls_string (sls, s, cs->len, cs->hash); - else - sls->ref_count -= 1; - return; - } -#endif - - if (s == NULL) return; - - if ((len = strlen (s)) < 2) - return; - - hash = _SLstring_hash ((unsigned char *)s, (unsigned char *) s + len); - free_long_string (s, len, hash); -} - -char *SLang_create_slstring (char *s) -{ - unsigned long hash; -#if _SLANG_OPTIMIZE_FOR_SPEED - Cached_String_Type *cs; - SLstring_Type *sls; - - cs = GET_CACHED_STRING(s); - if (((sls = cs->sls) != NULL) - && (sls->bytes == s)) - { - sls->ref_count += 1; - return s; - } -#endif - - if (s == NULL) return NULL; - return create_nstring (s, strlen (s), &hash); -} - -void _SLfree_hashed_string (char *s, unsigned int len, unsigned long hash) -{ - if ((s == NULL) || (len < 2)) return; - free_long_string (s, len, hash); -} - - -char *_SLallocate_slstring (unsigned int len) -{ - SLstring_Type *sls = allocate_sls (len); - if (sls == NULL) - return NULL; - - return sls->bytes; -} - -void _SLunallocate_slstring (char *s, unsigned int len) -{ - SLstring_Type *sls; - - if (s == NULL) - return; - - sls = (SLstring_Type *) (s - offsetof(SLstring_Type,bytes[0])); - free_sls (sls, len); -} - -char *_SLcreate_via_alloced_slstring (char *s, unsigned int len) -{ - unsigned long hash; - SLstring_Type *sls; - - if (s == NULL) - return NULL; - - if (len < 2) - { - char *s1 = create_short_string (s, len); - _SLunallocate_slstring (s, len); - return s1; - } - - /* s is not going to be in the cache because when it was malloced, its - * value was unknown. This simplifies the coding. - */ - hash = _SLstring_hash ((unsigned char *)s, (unsigned char *)s + len); - sls = find_string (s, len, hash); - if (sls != NULL) - { - sls->ref_count++; - _SLunallocate_slstring (s, len); - s = sls->bytes; - -#if _SLANG_OPTIMIZE_FOR_SPEED - cache_string (sls, len, hash); -#endif - return s; - } - - sls = (SLstring_Type *) (s - offsetof(SLstring_Type,bytes[0])); - sls->ref_count = 1; - -#if _SLANG_OPTIMIZE_FOR_SPEED - cache_string (sls, len, hash); -#endif - - hash = hash % SLSTRING_HASH_TABLE_SIZE; - sls->next = String_Hash_Table [(unsigned int)hash]; - String_Hash_Table [(unsigned int)hash] = sls; - - return s; -} - -/* Note, a and b may be ordinary strings. The result is an slstring */ -char *SLang_concat_slstrings (char *a, char *b) -{ - unsigned int lena, len; - char *c; - - lena = strlen (a); - len = lena + strlen (b); - - c = _SLallocate_slstring (len); - if (c == NULL) - return NULL; - - strcpy (c, a); - strcpy (c + lena, b); - - return _SLcreate_via_alloced_slstring (c, len); -} - diff --git a/mdk-stage1/slang/slstrops.c b/mdk-stage1/slang/slstrops.c deleted file mode 100644 index a57ef6389..000000000 --- a/mdk-stage1/slang/slstrops.c +++ /dev/null @@ -1,1686 +0,0 @@ -/* -*- mode: C; mode: fold; -*- */ -/* string manipulation functions for S-Lang. */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" -/*{{{ Include Files */ - -#include - -#ifndef __QNX__ -# if defined(__GO32__) || defined(__WATCOMC__) -# include -# include -# endif -#endif - -#if SLANG_HAS_FLOAT -#include -#endif - -#include -#include -#include - -#ifndef isdigit -# define isdigit(x) (((x) >= '0') && ((x) <= '9')) -#endif - -#include "slang.h" -#include "_slang.h" - -/*}}}*/ - -#define USE_ALLOC_STSTRING 1 - -/*{{{ Utility Functions */ - -static char Utility_Char_Table [256]; -static unsigned char WhiteSpace_Lut[256]; - -static void set_utility_char_table (char *pos) /*{{{*/ -{ - register char *t = Utility_Char_Table, *tmax; - register unsigned char ch; - - tmax = t + 256; - while (t < tmax) *t++ = 0; - - t = Utility_Char_Table; - while ((ch = (unsigned char) *pos++) != 0) t[ch] = 1; -} - -/*}}}*/ - -_INLINE_ -static unsigned char *make_whitespace_lut (void) -{ - if (WhiteSpace_Lut[' '] != 1) - { - WhiteSpace_Lut[' '] = WhiteSpace_Lut['\r'] - = WhiteSpace_Lut ['\n'] = WhiteSpace_Lut['\t'] - = WhiteSpace_Lut ['\f'] = 1; - } - return WhiteSpace_Lut; -} - -static unsigned char *make_lut (unsigned char *s, unsigned char *lut) -{ - int reverse = 0; - - if (*s == '^') - { - reverse = 1; - s++; - } - SLmake_lut (lut, s, reverse); - return lut; -} - -static unsigned int do_trim (char **beg, int do_beg, - char **end, int do_end, - char *white) /*{{{*/ -{ - unsigned int len; - char *a, *b; - - set_utility_char_table (white); - - a = *beg; - len = strlen (a); - b = a + len; - - if (do_beg) - while (Utility_Char_Table[(unsigned char) *a]) a++; - - if (do_end) - { - b--; - while ((b >= a) && (Utility_Char_Table[(unsigned char) *b])) b--; - b++; - } - - len = (unsigned int) (b - a); - *beg = a; - *end = b; - return len; -} - -/*}}}*/ - -/*}}}*/ - -static int pop_3_strings (char **a, char **b, char **c) -{ - *a = *b = *c = NULL; - if (-1 == SLpop_string (c)) - return -1; - - if (-1 == SLpop_string (b)) - { - SLfree (*c); - *c = NULL; - return -1; - } - - if (-1 == SLpop_string (a)) - { - SLfree (*b); - SLfree (*c); - *b = *c = NULL; - return -1; - } - - return 0; -} - -static void free_3_strings (char *a, char *b, char *c) -{ - SLfree (a); - SLfree (b); - SLfree (c); -} - -static void strcat_cmd (void) /*{{{*/ -{ - char *c, *c1; - int nargs; - int i; - char **ptrs; - unsigned int len; -#if !USE_ALLOC_STSTRING - char buf[256]; -#endif - nargs = SLang_Num_Function_Args; - if (nargs <= 0) nargs = 2; - - if (NULL == (ptrs = (char **)SLmalloc (nargs * sizeof (char *)))) - return; - - memset ((char *) ptrs, 0, sizeof (char *) * nargs); - - c = NULL; - i = nargs; - len = 0; - while (i != 0) - { - char *s; - - i--; - if (-1 == SLang_pop_slstring (&s)) - goto free_and_return; - ptrs[i] = s; - len += strlen (s); - } -#if USE_ALLOC_STSTRING - if (NULL == (c = _SLallocate_slstring (len))) - goto free_and_return; -#else - len++; /* \0 char */ - if (len <= sizeof (buf)) - c = buf; - else if (NULL == (c = SLmalloc (len))) - goto free_and_return; -#endif - - c1 = c; - for (i = 0; i < nargs; i++) - { - strcpy (c1, ptrs[i]); - c1 += strlen (c1); - } - - free_and_return: - for (i = 0; i < nargs; i++) - SLang_free_slstring (ptrs[i]); - SLfree ((char *) ptrs); - -#if USE_ALLOC_STSTRING - (void) _SLpush_alloced_slstring (c, len); -#else - if (c != buf) - (void) SLang_push_malloced_string (c); /* NULL ok */ - else - (void) SLang_push_string (c); -#endif -} - -/*}}}*/ - -static int _SLang_push_nstring (char *a, unsigned int len) -{ - a = SLang_create_nslstring (a, len); - if (a == NULL) - return -1; - - return _SLang_push_slstring (a); -} - - -static void strtrim_cmd_internal (char *str, int do_beg, int do_end) -{ - char *beg, *end, *white; - int free_str; - unsigned int len; - - /* Go through SLpop_string to get a private copy since it will be - * modified. - */ - - free_str = 0; - if (SLang_Num_Function_Args == 2) - { - white = str; - if (-1 == SLang_pop_slstring (&str)) - return; - free_str = 1; - } - else white = " \t\f\r\n"; - - beg = str; - len = do_trim (&beg, do_beg, &end, do_end, white); - - (void) _SLang_push_nstring (beg, len); - if (free_str) - SLang_free_slstring (str); -} - - -static void strtrim_cmd (char *str) -{ - strtrim_cmd_internal (str, 1, 1); -} - -static void strtrim_beg_cmd (char *str) -{ - strtrim_cmd_internal (str, 1, 0); -} - -static void strtrim_end_cmd (char *str) -{ - strtrim_cmd_internal (str, 0, 1); -} - - -static void strcompress_cmd (void) /*{{{*/ -{ - char *str, *white, *c; - unsigned char *s, *beg, *end; - unsigned int len; - char pref_char; - - if (SLpop_string (&white)) return; - if (SLpop_string (&str)) - { - SLfree (white); - return; - } - - /* The first character of white is the preferred whitespace character */ - pref_char = *white; - - beg = (unsigned char *) str; - (void) do_trim ((char **) &beg, 1, (char **) &end, 1, white); - SLfree (white); - - /* Determine the effective length */ - len = 0; - s = (unsigned char *) beg; - while (s < end) - { - len++; - if (Utility_Char_Table[*s++]) - { - while ((s < end) && Utility_Char_Table[*s]) s++; - } - } - -#if USE_ALLOC_STSTRING - c = _SLallocate_slstring (len); -#else - c = SLmalloc (len + 1); -#endif - if (c == NULL) - { - SLfree (str); - return; - } - - s = (unsigned char *) c; - - while (beg < end) - { - unsigned char ch = *beg++; - - if (0 == Utility_Char_Table[ch]) - { - *s++ = ch; - continue; - } - - *s++ = (unsigned char) pref_char; - - while ((beg < end) && Utility_Char_Table[*beg]) - beg++; - } - - *s = 0; - -#if USE_ALLOC_STSTRING - (void) _SLpush_alloced_slstring (c, len); -#else - SLang_push_malloced_string(c); -#endif - - SLfree(str); -} - -/*}}}*/ - -static int str_replace_cmd_1 (char *orig, char *match, char *rep, unsigned int max_num_replaces, - char **new_strp) /*{{{*/ -{ - char *s, *t, *new_str; - unsigned int rep_len, match_len, new_len; - unsigned int num_replaces; - - *new_strp = NULL; - - match_len = strlen (match); - - if (match_len == 0) - return 0; - - num_replaces = 0; - s = orig; - while (num_replaces < max_num_replaces) - { - s = strstr (s, match); - if (s == NULL) - break; - s += match_len; - num_replaces++; - } - - if (num_replaces == 0) - return 0; - - max_num_replaces = num_replaces; - - rep_len = strlen (rep); - - new_len = (strlen (orig) - num_replaces * match_len) + num_replaces * rep_len; - new_str = SLmalloc (new_len + 1); - if (new_str == NULL) - return -1; - - s = orig; - t = new_str; - - for (num_replaces = 0; num_replaces < max_num_replaces; num_replaces++) - { - char *next_s; - unsigned int len; - - next_s = strstr (s, match); /* cannot be NULL */ - len = (unsigned int) (next_s - s); - strncpy (t, s, len); - t += len; - strcpy (t, rep); - t += rep_len; - - s = next_s + match_len; - } - strcpy (t, s); - *new_strp = new_str; - - return (int) num_replaces; -} - -/*}}}*/ - -static void reverse_string (char *a) -{ - char *b; - - b = a + strlen (a); - while (b > a) - { - char ch; - - b--; - ch = *a; - *a++ = *b; - *b = ch; - } -} - -static int strreplace_cmd (int *np) -{ - char *orig, *match, *rep; - char *new_str; - int max_num_replaces; - int ret; - - max_num_replaces = *np; - - if (-1 == pop_3_strings (&orig, &match, &rep)) - return -1; - - if (max_num_replaces < 0) - { - reverse_string (orig); - reverse_string (match); - reverse_string (rep); - ret = str_replace_cmd_1 (orig, match, rep, -max_num_replaces, &new_str); - if (ret > 0) reverse_string (new_str); - else if (ret == 0) - reverse_string (orig); - } - else ret = str_replace_cmd_1 (orig, match, rep, max_num_replaces, &new_str); - - if (ret == 0) - { - if (-1 == SLang_push_malloced_string (orig)) - ret = -1; - orig = NULL; - } - else if (ret > 0) - { - if (-1 == SLang_push_malloced_string (new_str)) - ret = -1; - } - - free_3_strings (orig, match, rep); - return ret; -} - -static int str_replace_cmd (char *orig, char *match, char *rep) -{ - char *s; - int ret; - - ret = str_replace_cmd_1 (orig, match, rep, 1, &s); - if (ret == 1) - (void) SLang_push_malloced_string (s); - return ret; -} - - - -static void strtok_cmd (char *str) -{ - _SLString_List_Type sl; - unsigned char white_buf[256]; - char *s; - unsigned char *white; - - if (SLang_Num_Function_Args == 1) - white = make_whitespace_lut (); - else - { - white = white_buf; - make_lut ((unsigned char *)str, white); - if (-1 == SLang_pop_slstring (&str)) - return; - } - - if (-1 == _SLstring_list_init (&sl, 256, 1024)) - goto the_return; - - s = str; - while (*s != 0) - { - char *s0; - - s0 = s; - /* Skip whitespace */ - while ((*s0 != 0) && (0 != white[(unsigned char)*s0])) - s0++; - - if (*s0 == 0) - break; - - s = s0; - while ((*s != 0) && (0 == white[(unsigned char) *s])) - s++; - - /* sl deleted upon failure */ - if (-1 == _SLstring_list_append (&sl, SLang_create_nslstring (s0, (unsigned int) (s - s0)))) - goto the_return; - } - - /* Deletes sl */ - (void) _SLstring_list_push (&sl); - - the_return: - if (white == white_buf) - SLang_free_slstring (str); -} - -/* This routine returns the string with text removed between single character - comment delimiters from the set b and e. */ - -static void str_uncomment_string_cmd (char *str, char *b, char *e) /*{{{*/ -{ - unsigned char chb, che; - unsigned char *s, *cbeg, *mark; - - if (strlen(b) != strlen(e)) - { - SLang_doerror ("Comment delimiter length mismatch."); - return; - } - - set_utility_char_table (b); - - if (NULL == (str = (char *) SLmake_string(str))) return; - - s = (unsigned char *) str; - - while ((chb = *s++) != 0) - { - if (Utility_Char_Table [chb] == 0) continue; - - mark = s - 1; - - cbeg = (unsigned char *) b; - while (*cbeg != chb) cbeg++; - - che = (unsigned char) *(e + (int) (cbeg - (unsigned char *) b)); - - while (((chb = *s++) != 0) && (chb != che)); - - if (chb == 0) - { - /* end of string and end not found. Just truncate it a return; */ - *mark = 0; - break; - } - - strcpy ((char *) mark, (char *)s); - s = mark; - } - SLang_push_malloced_string (str); -} - -/*}}}*/ - -static void str_quote_string_cmd (char *str, char *quotes, int *slash_ptr) /*{{{*/ -{ - char *q; - int slash; - unsigned int len; - register char *t, *s, *q1; - register unsigned char ch; - - slash = *slash_ptr; - - if ((slash > 255) || (slash < 0)) - { - SLang_Error = SL_INVALID_PARM; - return; - } - - /* setup the utility table to have 1s at quote char postitions. */ - set_utility_char_table (quotes); - - t = Utility_Char_Table; - t[(unsigned int) slash] = 1; - - /* calculate length */ - s = str; - len = 0; - while ((ch = (unsigned char) *s++) != 0) if (t[ch]) len++; - len += (unsigned int) (s - str); - - if (NULL != (q = SLmalloc(len))) - { - s = str; q1 = q; - while ((ch = (unsigned char) *s++) != 0) - { - if (t[ch]) *q1++ = slash; - *q1++ = (char) ch; - } - *q1 = 0; - SLang_push_malloced_string(q); - } -} - -/*}}}*/ - -/* returns the position of substrin in a string or null */ -static int issubstr_cmd (char *a, char *b) /*{{{*/ -{ - char *c; - - if (NULL == (c = (char *) strstr(a, b))) - return 0; - - return 1 + (int) (c - a); -} - -/*}}}*/ - -/* returns to stack string at pos n to n + m of a */ -static void substr_cmd (char *a, int *n_ptr, int *m_ptr) /*{{{*/ -{ - int n, m; - int lena; - - n = *n_ptr; - m = *m_ptr; - - lena = strlen (a); - if (n > lena) n = lena + 1; - if (n < 1) - { - SLang_Error = SL_INVALID_PARM; - return; - } - - n--; - if (m < 0) m = lena; - if (n + m > lena) m = lena - n; - - (void) _SLang_push_nstring (a + n, (unsigned int) m); -} - -/*}}}*/ - -/* substitute char m at positin string n in string*/ -static void strsub_cmd (int *nptr, int *mptr) /*{{{*/ -{ - char *a; - int n, m; - unsigned int lena; - - if (-1 == SLpop_string (&a)) - return; - - n = *nptr; - m = *mptr; - - lena = strlen (a); - - if ((n <= 0) || (lena < (unsigned int) n)) - { - SLang_Error = SL_INVALID_PARM; - SLfree(a); - return; - } - - a[n - 1] = (char) m; - - SLang_push_malloced_string (a); -} - -/*}}}*/ - -static void strup_cmd(void) /*{{{*/ -{ - unsigned char c, *a; - char *str; - - if (SLpop_string (&str)) - return; - - a = (unsigned char *) str; - while ((c = *a) != 0) - { - /* if ((*a >= 'a') && (*a <= 'z')) *a -= 32; */ - *a = UPPER_CASE(c); - a++; - } - - SLang_push_malloced_string (str); -} - -/*}}}*/ - -static int isdigit_cmd (char *what) /*{{{*/ -{ - return isdigit((unsigned char)*what); -} - -/*}}}*/ -static int toupper_cmd (int *ch) /*{{{*/ -{ - return UPPER_CASE(*ch); -} - -/*}}}*/ - -static int tolower_cmd (int *ch) /*{{{*/ -{ - return LOWER_CASE(*ch); -} - -/*}}}*/ - -static void strlow_cmd (void) /*{{{*/ -{ - unsigned char c, *a; - char *str; - - if (SLpop_string(&str)) return; - a = (unsigned char *) str; - while ((c = *a) != 0) - { - /* if ((*a >= 'a') && (*a <= 'z')) *a -= 32; */ - *a = LOWER_CASE(c); - a++; - } - - SLang_push_malloced_string ((char *) str); -} - -/*}}}*/ - -static SLang_Array_Type *do_strchop (char *str, int delim, int quote) -{ - int count; - char *s0, *elm; - register char *s1; - register unsigned char ch; - int quoted; - SLang_Array_Type *at; - char **data; - - if ((quote < 0) || (quote > 255) - || (delim <= 0) || (delim > 255)) - { - SLang_Error = SL_INVALID_PARM; - return NULL; - } - - s1 = s0 = str; - - quoted = 0; - count = 1; /* at least 1 */ - while (1) - { - ch = (unsigned char) *s1++; - if ((ch == quote) && quote) - { - if (*s1 == 0) - break; - - s1++; - continue; - } - - if (ch == delim) - { - count++; - continue; - } - - if (ch == 0) - break; - } - - if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &count, 1))) - return NULL; - - data = (char **)at->data; - - count = 0; - s1 = s0; - - while (1) - { - ch = (unsigned char) *s1; - - if ((ch == quote) && quote) - { - s1++; - if (*s1 != 0) s1++; - quoted = 1; - continue; - } - - if ((ch == delim) || (ch == 0)) - { - if (quoted == 0) - elm = SLang_create_nslstring (s0, (unsigned int) (s1 - s0)); - else - { - register char ch1, *p, *p1; - char *tmp; - - tmp = SLmake_nstring (s0, (unsigned int)(s1 - s0)); - if (tmp == NULL) - break; - - /* Now unquote it */ - p = p1 = tmp; - do - { - ch1 = *p1++; - if (ch1 == '\\') ch1 = *p1++; - *p++ = ch1; - } - while (ch1 != 0); - quoted = 0; - - elm = SLang_create_slstring (tmp); - SLfree (tmp); - } - - if (elm == NULL) - break; - - data[count] = elm; - count++; - - if (ch == 0) - return at; - - s1++; /* skip past delim */ - s0 = s1; /* and reset */ - } - else s1++; - } - - SLang_free_array (at); - return NULL; -} - -static void strchop_cmd (char *str, int *q, int *d) -{ - (void) SLang_push_array (do_strchop (str, *q, *d), 1); -} - -static void strchopr_cmd (char *str, int *q, int *d) -{ - SLang_Array_Type *at; - - if (NULL != (at = do_strchop (str, *q, *d))) - { - char **d0, **d1; - - d0 = (char **) at->data; - d1 = d0 + (at->num_elements - 1); - - while (d0 < d1) - { - char *tmp; - - tmp = *d0; - *d0 = *d1; - *d1 = tmp; - d0++; - d1--; - } - } - SLang_push_array (at, 1); -} - -static int strcmp_cmd (char *a, char *b) /*{{{*/ -{ - return strcmp(a, b); -} - -/*}}}*/ - -static int strncmp_cmd (char *a, char *b, int *n) /*{{{*/ -{ - return strncmp(a, b, (unsigned int) *n); -} - -/*}}}*/ - -static int strlen_cmd (char *s) /*{{{*/ -{ - return (int) strlen (s); -} -/*}}}*/ - -static void extract_element_cmd (char *list, int *nth_ptr, int *delim_ptr) -{ - char buf[1024], *b; - - b = buf; - if (-1 == SLextract_list_element (list, *nth_ptr, *delim_ptr, buf, sizeof(buf))) - b = NULL; - - SLang_push_string (b); -} - -/* sprintf functionality for S-Lang */ - -static char *SLdo_sprintf (char *fmt) /*{{{*/ -{ - register char *p = fmt, ch; - char *out = NULL, *outp = NULL; - char dfmt[1024]; /* used to hold part of format */ - char *f; - VOID_STAR varp; - int want_width, width, precis, use_varp, int_var; - long long_var; - unsigned int len = 0, malloc_len = 0, dlen; - int do_free, guess_size; -#if SLANG_HAS_FLOAT - int tmp1, tmp2, use_double; - double x; -#endif - int use_long = 0; - - while (1) - { - while ((ch = *p) != 0) - { - if (ch == '%') - break; - p++; - } - - /* p points at '%' or 0 */ - - dlen = (unsigned int) (p - fmt); - - if (len + dlen >= malloc_len) - { - malloc_len = len + dlen; - if (out == NULL) outp = SLmalloc(malloc_len + 1); - else outp = SLrealloc(out, malloc_len + 1); - if (NULL == outp) - return out; - out = outp; - outp = out + len; - } - - strncpy(outp, fmt, dlen); - len += dlen; - outp = out + len; - *outp = 0; - if (ch == 0) break; - - /* bump it beyond '%' */ - ++p; - fmt = p; - - f = dfmt; - *f++ = ch; - /* handle flag char */ - ch = *p++; - - /* Make sure cases such as "% #g" can be handled. */ - if ((ch == '-') || (ch == '+') || (ch == ' ') || (ch == '#')) - { - *f++ = ch; - ch = *p++; - if ((ch == '-') || (ch == '+') || (ch == ' ') || (ch == '#')) - { - *f++ = ch; - ch = *p++; - } - } - - - /* width */ - /* I have got to parse it myself so that I can see how big it needs - * to be. - */ - want_width = width = 0; - if (ch == '*') - { - if (SLang_pop_integer(&width)) return (out); - want_width = 1; - ch = *p++; - } - else - { - if (ch == '0') - { - *f++ = '0'; - ch = *p++; - } - - while ((ch <= '9') && (ch >= '0')) - { - width = width * 10 + (ch - '0'); - ch = *p++; - want_width = 1; - } - } - - if (want_width) - { - sprintf(f, "%d", width); - f += strlen (f); - } - precis = 0; - /* precision -- also indicates max number of chars from string */ - if (ch == '.') - { - *f++ = ch; - ch = *p++; - want_width = 0; - if (ch == '*') - { - if (SLang_pop_integer(&precis)) return (out); - ch = *p++; - want_width = 1; - } - else while ((ch <= '9') && (ch >= '0')) - { - precis = precis * 10 + (ch - '0'); - ch = *p++; - want_width = 1; - } - if (want_width) - { - sprintf(f, "%d", precis); - f += strlen (f); - } - else precis = 0; - } - - long_var = 0; - int_var = 0; - varp = NULL; - guess_size = 32; -#if SLANG_HAS_FLOAT - use_double = 0; -#endif - use_long = 0; - use_varp = 0; - do_free = 0; - - if (ch == 'l') - { - use_long = 1; - ch = *p++; - } - else if (ch == 'h') ch = *p++; /* not supported */ - - /* Now the actual format specifier */ - switch (ch) - { - case 'S': - _SLstring_intrinsic (); - ch = 's'; - /* drop */ - case 's': - if (SLang_pop_slstring((char **) &varp)) return (out); - do_free = 1; - guess_size = strlen((char *) varp); - use_varp = 1; - break; - - case '%': - guess_size = 1; - do_free = 0; - use_varp = 1; - varp = (VOID_STAR) "%"; - break; - - case 'c': guess_size = 1; - use_long = 0; - /* drop */ - case 'd': - case 'i': - case 'o': - case 'u': - case 'X': - case 'x': - if (SLang_pop_long (&long_var)) return(out); - if (use_long == 0) - int_var = (int) long_var; - else - *f++ = 'l'; - break; - - case 'f': - case 'e': - case 'g': - case 'E': - case 'G': -#if SLANG_HAS_FLOAT - if (SLang_pop_double(&x, &tmp1, &tmp2)) return (out); - use_double = 1; - guess_size = 256; - (void) tmp1; (void) tmp2; - use_long = 0; - break; -#endif - case 'p': - guess_size = 32; - /* Pointer type?? Why?? */ - if (-1 == SLdo_pop ()) - return out; - varp = (VOID_STAR) _SLStack_Pointer; - use_varp = 1; - use_long = 0; - break; - - default: - SLang_doerror("Invalid Format."); - return(out); - } - *f++ = ch; *f = 0; - - width = width + precis; - if (width > guess_size) guess_size = width; - - if (len + guess_size > malloc_len) - { - outp = (char *) SLrealloc(out, len + guess_size + 1); - if (outp == NULL) - { - SLang_Error = SL_MALLOC_ERROR; - return (out); - } - out = outp; - outp = out + len; - malloc_len = len + guess_size; - } - - if (use_varp) - { - sprintf(outp, dfmt, varp); - if (do_free) SLang_free_slstring ((char *)varp); - } -#if SLANG_HAS_FLOAT - else if (use_double) sprintf(outp, dfmt, x); -#endif - else if (use_long) sprintf (outp, dfmt, long_var); - else sprintf(outp, dfmt, int_var); - - len += strlen(outp); - outp = out + len; - fmt = p; - } - - if (out != NULL) - { - outp = SLrealloc (out, (unsigned int) (outp - out) + 1); - if (outp != NULL) out = outp; - } - - return (out); -} - -/*}}}*/ - -int _SLstrops_do_sprintf_n (int n) /*{{{*/ -{ - char *p; - char *fmt; - SLang_Object_Type *ptr; - int ofs; - - if (-1 == (ofs = SLreverse_stack (n + 1))) - return -1; - - ptr = _SLRun_Stack + ofs; - - if (SLang_pop_slstring(&fmt)) - return -1; - - p = SLdo_sprintf (fmt); - SLang_free_slstring (fmt); - - while (_SLStack_Pointer > ptr) - SLdo_pop (); - - if (SLang_Error) - { - SLfree (p); - return -1; - } - - return SLang_push_malloced_string (p); -} - -/*}}}*/ - -static void sprintf_n_cmd (int *n) -{ - _SLstrops_do_sprintf_n (*n); -} - -static void sprintf_cmd (void) -{ - _SLstrops_do_sprintf_n (SLang_Num_Function_Args - 1); /* do not include format */ -} - -/* converts string s to a form that can be used in an eval */ -static void make_printable_string(char *s) /*{{{*/ -{ - unsigned int len; - register char *s1 = s, ch, *ss1; - char *ss; - - /* compute length */ - len = 3; - while ((ch = *s1++) != 0) - { - if ((ch == '\n') || (ch == '\\') || (ch == '"')) len++; - len++; - } - - if (NULL == (ss = SLmalloc(len))) - return; - - s1 = s; - ss1 = ss; - *ss1++ = '"'; - while ((ch = *s1++) != 0) - { - if (ch == '\n') - { - ch = 'n'; - *ss1++ = '\\'; - } - else if ((ch == '\\') || (ch == '"')) - { - *ss1++ = '\\'; - } - *ss1++ = ch; - } - *ss1++ = '"'; - *ss1 = 0; - if (-1 == SLang_push_string (ss)) - SLfree (ss); -} - -/*}}}*/ - -static int is_list_element_cmd (char *list, char *elem, int *d_ptr) -{ - char ch; - int d, n; - unsigned int len; - char *lbeg, *lend; - - d = *d_ptr; - - len = strlen (elem); - - n = 1; - lend = list; - - while (1) - { - lbeg = lend; - while ((0 != (ch = *lend)) && (ch != (char) d)) lend++; - - if ((lbeg + len == lend) - && (0 == strncmp (elem, lbeg, len))) - break; - - if (ch == 0) - { - n = 0; - break; - } - lend++; /* skip delim */ - n++; - } - - return n; -} - -/*}}}*/ - -/* Regular expression routines for strings */ -static SLRegexp_Type regexp_reg; - -static int string_match_cmd (char *str, char *pat, int *nptr) /*{{{*/ -{ - int n; - unsigned int len; - unsigned char rbuf[512], *match; - - n = *nptr; - - regexp_reg.case_sensitive = 1; - regexp_reg.buf = rbuf; - regexp_reg.pat = (unsigned char *) pat; - regexp_reg.buf_len = sizeof (rbuf); - - if (SLang_regexp_compile (®exp_reg)) - { - SLang_verror (SL_INVALID_PARM, "Unable to compile pattern"); - return -1; - } - - n--; - len = strlen(str); - if ((n < 0) || ((unsigned int) n >= len)) - { - /* SLang_Error = SL_INVALID_PARM; */ - return 0; - } - - str += n; - len -= n; - - if (NULL == (match = SLang_regexp_match((unsigned char *) str, len, ®exp_reg))) - return 0; - - /* adjust offsets */ - regexp_reg.offset = n; - - return (1 + (int) ((char *) match - str)); -} - -/*}}}*/ - -static int string_match_nth_cmd (int *nptr) /*{{{*/ -{ - int n, beg; - - n = *nptr; - - if ((n < 0) || (n > 9) || (regexp_reg.pat == NULL) - || ((beg = regexp_reg.beg_matches[n]) == -1)) - { - SLang_Error = SL_INVALID_PARM; - return -1; - } - SLang_push_integer(beg + regexp_reg.offset); - return regexp_reg.end_matches[n]; -} - -/*}}}*/ - -static char *create_delimited_string (char **list, unsigned int n, - char *delim) -{ - unsigned int len, dlen; - unsigned int i; - unsigned int num; - char *str, *s; - - len = 1; /* allow room for \0 char */ - num = 0; - for (i = 0; i < n; i++) - { - if (list[i] == NULL) continue; - len += strlen (list[i]); - num++; - } - - dlen = strlen (delim); - if (num > 1) - len += (num - 1) * dlen; - - if (NULL == (str = SLmalloc (len))) - return NULL; - - *str = 0; - s = str; - i = 0; - - while (num > 1) - { - while (list[i] == NULL) - i++; - - strcpy (s, list[i]); - s += strlen (list[i]); - strcpy (s, delim); - s += dlen; - i++; - num--; - } - - if (num) - { - while (list[i] == NULL) - i++; - - strcpy (s, list[i]); - } - - return str; -} - -static void create_delimited_string_cmd (int *nptr) -{ - unsigned int n, i; - char **strings; - char *str; - - str = NULL; - - n = 1 + (unsigned int) *nptr; /* n includes delimiter */ - - if (NULL == (strings = (char **)SLmalloc (n * sizeof (char *)))) - { - SLdo_pop_n (n); - return; - } - memset((char *)strings, 0, n * sizeof (char *)); - - i = n; - while (i != 0) - { - i--; - if (-1 == SLang_pop_slstring (strings + i)) - goto return_error; - } - - str = create_delimited_string (strings + 1, (n - 1), strings[0]); - /* drop */ - return_error: - for (i = 0; i < n; i++) SLang_free_slstring (strings[i]); - SLfree ((char *)strings); - - (void) SLang_push_malloced_string (str); /* NULL Ok */ -} - -static void strjoin_cmd (char *delim) -{ - SLang_Array_Type *at; - char *str; - - if (-1 == SLang_pop_array_of_type (&at, SLANG_STRING_TYPE)) - return; - - str = create_delimited_string ((char **)at->data, at->num_elements, delim); - SLang_free_array (at); - (void) SLang_push_malloced_string (str); /* NULL Ok */ -} - -static void str_delete_chars_cmd (char *s, char *d) -{ - unsigned char lut[256]; - unsigned char *s1, *s2; - unsigned char ch; - - make_lut ((unsigned char *)d, lut); - if (NULL == (s = SLmake_string (s))) - return; - - s1 = s2 = (unsigned char *) s; - while ((ch = *s2++) != 0) - { - if (0 == lut[ch]) - *s1++ = ch; - } - *s1 = 0; - - (void) SLang_push_malloced_string (s); -} - -static unsigned char *make_lut_string (unsigned char *s) -{ - unsigned char lut[256]; - unsigned char *l; - unsigned int i; - - /* Complement-- a natural order is imposed */ - make_lut (s, lut); - l = lut; - for (i = 1; i < 256; i++) - { - if (lut[i]) - *l++ = (unsigned char) i; - } - *l = 0; - return (unsigned char *) SLmake_string ((char *)lut); -} - -static unsigned char *make_str_range (unsigned char *s) -{ - unsigned char *s1, *range; - unsigned int num; - unsigned char ch; - int len; - - if (*s == '^') - return make_lut_string (s); - - num = 0; - s1 = s; - while ((ch = *s1++) != 0) - { - unsigned char ch1; - - ch1 = *s1; - if (ch1 == '-') - { - s1++; - ch1 = *s1; - len = (int)ch1 - (int)ch; - if (len < 0) - len = -len; - - num += (unsigned int) len; - if (ch1 != 0) - s1++; - } - - num++; - } - - range = (unsigned char *)SLmalloc (num + 1); - if (range == NULL) - return NULL; - - s1 = s; - s = range; - while ((ch = *s1++) != 0) - { - unsigned char ch1; - unsigned int i; - - ch1 = *s1; - if (ch1 != '-') - { - *s++ = ch; - continue; - } - - s1++; - ch1 = *s1; - - if (ch > ch1) - { - if (ch1 == 0) - ch1 = 1; - - for (i = (unsigned int) ch; i >= (unsigned int) ch1; i--) - *s++ = (unsigned char) i; - - if (*s1 == 0) - break; - } - else - { - for (i = (unsigned int) ch; i <= (unsigned int) ch1; i++) - *s++ = (unsigned char) i; - } - s1++; - } - -#if 0 - if (range + num != s) - SLang_verror (SL_INTERNAL_ERROR, "make_str_range: num wrong"); -#endif - *s = 0; - - return range; -} - -static void strtrans_cmd (char *s, unsigned char *from, unsigned char *to) -{ - unsigned char map[256]; - char *s1; - unsigned int i; - unsigned char ch; - unsigned char last_to; - unsigned char *from_range, *to_range; - - for (i = 0; i < 256; i++) map[i] = (unsigned char) i; - - if (*to == 0) - { - str_delete_chars_cmd (s, (char *)from); - return; - } - - from_range = make_str_range (from); - if (from_range == NULL) - return; - to_range = make_str_range (to); - if (to_range == NULL) - { - SLfree ((char *)from_range); - return; - } - - from = from_range; - to = to_range; - - last_to = 0; - while ((ch = *from++) != 0) - { - unsigned char to_ch; - - if (0 == (to_ch = *to++)) - { - do - { - map[ch] = last_to; - } - while (0 != (ch = *from++)); - break; - } - - last_to = map[ch] = to_ch; - } - - SLfree ((char *)from_range); - SLfree ((char *)to_range); - - s = SLmake_string (s); - if (s == NULL) - return; - - s1 = s; - while ((ch = (unsigned char) *s1) != 0) - *s1++ = (char) map[ch]; - - (void) SLang_push_malloced_string (s); -} - - -static SLang_Intrin_Fun_Type Strops_Table [] = /*{{{*/ -{ - MAKE_INTRINSIC_I("create_delimited_string", create_delimited_string_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SS("strcmp", strcmp_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_SSI("strncmp", strncmp_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_0("strcat", strcat_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("strlen", strlen_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_SII("strchop", strchop_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SII("strchopr", strchopr_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_I("strreplace", strreplace_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_SSS("str_replace", str_replace_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_SII("substr", substr_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SS("is_substr", issubstr_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_II("strsub", strsub_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SII("extract_element", extract_element_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SSI("is_list_element", is_list_element_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_SSI("string_match", string_match_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_I("string_match_nth", string_match_nth_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_0("strlow", strlow_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_I("tolower", tolower_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_I("toupper", toupper_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_0("strup", strup_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("isdigit", isdigit_cmd, SLANG_INT_TYPE), - MAKE_INTRINSIC_S("strtrim", strtrim_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("strtrim_end", strtrim_end_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("strtrim_beg", strtrim_beg_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("strcompress", strcompress_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_I("Sprintf", sprintf_n_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("sprintf", sprintf_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("sscanf", _SLang_sscanf, SLANG_INT_TYPE), - MAKE_INTRINSIC_S("make_printable_string", make_printable_string, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SSI("str_quote_string", str_quote_string_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SSS("str_uncomment_string", str_uncomment_string_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_II("define_case", SLang_define_case, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("strtok", strtok_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_S("strjoin", strjoin_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SSS("strtrans", strtrans_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_SS("str_delete_chars", str_delete_chars_cmd, SLANG_VOID_TYPE), - - SLANG_END_INTRIN_FUN_TABLE -}; - -/*}}}*/ - -int _SLang_init_slstrops (void) -{ - return SLadd_intrin_fun_table (Strops_Table, NULL); -} diff --git a/mdk-stage1/slang/slstruct.c b/mdk-stage1/slang/slstruct.c deleted file mode 100644 index 33d182373..000000000 --- a/mdk-stage1/slang/slstruct.c +++ /dev/null @@ -1,932 +0,0 @@ -/* Structure type implementation */ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#define SL_APP_WANTS_FOREACH -#include "slang.h" -#include "_slang.h" - -void _SLstruct_delete_struct (_SLang_Struct_Type *s) -{ - _SLstruct_Field_Type *field, *field_max; - - if (s == NULL) return; - - if (s->num_refs > 1) - { - s->num_refs -= 1; - return; - } - - field = s->fields; - if (field != NULL) - { - field_max = field + s->nfields; - - while (field < field_max) - { - SLang_free_object (&field->obj); - SLang_free_slstring (field->name); /* could be NULL */ - field++; - } - SLfree ((char *) s->fields); - } - SLfree ((char *) s); -} - -static _SLang_Struct_Type *allocate_struct (unsigned int nfields) -{ - _SLang_Struct_Type *s; - _SLstruct_Field_Type *f; - unsigned int i, size; - - s = (_SLang_Struct_Type *) SLmalloc (sizeof (_SLang_Struct_Type)); - if (s == NULL) return NULL; - - SLMEMSET((char *) s, 0, sizeof (_SLang_Struct_Type)); - - size = nfields * sizeof(_SLstruct_Field_Type); - if (NULL == (f = (_SLstruct_Field_Type *) SLmalloc (size))) - { - SLfree ((char *) s); - return NULL; - } - SLMEMSET ((char *) f, 0, size); - s->nfields = nfields; - s->fields = f; - - /* By default, all structs will be created with elements set to NULL. I - * do not know whether or not it is better to use SLANG_UNDEFINED_TYPE. - */ - for (i = 0; i < nfields; i++) - f[i].obj.data_type = SLANG_NULL_TYPE; - - return s; -} - -static int push_struct_of_type (unsigned char type, _SLang_Struct_Type *s) -{ - SLang_Object_Type obj; - - obj.data_type = type; - obj.v.struct_val = s; - s->num_refs += 1; - - if (0 == SLang_push (&obj)) - return 0; - - s->num_refs -= 1; - return -1; -} - -int _SLang_push_struct (_SLang_Struct_Type *s) -{ - return push_struct_of_type (SLANG_STRUCT_TYPE, s); -} - -int _SLang_pop_struct (_SLang_Struct_Type **sp) -{ - SLang_Object_Type obj; - SLang_Class_Type *cl; - unsigned char type; - - if (0 != SLang_pop (&obj)) - return -1; - - type = obj.data_type; - if (type != SLANG_STRUCT_TYPE) - { - cl = _SLclass_get_class (type); - if (cl->cl_struct_def == NULL) - { - *sp = NULL; - SLang_free_object (&obj); - SLang_verror (SL_TYPE_MISMATCH, - "Expecting struct type object. Found %s", - cl->cl_name); - return -1; - } - } - - *sp = obj.v.struct_val; - return 0; -} - -static void struct_destroy (unsigned char type, VOID_STAR vs) -{ - (void) type; - _SLstruct_delete_struct (*(_SLang_Struct_Type **) vs); -} - -static int struct_push (unsigned char type, VOID_STAR ptr) -{ - return push_struct_of_type (type, *(_SLang_Struct_Type **) ptr); -} - -static _SLstruct_Field_Type *find_field (_SLang_Struct_Type *s, char *name) -{ - _SLstruct_Field_Type *f, *fmax; - - f = s->fields; - fmax = f + s->nfields; - - while (f < fmax) - { - /* Since both these are slstrings, only compare pointer */ - if (name == f->name) - return f; - - f++; - } - - return NULL; -} - -static _SLstruct_Field_Type *pop_field (_SLang_Struct_Type *s, char *name) -{ - _SLstruct_Field_Type *f; - - f = find_field (s, name); - if (f == NULL) - SLang_verror (SL_SYNTAX_ERROR, "struct has no field named %s", name); - return f; -} - -int SLstruct_create_struct (unsigned int nfields, - char **field_names, - unsigned char *field_types, - VOID_STAR *field_values) -{ - _SLang_Struct_Type *s; - _SLstruct_Field_Type *f; - unsigned int i; - - if (NULL == (s = allocate_struct (nfields))) - return -1; - - f = s->fields; - for (i = 0; i < nfields; i++) - { - unsigned char type; - SLang_Class_Type *cl; - VOID_STAR value; - char *name = field_names [i]; - - if (name == NULL) - { - SLang_verror (SL_INVALID_PARM, "A struct field name cannot be NULL"); - goto return_error; - } - - if (NULL == (f->name = SLang_create_slstring (name))) - goto return_error; - - if ((field_values == NULL) - || (NULL == (value = field_values [i]))) - { - f++; - continue; - } - - type = field_types[i]; - cl = _SLclass_get_class (type); - - if ((-1 == (cl->cl_push (type, value))) - || (-1 == SLang_pop (&f->obj))) - goto return_error; - - f++; - } - - if (0 == _SLang_push_struct (s)) - return 0; - /* drop */ - - return_error: - _SLstruct_delete_struct (s); - return -1; -} - -/* Interpreter interface */ - -int _SLstruct_define_struct (void) -{ - int nfields; - _SLang_Struct_Type *s; - _SLstruct_Field_Type *f; - - if (-1 == SLang_pop_integer (&nfields)) - return -1; - - if (nfields <= 0) - { - SLang_verror (SL_INVALID_PARM, "Number of struct fields must be > 0"); - return -1; - } - - if (NULL == (s = allocate_struct (nfields))) - return -1; - - f = s->fields; - while (nfields) - { - char *name; - - nfields--; - if (-1 == SLang_pop_slstring (&name)) - { - _SLstruct_delete_struct (s); - return -1; - } - f[nfields].name = name; - } - - if (-1 == _SLang_push_struct (s)) - { - _SLstruct_delete_struct (s); - return -1; - } - return 0; -} - -/* Simply make a struct that contains the same fields as struct s. Do not - * duplicate the field values. - */ -static _SLang_Struct_Type *make_struct_shell (_SLang_Struct_Type *s) -{ - _SLang_Struct_Type *new_s; - _SLstruct_Field_Type *new_f, *old_f; - unsigned int i, nfields; - - nfields = s->nfields; - if (NULL == (new_s = allocate_struct (nfields))) - return NULL; - - new_f = new_s->fields; - old_f = s->fields; - - for (i = 0; i < nfields; i++) - { - if (NULL == (new_f[i].name = SLang_create_slstring (old_f[i].name))) - { - _SLstruct_delete_struct (new_s); - return NULL; - } - } - return new_s; -} - -static int struct_init_array_object (unsigned char type, VOID_STAR addr) -{ - SLang_Class_Type *cl; - _SLang_Struct_Type *s; - - cl = _SLclass_get_class (type); - if (NULL == (s = make_struct_shell (cl->cl_struct_def))) - return -1; - - s->num_refs = 1; - *(_SLang_Struct_Type **) addr = s; - return 0; -} - -static int -typedefed_struct_datatype_deref (unsigned char type) -{ - SLang_Class_Type *cl; - _SLang_Struct_Type *s; - - cl = _SLclass_get_class (type); - if (NULL == (s = make_struct_shell (cl->cl_struct_def))) - return -1; - - if (-1 == push_struct_of_type (type, s)) - { - _SLstruct_delete_struct (s); - return -1; - } - - return 0; -} - -static _SLang_Struct_Type *duplicate_struct (_SLang_Struct_Type *s) -{ - _SLang_Struct_Type *new_s; - _SLstruct_Field_Type *new_f, *f, *fmax; - - new_s = make_struct_shell (s); - - if (new_s == NULL) - return NULL; - - f = s->fields; - fmax = f + s->nfields; - new_f = new_s->fields; - - while (f < fmax) - { - SLang_Object_Type *obj; - - obj = &f->obj; - if (obj->data_type != SLANG_UNDEFINED_TYPE) - { - if ((-1 == _SLpush_slang_obj (obj)) - || (-1 == SLang_pop (&new_f->obj))) - { - _SLstruct_delete_struct (new_s); - return NULL; - } - } - new_f++; - f++; - } - - return new_s; -} - -static int struct_dereference (unsigned char type, VOID_STAR addr) -{ - _SLang_Struct_Type *s; - - if (NULL == (s = duplicate_struct (*(_SLang_Struct_Type **) addr))) - return -1; - - if (-1 == push_struct_of_type (type, s)) - { - _SLstruct_delete_struct (s); - return -1; - } - - return 0; -} - -/*{{{ foreach */ - -struct _SLang_Foreach_Context_Type -{ - _SLang_Struct_Type *s; - char *next_field_name; -}; - -static SLang_Foreach_Context_Type * -struct_foreach_open (unsigned char type, unsigned int num) -{ - SLang_Foreach_Context_Type *c; - _SLang_Struct_Type *s; - char *next_name; - - (void) type; - - if (-1 == _SLang_pop_struct (&s)) - return NULL; - - switch (num) - { - case 0: - next_name = SLang_create_slstring ("next"); - break; - - case 1: - if (-1 == SLang_pop_slstring (&next_name)) - next_name = NULL; - break; - - default: - next_name = NULL; - SLang_verror (SL_NOT_IMPLEMENTED, - "'foreach (Struct_Type) using' requires single control value"); - SLdo_pop_n (num); - break; - } - - if (next_name == NULL) - { - _SLstruct_delete_struct (s); - return NULL; - } - - c = (SLang_Foreach_Context_Type *)SLmalloc (sizeof (SLang_Foreach_Context_Type)); - if (c == NULL) - { - _SLstruct_delete_struct (s); - SLang_free_slstring (next_name); - return NULL; - } - memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type)); - - c->next_field_name = next_name; - c->s = s; - - return c; -} - -static void struct_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c) -{ - (void) type; - if (c == NULL) return; - - SLang_free_slstring (c->next_field_name); - if (c->s != NULL) _SLstruct_delete_struct (c->s); - SLfree ((char *) c); -} - -static int struct_foreach (unsigned char type, SLang_Foreach_Context_Type *c) -{ - _SLstruct_Field_Type *f; - _SLang_Struct_Type *next_s; - - (void) type; - - if (c == NULL) - return -1; - - if (c->s == NULL) - return 0; /* done */ - - if (-1 == _SLang_push_struct (c->s)) - return -1; - - /* Now get the next one ready for the next foreach loop */ - - next_s = NULL; - if (NULL != (f = find_field (c->s, c->next_field_name))) - { - SLang_Class_Type *cl; - - cl = _SLclass_get_class (f->obj.data_type); - /* Note that I cannot simply look for SLANG_STRUCT_TYPE since the - * user may have typedefed another struct type. So, look at the - * class methods. - */ - if (cl->cl_foreach_open == struct_foreach_open) - { - next_s = f->obj.v.struct_val; - next_s->num_refs += 1; - } - } - - _SLstruct_delete_struct (c->s); - c->s = next_s; - - /* keep going */ - return 1; -} - -/*}}}*/ - -static int struct_sput (unsigned char type, char *name) -{ - _SLang_Struct_Type *s; - _SLstruct_Field_Type *f; - SLang_Object_Type obj; - - (void) type; - - if (-1 == _SLang_pop_struct (&s)) - return -1; - - if ((NULL == (f = pop_field (s, name))) - || (-1 == SLang_pop (&obj))) - { - _SLstruct_delete_struct (s); - return -1; - } - - SLang_free_object (&f->obj); - f->obj = obj; - _SLstruct_delete_struct (s); - return 0; -} - -static int struct_sget (unsigned char type, char *name) -{ - _SLang_Struct_Type *s; - _SLstruct_Field_Type *f; - int ret; - - (void) type; - - if (-1 == _SLang_pop_struct (&s)) - return -1; - - if (NULL == (f = pop_field (s, name))) - { - _SLstruct_delete_struct (s); - return -1; - } - - ret = _SLpush_slang_obj (&f->obj); - _SLstruct_delete_struct (s); - return ret; -} - -static int struct_typecast - (unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp) -{ - _SLang_Struct_Type **a, **b; - unsigned int i; - - (void) a_type; - (void) b_type; - - a = (_SLang_Struct_Type **) ap; - b = (_SLang_Struct_Type **) bp; - for (i = 0; i < na; i++) - { - b[i] = a[i]; - if (a[i] != NULL) - a[i]->num_refs += 1; - } - - return 1; -} - -int _SLstruct_define_typedef (void) -{ - char *type_name; - _SLang_Struct_Type *s, *s1; - SLang_Class_Type *cl; - - if (-1 == SLang_pop_slstring (&type_name)) - return -1; - - if (-1 == _SLang_pop_struct (&s)) - { - SLang_free_slstring (type_name); - return -1; - } - - if (NULL == (s1 = make_struct_shell (s))) - { - SLang_free_slstring (type_name); - _SLstruct_delete_struct (s); - return -1; - } - - _SLstruct_delete_struct (s); - - if (NULL == (cl = SLclass_allocate_class (type_name))) - { - SLang_free_slstring (type_name); - _SLstruct_delete_struct (s1); - return -1; - } - SLang_free_slstring (type_name); - - cl->cl_struct_def = s1; - cl->cl_init_array_object = struct_init_array_object; - cl->cl_datatype_deref = typedefed_struct_datatype_deref; - cl->cl_destroy = struct_destroy; - cl->cl_push = struct_push; - cl->cl_dereference = struct_dereference; - cl->cl_foreach_open = struct_foreach_open; - cl->cl_foreach_close = struct_foreach_close; - cl->cl_foreach = struct_foreach; - - cl->cl_sget = struct_sget; - cl->cl_sput = struct_sput; - - if (-1 == SLclass_register_class (cl, - SLANG_VOID_TYPE, /* any open slot */ - sizeof (_SLang_Struct_Type), - SLANG_CLASS_TYPE_PTR)) - { - /* FIXME: Priority=low */ - /* There is a memory leak here if this fails... */ - return -1; - } - /* Note: typecast from a user type struct type allowed but not the other - * way. - */ - if (-1 == SLclass_add_typecast (cl->cl_data_type, SLANG_STRUCT_TYPE, struct_typecast, 1)) - return -1; - - return 0; -} - -static int -struct_datatype_deref (unsigned char stype) -{ - (void) stype; - - if (SLang_peek_at_stack () == SLANG_ARRAY_TYPE) - { - SLang_Array_Type *at; - int status; - - if (-1 == SLang_pop_array_of_type (&at, SLANG_STRING_TYPE)) - return -1; - - status = SLstruct_create_struct (at->num_elements, - (char **) at->data, NULL, NULL); - - SLang_free_array (at); - return status; - } - - SLang_push_integer (SLang_Num_Function_Args); - return _SLstruct_define_struct (); -} - -static int register_struct (void) -{ - SLang_Class_Type *cl; - - if (NULL == (cl = SLclass_allocate_class ("Struct_Type"))) - return -1; - - (void) SLclass_set_destroy_function (cl, struct_destroy); - (void) SLclass_set_push_function (cl, struct_push); - cl->cl_dereference = struct_dereference; - cl->cl_datatype_deref = struct_datatype_deref; - - cl->cl_foreach_open = struct_foreach_open; - cl->cl_foreach_close = struct_foreach_close; - cl->cl_foreach = struct_foreach; - - cl->cl_sget = struct_sget; - cl->cl_sput = struct_sput; - - if (-1 == SLclass_register_class (cl, SLANG_STRUCT_TYPE, sizeof (_SLang_Struct_Type), - SLANG_CLASS_TYPE_PTR)) - return -1; - - return 0; -} - -static void get_struct_field_names (_SLang_Struct_Type *s) -{ - SLang_Array_Type *a; - char **data; - int i, nfields; - _SLstruct_Field_Type *f; - - nfields = (int) s->nfields; - - if (NULL == (a = SLang_create_array (SLANG_STRING_TYPE, 0, NULL, &nfields, 1))) - return; - - f = s->fields; - data = (char **) a->data; - for (i = 0; i < nfields; i++) - { - /* Since we are dealing with hashed strings, the next call should not - * fail. If it does, the interpreter will handle it at some other - * level. - */ - data [i] = SLang_create_slstring (f[i].name); - } - - SLang_push_array (a, 1); -} - -static int push_struct_fields (_SLang_Struct_Type *s) -{ - _SLstruct_Field_Type *f, *fmax; - int num; - - f = s->fields; - fmax = f + s->nfields; - - num = 0; - while (fmax > f) - { - fmax--; - if (-1 == _SLpush_slang_obj (&fmax->obj)) - break; - - num++; - } - - return num; -} - -/* Syntax: set_struct_field (s, name, value); */ -static void struct_set_field (void) -{ - _SLang_Struct_Type *s; - _SLstruct_Field_Type *f; - SLang_Object_Type obj; - char *name; - - if (-1 == SLang_pop (&obj)) - return; - - if (-1 == SLang_pop_slstring (&name)) - { - SLang_free_object (&obj); - return; - } - - if (-1 == _SLang_pop_struct (&s)) - { - SLang_free_slstring (name); - SLang_free_object (&obj); - return; - } - - if (NULL == (f = pop_field (s, name))) - { - _SLstruct_delete_struct (s); - SLang_free_slstring (name); - SLang_free_object (&obj); - return; - } - - SLang_free_object (&f->obj); - f->obj = obj; - - _SLstruct_delete_struct (s); - SLang_free_slstring (name); -} - -/* Syntax: set_struct_fields (s, values....); */ -static void set_struct_fields (void) -{ - unsigned int n; - _SLang_Struct_Type *s; - _SLstruct_Field_Type *f; - - n = (unsigned int) SLang_Num_Function_Args; - - if (-1 == SLreverse_stack (n)) - return; - - n--; - if (-1 == _SLang_pop_struct (&s)) - { - SLdo_pop_n (n); - return; - } - - if (n > s->nfields) - { - SLdo_pop_n (n); - SLang_verror (SL_INVALID_PARM, "Too many values for structure"); - _SLstruct_delete_struct (s); - return; - } - - f = s->fields; - while (n > 0) - { - SLang_Object_Type obj; - - if (-1 == SLang_pop (&obj)) - break; - - SLang_free_object (&f->obj); - f->obj = obj; - - f++; - n--; - } - - _SLstruct_delete_struct (s); -} - -static void get_struct_field (char *name) -{ - (void) struct_sget (0, name); -} - -static int is_struct_type (void) -{ - SLang_Object_Type obj; - unsigned char type; - int status; - - if (-1 == SLang_pop (&obj)) - return -1; - - type = obj.data_type; - if (type == SLANG_STRUCT_TYPE) - status = 1; - else - status = (NULL != _SLclass_get_class (type)->cl_struct_def); - SLang_free_object (&obj); - return status; -} - - -static SLang_Intrin_Fun_Type Struct_Table [] = -{ - MAKE_INTRINSIC_1("get_struct_field_names", get_struct_field_names, SLANG_VOID_TYPE, SLANG_STRUCT_TYPE), - MAKE_INTRINSIC_1("get_struct_field", get_struct_field, SLANG_VOID_TYPE, SLANG_STRING_TYPE), - MAKE_INTRINSIC_1("_push_struct_field_values", push_struct_fields, SLANG_INT_TYPE, SLANG_STRUCT_TYPE), - MAKE_INTRINSIC_0("set_struct_field", struct_set_field, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("set_struct_fields", set_struct_fields, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("is_struct_type", is_struct_type, SLANG_INT_TYPE), - /* MAKE_INTRINSIC_I("_create_struct", create_struct, SLANG_VOID_TYPE), */ - SLANG_END_INTRIN_FUN_TABLE -}; - -int _SLstruct_init (void) -{ - if ((-1 == SLadd_intrin_fun_table (Struct_Table, NULL)) - || (-1 == register_struct ())) - return -1; - - return 0; -} - -void _SLstruct_pop_args (int *np) -{ - SLang_Array_Type *at; - int i, n; - _SLang_Struct_Type **data; - - n = *np; - - if (n < 0) - { - SLang_Error = SL_INVALID_PARM; - return; - } - - data = (_SLang_Struct_Type **) SLmalloc ((n + 1) * sizeof (_SLang_Struct_Type *)); - if (data == NULL) - { - SLdo_pop_n (n); - return; - } - - memset ((char *)data, 0, n * sizeof (_SLang_Struct_Type *)); - - i = n; - while (i > 0) - { - _SLang_Struct_Type *s; - _SLstruct_Field_Type *f; - - i--; - - if (NULL == (s = allocate_struct (1))) - goto return_error; - - data[i] = s; - s->num_refs += 1; /* keeping a copy */ - - f = s->fields; - if (NULL == (f->name = SLang_create_slstring ("value"))) - goto return_error; - - if (-1 == SLang_pop (&f->obj)) - goto return_error; - } - - if (NULL == (at = SLang_create_array (SLANG_STRUCT_TYPE, 0, - (VOID_STAR) data, &n, 1))) - goto return_error; - - (void) SLang_push_array (at, 1); - return; - - return_error: - for (i = 0; i < n; i++) - { - _SLang_Struct_Type *s; - - s = data[i]; - if (s != NULL) - _SLstruct_delete_struct (s); - } - - SLfree ((char *) data); -} - -void _SLstruct_push_args (SLang_Array_Type *at) -{ - _SLang_Struct_Type **sp; - unsigned int num; - - if (at->data_type != SLANG_STRUCT_TYPE) - { - SLang_Error = SL_TYPE_MISMATCH; - return; - } - - sp = (_SLang_Struct_Type **) at->data; - num = at->num_elements; - - while ((SLang_Error == 0) && (num > 0)) - { - _SLang_Struct_Type *s; - - num--; - if (NULL == (s = *sp++)) - { - SLang_push_null (); - continue; - } - - /* I should check to see if the value field is present, but... */ - (void) _SLpush_slang_obj (&s->fields->obj); - } -} diff --git a/mdk-stage1/slang/sltermin.c b/mdk-stage1/slang/sltermin.c deleted file mode 100644 index f9c64f0b2..000000000 --- a/mdk-stage1/slang/sltermin.c +++ /dev/null @@ -1,1155 +0,0 @@ -/* This file contains enough terminfo reading capabilities sufficient for - * the slang SLtt interface. - */ - -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -/* - * The majority of the comments found in the file were taken from the - * term(4) man page on an SGI. - */ - -/* Short integers are stored in two 8-bit bytes. The first byte contains - * the least significant 8 bits of the value, and the second byte contains - * the most significant 8 bits. (Thus, the value represented is - * 256*second+first.) The value -1 is represented by 0377,0377, and the - * value -2 is represented by 0376,0377; other negative values are illegal. - * The -1 generally means that a capability is missing from this terminal. - * The -2 means that the capability has been cancelled in the terminfo - * source and also is to be considered missing. - */ - -static int make_integer (unsigned char *buf) -{ - register int lo, hi; - lo = (int) *buf++; hi = (int) *buf; - if (hi == 0377) - { - if (lo == 0377) return -1; - if (lo == 0376) return -2; - } - return lo + 256 * hi; -} - -/* - * The compiled file is created from the source file descriptions of the - * terminals (see the -I option of infocmp) by using the terminfo compiler, - * tic, and read by the routine setupterm [see curses(3X).] The file is - * divided into six parts in the following order: the header, terminal - * names, boolean flags, numbers, strings, and string table. - * - * The header section begins the file. This section contains six short - * integers in the format described below. These integers are (1) the magic - * number (octal 0432); (2) the size, in bytes, of the names section; (3) - * the number of bytes in the boolean section; (4) the number of short - * integers in the numbers section; (5) the number of offsets (short - * integers) in the strings section; (6) the size, in bytes, of the string - * table. - */ - -#define MAGIC 0432 - -/* In this structure, all char * fields are malloced EXCEPT if the - * structure is SLTERMCAP. In that case, only terminal_names is malloced - * and the other fields are pointers into it. - */ -struct _SLterminfo_Type -{ -#define SLTERMINFO 1 -#define SLTERMCAP 2 - unsigned int flags; - - unsigned int name_section_size; - char *terminal_names; - - unsigned int boolean_section_size; - unsigned char *boolean_flags; - - unsigned int num_numbers; - unsigned char *numbers; - - unsigned int num_string_offsets; - unsigned char *string_offsets; - - unsigned int string_table_size; - char *string_table; - -}; - -static char *tcap_getstr (char *, SLterminfo_Type *); -static int tcap_getnum (char *, SLterminfo_Type *); -static int tcap_getflag (char *, SLterminfo_Type *); -static int tcap_getent (char *, SLterminfo_Type *); - -static FILE *open_terminfo (char *file, SLterminfo_Type *h) -{ - FILE *fp; - unsigned char buf[12]; - - /* Alan Cox reported a security problem here if the application using the - * library is setuid. So, I need to make sure open the file as a normal - * user. Unfortunately, there does not appear to be a portable way of - * doing this, so I am going to use 'setfsgid' and 'setfsuid', which - * are not portable. - * - * I will also look into the use of setreuid, seteuid and setregid, setegid. - * FIXME: Priority=medium - */ - fp = fopen (file, "rb"); - if (fp == NULL) return NULL; - - if ((12 == fread ((char *) buf, 1, 12, fp) && (MAGIC == make_integer (buf)))) - { - h->name_section_size = make_integer (buf + 2); - h->boolean_section_size = make_integer (buf + 4); - h->num_numbers = make_integer (buf + 6); - h->num_string_offsets = make_integer (buf + 8); - h->string_table_size = make_integer (buf + 10); - } - else - { - fclose (fp); - fp = NULL; - } - return fp; -} - -/* - * The terminal names section comes next. It contains the first line of the - * terminfo description, listing the various names for the terminal, - * separated by the bar ( | ) character (see term(5)). The section is - * terminated with an ASCII NUL character. - */ - -/* returns pointer to malloced space */ -static unsigned char *read_terminfo_section (FILE *fp, unsigned int size) -{ - char *s; - - if (NULL == (s = (char *) SLmalloc (size))) return NULL; - if (size != fread (s, 1, size, fp)) - { - SLfree (s); - return NULL; - } - return (unsigned char *) s; -} - -static char *read_terminal_names (FILE *fp, SLterminfo_Type *t) -{ - return t->terminal_names = (char *) read_terminfo_section (fp, t->name_section_size); -} - -/* - * The boolean flags have one byte for each flag. This byte is either 0 or - * 1 as the flag is present or absent. The value of 2 means that the flag - * has been cancelled. The capabilities are in the same order as the file - * . - */ - -static unsigned char *read_boolean_flags (FILE *fp, SLterminfo_Type *t) -{ - /* Between the boolean section and the number section, a null byte is - * inserted, if necessary, to ensure that the number section begins on an - * even byte offset. All short integers are aligned on a short word - * boundary. - */ - - unsigned int size = (t->name_section_size + t->boolean_section_size) % 2; - size += t->boolean_section_size; - - return t->boolean_flags = read_terminfo_section (fp, size); -} - -/* - * The numbers section is similar to the boolean flags section. Each - * capability takes up two bytes, and is stored as a short integer. If the - * value represented is -1 or -2, the capability is taken to be missing. - */ - -static unsigned char *read_numbers (FILE *fp, SLterminfo_Type *t) -{ - return t->numbers = read_terminfo_section (fp, 2 * t->num_numbers); -} - -/* The strings section is also similar. Each capability is stored as a - * short integer, in the format above. A value of -1 or -2 means the - * capability is missing. Otherwise, the value is taken as an offset from - * the beginning of the string table. Special characters in ^X or \c - * notation are stored in their interpreted form, not the printing - * representation. Padding information ($) and parameter information - * (%x) are stored intact in uninterpreted form. - */ - -static unsigned char *read_string_offsets (FILE *fp, SLterminfo_Type *t) -{ - return t->string_offsets = (unsigned char *) read_terminfo_section (fp, 2 * t->num_string_offsets); -} - -/* The final section is the string table. It contains all the values of - * string capabilities referenced in the string section. Each string is - * null terminated. - */ - -static char *read_string_table (FILE *fp, SLterminfo_Type *t) -{ - return t->string_table = (char *) read_terminfo_section (fp, t->string_table_size); -} - -/* - * Compiled terminfo(4) descriptions are placed under the directory - * /usr/share/lib/terminfo. In order to avoid a linear search of a huge - * UNIX system directory, a two-level scheme is used: - * /usr/share/lib/terminfo/c/name where name is the name of the terminal, - * and c is the first character of name. Thus, att4425 can be found in the - * file /usr/share/lib/terminfo/a/att4425. Synonyms for the same terminal - * are implemented by multiple links to the same compiled file. - */ - -#define MAX_TI_DIRS 7 -static char *Terminfo_Dirs [MAX_TI_DIRS] = -{ - NULL, /* $HOME/.terminfo */ - NULL, /* $TERMINFO */ - "/usr/share/terminfo", - "/usr/lib/terminfo", - "/usr/share/lib/terminfo", - "/etc/terminfo", - "/usr/local/lib/terminfo" -}; - -SLterminfo_Type *_SLtt_tigetent (char *term) -{ - char *tidir; - int i; - FILE *fp = NULL; - char file[1024]; - static char home_ti [1024]; - char *home; - SLterminfo_Type *ti; - - if ( - (term == NULL) -#ifdef SLANG_UNTIC - && (SLang_Untic_Terminfo_File == NULL) -#endif - ) - return NULL; - - if (NULL == (ti = (SLterminfo_Type *) SLmalloc (sizeof (SLterminfo_Type)))) - { - return NULL; - } - -#ifdef SLANG_UNTIC - if (SLang_Untic_Terminfo_File != NULL) - { - fp = open_terminfo (SLang_Untic_Terminfo_File, ti); - goto fp_open_label; - } - else -#endif - /* If we are on a termcap based system, use termcap */ - if (0 == tcap_getent (term, ti)) return ti; - - if (NULL != (home = getenv ("HOME"))) - { - strncpy (home_ti, home, sizeof (home_ti) - 11); - home_ti [sizeof(home_ti) - 11] = 0; - strcat (home_ti, "/.terminfo"); - Terminfo_Dirs [0] = home_ti; - } - - Terminfo_Dirs[1] = getenv ("TERMINFO"); - i = 0; - while (i < MAX_TI_DIRS) - { - tidir = Terminfo_Dirs[i]; - if ((tidir != NULL) - && (sizeof (file) > strlen (tidir) + 2 + strlen (term))) - { - sprintf (file, "%s/%c/%s", tidir, *term, term); - if (NULL != (fp = open_terminfo (file, ti))) - break; - } - i++; - } -#ifdef SLANG_UNTIC - fp_open_label: -#endif - - if (fp != NULL) - { - if (NULL != read_terminal_names (fp, ti)) - { - if (NULL != read_boolean_flags (fp, ti)) - { - if (NULL != read_numbers (fp, ti)) - { - if (NULL != read_string_offsets (fp, ti)) - { - if (NULL != read_string_table (fp, ti)) - { - /* success */ - fclose (fp); - ti->flags = SLTERMINFO; - return ti; - } - SLfree ((char *)ti->string_offsets); - } - SLfree ((char *)ti->numbers); - } - SLfree ((char *)ti->boolean_flags); - } - SLfree ((char *)ti->terminal_names); - } - fclose (fp); - } - - SLfree ((char *)ti); - return NULL; -} - -#ifdef SLANG_UNTIC -# define UNTIC_COMMENT(x) ,x -#else -# define UNTIC_COMMENT(x) -#endif - -typedef struct -{ - char name[3]; - int offset; -#ifdef SLANG_UNTIC - char *comment; -#endif -} -Tgetstr_Map_Type; - -/* I need to add: K1-5, %0-5(not important), @8, &8... */ -static Tgetstr_Map_Type Tgetstr_Map [] = -{ - {"!1", 212 UNTIC_COMMENT("shifted key")}, - {"!2", 213 UNTIC_COMMENT("shifted key")}, - {"!3", 214 UNTIC_COMMENT("shifted key")}, - {"#1", 198 UNTIC_COMMENT("shifted key")}, - {"#2", 199 UNTIC_COMMENT("Key S-Home")}, - {"#3", 200 UNTIC_COMMENT("Key S-Insert")}, - {"#4", 201 UNTIC_COMMENT("Key S-Left")}, - {"%0", 177 UNTIC_COMMENT("redo key")}, - {"%1", 168 UNTIC_COMMENT("help key")}, - {"%2", 169 UNTIC_COMMENT("mark key")}, - {"%3", 170 UNTIC_COMMENT("message key")}, - {"%4", 171 UNTIC_COMMENT("move key")}, - {"%5", 172 UNTIC_COMMENT("next key")}, - {"%6", 173 UNTIC_COMMENT("open key")}, - {"%7", 174 UNTIC_COMMENT("options key")}, - {"%8", 175 UNTIC_COMMENT("previous key")}, - {"%9", 176 UNTIC_COMMENT("print key")}, - {"%a", 202 UNTIC_COMMENT("shifted key")}, - {"%b", 203 UNTIC_COMMENT("shifted key")}, - {"%c", 204 UNTIC_COMMENT("Key S-Next")}, - {"%d", 205 UNTIC_COMMENT("shifted key")}, - {"%e", 206 UNTIC_COMMENT("Key S-Previous")}, - {"%f", 207 UNTIC_COMMENT("shifted key")}, - {"%g", 208 UNTIC_COMMENT("shifted key")}, - {"%h", 209 UNTIC_COMMENT("shifted key")}, - {"%i", 210 UNTIC_COMMENT("Key S-Right")}, - {"%j", 211 UNTIC_COMMENT("shifted key")}, - {"&0", 187 UNTIC_COMMENT("shifted key")}, - {"&1", 178 UNTIC_COMMENT("reference key")}, - {"&2", 179 UNTIC_COMMENT("refresh key")}, - {"&3", 180 UNTIC_COMMENT("replace key")}, - {"&4", 181 UNTIC_COMMENT("restart key")}, - {"&5", 182 UNTIC_COMMENT("resume key")}, - {"&6", 183 UNTIC_COMMENT("save key")}, - {"&7", 184 UNTIC_COMMENT("suspend key")}, - {"&8", 185 UNTIC_COMMENT("undo key")}, - {"&9", 186 UNTIC_COMMENT("shifted key")}, - {"*0", 197 UNTIC_COMMENT("shifted key")}, - {"*1", 188 UNTIC_COMMENT("shifted key")}, - {"*2", 189 UNTIC_COMMENT("shifted key")}, - {"*3", 190 UNTIC_COMMENT("shifted key")}, - {"*4", 191 UNTIC_COMMENT("Key S-Delete")}, - {"*5", 192 UNTIC_COMMENT("shifted key")}, - {"*6", 193 UNTIC_COMMENT("select key")}, - {"*7", 194 UNTIC_COMMENT("Key S-End")}, - {"*8", 195 UNTIC_COMMENT("shifted key")}, - {"*9", 196 UNTIC_COMMENT("shifted key")}, - {"@0", 167 UNTIC_COMMENT("find key")}, - {"@1", 158 UNTIC_COMMENT("begin key")}, - {"@2", 159 UNTIC_COMMENT("cancel key")}, - {"@3", 160 UNTIC_COMMENT("close key")}, - {"@4", 161 UNTIC_COMMENT("command key")}, - {"@5", 162 UNTIC_COMMENT("copy key")}, - {"@6", 163 UNTIC_COMMENT("create key")}, - {"@7", 164 UNTIC_COMMENT("Key End")}, - {"@8", 165 UNTIC_COMMENT("enter/send key")}, - {"@9", 166 UNTIC_COMMENT("exit key")}, - {"AB", 360 UNTIC_COMMENT("set ANSI color background")}, - {"AF", 359 UNTIC_COMMENT("set ANSI color foreground")}, - {"AL", 110 UNTIC_COMMENT("parm_insert_line")}, - {"CC", 9 UNTIC_COMMENT("terminal settable cmd character in prototype !?")}, - {"CM", 15 UNTIC_COMMENT("memory relative cursor addressing")}, - {"CW", 277 UNTIC_COMMENT("define a window #1 from #2, #3 to #4, #5")}, - {"DC", 105 UNTIC_COMMENT("delete #1 chars")}, - {"DI", 280 UNTIC_COMMENT("dial number #1")}, - {"DK", 275 UNTIC_COMMENT("display clock at (#1,#2)")}, - {"DL", 106 UNTIC_COMMENT("parm_delete_line")}, - {"DO", 107 UNTIC_COMMENT("down #1 lines")}, - {"F1", 216 UNTIC_COMMENT("key_f11")}, - {"F2", 217 UNTIC_COMMENT("key_f12")}, - {"F3", 218 UNTIC_COMMENT("key_f13")}, - {"F4", 219 UNTIC_COMMENT("key_f14")}, - {"F5", 220 UNTIC_COMMENT("key_f15")}, - {"F6", 221 UNTIC_COMMENT("key_f16")}, - {"F7", 222 UNTIC_COMMENT("key_f17")}, - {"F8", 223 UNTIC_COMMENT("key_f18")}, - {"F9", 224 UNTIC_COMMENT("key_f19")}, - {"FA", 225 UNTIC_COMMENT("key_f20")}, - {"FB", 226 UNTIC_COMMENT("F21 function key")}, - {"FC", 227 UNTIC_COMMENT("F22 function key")}, - {"FD", 228 UNTIC_COMMENT("F23 function key")}, - {"FE", 229 UNTIC_COMMENT("F24 function key")}, - {"FF", 230 UNTIC_COMMENT("F25 function key")}, - {"FG", 231 UNTIC_COMMENT("F26 function key")}, - {"FH", 232 UNTIC_COMMENT("F27 function key")}, - {"FI", 233 UNTIC_COMMENT("F28 function key")}, - {"FJ", 234 UNTIC_COMMENT("F29 function key")}, - {"FK", 235 UNTIC_COMMENT("F30 function key")}, - {"FL", 236 UNTIC_COMMENT("F31 function key")}, - {"FM", 237 UNTIC_COMMENT("F32 function key")}, - {"FN", 238 UNTIC_COMMENT("F33 function key")}, - {"FO", 239 UNTIC_COMMENT("F34 function key")}, - {"FP", 240 UNTIC_COMMENT("F35 function key")}, - {"FQ", 241 UNTIC_COMMENT("F36 function key")}, - {"FR", 242 UNTIC_COMMENT("F37 function key")}, - {"FS", 243 UNTIC_COMMENT("F38 function key")}, - {"FT", 244 UNTIC_COMMENT("F39 function key")}, - {"FU", 245 UNTIC_COMMENT("F40 function key")}, - {"FV", 246 UNTIC_COMMENT("F41 function key")}, - {"FW", 247 UNTIC_COMMENT("F42 function key")}, - {"FX", 248 UNTIC_COMMENT("F43 function key")}, - {"FY", 249 UNTIC_COMMENT("F44 function key")}, - {"FZ", 250 UNTIC_COMMENT("F45 function key")}, - {"Fa", 251 UNTIC_COMMENT("F46 function key")}, - {"Fb", 252 UNTIC_COMMENT("F47 function key")}, - {"Fc", 253 UNTIC_COMMENT("F48 function key")}, - {"Fd", 254 UNTIC_COMMENT("F49 function key")}, - {"Fe", 255 UNTIC_COMMENT("F50 function key")}, - {"Ff", 256 UNTIC_COMMENT("F51 function key")}, - {"Fg", 257 UNTIC_COMMENT("F52 function key")}, - {"Fh", 258 UNTIC_COMMENT("F53 function key")}, - {"Fi", 259 UNTIC_COMMENT("F54 function key")}, - {"Fj", 260 UNTIC_COMMENT("F55 function key")}, - {"Fk", 261 UNTIC_COMMENT("F56 function key")}, - {"Fl", 262 UNTIC_COMMENT("F57 function key")}, - {"Fm", 263 UNTIC_COMMENT("F58 function key")}, - {"Fn", 264 UNTIC_COMMENT("F59 function key")}, - {"Fo", 265 UNTIC_COMMENT("F60 function key")}, - {"Fp", 266 UNTIC_COMMENT("F61 function key")}, - {"Fq", 267 UNTIC_COMMENT("F62 function key")}, - {"Fr", 268 UNTIC_COMMENT("F63 function key")}, - {"G1", 400 UNTIC_COMMENT("single upper right")}, - {"G2", 398 UNTIC_COMMENT("single upper left")}, - {"G3", 399 UNTIC_COMMENT("single lower left")}, - {"G4", 401 UNTIC_COMMENT("single lower right")}, - {"GC", 408 UNTIC_COMMENT("single intersection")}, - {"GD", 405 UNTIC_COMMENT("tee pointing down")}, - {"GH", 406 UNTIC_COMMENT("single horizontal line")}, - {"GL", 403 UNTIC_COMMENT("tee pointing left")}, - {"GR", 402 UNTIC_COMMENT("tee pointing right")}, - {"GU", 404 UNTIC_COMMENT("tee pointing up")}, - {"GV", 407 UNTIC_COMMENT("single vertical line")}, - {"Gm", 358 UNTIC_COMMENT("Curses should get button events")}, - {"HU", 279 UNTIC_COMMENT("hang-up phone")}, - {"IC", 108 UNTIC_COMMENT("insert #1 chars")}, - {"Ic", 299 UNTIC_COMMENT("initialize color #1 to (#2,#3,#4)")}, - {"Ip", 300 UNTIC_COMMENT("Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)")}, - {"K1", 139 UNTIC_COMMENT("upper left of keypad")}, - {"K2", 141 UNTIC_COMMENT("center of keypad")}, - {"K3", 140 UNTIC_COMMENT("upper right of keypad")}, - {"K4", 142 UNTIC_COMMENT("lower left of keypad")}, - {"K5", 143 UNTIC_COMMENT("lower right of keypad")}, - {"Km", 355 UNTIC_COMMENT("Mouse event has occurred")}, - {"LE", 111 UNTIC_COMMENT("move #1 chars to the left")}, - {"LF", 157 UNTIC_COMMENT("turn off soft labels")}, - {"LO", 156 UNTIC_COMMENT("turn on soft labels")}, - {"Lf", 273 UNTIC_COMMENT("label format")}, - {"MC", 270 UNTIC_COMMENT("clear right and left soft margins")}, - {"ML", 271 UNTIC_COMMENT("set left soft margin")}, - {"ML", 368 UNTIC_COMMENT("Set both left and right margins to #1, #2")}, - {"MR", 272 UNTIC_COMMENT("set right soft margin")}, - {"MT", 369 UNTIC_COMMENT("Sets both top and bottom margins to #1, #2")}, - {"Mi", 356 UNTIC_COMMENT("Mouse status information")}, - {"PA", 285 UNTIC_COMMENT("pause for 2-3 seconds")}, - {"PU", 283 UNTIC_COMMENT("select pulse dialling")}, - {"QD", 281 UNTIC_COMMENT("dial number #1 without checking")}, - {"RA", 152 UNTIC_COMMENT("turn off automatic margins")}, - {"RC", 276 UNTIC_COMMENT("remove clock")}, - {"RF", 215 UNTIC_COMMENT("send next input char (for ptys)")}, - {"RI", 112 UNTIC_COMMENT("parm_right_cursor")}, - {"RQ", 357 UNTIC_COMMENT("Request mouse position")}, - {"RX", 150 UNTIC_COMMENT("turn off xon/xoff handshaking")}, - {"S1", 378 UNTIC_COMMENT("Display PC character")}, - {"S2", 379 UNTIC_COMMENT("Enter PC character display mode")}, - {"S3", 380 UNTIC_COMMENT("Exit PC character display mode")}, - {"S4", 381 UNTIC_COMMENT("Enter PC scancode mode")}, - {"S5", 382 UNTIC_COMMENT("Exit PC scancode mode")}, - {"S6", 383 UNTIC_COMMENT("PC terminal options")}, - {"S7", 384 UNTIC_COMMENT("Escape for scancode emulation")}, - {"S8", 385 UNTIC_COMMENT("Alternate escape for scancode emulation")}, - {"SA", 151 UNTIC_COMMENT("turn on automatic margins")}, - {"SC", 274 UNTIC_COMMENT("set clock, #1 hrs #2 mins #3 secs")}, - {"SF", 109 UNTIC_COMMENT("scroll forward #1 lines")}, - {"SR", 113 UNTIC_COMMENT("scroll back #1 lines")}, - {"SX", 149 UNTIC_COMMENT("turn on xon/xoff handshaking")}, - {"Sb", 303 UNTIC_COMMENT("set background (color)")}, - {"Sf", 302 UNTIC_COMMENT("set foreground (color)")}, - {"TO", 282 UNTIC_COMMENT("select touch tone dialing")}, - {"UP", 114 UNTIC_COMMENT("up #1 lines")}, - {"WA", 286 UNTIC_COMMENT("wait for dial-tone")}, - {"WG", 278 UNTIC_COMMENT("go to window #1")}, - {"XF", 154 UNTIC_COMMENT("XOFF character")}, - {"XN", 153 UNTIC_COMMENT("XON character")}, - {"Xh", 386 UNTIC_COMMENT("Enter horizontal highlight mode")}, - {"Xl", 387 UNTIC_COMMENT("Enter left highlight mode")}, - {"Xo", 388 UNTIC_COMMENT("Enter low highlight mode")}, - {"Xr", 389 UNTIC_COMMENT("Enter right highlight mode")}, - {"Xt", 390 UNTIC_COMMENT("Enter top highlight mode")}, - {"Xv", 391 UNTIC_COMMENT("Enter vertical highlight mode")}, - {"Xy", 370 UNTIC_COMMENT("Repeat bit image cell #1 #2 times")}, - {"YZ", 377 UNTIC_COMMENT("Set page length to #1 lines")}, - {"Yv", 372 UNTIC_COMMENT("Move to beginning of same row")}, - {"Yw", 373 UNTIC_COMMENT("Give name for color #1")}, - {"Yx", 374 UNTIC_COMMENT("Define rectangualar bit image region")}, - {"Yy", 375 UNTIC_COMMENT("End a bit-image region")}, - {"Yz", 376 UNTIC_COMMENT("Change to ribbon color #1")}, - {"ZA", 304 UNTIC_COMMENT("Change number of characters per inch")}, - {"ZB", 305 UNTIC_COMMENT("Change number of lines per inch")}, - {"ZC", 306 UNTIC_COMMENT("Change horizontal resolution")}, - {"ZD", 307 UNTIC_COMMENT("Change vertical resolution")}, - {"ZE", 308 UNTIC_COMMENT("Define a character")}, - {"ZF", 309 UNTIC_COMMENT("Enter double-wide mode")}, - {"ZG", 310 UNTIC_COMMENT("Enter draft-quality mode")}, - {"ZH", 311 UNTIC_COMMENT("Enter italic mode")}, - {"ZI", 312 UNTIC_COMMENT("Start leftward carriage motion")}, - {"ZJ", 313 UNTIC_COMMENT("Start micro-motion mode")}, - {"ZK", 314 UNTIC_COMMENT("Enter NLQ mode")}, - {"ZL", 315 UNTIC_COMMENT("Wnter normal-quality mode")}, - {"ZM", 316 UNTIC_COMMENT("Enter shadow-print mode")}, - {"ZN", 317 UNTIC_COMMENT("Enter subscript mode")}, - {"ZO", 318 UNTIC_COMMENT("Enter superscript mode")}, - {"ZP", 319 UNTIC_COMMENT("Start upward carriage motion")}, - {"ZQ", 320 UNTIC_COMMENT("End double-wide mode")}, - {"ZR", 321 UNTIC_COMMENT("End italic mode")}, - {"ZS", 322 UNTIC_COMMENT("End left-motion mode")}, - {"ZT", 323 UNTIC_COMMENT("End micro-motion mode")}, - {"ZU", 324 UNTIC_COMMENT("End shadow-print mode")}, - {"ZV", 325 UNTIC_COMMENT("End subscript mode")}, - {"ZW", 326 UNTIC_COMMENT("End superscript mode")}, - {"ZX", 327 UNTIC_COMMENT("End reverse character motion")}, - {"ZY", 328 UNTIC_COMMENT("Like column_address in micro mode")}, - {"ZZ", 329 UNTIC_COMMENT("Like cursor_down in micro mode")}, - {"Za", 330 UNTIC_COMMENT("Like cursor_left in micro mode")}, - {"Zb", 331 UNTIC_COMMENT("Like cursor_right in micro mode")}, - {"Zc", 332 UNTIC_COMMENT("Like row_address in micro mode")}, - {"Zd", 333 UNTIC_COMMENT("Like cursor_up in micro mode")}, - {"Ze", 334 UNTIC_COMMENT("Match software bits to print-head pins")}, - {"Zf", 335 UNTIC_COMMENT("Like parm_down_cursor in micro mode")}, - {"Zg", 336 UNTIC_COMMENT("Like parm_left_cursor in micro mode")}, - {"Zh", 337 UNTIC_COMMENT("Like parm_right_cursor in micro mode")}, - {"Zi", 338 UNTIC_COMMENT("Like parm_up_cursor in micro mode")}, - {"Zj", 339 UNTIC_COMMENT("Select character set")}, - {"Zk", 340 UNTIC_COMMENT("Set bottom margin at current line")}, - {"Zl", 341 UNTIC_COMMENT("Set bottom margin at line #1 or #2 lines from bottom")}, - {"Zm", 342 UNTIC_COMMENT("Set left (right) margin at column #1 (#2)")}, - {"Zn", 343 UNTIC_COMMENT("Set right margin at column #1")}, - {"Zo", 344 UNTIC_COMMENT("Set top margin at current line")}, - {"Zp", 345 UNTIC_COMMENT("Set top (bottom) margin at row #1 (#2)")}, - {"Zq", 346 UNTIC_COMMENT("Start printing bit image braphics")}, - {"Zr", 347 UNTIC_COMMENT("Start character set definition")}, - {"Zs", 348 UNTIC_COMMENT("Stop printing bit image graphics")}, - {"Zt", 349 UNTIC_COMMENT("End definition of character aet")}, - {"Zu", 350 UNTIC_COMMENT("List of subscriptable characters")}, - {"Zv", 351 UNTIC_COMMENT("List of superscriptable characters")}, - {"Zw", 352 UNTIC_COMMENT("Printing any of these chars causes CR")}, - {"Zx", 353 UNTIC_COMMENT("No motion for subsequent character")}, - {"Zy", 354 UNTIC_COMMENT("List of character set names")}, - {"Zz", 371 UNTIC_COMMENT("Move to next row of the bit image")}, - {"ac", 146 UNTIC_COMMENT("acs_chars")}, - {"ae", 38 UNTIC_COMMENT("exit_alt_charset_mode")}, - {"al", 53 UNTIC_COMMENT("insert line")}, - {"as", 25 UNTIC_COMMENT("enter_alt_charset_mode")}, - {"bc", 395 UNTIC_COMMENT("move left, if not ^H")}, - {"bl", 1 UNTIC_COMMENT("audible signal (bell)")}, - {"bt", 0 UNTIC_COMMENT("back tab")}, - {"bx", 411 UNTIC_COMMENT("box chars primary set")}, - {"cb", 269 UNTIC_COMMENT("Clear to beginning of line")}, - {"cd", 7 UNTIC_COMMENT("clear to end of screen")}, - {"ce", 6 UNTIC_COMMENT("clr_eol")}, - {"ch", 8 UNTIC_COMMENT("horizontal position #1, absolute")}, - {"ci", 363 UNTIC_COMMENT("Init sequence for multiple codesets")}, - {"cl", 5 UNTIC_COMMENT("clear screen and home cursor")}, - {"cm", 10 UNTIC_COMMENT("move to row #1 columns #2")}, - {"cr", 2 UNTIC_COMMENT("carriage return")}, - {"cs", 3 UNTIC_COMMENT("change region to line #1 to line #2")}, - {"ct", 4 UNTIC_COMMENT("clear all tab stops")}, - {"cv", 127 UNTIC_COMMENT("vertical position #1 absolute")}, - {"dc", 21 UNTIC_COMMENT("delete character")}, - {"dl", 22 UNTIC_COMMENT("delete line")}, - {"dm", 29 UNTIC_COMMENT("enter delete mode")}, - {"do", 11 UNTIC_COMMENT("down one line")}, - {"ds", 23 UNTIC_COMMENT("disable status line")}, - {"dv", 362 UNTIC_COMMENT("Indicate language/codeset support")}, - {"eA", 155 UNTIC_COMMENT("enable alternate char set")}, - {"ec", 37 UNTIC_COMMENT("erase #1 characters")}, - {"ed", 41 UNTIC_COMMENT("end delete mode")}, - {"ei", 42 UNTIC_COMMENT("exit insert mode")}, - {"ff", 46 UNTIC_COMMENT("hardcopy terminal page eject")}, - {"fh", 284 UNTIC_COMMENT("flash switch hook")}, - {"fs", 47 UNTIC_COMMENT("return from status line")}, - {"hd", 24 UNTIC_COMMENT("half a line down")}, - {"ho", 12 UNTIC_COMMENT("home cursor (if no cup)")}, - {"hu", 137 UNTIC_COMMENT("half a line up")}, - {"i1", 48 UNTIC_COMMENT("initialization string")}, - {"i2", 392 UNTIC_COMMENT("secondary initialization string")}, - {"i3", 50 UNTIC_COMMENT("initialization string")}, - {"iP", 138 UNTIC_COMMENT("path name of program for initialization")}, - {"ic", 52 UNTIC_COMMENT("insert character")}, - {"if", 51 UNTIC_COMMENT("name of initialization file")}, - {"im", 31 UNTIC_COMMENT("enter insert mode")}, - {"ip", 54 UNTIC_COMMENT("insert padding after inserted character")}, - {"is", 49 UNTIC_COMMENT("initialization string")}, - {"k0", 65 UNTIC_COMMENT("F0 function key")}, - {"k1", 66 UNTIC_COMMENT("F1 function key")}, - {"k2", 68 UNTIC_COMMENT("F2 function key")}, - {"k3", 69 UNTIC_COMMENT("F3 function key")}, - {"k4", 70 UNTIC_COMMENT("F4 function key")}, - {"k5", 71 UNTIC_COMMENT("F5 function key")}, - {"k6", 72 UNTIC_COMMENT("F6 function key")}, - {"k7", 73 UNTIC_COMMENT("F7 function key")}, - {"k8", 74 UNTIC_COMMENT("F8 fucntion key")}, - {"k9", 75 UNTIC_COMMENT("F9 function key")}, - {"k;", 67 UNTIC_COMMENT("F10 function key")}, - {"kA", 78 UNTIC_COMMENT("insert-line key")}, - {"kB", 148 UNTIC_COMMENT("back-tab key")}, - {"kC", 57 UNTIC_COMMENT("clear-screen or erase key")}, - {"kD", 59 UNTIC_COMMENT("delete-character key")}, - {"kE", 63 UNTIC_COMMENT("clear-to-end-of-line key")}, - {"kF", 84 UNTIC_COMMENT("scroll-forward key")}, - {"kH", 80 UNTIC_COMMENT("last-line key")}, - {"kI", 77 UNTIC_COMMENT("insert-character key")}, - {"kL", 60 UNTIC_COMMENT("delete-line key")}, - {"kM", 62 UNTIC_COMMENT("sent by rmir or smir in insert mode")}, - {"kN", 81 UNTIC_COMMENT("next-page key")}, - {"kP", 82 UNTIC_COMMENT("prev-page key")}, - {"kR", 85 UNTIC_COMMENT("scroll-backward key")}, - {"kS", 64 UNTIC_COMMENT("clear-to-end-of-screen key")}, - {"kT", 86 UNTIC_COMMENT("set-tab key")}, - {"ka", 56 UNTIC_COMMENT("clear-all-tabs key")}, - {"kb", 55 UNTIC_COMMENT("backspace key")}, - {"kd", 61 UNTIC_COMMENT("down-arrow key")}, - {"ke", 88 UNTIC_COMMENT("leave 'keyboard_transmit' mode")}, - {"kh", 76 UNTIC_COMMENT("home key")}, - {"kl", 79 UNTIC_COMMENT("left-arrow key")}, - {"ko", 396 UNTIC_COMMENT("list of self-mapped keycaps")}, - {"kr", 83 UNTIC_COMMENT("right-arrow key")}, - {"ks", 89 UNTIC_COMMENT("enter 'keyboard_transmit' mode")}, - {"kt", 58 UNTIC_COMMENT("clear-tab key")}, - {"ku", 87 UNTIC_COMMENT("up-arrow key")}, - {"l0", 90 UNTIC_COMMENT("label on function key f0 if not f0")}, - {"l1", 91 UNTIC_COMMENT("label on function key f1 if not f1")}, - {"l2", 93 UNTIC_COMMENT("label on function key f2 if not f2")}, - {"l3", 94 UNTIC_COMMENT("label on function key f3 if not f3")}, - {"l4", 95 UNTIC_COMMENT("label on function key f4 if not f4")}, - {"l5", 96 UNTIC_COMMENT("lable on function key f5 if not f5")}, - {"l6", 97 UNTIC_COMMENT("label on function key f6 if not f6")}, - {"l7", 98 UNTIC_COMMENT("label on function key f7 if not f7")}, - {"l8", 99 UNTIC_COMMENT("label on function key f8 if not f8")}, - {"l9", 100 UNTIC_COMMENT("label on function key f9 if not f9")}, - {"la", 92 UNTIC_COMMENT("label on function key f10 if not f10")}, - {"le", 14 UNTIC_COMMENT("move left one space")}, - {"ll", 18 UNTIC_COMMENT("last line, first column (if no cup)")}, - {"ma", 397 UNTIC_COMMENT("map arrow keys rogue(1) motion keys")}, - {"mb", 26 UNTIC_COMMENT("turn on blinking")}, - {"md", 27 UNTIC_COMMENT("turn on bold (extra bright) mode")}, - {"me", 39 UNTIC_COMMENT("turn off all attributes")}, - {"mh", 30 UNTIC_COMMENT("turn on half-bright mode")}, - {"mk", 32 UNTIC_COMMENT("turn on blank mode (characters invisible)")}, - {"ml", 409 UNTIC_COMMENT("memory lock above")}, - {"mm", 102 UNTIC_COMMENT("turn on meta mode (8th-bit on)")}, - {"mo", 101 UNTIC_COMMENT("turn off meta mode")}, - {"mp", 33 UNTIC_COMMENT("turn on protected mode")}, - {"mr", 34 UNTIC_COMMENT("turn on reverse video mode")}, - {"mu", 410 UNTIC_COMMENT("memory unlock")}, - {"nd", 17 UNTIC_COMMENT("move right one space")}, - {"nl", 394 UNTIC_COMMENT("use to move down")}, - {"nw", 103 UNTIC_COMMENT("newline (behave like cr followed by lf)")}, - {"oc", 298 UNTIC_COMMENT("Set all color pairs to the original ones")}, - {"op", 297 UNTIC_COMMENT("Set default pair to its original value")}, - {"pO", 144 UNTIC_COMMENT("turn on printer for #1 bytes")}, - {"pc", 104 UNTIC_COMMENT("padding char (instead of null)")}, - {"pf", 119 UNTIC_COMMENT("turn off printer")}, - {"pk", 115 UNTIC_COMMENT("program function key #1 to type string #2")}, - {"pl", 116 UNTIC_COMMENT("program function key #1 to execute string #2")}, - {"pn", 147 UNTIC_COMMENT("program label #1 to show string #2")}, - {"po", 120 UNTIC_COMMENT("turn on printer")}, - {"ps", 118 UNTIC_COMMENT("print contents of screen")}, - {"px", 117 UNTIC_COMMENT("program function key #1 to transmit string #2")}, - {"r1", 122 UNTIC_COMMENT("reset string")}, - {"r2", 123 UNTIC_COMMENT("reset string")}, - {"r3", 124 UNTIC_COMMENT("reset string")}, - {"rP", 145 UNTIC_COMMENT("like ip but when in insert mode")}, - {"rc", 126 UNTIC_COMMENT("restore cursor to last position of sc")}, - {"rf", 125 UNTIC_COMMENT("name of reset file")}, - {"rp", 121 UNTIC_COMMENT("repeat char #1 #2 times")}, - {"rs", 393 UNTIC_COMMENT("terminal reset string")}, - {"s0", 364 UNTIC_COMMENT("Shift to code set 0 (EUC set 0, ASCII)")}, - {"s1", 365 UNTIC_COMMENT("Shift to code set 1")}, - {"s2", 366 UNTIC_COMMENT("Shift to code set 2")}, - {"s3", 367 UNTIC_COMMENT("Shift to code set 3")}, - {"sa", 131 UNTIC_COMMENT("define video attributes #1-#9 (PG9)")}, - {"sc", 128 UNTIC_COMMENT("save current cursor position")}, - {"se", 43 UNTIC_COMMENT("exit standout mode")}, - {"sf", 129 UNTIC_COMMENT("scroll text up")}, - {"so", 35 UNTIC_COMMENT("begin standout mode")}, - {"sp", 301 UNTIC_COMMENT("Set current color pair to #1")}, - {"sr", 130 UNTIC_COMMENT("scroll text down")}, - {"st", 132 UNTIC_COMMENT("set a tab in every row, current columns")}, - {"ta", 134 UNTIC_COMMENT("tab to next 8-space hardware tab stop")}, - {"te", 40 UNTIC_COMMENT("strings to end programs using cup")}, - {"ti", 28 UNTIC_COMMENT("string to start programs using cup")}, - {"ts", 135 UNTIC_COMMENT("move to status line")}, - {"u0", 287 UNTIC_COMMENT("User string #0")}, - {"u1", 288 UNTIC_COMMENT("User string #1")}, - {"u2", 289 UNTIC_COMMENT("User string #2")}, - {"u3", 290 UNTIC_COMMENT("User string #3")}, - {"u4", 291 UNTIC_COMMENT("User string #4")}, - {"u5", 292 UNTIC_COMMENT("User string #5")}, - {"u6", 293 UNTIC_COMMENT("User string #6")}, - {"u7", 294 UNTIC_COMMENT("User string #7")}, - {"u8", 295 UNTIC_COMMENT("User string #8")}, - {"u9", 296 UNTIC_COMMENT("User string #9")}, - {"uc", 136 UNTIC_COMMENT("underline char and move past it")}, - {"ue", 44 UNTIC_COMMENT("exit underline mode")}, - {"up", 19 UNTIC_COMMENT("up one line")}, - {"us", 36 UNTIC_COMMENT("begin underline mode")}, - {"vb", 45 UNTIC_COMMENT("visible bell (may not move cursor)")}, - {"ve", 16 UNTIC_COMMENT("make cursor appear normal (undo civis/cvvis)")}, - {"vi", 13 UNTIC_COMMENT("make cursor invisible")}, - {"vs", 20 UNTIC_COMMENT("make cursor very visible")}, - {"wi", 133 UNTIC_COMMENT("current window is lines #1-#2 cols #3-#4")}, - {"xl", 361 UNTIC_COMMENT("Program function key #1 to type string #2 and show string #3")}, - {"", -1 UNTIC_COMMENT(NULL)} -}; - -static int compute_cap_offset (char *cap, SLterminfo_Type *t, Tgetstr_Map_Type *map, unsigned int max_ofs) -{ - char cha, chb; - - (void) t; - cha = *cap++; chb = *cap; - - while (*map->name != 0) - { - if ((cha == *map->name) && (chb == *(map->name + 1))) - { - if (map->offset >= (int) max_ofs) return -1; - return map->offset; - } - map++; - } - return -1; -} - -char *_SLtt_tigetstr (SLterminfo_Type *t, char *cap) -{ - int offset; - - if (t == NULL) - return NULL; - - if (t->flags == SLTERMCAP) return tcap_getstr (cap, t); - - offset = compute_cap_offset (cap, t, Tgetstr_Map, t->num_string_offsets); - if (offset < 0) return NULL; - offset = make_integer (t->string_offsets + 2 * offset); - if (offset < 0) return NULL; - return t->string_table + offset; -} - -static Tgetstr_Map_Type Tgetnum_Map[] = -{ - {"BT", 30 UNTIC_COMMENT("number of buttons on mouse")}, - {"Co", 13 UNTIC_COMMENT("maximum numbers of colors on screen")}, - {"MW", 12 UNTIC_COMMENT("maxumum number of defineable windows")}, - {"NC", 15 UNTIC_COMMENT("video attributes that can't be used with colors")}, - {"Nl", 8 UNTIC_COMMENT("number of labels on screen")}, - {"Ya", 16 UNTIC_COMMENT("numbers of bytes buffered before printing")}, - {"Yb", 17 UNTIC_COMMENT("spacing of pins vertically in pins per inch")}, - {"Yc", 18 UNTIC_COMMENT("spacing of dots horizontally in dots per inch")}, - {"Yd", 19 UNTIC_COMMENT("maximum value in micro_..._address")}, - {"Ye", 20 UNTIC_COMMENT("maximum value in parm_..._micro")}, - {"Yf", 21 UNTIC_COMMENT("character size when in micro mode")}, - {"Yg", 22 UNTIC_COMMENT("line size when in micro mode")}, - {"Yh", 23 UNTIC_COMMENT("numbers of pins in print-head")}, - {"Yi", 24 UNTIC_COMMENT("horizontal resolution in units per line")}, - {"Yj", 25 UNTIC_COMMENT("vertical resolution in units per line")}, - {"Yk", 26 UNTIC_COMMENT("horizontal resolution in units per inch")}, - {"Yl", 27 UNTIC_COMMENT("vertical resolution in units per inch")}, - {"Ym", 28 UNTIC_COMMENT("print rate in chars per second")}, - {"Yn", 29 UNTIC_COMMENT("character step size when in double wide mode")}, - {"Yo", 31 UNTIC_COMMENT("number of passed for each bit-image row")}, - {"Yp", 32 UNTIC_COMMENT("type of bit-image device")}, - {"co", 0 UNTIC_COMMENT("number of columns in aline")}, - {"dB", 36 UNTIC_COMMENT("padding required for ^H")}, - {"dC", 34 UNTIC_COMMENT("pad needed for CR")}, - {"dN", 35 UNTIC_COMMENT("pad needed for LF")}, - {"dT", 37 UNTIC_COMMENT("padding required for ^I")}, - {"it", 1 UNTIC_COMMENT("tabs initially every # spaces")}, - {"kn", 38 UNTIC_COMMENT("count of function keys")}, - {"lh", 9 UNTIC_COMMENT("rows in each label")}, - {"li", 2 UNTIC_COMMENT("number of lines on screen or page")}, - {"lm", 3 UNTIC_COMMENT("lines of memory if > line. 0 => varies")}, - {"lw", 10 UNTIC_COMMENT("columns in each label")}, - {"ma", 11 UNTIC_COMMENT("maximum combined attributes terminal can handle")}, - {"pa", 14 UNTIC_COMMENT("maximum number of color-pairs on the screen")}, - {"pb", 5 UNTIC_COMMENT("lowest baud rate where padding needed")}, - {"sg", 4 UNTIC_COMMENT("number of blank chars left by smso or rmso")}, - {"ug", 33 UNTIC_COMMENT("number of blanks left by ul")}, - {"vt", 6 UNTIC_COMMENT("virtual terminal number (CB/unix)")}, - {"ws", 7 UNTIC_COMMENT("columns in status line")}, - {"", -1 UNTIC_COMMENT(NULL)} -}; - -int _SLtt_tigetnum (SLterminfo_Type *t, char *cap) -{ - int offset; - - if (t == NULL) - return -1; - - if (t->flags == SLTERMCAP) return tcap_getnum (cap, t); - - offset = compute_cap_offset (cap, t, Tgetnum_Map, t->num_numbers); - if (offset < 0) return -1; - return make_integer (t->numbers + 2 * offset); -} - -static Tgetstr_Map_Type Tgetflag_Map[] = -{ - {"5i", 22 UNTIC_COMMENT("printer won't echo on screen")}, - {"HC", 23 UNTIC_COMMENT("cursor is hard to see")}, - {"MT", 40 UNTIC_COMMENT("has meta key")}, - {"ND", 26 UNTIC_COMMENT("scrolling region is non-destructive")}, - {"NL", 41 UNTIC_COMMENT("move down with \n")}, - {"NP", 25 UNTIC_COMMENT("pad character does not exist")}, - {"NR", 24 UNTIC_COMMENT("smcup does not reverse rmcup")}, - {"YA", 30 UNTIC_COMMENT("only positive motion for hpa/mhpa caps")}, - {"YB", 31 UNTIC_COMMENT("using cr turns off micro mode")}, - {"YC", 32 UNTIC_COMMENT("printer needs operator to change character set")}, - {"YD", 33 UNTIC_COMMENT("only positive motion for vpa/mvpa caps")}, - {"YE", 34 UNTIC_COMMENT("printing in last column causes cr")}, - {"YF", 35 UNTIC_COMMENT("changing character pitch changes resolution")}, - {"YG", 36 UNTIC_COMMENT("changing line pitch changes resolution")}, - {"am", 1 UNTIC_COMMENT("terminal has automatic margins")}, - {"bs", 37 UNTIC_COMMENT("uses ^H to move left")}, - {"bw", 0 UNTIC_COMMENT("cub1 wraps from column 0 to last column")}, - {"cc", 27 UNTIC_COMMENT("terminal can re-define existing colors")}, - {"da", 11 UNTIC_COMMENT("display may be retained above the screen")}, - {"db", 12 UNTIC_COMMENT("display may be retained below the screen")}, - {"eo", 5 UNTIC_COMMENT("can erase overstrikes with a blank")}, - {"es", 16 UNTIC_COMMENT("escape can be used on the status line")}, - {"gn", 6 UNTIC_COMMENT("generic line type")}, - {"hc", 7 UNTIC_COMMENT("hardcopy terminal")}, - {"hl", 29 UNTIC_COMMENT("terminal uses only HLS color notation (tektronix)")}, - {"hs", 9 UNTIC_COMMENT("has extra status line")}, - {"hz", 18 UNTIC_COMMENT("can't print ~'s (hazeltine)")}, - {"in", 10 UNTIC_COMMENT("insert mode distinguishes nulls")}, - {"km", 8 UNTIC_COMMENT("Has a meta key, sets msb high")}, - {"mi", 13 UNTIC_COMMENT("safe to move while in insert mode")}, - {"ms", 14 UNTIC_COMMENT("safe to move while in standout mode")}, - {"nc", 39 UNTIC_COMMENT("no way to go to start of line")}, - {"ns", 38 UNTIC_COMMENT("crt cannot scroll")}, - {"nx", 21 UNTIC_COMMENT("padding won't work, xon/xoff required")}, - {"os", 15 UNTIC_COMMENT("terminal can overstrike")}, - {"pt", 42 UNTIC_COMMENT("has 8-char tabs invoked with ^I")}, - {"ul", 19 UNTIC_COMMENT("underline character overstrikes")}, - {"ut", 28 UNTIC_COMMENT("screen erased with background color")}, - {"xb", 2 UNTIC_COMMENT("beehive (f1=escape, f2=ctrl C)")}, - {"xn", 4 UNTIC_COMMENT("newline ignored after 80 cols (concept)")}, - {"xo", 20 UNTIC_COMMENT("terminal uses xon/xoff handshaking")}, - {"xr", 43 UNTIC_COMMENT("return clears the line")}, - {"xs", 3 UNTIC_COMMENT("standout not erased by overwriting (hp)")}, - {"xt", 17 UNTIC_COMMENT("tabs destructive, magic so char (t1061)")}, - {"", -1 UNTIC_COMMENT(NULL)} -}; - -int _SLtt_tigetflag (SLterminfo_Type *t, char *cap) -{ - int offset; - - if (t == NULL) return -1; - - if (t->flags == SLTERMCAP) return tcap_getflag (cap, t); - - offset = compute_cap_offset (cap, t, Tgetflag_Map, t->boolean_section_size); - - if (offset < 0) return -1; - return (int) *(t->boolean_flags + offset); -} - -/* These are my termcap routines. They only work with the TERMCAP environment - * variable. This variable must contain the termcap entry and NOT the file. - */ - -static int tcap_getflag (char *cap, SLterminfo_Type *t) -{ - char a, b; - char *f = (char *) t->boolean_flags; - char *fmax; - - if (f == NULL) return 0; - fmax = f + t->boolean_section_size; - - a = *cap; - b = *(cap + 1); - while (f < fmax) - { - if ((a == f[0]) && (b == f[1])) - return 1; - f += 2; - } - return 0; -} - -static char *tcap_get_cap (unsigned char *cap, unsigned char *caps, unsigned int len) -{ - unsigned char c0, c1; - unsigned char *caps_max; - - c0 = cap[0]; - c1 = cap[1]; - - if (caps == NULL) return NULL; - caps_max = caps + len; - while (caps < caps_max) - { - if ((c0 == caps[0]) && (c1 == caps[1])) - { - return (char *) caps + 3; - } - caps += (int) caps[2]; - } - return NULL; -} - -static int tcap_getnum (char *cap, SLterminfo_Type *t) -{ - cap = tcap_get_cap ((unsigned char *) cap, t->numbers, t->num_numbers); - if (cap == NULL) return -1; - return atoi (cap); -} - -static char *tcap_getstr (char *cap, SLterminfo_Type *t) -{ - return tcap_get_cap ((unsigned char *) cap, (unsigned char *) t->string_table, t->string_table_size); -} - -static int tcap_extract_field (unsigned char *t0) -{ - register unsigned char ch, *t = t0; - while (((ch = *t) != 0) && (ch != ':')) t++; - if (ch == ':') return (int) (t - t0); - return -1; -} - -int SLtt_Try_Termcap = 1; -static int tcap_getent (char *term, SLterminfo_Type *ti) -{ - unsigned char *termcap, ch; - unsigned char *buf, *b; - unsigned char *t; - int len; - - if (SLtt_Try_Termcap == 0) return -1; -#if 1 - /* XFREE86 xterm sets the TERMCAP environment variable to an invalid - * value. Specifically, it lacks the tc= string. - */ - if (!strncmp (term, "xterm", 5)) - return -1; -#endif - termcap = (unsigned char *) getenv ("TERMCAP"); - if ((termcap == NULL) || (*termcap == '/')) return -1; - - /* We have a termcap so lets use it provided it does not have a reference - * to another terminal via tc=. In that case, use terminfo. The alternative - * would be to parse the termcap file which I do not want to do right now. - * Besides, this is a terminfo based system and if the termcap were parsed - * terminfo would almost never get a chance to run. In addition, the tc= - * thing should not occur if tset is used to set the termcap entry. - */ - t = termcap; - while ((len = tcap_extract_field (t)) != -1) - { - if ((len > 3) && (t[0] == 't') && (t[1] == 'c') && (t[2] == '=')) - return -1; - t += (len + 1); - } - - /* malloc some extra space just in case it is needed. */ - len = strlen ((char *) termcap) + 256; - if (NULL == (buf = (unsigned char *) SLmalloc ((unsigned int) len))) return -1; - - b = buf; - - /* The beginning of the termcap entry contains the names of the entry. - * It is terminated by a colon. - */ - - ti->terminal_names = (char *) b; - t = termcap; - len = tcap_extract_field (t); - if (len < 0) - { - SLfree ((char *)buf); - return -1; - } - strncpy ((char *) b, (char *) t, (unsigned int) len); - b[len] = 0; - b += len + 1; - ti->name_section_size = len; - - /* Now, we are really at the start of the termcap entries. Point the - * termcap variable here since we want to refer to this a number of times. - */ - termcap = t + (len + 1); - - /* Process strings first. */ - ti->string_table = (char *) b; - t = termcap; - while (-1 != (len = tcap_extract_field (t))) - { - unsigned char *b1; - unsigned char *tmax; - - /* We are looking for: XX=something */ - if ((len < 4) || (t[2] != '=') || (*t == '.')) - { - t += len + 1; - continue; - } - tmax = t + len; - b1 = b; - - while (t < tmax) - { - ch = *t++; - if ((ch == '\\') && (t < tmax)) - { - t = (unsigned char *) _SLexpand_escaped_char ((char *) t, (char *) &ch); - } - else if ((ch == '^') && (t < tmax)) - { - ch = *t++; - if (ch == '?') ch = 127; - else ch = (ch | 0x20) - ('a' - 1); - } - *b++ = ch; - } - /* Null terminate it. */ - *b++ = 0; - len = (int) (b - b1); - b1[2] = (unsigned char) len; /* replace the = by the length */ - /* skip colon to next field. */ - t++; - } - ti->string_table_size = (int) (b - (unsigned char *) ti->string_table); - - /* Now process the numbers. */ - - t = termcap; - ti->numbers = b; - while (-1 != (len = tcap_extract_field (t))) - { - unsigned char *b1; - unsigned char *tmax; - - /* We are looking for: XX#NUMBER */ - if ((len < 4) || (t[2] != '#') || (*t == '.')) - { - t += len + 1; - continue; - } - tmax = t + len; - b1 = b; - - while (t < tmax) - { - *b++ = *t++; - } - /* Null terminate it. */ - *b++ = 0; - len = (int) (b - b1); - b1[2] = (unsigned char) len; /* replace the # by the length */ - t++; - } - ti->num_numbers = (int) (b - ti->numbers); - - /* Now process the flags. */ - t = termcap; - ti->boolean_flags = b; - while (-1 != (len = tcap_extract_field (t))) - { - /* We are looking for: XX#NUMBER */ - if ((len != 2) || (*t == '.') || (*t <= ' ')) - { - t += len + 1; - continue; - } - b[0] = t[0]; - b[1] = t[1]; - t += 3; - b += 2; - } - ti->boolean_section_size = (int) (b - ti->boolean_flags); - ti->flags = SLTERMCAP; - return 0; -} - - -/* These routines are provided only for backward binary compatability. - * They will vanish in V2.x - */ -char *SLtt_tigetent (char *s) -{ - return (char *) _SLtt_tigetent (s); -} - -extern char *SLtt_tigetstr (char *s, char **p) -{ - if (p == NULL) - return NULL; - return _SLtt_tigetstr ((SLterminfo_Type *) *p, s); -} - -extern int SLtt_tigetnum (char *s, char **p) -{ - if (p == NULL) - return -1; - return _SLtt_tigetnum ((SLterminfo_Type *) *p, s); -} - - diff --git a/mdk-stage1/slang/sltime.c b/mdk-stage1/slang/sltime.c deleted file mode 100644 index 14fc6ec16..000000000 --- a/mdk-stage1/slang/sltime.c +++ /dev/null @@ -1,310 +0,0 @@ -/* time related system calls */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include -#include - -#if defined(__BORLANDC__) -# include -#endif -#if defined(__GO32__) || defined(__WATCOMC__) -# include -# include -#endif - -#include - -#include "slang.h" -#include "_slang.h" - -#ifdef __WIN32__ -#include -/* Sleep is defined badly in MSVC... */ -# ifdef _MSC_VER -# define sleep(n) _sleep((n)*1000) -# else -# ifdef sleep -# undef sleep -# endif -# define sleep(x) if(x)Sleep((x)*1000) -# endif -#endif - - -#if defined(IBMPC_SYSTEM) -/* For other system (Unix and VMS), _SLusleep is in sldisply.c */ -int _SLusleep (unsigned long s) -{ - sleep (s/1000000L); - s = s % 1000000L; - -# if defined(__WIN32__) - Sleep (s/1000); -#else -# if defined(__IBMC__) - DosSleep(s/1000); -# else -# if defined(_MSC_VER) - _sleep (s/1000); -# endif -# endif -#endif - return 0; -} -#endif - -#if defined(__IBMC__) && !defined(_AIX) -/* sleep is not a standard function in VA3. */ -unsigned int sleep (unsigned int seconds) -{ - DosSleep(1000L * ((long)seconds)); - return 0; -} -#endif - -static char *ctime_cmd (unsigned long *tt) -{ - char *t; - - t = ctime ((time_t *) tt); - t[24] = 0; /* knock off \n */ - return (t); -} - -static void sleep_cmd (void) -{ - unsigned int secs; -#if SLANG_HAS_FLOAT - unsigned long usecs; - double x; - - if (-1 == SLang_pop_double (&x, NULL, NULL)) - return; - - if (x < 0.0) - x = 0.0; - secs = (unsigned int) x; - sleep (secs); - x -= (double) secs; - usecs = (unsigned long) (1e6 * x); - if (usecs > 0) _SLusleep (usecs); -#else - if (-1 == SLang_pop_uinteger (&secs)) - return; - if (secs != 0) sleep (secs); -#endif -} - -static unsigned long _time_cmd (void) -{ - return (unsigned long) time (NULL); -} - -#if defined(__GO32__) -static char *djgpp_current_time (void) /*{{{*/ -{ - union REGS rg; - unsigned int year; - unsigned char month, day, weekday, hour, minute, sec; - char days[] = "SunMonTueWedThuFriSat"; - char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; - static char the_date[26]; - - rg.h.ah = 0x2A; -#ifndef __WATCOMC__ - int86(0x21, &rg, &rg); - year = rg.x.cx & 0xFFFF; -#else - int386(0x21, &rg, &rg); - year = rg.x.ecx & 0xFFFF; -#endif - - month = 3 * (rg.h.dh - 1); - day = rg.h.dl; - weekday = 3 * rg.h.al; - - rg.h.ah = 0x2C; - -#ifndef __WATCOMC__ - int86(0x21, &rg, &rg); -#else - int386(0x21, &rg, &rg); -#endif - - hour = rg.h.ch; - minute = rg.h.cl; - sec = rg.h.dh; - - /* we want this form: Thu Apr 14 15:43:39 1994\n */ - sprintf(the_date, "%.3s %.3s%3d %02d:%02d:%02d %d\n", - days + weekday, months + month, - day, hour, minute, sec, year); - return the_date; -} - -/*}}}*/ - -#endif - -char *SLcurrent_time_string (void) /*{{{*/ -{ - char *the_time; -#ifndef __GO32__ - time_t myclock; - - myclock = time((time_t *) 0); - the_time = (char *) ctime(&myclock); -#else - the_time = djgpp_current_time (); -#endif - /* returns the form Sun Sep 16 01:03:52 1985\n\0 */ - the_time[24] = '\0'; - return(the_time); -} - -/*}}}*/ - -static int push_tm_struct (struct tm *tms) -{ - char *field_names [9]; - unsigned char field_types[9]; - VOID_STAR field_values [9]; - int int_values [9]; - unsigned int i; - - if (tms == NULL) - return SLang_push_null (); - - field_names [0] = "tm_sec"; int_values [0] = tms->tm_sec; - field_names [1] = "tm_min"; int_values [1] = tms->tm_min; - field_names [2] = "tm_hour"; int_values [2] = tms->tm_hour; - field_names [3] = "tm_mday"; int_values [3] = tms->tm_mday; - field_names [4] = "tm_mon"; int_values [4] = tms->tm_mon; - field_names [5] = "tm_year"; int_values [5] = tms->tm_year; - field_names [6] = "tm_wday"; int_values [6] = tms->tm_wday; - field_names [7] = "tm_yday"; int_values [7] = tms->tm_yday; - field_names [8] = "tm_isdst"; int_values [8] = tms->tm_isdst; - - for (i = 0; i < 9; i++) - { - field_types [i] = SLANG_INT_TYPE; - field_values [i] = (VOID_STAR) (int_values + i); - } - - return SLstruct_create_struct (9, field_names, field_types, field_values); -} - - -static void localtime_cmd (long *t) -{ - time_t tt = (time_t) *t; - (void) push_tm_struct (localtime (&tt)); -} - -static void gmtime_cmd (long *t) -{ -#ifdef HAVE_GMTIME - time_t tt = (time_t) *t; - (void) push_tm_struct (gmtime (&tt)); -#else - localtime_cmd (t); -#endif -} - -#ifdef HAVE_TIMES - -# ifdef HAVE_SYS_TIMES_H -# include -# endif - -#include - -#ifdef CLK_TCK -# define SECS_PER_TICK (1.0/(double)CLK_TCK) -#else -# ifdef CLOCKS_PER_SEC -# define SECS_PER_TICK (1.0/(double)CLOCKS_PER_SEC) -# else -# define SECS_PER_TICK (1.0/60.0) -# endif -#endif - -static void times_cmd (void) -{ - double dvals[4]; - struct tms t; - VOID_STAR field_values[4]; - char *field_names[4]; - unsigned int i; - unsigned char field_types[4]; - - (void) times (&t); - - field_names[0] = "tms_utime"; dvals[0] = (double)t.tms_utime; - field_names[1] = "tms_stime"; dvals[1] = (double)t.tms_stime; - field_names[2] = "tms_cutime"; dvals[2] = (double)t.tms_cutime; - field_names[3] = "tms_cstime"; dvals[3] = (double)t.tms_cstime; - - for (i = 0; i < 4; i++) - { - dvals[i] *= SECS_PER_TICK; - field_values[i] = (VOID_STAR) &dvals[i]; - field_types[i] = SLANG_DOUBLE_TYPE; - } - (void) SLstruct_create_struct (4, field_names, field_types, field_values); -} - -static struct tms Tic_TMS; - -static void tic_cmd (void) -{ - (void) times (&Tic_TMS); -} - -static double toc_cmd (void) -{ - struct tms t; - double d; - - (void) times (&t); - d = ((t.tms_utime - Tic_TMS.tms_utime) - + (t.tms_stime - Tic_TMS.tms_stime)) * SECS_PER_TICK; - Tic_TMS = t; - return d; -} - -#endif /* HAVE_TIMES */ - - -static SLang_Intrin_Fun_Type Time_Funs_Table [] = -{ - MAKE_INTRINSIC_1("ctime", ctime_cmd, SLANG_STRING_TYPE, SLANG_ULONG_TYPE), - MAKE_INTRINSIC_0("sleep", sleep_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("_time", _time_cmd, SLANG_ULONG_TYPE), - MAKE_INTRINSIC_0("time", SLcurrent_time_string, SLANG_STRING_TYPE), - MAKE_INTRINSIC_1("localtime", localtime_cmd, SLANG_VOID_TYPE, SLANG_LONG_TYPE), - MAKE_INTRINSIC_1("gmtime", gmtime_cmd, SLANG_VOID_TYPE, SLANG_LONG_TYPE), - -#ifdef HAVE_TIMES - MAKE_INTRINSIC_0("times", times_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("tic", tic_cmd, SLANG_VOID_TYPE), - MAKE_INTRINSIC_0("toc", toc_cmd, SLANG_DOUBLE_TYPE), -#endif - SLANG_END_INTRIN_FUN_TABLE -}; - -int _SLang_init_sltime (void) -{ -#ifdef HAVE_TIMES - (void) tic_cmd (); -#endif - return SLadd_intrin_fun_table (Time_Funs_Table, NULL); -} - diff --git a/mdk-stage1/slang/sltoken.c b/mdk-stage1/slang/sltoken.c deleted file mode 100644 index d08967a24..000000000 --- a/mdk-stage1/slang/sltoken.c +++ /dev/null @@ -1,1702 +0,0 @@ -/* Copyright (c) 1998, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ -#include "slinclud.h" - -#include "slang.h" -#include "_slang.h" - -#define MAX_TOKEN_LEN 254 -#define MAX_FILE_LINE_LEN 256 - -static char Empty_Line[1] = {0}; - -static int Default_Compile_Line_Num_Info; -static char *Input_Line = Empty_Line; -static char *Input_Line_Pointer; - -static SLPreprocess_Type *This_SLpp; - -static SLang_Load_Type *LLT; - -static char *map_token_to_string (_SLang_Token_Type *tok) -{ - char *s; - static char numbuf [32]; - unsigned char type; - s = NULL; - - if (tok != NULL) type = tok->type; - else type = 0; - - switch (type) - { - case 0: - s = "??"; - break; - - case CHAR_TOKEN: - case SHORT_TOKEN: - case INT_TOKEN: - case LONG_TOKEN: - s = numbuf; - sprintf (s, "%ld", tok->v.long_val); - break; - - case UCHAR_TOKEN: - case USHORT_TOKEN: - case UINT_TOKEN: - case ULONG_TOKEN: - s = numbuf; - sprintf (s, "%lu", (unsigned long)tok->v.long_val); - break; - - case OBRACKET_TOKEN: s = "["; break; - case CBRACKET_TOKEN: s = "]"; break; - case OPAREN_TOKEN: s = "("; break; - case CPAREN_TOKEN: s = ")"; break; - case OBRACE_TOKEN: s = "{"; break; - case CBRACE_TOKEN: s = "}"; break; - case DEREF_TOKEN: s = "@"; break; - case POUND_TOKEN: s = "#"; break; - case COMMA_TOKEN: s = ","; break; - case SEMICOLON_TOKEN: s = ";"; break; - case COLON_TOKEN: s = ":"; break; - -#if SLANG_HAS_FLOAT - case FLOAT_TOKEN: - case DOUBLE_TOKEN: - case COMPLEX_TOKEN: -#endif - case IDENT_TOKEN: - if ((tok->free_sval_flag == 0) || (tok->num_refs == 0)) - break; - /* drop */ - default: - s = tok->v.s_val; - break; - } - - if (s == NULL) - { - s = numbuf; - sprintf (s, "(0x%02X)", type); - } - - return s; -} - -static char *make_line_file_error (char *buf, unsigned int buflen, - _SLang_Token_Type *tok, char *dsc, int line, char *file) -{ -#if _SLANG_HAS_DEBUG_CODE - if (tok != NULL) line = tok->line_number; -#endif - if (file == NULL) file = "??"; - - (void) _SLsnprintf (buf, buflen, "%s: found '%s', line %d, file: %s", - dsc, map_token_to_string (tok), line, file); - - return buf; -} - -void _SLparse_error(char *str, _SLang_Token_Type *tok, int flag) -{ - char buf [1024]; - - if (str == NULL) - str = "Parse Error"; - - make_line_file_error (buf, sizeof (buf), tok, str, LLT->line_num, (char *) LLT->name); - - if ((flag == 0) && SLang_Error) - return; - - SLang_verror (SL_SYNTAX_ERROR, "%s", buf); -} - -static void do_line_file_error (int line, char *file) -{ - SLang_verror (SL_SYNTAX_ERROR, - "called from line %d, file: %s", line, file); -} - -#define ALPHA_CHAR 1 -#define DIGIT_CHAR 2 -#define EXCL_CHAR 3 -#define SEP_CHAR 4 -#define OP_CHAR 5 -#define DOT_CHAR 6 -#define BOLDOT_CHAR 7 -#define DQUOTE_CHAR 8 -#define QUOTE_CHAR 9 -#define COMMENT_CHAR 10 -#define NL_CHAR 11 -#define BAD_CHAR 12 -#define WHITE_CHAR 13 - -#define CHAR_EOF 255 - -#define CHAR_CLASS(c) (Char_Type_Table[(c)][0]) -#define CHAR_DATA(c) (Char_Type_Table[(c)][1]) - -/* In this table, if a single character can represent an operator, e.g., - * '&' (BAND_TOKEN), then it must be placed before multiple-character - * operators that begin with the same character, e.g., "&=". See - * get_op_token to see how this is exploited. - * - * The third character null terminates the operator string. This is for - * the token structure. - */ -static char Operators [29][4] = -{ -#define OFS_EXCL 0 - {'!', '=', 0, NE_TOKEN}, -#define OFS_POUND 1 - {'#', 0, 0, POUND_TOKEN}, -#define OFS_BAND 2 - {'&', 0, 0, BAND_TOKEN}, - {'&', '&', 0, EOF_TOKEN}, - {'&', '=', 0, BANDEQS_TOKEN}, -#define OFS_STAR 5 - {'*', 0, 0, TIMES_TOKEN}, - {'*', '=', 0, TIMESEQS_TOKEN}, -#define OFS_PLUS 7 - {'+', 0, 0, ADD_TOKEN}, - {'+', '+', 0, PLUSPLUS_TOKEN}, - {'+', '=', 0, PLUSEQS_TOKEN}, -#define OFS_MINUS 10 - {'-', 0, 0, SUB_TOKEN}, - {'-', '-', 0, MINUSMINUS_TOKEN}, - {'-', '=', 0, MINUSEQS_TOKEN}, - {'-', '>', 0, NAMESPACE_TOKEN}, -#define OFS_DIV 14 - {'/', 0, 0, DIV_TOKEN}, - {'/', '=', 0, DIVEQS_TOKEN}, -#define OFS_LT 16 - {'<', 0, 0, LT_TOKEN}, - {'<', '=', 0, LE_TOKEN}, -#define OFS_EQS 18 - {'=', 0, 0, ASSIGN_TOKEN}, - {'=', '=', 0, EQ_TOKEN}, -#define OFS_GT 20 - {'>', 0, 0, GT_TOKEN}, - {'>', '=', 0, GE_TOKEN}, -#define OFS_AT 22 - {'@', 0, 0, DEREF_TOKEN}, -#define OFS_POW 23 - {'^', 0, 0, POW_TOKEN}, -#define OFS_BOR 24 - {'|', 0, 0, BOR_TOKEN}, - {'|', '|', 0, EOF_TOKEN}, - {'|', '=', 0, BOREQS_TOKEN}, -#define OFS_BNOT 27 - {'~', 0, 0, BNOT_TOKEN}, - { 0, 0, 0, EOF_TOKEN} -}; - -static unsigned char Char_Type_Table[256][2] = -{ - { NL_CHAR, 0 }, /* 0x0 */ { BAD_CHAR, 0 }, /* 0x1 */ - { BAD_CHAR, 0 }, /* 0x2 */ { BAD_CHAR, 0 }, /* 0x3 */ - { BAD_CHAR, 0 }, /* 0x4 */ { BAD_CHAR, 0 }, /* 0x5 */ - { BAD_CHAR, 0 }, /* 0x6 */ { BAD_CHAR, 0 }, /* 0x7 */ - { WHITE_CHAR, 0 }, /* 0x8 */ { WHITE_CHAR, 0 }, /* 0x9 */ - { NL_CHAR, 0 }, /* \n */ { WHITE_CHAR, 0 }, /* 0xb */ - { WHITE_CHAR, 0 }, /* 0xc */ { WHITE_CHAR, 0 }, /* \r */ - { BAD_CHAR, 0 }, /* 0xe */ { BAD_CHAR, 0 }, /* 0xf */ - { BAD_CHAR, 0 }, /* 0x10 */ { BAD_CHAR, 0 }, /* 0x11 */ - { BAD_CHAR, 0 }, /* 0x12 */ { BAD_CHAR, 0 }, /* 0x13 */ - { BAD_CHAR, 0 }, /* 0x14 */ { BAD_CHAR, 0 }, /* 0x15 */ - { BAD_CHAR, 0 }, /* 0x16 */ { BAD_CHAR, 0 }, /* 0x17 */ - { BAD_CHAR, 0 }, /* 0x18 */ { BAD_CHAR, 0 }, /* 0x19 */ - { BAD_CHAR, 0 }, /* 0x1a */ { BAD_CHAR, 0 }, /* 0x1b */ - { BAD_CHAR, 0 }, /* 0x1c */ { BAD_CHAR, 0 }, /* 0x1d */ - { BAD_CHAR, 0 }, /* 0x1e */ { BAD_CHAR, 0 }, /* 0x1f */ - { WHITE_CHAR, 0 }, /* 0x20 */ { EXCL_CHAR, OFS_EXCL }, /* ! */ - { DQUOTE_CHAR, 0 }, /* " */ { OP_CHAR, OFS_POUND }, /* # */ - { ALPHA_CHAR, 0 }, /* $ */ { NL_CHAR, 0 },/* % */ - { OP_CHAR, OFS_BAND }, /* & */ { QUOTE_CHAR, 0 }, /* ' */ - { SEP_CHAR, OPAREN_TOKEN }, /* ( */ { SEP_CHAR, CPAREN_TOKEN }, /* ) */ - { OP_CHAR, OFS_STAR }, /* * */ { OP_CHAR, OFS_PLUS}, /* + */ - { SEP_CHAR, COMMA_TOKEN }, /* , */ { OP_CHAR, OFS_MINUS }, /* - */ - { DOT_CHAR, 0 }, /* . */ { OP_CHAR, OFS_DIV }, /* / */ - { DIGIT_CHAR, 0 }, /* 0 */ { DIGIT_CHAR, 0 }, /* 1 */ - { DIGIT_CHAR, 0 }, /* 2 */ { DIGIT_CHAR, 0 }, /* 3 */ - { DIGIT_CHAR, 0 }, /* 4 */ { DIGIT_CHAR, 0 }, /* 5 */ - { DIGIT_CHAR, 0 }, /* 6 */ { DIGIT_CHAR, 0 }, /* 7 */ - { DIGIT_CHAR, 0 }, /* 8 */ { DIGIT_CHAR, 0 }, /* 9 */ - { SEP_CHAR, COLON_TOKEN }, /* : */ { SEP_CHAR, SEMICOLON_TOKEN }, /* ; */ - { OP_CHAR, OFS_LT }, /* < */ { OP_CHAR, OFS_EQS }, /* = */ - { OP_CHAR, OFS_GT }, /* > */ { BAD_CHAR, 0 }, /* ? */ - { OP_CHAR, OFS_AT}, /* @ */ { ALPHA_CHAR, 0 }, /* A */ - { ALPHA_CHAR, 0 }, /* B */ { ALPHA_CHAR, 0 }, /* C */ - { ALPHA_CHAR, 0 }, /* D */ { ALPHA_CHAR, 0 }, /* E */ - { ALPHA_CHAR, 0 }, /* F */ { ALPHA_CHAR, 0 }, /* G */ - { ALPHA_CHAR, 0 }, /* H */ { ALPHA_CHAR, 0 }, /* I */ - { ALPHA_CHAR, 0 }, /* J */ { ALPHA_CHAR, 0 }, /* K */ - { ALPHA_CHAR, 0 }, /* L */ { ALPHA_CHAR, 0 }, /* M */ - { ALPHA_CHAR, 0 }, /* N */ { ALPHA_CHAR, 0 }, /* O */ - { ALPHA_CHAR, 0 }, /* P */ { ALPHA_CHAR, 0 }, /* Q */ - { ALPHA_CHAR, 0 }, /* R */ { ALPHA_CHAR, 0 }, /* S */ - { ALPHA_CHAR, 0 }, /* T */ { ALPHA_CHAR, 0 }, /* U */ - { ALPHA_CHAR, 0 }, /* V */ { ALPHA_CHAR, 0 }, /* W */ - { ALPHA_CHAR, 0 }, /* X */ { ALPHA_CHAR, 0 }, /* Y */ - { ALPHA_CHAR, 0 }, /* Z */ { SEP_CHAR, OBRACKET_TOKEN }, /* [ */ - { BAD_CHAR, 0 }, /* \ */ { SEP_CHAR, CBRACKET_TOKEN }, /* ] */ - { OP_CHAR, OFS_POW }, /* ^ */ { ALPHA_CHAR, 0 }, /* _ */ - { BAD_CHAR, 0 }, /* ` */ { ALPHA_CHAR, 0 }, /* a */ - { ALPHA_CHAR, 0 }, /* b */ { ALPHA_CHAR, 0 }, /* c */ - { ALPHA_CHAR, 0 }, /* d */ { ALPHA_CHAR, 0 }, /* e */ - { ALPHA_CHAR, 0 }, /* f */ { ALPHA_CHAR, 0 }, /* g */ - { ALPHA_CHAR, 0 }, /* h */ { ALPHA_CHAR, 0 }, /* i */ - { ALPHA_CHAR, 0 }, /* j */ { ALPHA_CHAR, 0 }, /* k */ - { ALPHA_CHAR, 0 }, /* l */ { ALPHA_CHAR, 0 }, /* m */ - { ALPHA_CHAR, 0 }, /* n */ { ALPHA_CHAR, 0 }, /* o */ - { ALPHA_CHAR, 0 }, /* p */ { ALPHA_CHAR, 0 }, /* q */ - { ALPHA_CHAR, 0 }, /* r */ { ALPHA_CHAR, 0 }, /* s */ - { ALPHA_CHAR, 0 }, /* t */ { ALPHA_CHAR, 0 }, /* u */ - { ALPHA_CHAR, 0 }, /* v */ { ALPHA_CHAR, 0 }, /* w */ - { ALPHA_CHAR, 0 }, /* x */ { ALPHA_CHAR, 0 }, /* y */ - { ALPHA_CHAR, 0 }, /* z */ { SEP_CHAR, OBRACE_TOKEN }, /* { */ - { OP_CHAR, OFS_BOR }, /* | */ { SEP_CHAR, CBRACE_TOKEN }, /* } */ - { OP_CHAR, OFS_BNOT }, /* ~ */ { BAD_CHAR, 0 }, /* 0x7f */ - - { ALPHA_CHAR, 0 }, /* € */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* ‚ */ { ALPHA_CHAR, 0 }, /* ƒ */ - { ALPHA_CHAR, 0 }, /* „ */ { ALPHA_CHAR, 0 }, /* … */ - { ALPHA_CHAR, 0 }, /* † */ { ALPHA_CHAR, 0 }, /* ‡ */ - { ALPHA_CHAR, 0 }, /* ˆ */ { ALPHA_CHAR, 0 }, /* ‰ */ - { ALPHA_CHAR, 0 }, /* Š */ { ALPHA_CHAR, 0 }, /* ‹ */ - { ALPHA_CHAR, 0 }, /* Œ */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* Ž */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* */ { ALPHA_CHAR, 0 }, /* ‘ */ - { ALPHA_CHAR, 0 }, /* ’ */ { ALPHA_CHAR, 0 }, /* “ */ - { ALPHA_CHAR, 0 }, /* ” */ { ALPHA_CHAR, 0 }, /* • */ - { ALPHA_CHAR, 0 }, /* – */ { ALPHA_CHAR, 0 }, /* — */ - { ALPHA_CHAR, 0 }, /* ˜ */ { ALPHA_CHAR, 0 }, /* ™ */ - { ALPHA_CHAR, 0 }, /* š */ { ALPHA_CHAR, 0 }, /* › */ - { ALPHA_CHAR, 0 }, /* œ */ { ALPHA_CHAR, 0 }, /* */ - { ALPHA_CHAR, 0 }, /* ž */ { ALPHA_CHAR, 0 }, /* Ÿ */ - { ALPHA_CHAR, 0 }, /*   */ { ALPHA_CHAR, 0 }, /* ¡ */ - { ALPHA_CHAR, 0 }, /* ¢ */ { ALPHA_CHAR, 0 }, /* £ */ - { ALPHA_CHAR, 0 }, /* ¤ */ { ALPHA_CHAR, 0 }, /* ¥ */ - { ALPHA_CHAR, 0 }, /* ¦ */ { ALPHA_CHAR, 0 }, /* § */ - { ALPHA_CHAR, 0 }, /* ¨ */ { ALPHA_CHAR, 0 }, /* © */ - { ALPHA_CHAR, 0 }, /* ª */ { ALPHA_CHAR, 0 }, /* « */ - { ALPHA_CHAR, 0 }, /* ¬ */ { ALPHA_CHAR, 0 }, /* ­ */ - { ALPHA_CHAR, 0 }, /* ® */ { ALPHA_CHAR, 0 }, /* ¯ */ - { ALPHA_CHAR, 0 }, /* ° */ { ALPHA_CHAR, 0 }, /* ± */ - { ALPHA_CHAR, 0 }, /* ² */ { ALPHA_CHAR, 0 }, /* ³ */ - { ALPHA_CHAR, 0 }, /* ´ */ { ALPHA_CHAR, 0 }, /* µ */ - { ALPHA_CHAR, 0 }, /* ¶ */ { ALPHA_CHAR, 0 }, /* · */ - { ALPHA_CHAR, 0 }, /* ¸ */ { ALPHA_CHAR, 0 }, /* ¹ */ - { ALPHA_CHAR, 0 }, /* º */ { ALPHA_CHAR, 0 }, /* » */ - { ALPHA_CHAR, 0 }, /* ¼ */ { ALPHA_CHAR, 0 }, /* ½ */ - { ALPHA_CHAR, 0 }, /* ¾ */ { ALPHA_CHAR, 0 }, /* ¿ */ - { ALPHA_CHAR, 0 }, /* À */ { ALPHA_CHAR, 0 }, /* Á */ - { ALPHA_CHAR, 0 }, /*  */ { ALPHA_CHAR, 0 }, /* à */ - { ALPHA_CHAR, 0 }, /* Ä */ { ALPHA_CHAR, 0 }, /* Å */ - { ALPHA_CHAR, 0 }, /* Æ */ { ALPHA_CHAR, 0 }, /* Ç */ - { ALPHA_CHAR, 0 }, /* È */ { ALPHA_CHAR, 0 }, /* É */ - { ALPHA_CHAR, 0 }, /* Ê */ { ALPHA_CHAR, 0 }, /* Ë */ - { ALPHA_CHAR, 0 }, /* Ì */ { ALPHA_CHAR, 0 }, /* Í */ - { ALPHA_CHAR, 0 }, /* Î */ { ALPHA_CHAR, 0 }, /* Ï */ - { ALPHA_CHAR, 0 }, /* Ð */ { ALPHA_CHAR, 0 }, /* Ñ */ - { ALPHA_CHAR, 0 }, /* Ò */ { ALPHA_CHAR, 0 }, /* Ó */ - { ALPHA_CHAR, 0 }, /* Ô */ { ALPHA_CHAR, 0 }, /* Õ */ - { ALPHA_CHAR, 0 }, /* Ö */ { ALPHA_CHAR, 0 }, /* × */ - { ALPHA_CHAR, 0 }, /* Ø */ { ALPHA_CHAR, 0 }, /* Ù */ - { ALPHA_CHAR, 0 }, /* Ú */ { ALPHA_CHAR, 0 }, /* Û */ - { ALPHA_CHAR, 0 }, /* Ü */ { ALPHA_CHAR, 0 }, /* Ý */ - { ALPHA_CHAR, 0 }, /* Þ */ { ALPHA_CHAR, 0 }, /* ß */ - { ALPHA_CHAR, 0 }, /* à */ { ALPHA_CHAR, 0 }, /* á */ - { ALPHA_CHAR, 0 }, /* â */ { ALPHA_CHAR, 0 }, /* ã */ - { ALPHA_CHAR, 0 }, /* ä */ { ALPHA_CHAR, 0 }, /* å */ - { ALPHA_CHAR, 0 }, /* æ */ { ALPHA_CHAR, 0 }, /* ç */ - { ALPHA_CHAR, 0 }, /* è */ { ALPHA_CHAR, 0 }, /* é */ - { ALPHA_CHAR, 0 }, /* ê */ { ALPHA_CHAR, 0 }, /* ë */ - { ALPHA_CHAR, 0 }, /* ì */ { ALPHA_CHAR, 0 }, /* í */ - { ALPHA_CHAR, 0 }, /* î */ { ALPHA_CHAR, 0 }, /* ï */ - { ALPHA_CHAR, 0 }, /* ð */ { ALPHA_CHAR, 0 }, /* ñ */ - { ALPHA_CHAR, 0 }, /* ò */ { ALPHA_CHAR, 0 }, /* ó */ - { ALPHA_CHAR, 0 }, /* ô */ { ALPHA_CHAR, 0 }, /* õ */ - { ALPHA_CHAR, 0 }, /* ö */ { ALPHA_CHAR, 0 }, /* ÷ */ - { ALPHA_CHAR, 0 }, /* ø */ { ALPHA_CHAR, 0 }, /* ù */ - { ALPHA_CHAR, 0 }, /* ú */ { ALPHA_CHAR, 0 }, /* û */ - { ALPHA_CHAR, 0 }, /* ü */ { ALPHA_CHAR, 0 }, /* ý */ - { ALPHA_CHAR, 0 }, /* þ */ { ALPHA_CHAR, 0 }, /* ÿ */ -}; - -int _SLcheck_identifier_syntax (char *name) -{ - unsigned char *p; - - p = (unsigned char *) name; - if (ALPHA_CHAR == Char_Type_Table[*p][0]) while (1) - { - unsigned ch; - unsigned char type; - - ch = *++p; - - type = Char_Type_Table [ch][0]; - if ((type != ALPHA_CHAR) && (type != DIGIT_CHAR)) - { - if (ch == 0) - return 0; - break; - } - } - - SLang_verror (SL_SYNTAX_ERROR, - "Name %s contains an illegal character", name); - return -1; -} - -static unsigned char prep_get_char (void) -{ - register unsigned char ch; - - if (0 != (ch = *Input_Line_Pointer++)) - return ch; - - Input_Line_Pointer--; - return 0; -} - -static void unget_prep_char (unsigned char ch) -{ - if ((Input_Line_Pointer != Input_Line) - && (ch != 0)) - Input_Line_Pointer--; - /* *Input_Line_Pointer = ch; -- Do not modify the Input_Line */ -} - -#include "keywhash.c" - -static int get_ident_token (_SLang_Token_Type *tok, unsigned char *s, unsigned int len) -{ - unsigned char ch; - unsigned char type; - Keyword_Table_Type *table; - - while (1) - { - ch = prep_get_char (); - type = CHAR_CLASS (ch); - if ((type != ALPHA_CHAR) && (type != DIGIT_CHAR)) - { - unget_prep_char (ch); - break; - } - s [len++] = ch; - } - - s[len] = 0; - - /* check if keyword */ - table = is_keyword ((char *) s, len); - if (table != NULL) - { - tok->v.s_val = table->name; - return (tok->type = table->type); - } - - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = IDENT_TOKEN); -} - -static int get_number_token (_SLang_Token_Type *tok, unsigned char *s, unsigned int len) -{ - unsigned char ch; - unsigned char type; - - /* Look for pattern [0-9.xX]*([eE][-+]?[digits])?[ijfhul]? */ - while (1) - { - ch = prep_get_char (); - - type = CHAR_CLASS (ch); - if ((type != DIGIT_CHAR) && (type != DOT_CHAR)) - { - if ((ch != 'x') && (ch != 'X')) - break; - /* It must be hex */ - do - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - - s[len++] = ch; - ch = prep_get_char (); - type = CHAR_CLASS (ch); - } - while ((type == DIGIT_CHAR) || (type == ALPHA_CHAR)); - break; - } - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s [len++] = ch; - } - - /* At this point, type and ch are synchronized */ - - if ((ch == 'e') || (ch == 'E')) - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s[len++] = ch; - ch = prep_get_char (); - if ((ch == '+') || (ch == '-')) - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s[len++] = ch; - ch = prep_get_char (); - } - - while (DIGIT_CHAR == (type = CHAR_CLASS(ch))) - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s[len++] = ch; - ch = prep_get_char (); - } - } - - while (ALPHA_CHAR == type) - { - if (len == (MAX_TOKEN_LEN - 1)) - goto too_long_return_error; - s[len++] = ch; - ch = prep_get_char (); - type = CHAR_CLASS(ch); - } - - unget_prep_char (ch); - s[len] = 0; - - switch (SLang_guess_type ((char *) s)) - { - default: - tok->v.s_val = (char *) s; - _SLparse_error ("Not a number", tok, 0); - return (tok->type = EOF_TOKEN); - -#if SLANG_HAS_FLOAT - case SLANG_FLOAT_TYPE: - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = FLOAT_TOKEN); - - case SLANG_DOUBLE_TYPE: - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = DOUBLE_TOKEN); -#endif -#if SLANG_HAS_COMPLEX - case SLANG_COMPLEX_TYPE: - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, len, &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = COMPLEX_TOKEN); -#endif - case SLANG_CHAR_TYPE: - tok->v.long_val = (char)SLatol (s); - return tok->type = CHAR_TOKEN; - case SLANG_UCHAR_TYPE: - tok->v.long_val = (unsigned char)SLatol (s); - return tok->type = UCHAR_TOKEN; - case SLANG_SHORT_TYPE: - tok->v.long_val = (short)SLatol (s); - return tok->type = SHORT_TOKEN; - case SLANG_USHORT_TYPE: - tok->v.long_val = (unsigned short)SLatoul (s); - return tok->type = USHORT_TOKEN; - case SLANG_INT_TYPE: - tok->v.long_val = (int)SLatol (s); - return tok->type = INT_TOKEN; - case SLANG_UINT_TYPE: - tok->v.long_val = (unsigned int)SLatoul (s); - return tok->type = UINT_TOKEN; - case SLANG_LONG_TYPE: - tok->v.long_val = SLatol (s); - return tok->type = LONG_TOKEN; - case SLANG_ULONG_TYPE: - tok->v.long_val = SLatoul (s); - return tok->type = ULONG_TOKEN; - } - - too_long_return_error: - _SLparse_error ("Number too long for buffer", NULL, 0); - return (tok->type == EOF_TOKEN); -} - -static int get_op_token (_SLang_Token_Type *tok, char ch) -{ - unsigned int offset; - char second_char; - unsigned char type; - char *name; - - /* operators are: + - / * ++ -- += -= = == != > < >= <= | etc.. - * These lex to the longest valid operator token. - */ - - offset = CHAR_DATA((unsigned char) ch); - if (0 == Operators [offset][1]) - { - name = Operators [offset]; - type = name [3]; - } - else - { - type = EOF_TOKEN; - name = NULL; - } - - second_char = prep_get_char (); - do - { - if (second_char == Operators[offset][1]) - { - name = Operators [offset]; - type = name [3]; - break; - } - offset++; - } - while (ch == Operators[offset][0]); - - tok->type = type; - - if (type == EOF_TOKEN) - { - _SLparse_error ("Operator not supported", NULL, 0); - return type; - } - - tok->v.s_val = name; - - if (name[1] == 0) - unget_prep_char (second_char); - - return type; -} - -/* If this returns non-zero, then it is a binary string */ -static int expand_escaped_string (register char *s, - register char *t, register char *tmax, - unsigned int *lenp) -{ - char *s0; - int is_binary = 0; - char ch; - - s0 = s; - while (t < tmax) - { - ch = *t++; - if (ch == '\\') - { - t = _SLexpand_escaped_char (t, &ch); - if (ch == 0) is_binary = 1; - } - *s++ = ch; - } - *s = 0; - - *lenp = (unsigned char) (s - s0); - return is_binary; -} - -static int get_string_token (_SLang_Token_Type *tok, unsigned char quote_char, - unsigned char *s) -{ - unsigned char ch; - unsigned int len = 0; - int has_quote = 0; - int is_binary; - - while (1) - { - ch = prep_get_char (); - if (ch == 0) - { - _SLparse_error("Expecting quote-character", NULL, 0); - return (tok->type = EOF_TOKEN); - } - if (ch == quote_char) break; - - s[len++] = ch; - - if (len == (MAX_TOKEN_LEN - 1)) - { - _SLparse_error ("String too long for buffer", NULL, 0); - return (tok->type == EOF_TOKEN); - } - - if (ch == '\\') - { - has_quote = 1; - ch = prep_get_char (); - s[len++] = ch; - } - } - - s[len] = 0; - - if (has_quote) - is_binary = expand_escaped_string ((char *) s, (char *)s, (char *)s + len, &len); - else is_binary = 0; - - if ('"' == quote_char) - { - tok->free_sval_flag = 1; - if (is_binary) - { - tok->v.b_val = SLbstring_create (s, len); - return tok->type = BSTRING_TOKEN; - } - else - { - tok->v.s_val = _SLstring_make_hashed_string ((char *)s, - len, - &tok->hash); - tok->free_sval_flag = 1; - return (tok->type = STRING_TOKEN); - } - } - - /* else single character */ - if (s[1] != 0) - { - _SLparse_error("Single char expected", NULL, 0); - return (tok->type = EOF_TOKEN); - } - - tok->v.long_val = s[0]; - return (tok->type = UCHAR_TOKEN); -} - -static int extract_token (_SLang_Token_Type *tok, unsigned char ch, unsigned char t) -{ - unsigned char s [MAX_TOKEN_LEN]; - unsigned int slen; - - s[0] = (char) ch; - slen = 1; - - switch (t) - { - case ALPHA_CHAR: - return get_ident_token (tok, s, slen); - - case OP_CHAR: - return get_op_token (tok, ch); - - case DIGIT_CHAR: - return get_number_token (tok, s, slen); - - case EXCL_CHAR: - ch = prep_get_char (); - s [slen++] = ch; - t = CHAR_CLASS(ch); - if (t == ALPHA_CHAR) return get_ident_token (tok, s, slen); - if (t == OP_CHAR) - { - unget_prep_char (ch); - return get_op_token (tok, '!'); - } - _SLparse_error("Misplaced !", NULL, 0); - return -1; - - case DOT_CHAR: - ch = prep_get_char (); - if (DIGIT_CHAR == CHAR_CLASS(ch)) - { - s [slen++] = ch; - return get_number_token (tok, s, slen); - } - unget_prep_char (ch); - return (tok->type = DOT_TOKEN); - - case SEP_CHAR: - return (tok->type = CHAR_DATA(ch)); - - case DQUOTE_CHAR: - case QUOTE_CHAR: - return get_string_token (tok, ch, s); - - default: - _SLparse_error("Invalid character", NULL, 0); - return (tok->type = EOF_TOKEN); - } -} - -int _SLget_rpn_token (_SLang_Token_Type *tok) -{ - unsigned char ch; - - tok->v.s_val = "??"; - while ((ch = *Input_Line_Pointer) != 0) - { - unsigned char t; - - Input_Line_Pointer++; - if (WHITE_CHAR == (t = CHAR_CLASS(ch))) - continue; - - if (NL_CHAR == t) - break; - - return extract_token (tok, ch, t); - } - Input_Line_Pointer = Empty_Line; - return EOF_TOKEN; -} - -int _SLget_token (_SLang_Token_Type *tok) -{ - unsigned char ch; - unsigned char t; - - tok->num_refs = 1; - tok->free_sval_flag = 0; - tok->v.s_val = "??"; -#if _SLANG_HAS_DEBUG_CODE - tok->line_number = LLT->line_num; -#endif - if (SLang_Error || (Input_Line == NULL)) - return (tok->type = EOF_TOKEN); - - while (1) - { - ch = *Input_Line_Pointer++; - if (WHITE_CHAR == (t = CHAR_CLASS (ch))) - continue; - - if (t != NL_CHAR) - return extract_token (tok, ch, t); - - do - { - LLT->line_num++; -#if _SLANG_HAS_DEBUG_CODE - tok->line_number++; -#endif - Input_Line = LLT->read(LLT); - if ((NULL == Input_Line) || SLang_Error) - { - Input_Line_Pointer = Input_Line = NULL; - return (tok->type = EOF_TOKEN); - } - } - while (0 == SLprep_line_ok(Input_Line, This_SLpp)); - - Input_Line_Pointer = Input_Line; - if (*Input_Line_Pointer == '.') - { - Input_Line_Pointer++; - return tok->type = RPN_TOKEN; - } - } -} - -static int prep_exists_function (char *line, char comment) -{ - char buf[MAX_FILE_LINE_LEN], *b, *bmax; - unsigned char ch; - - bmax = buf + (sizeof (buf) - 1); - - while (1) - { - /* skip whitespace */ - while ((ch = (unsigned char) *line), - ch && (ch != '\n') && (ch <= ' ')) - line++; - - if ((ch <= '\n') - || (ch == (unsigned char) comment)) break; - - b = buf; - while ((ch = (unsigned char) *line) > ' ') - { - if (b < bmax) *b++ = (char) ch; - line++; - } - *b = 0; - - if (SLang_is_defined (buf)) - return 1; - } - - return 0; -} - -static int prep_eval_expr (char *expr) -{ - int ret; - - if (0 != SLang_load_string (expr)) - return -1; - if (-1 == SLang_pop_integer (&ret)) - return -1; - return (ret != 0); -} - - -int SLang_load_object (SLang_Load_Type *x) -{ - SLPreprocess_Type this_pp; - SLPreprocess_Type *save_this_pp; - SLang_Load_Type *save_llt; - char *save_input_line, *save_input_line_ptr; -#if _SLANG_HAS_DEBUG_CODE - int save_compile_line_num_info; -#endif - int save_auto_declare_variables; - - if (SLprep_exists_hook == NULL) - SLprep_exists_hook = prep_exists_function; - - if (_SLprep_eval_hook == NULL) - _SLprep_eval_hook = prep_eval_expr; - - if (-1 == SLprep_open_prep (&this_pp)) return -1; - - if (-1 == _SLcompile_push_context (x)) - return -1; - -#if _SLANG_HAS_DEBUG_CODE - save_compile_line_num_info = _SLang_Compile_Line_Num_Info; -#endif - save_this_pp = This_SLpp; - save_input_line = Input_Line; - save_input_line_ptr = Input_Line_Pointer; - save_llt = LLT; - save_auto_declare_variables = _SLang_Auto_Declare_Globals; - - This_SLpp = &this_pp; - Input_Line_Pointer = Input_Line = Empty_Line; - LLT = x; - - x->line_num = 0; - x->parse_level = 0; - _SLang_Auto_Declare_Globals = x->auto_declare_globals; - -#if _SLANG_HAS_DEBUG_CODE - _SLang_Compile_Line_Num_Info = Default_Compile_Line_Num_Info; -#endif - - _SLparse_start (x); - if (SLang_Error) - do_line_file_error (x->line_num, x->name); - - _SLang_Auto_Declare_Globals = save_auto_declare_variables; - - if (SLang_Error) SLang_restart (0); - - (void) _SLcompile_pop_context (); - - Input_Line = save_input_line; - Input_Line_Pointer = save_input_line_ptr; - LLT = save_llt; - This_SLpp = save_this_pp; - -#if _SLANG_HAS_DEBUG_CODE - _SLang_Compile_Line_Num_Info = save_compile_line_num_info; -#endif - - if (SLang_Error) return -1; - return 0; -} - -SLang_Load_Type *SLallocate_load_type (char *name) -{ - SLang_Load_Type *x; - - if (NULL == (x = (SLang_Load_Type *)SLmalloc (sizeof (SLang_Load_Type)))) - return NULL; - memset ((char *) x, 0, sizeof (SLang_Load_Type)); - - if (name == NULL) name = ""; - - x->name = SLang_create_slstring (name); - if (x->name == NULL) - { - SLfree ((char *) x); - return NULL; - } - return x; -} - -void SLdeallocate_load_type (SLang_Load_Type *x) -{ - if (x != NULL) - { - SLang_free_slstring (x->name); - SLfree ((char *) x); - } -} - -typedef struct -{ - char *string; - char *ptr; -} -String_Client_Data_Type; - -static char *read_from_string (SLang_Load_Type *x) -{ - String_Client_Data_Type *data; - char *s, *s1, ch; - - data = (String_Client_Data_Type *)x->client_data; - s1 = s = data->ptr; - - if (*s == 0) - return NULL; - - while ((ch = *s) != 0) - { - s++; - if (ch == '\n') - break; - } - - data->ptr = s; - return s1; -} - -int SLang_load_string (char *string) -{ - SLang_Load_Type *x; - String_Client_Data_Type data; - int ret; - - if (string == NULL) - return -1; - - /* Grab a private copy in case loading modifies string */ - if (NULL == (string = SLang_create_slstring (string))) - return -1; - - /* To avoid creating a static data space for every string loaded, - * all string objects will be regarded as identical. So, identify - * all of them by ***string*** - */ - if (NULL == (x = SLallocate_load_type ("***string***"))) - { - SLang_free_slstring (string); - return -1; - } - - x->client_data = (VOID_STAR) &data; - x->read = read_from_string; - - data.ptr = data.string = string; - if (-1 == (ret = SLang_load_object (x))) - SLang_verror (SLang_Error, "called from eval: %s", string); - - SLang_free_slstring (string); - SLdeallocate_load_type (x); - return ret; -} - -typedef struct -{ - char *buf; - FILE *fp; -} -File_Client_Data_Type; - -char *SLang_User_Prompt; -static char *read_from_file (SLang_Load_Type *x) -{ - FILE *fp; - File_Client_Data_Type *c; - - c = (File_Client_Data_Type *)x->client_data; - fp = c->fp; - - if ((fp == stdin) && (SLang_User_Prompt != NULL)) - { - fputs (SLang_User_Prompt, stdout); - fflush (stdout); - } - - return fgets (c->buf, MAX_FILE_LINE_LEN, c->fp); -} - -/* Note that file could be freed from Slang during run of this routine - * so get it and store it !! (e.g., autoloading) - */ -int (*SLang_Load_File_Hook) (char *); -int SLang_load_file (char *f) -{ - File_Client_Data_Type client_data; - SLang_Load_Type *x; - char *name, *buf; - FILE *fp; - - if (SLang_Load_File_Hook != NULL) - return (*SLang_Load_File_Hook) (f); - - if (f == NULL) name = ""; else name = f; - - name = SLang_create_slstring (name); - if (name == NULL) - return -1; - - if (NULL == (x = SLallocate_load_type (name))) - { - SLang_free_slstring (name); - return -1; - } - - buf = NULL; - - if (f != NULL) - fp = fopen (f, "r"); - else - fp = stdin; - - if (fp == NULL) - SLang_verror (SL_OBJ_NOPEN, "Unable to open %s", name); - else if (NULL != (buf = SLmalloc (MAX_FILE_LINE_LEN + 1))) - { - client_data.fp = fp; - client_data.buf = buf; - x->client_data = (VOID_STAR) &client_data; - x->read = read_from_file; - - (void) SLang_load_object (x); - } - - if ((fp != NULL) && (fp != stdin)) - fclose (fp); - - SLfree (buf); - SLang_free_slstring (name); - SLdeallocate_load_type (x); - - if (SLang_Error) - return -1; - - return 0; -} - -int SLang_guess_type (char *t) -{ - char *p; - register char ch; - int modifier = 0; - - if (*t == '-') t++; - p = t; - -#if SLANG_HAS_FLOAT - if (*p != '.') - { -#endif - modifier = 0; - while ((*p >= '0') && (*p <= '9')) p++; - if (t == p) return (SLANG_STRING_TYPE); - if ((*p == 'x') && (p == t + 1)) /* 0x?? */ - { - modifier |= 8; - p++; - while (ch = *p, - ((ch >= '0') && (ch <= '9')) - || (((ch | 0x20) >= 'a') && ((ch | 0x20) <= 'f'))) p++; - } - - /* Now look for UL, LU, UH, HU, L, H modifiers */ - while ((ch = *p) != 0) - { - ch |= 0x20; - if (ch == 'h') modifier |= 1; - else if (ch == 'l') modifier |= 2; - else if (ch == 'u') modifier |= 4; - else break; - p++; - } - if ((1|2) == (modifier & (1|2))) /* hl present */ - return SLANG_STRING_TYPE; - - if (ch == 0) - { - if ((modifier & 0x7) == 0) return SLANG_INT_TYPE; - if (modifier & 4) - { - if (modifier & 1) return SLANG_USHORT_TYPE; - if (modifier & 2) return SLANG_ULONG_TYPE; - return SLANG_UINT_TYPE; - } - if (modifier & 1) return SLANG_SHORT_TYPE; - if (modifier & 2) return SLANG_LONG_TYPE; - return SLANG_INT_TYPE; - } - - if (modifier) return SLANG_STRING_TYPE; -#if SLANG_HAS_FLOAT - } - - /* now down to double case */ - if (*p == '.') - { - p++; - while ((*p >= '0') && (*p <= '9')) p++; - } - if (*p == 0) return(SLANG_DOUBLE_TYPE); - if ((*p != 'e') && (*p != 'E')) - { -# if SLANG_HAS_COMPLEX - if (((*p == 'i') || (*p == 'j')) - && (p[1] == 0)) - return SLANG_COMPLEX_TYPE; -# endif - if (((*p | 0x20) == 'f') && (p[1] == 0)) - return SLANG_FLOAT_TYPE; - - return SLANG_STRING_TYPE; - } - - p++; - if ((*p == '-') || (*p == '+')) p++; - while ((*p >= '0') && (*p <= '9')) p++; - if (*p != 0) - { -# if SLANG_HAS_COMPLEX - if (((*p == 'i') || (*p == 'j')) - && (p[1] == 0)) - return SLANG_COMPLEX_TYPE; -# endif - if (((*p | 0x20) == 'f') && (p[1] == 0)) - return SLANG_FLOAT_TYPE; - - return SLANG_STRING_TYPE; - } - return SLANG_DOUBLE_TYPE; -#else - return SLANG_STRING_TYPE; -#endif /* SLANG_HAS_FLOAT */ -} - -static int hex_atoul (unsigned char *s, unsigned long *ul) -{ - register unsigned char ch; - register unsigned long value; - register int base; - - s++; /* skip the leading 0 */ - - /* look for 'x' which indicates hex */ - if ((*s | 0x20) == 'x') - { - base = 16; - s++; - if (*s == 0) - { - SLang_Error = SL_SYNTAX_ERROR; - return -1; - } - } - else base = 8; - - value = 0; - while ((ch = *s++) != 0) - { - char ch1 = ch | 0x20; - switch (ch1) - { - default: - SLang_Error = SL_SYNTAX_ERROR; - break; - - case 'u': - case 'l': - case 'h': - *ul = value; - return 0; - - case '8': - case '9': - if (base != 16) SLang_Error = SL_SYNTAX_ERROR; - /* drop */ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - ch1 -= '0'; - break; - - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - if (base != 16) SLang_Error = SL_SYNTAX_ERROR; - ch1 = (ch1 - 'a') + 10; - break; - } - value = value * base + ch1; - } - *ul = value; - return 0; -} - -/* Note: These routines do not check integer overflow. I would use the C - * library functions atol and atoul but some implementations check overflow - * and some do not. The following implementations provide a consistent - * behavior. - */ -unsigned long SLatoul (unsigned char *s) -{ - int sign; - unsigned long value; - - if (*s == '-') sign = -1; - else - { - sign = 1; - if (*s == '+') s++; - } - - if (*s == '0') - { - if (-1 == hex_atoul (s, &value)) - return (unsigned long) -1; - } - else - { - while (WHITE_CHAR == CHAR_CLASS(*s)) - s++; - - value = 0; - while (DIGIT_CHAR == CHAR_CLASS(*s)) - { - value = value * 10 + (unsigned long) (*s - '0'); - s++; - } - } - - if (sign == -1) - value = (unsigned long)-1L * value; - - return value; -} - -long SLatol (unsigned char *s) -{ - while (WHITE_CHAR == CHAR_CLASS(*s)) - s++; - - if (*s == '-') - { - long value = (long) SLatoul (s+1); - return -value; - } - return (long) SLatoul (s); -} - -int SLatoi (unsigned char *s) -{ - return (int) SLatol (s); -} - -static char *check_byte_compiled_token (char *buf) -{ - unsigned int len_lo, len_hi, len; - - len_lo = (unsigned char) *Input_Line_Pointer++; - if ((len_lo < 32) - || ((len_hi = (unsigned char)*Input_Line_Pointer++) < 32) - || ((len = (len_lo - 32) | ((len_hi - 32) << 7)) >= MAX_TOKEN_LEN)) - { - SLang_doerror ("Byte compiled file appears corrupt"); - return NULL; - } - - SLMEMCPY (buf, Input_Line_Pointer, len); - buf += len; - Input_Line_Pointer += len; - *buf = 0; - return buf; -} - -void _SLcompile_byte_compiled (void) -{ - unsigned char type; - _SLang_Token_Type tok; - char buf[MAX_TOKEN_LEN]; - char *ebuf; - unsigned int len; - - memset ((char *) &tok, 0, sizeof (_SLang_Token_Type)); - - while (SLang_Error == 0) - { - top_of_switch: - type = (unsigned char) *Input_Line_Pointer++; - switch (type) - { - case '\n': - case 0: - if (NULL == (Input_Line = LLT->read(LLT))) - { - Input_Line_Pointer = Input_Line = NULL; - return; - } - Input_Line_Pointer = Input_Line; - goto top_of_switch; - - case LINE_NUM_TOKEN: - case CHAR_TOKEN: - case UCHAR_TOKEN: - case SHORT_TOKEN: - case USHORT_TOKEN: - case INT_TOKEN: - case UINT_TOKEN: - case LONG_TOKEN: - case ULONG_TOKEN: - if (NULL == check_byte_compiled_token (buf)) - return; - tok.v.long_val = atol (buf); - break; - - case COMPLEX_TOKEN: - case FLOAT_TOKEN: - case DOUBLE_TOKEN: - if (NULL == check_byte_compiled_token (buf)) - return; - tok.v.s_val = buf; - break; - - case ESC_STRING_TOKEN: - if (NULL == (ebuf = check_byte_compiled_token (buf))) - return; - tok.v.s_val = buf; - if (expand_escaped_string (buf, buf, ebuf, &len)) - { - tok.hash = len; - type = _BSTRING_TOKEN; - } - else - { - tok.hash = _SLstring_hash ((unsigned char *)buf, (unsigned char *)buf + len); - type = STRING_TOKEN; - } - break; - - case TMP_TOKEN: - case DEFINE_TOKEN: - case DEFINE_STATIC_TOKEN: - case DEFINE_PRIVATE_TOKEN: - case DEFINE_PUBLIC_TOKEN: - case DOT_TOKEN: - case STRING_TOKEN: - case IDENT_TOKEN: - case _REF_TOKEN: - case _DEREF_ASSIGN_TOKEN: - case _SCALAR_ASSIGN_TOKEN: - case _SCALAR_PLUSEQS_TOKEN: - case _SCALAR_MINUSEQS_TOKEN: - case _SCALAR_TIMESEQS_TOKEN: - case _SCALAR_DIVEQS_TOKEN: - case _SCALAR_BOREQS_TOKEN: - case _SCALAR_BANDEQS_TOKEN: - case _SCALAR_PLUSPLUS_TOKEN: - case _SCALAR_POST_PLUSPLUS_TOKEN: - case _SCALAR_MINUSMINUS_TOKEN: - case _SCALAR_POST_MINUSMINUS_TOKEN: - case _STRUCT_ASSIGN_TOKEN: - case _STRUCT_PLUSEQS_TOKEN: - case _STRUCT_MINUSEQS_TOKEN: - case _STRUCT_TIMESEQS_TOKEN: - case _STRUCT_DIVEQS_TOKEN: - case _STRUCT_BOREQS_TOKEN: - case _STRUCT_BANDEQS_TOKEN: - case _STRUCT_POST_MINUSMINUS_TOKEN: - case _STRUCT_MINUSMINUS_TOKEN: - case _STRUCT_POST_PLUSPLUS_TOKEN: - case _STRUCT_PLUSPLUS_TOKEN: - if (NULL == (ebuf = check_byte_compiled_token (buf))) - return; - tok.v.s_val = buf; - tok.hash = _SLstring_hash ((unsigned char *)buf, (unsigned char *)ebuf); - break; - - default: - break; - } - tok.type = type; - - (*_SLcompile_ptr) (&tok); - } -} - -static int escape_string (unsigned char *s, unsigned char *smax, - unsigned char *buf, unsigned char *buf_max, - int *is_escaped) -{ - unsigned char ch; - - *is_escaped = 0; - while (buf < buf_max) - { - if (s == smax) - { - *buf = 0; - return 0; - } - - ch = *s++; - switch (ch) - { - default: - *buf++ = ch; - break; - - case 0: - *buf++ = '\\'; - if (buf < buf_max) *buf++ = 'x'; - if (buf < buf_max) *buf++ = '0'; - if (buf < buf_max) *buf++ = '0'; - *is_escaped = 1; - break; /* return 0; */ - - case '\n': - *buf++ = '\\'; - if (buf < buf_max) *buf++ = 'n'; - *is_escaped = 1; - break; - - case '\r': - *buf++ = '\\'; - if (buf < buf_max) *buf++ = 'r'; - *is_escaped = 1; - break; - - case 0x1A: /* ^Z */ - *buf++ = '\\'; - if (buf < buf_max) *buf++ = 'x'; - if (buf < buf_max) *buf++ = '1'; - if (buf < buf_max) *buf++ = 'A'; - *is_escaped = 1; - break; - - case '\\': - *buf++ = ch; - if (buf < buf_max) *buf++ = ch; - *is_escaped = 1; - break; - } - } - _SLparse_error ("String too long to byte-compile", NULL, 0); - return -1; -} - -static FILE *Byte_Compile_Fp; -static unsigned int Byte_Compile_Line_Len; - -static int bytecomp_write_data (char *buf, unsigned int len) -{ - char *err = "Write Error"; - - if ((Byte_Compile_Line_Len + len + 1) >= MAX_FILE_LINE_LEN) - { - if (EOF == fputs ("\n", Byte_Compile_Fp)) - { - SLang_doerror (err); - return -1; - } - Byte_Compile_Line_Len = 0; - } - - if (EOF == fputs (buf, Byte_Compile_Fp)) - { - SLang_doerror (err); - return -1; - } - Byte_Compile_Line_Len += len; - return 0; -} - -static void byte_compile_token (_SLang_Token_Type *tok) -{ - unsigned char buf [MAX_TOKEN_LEN + 4], *buf_max; - unsigned int len; - char *b3; - int is_escaped; - unsigned char *s; - - if (SLang_Error) return; - - buf [0] = (unsigned char) tok->type; - buf [1] = 0; - - buf_max = buf + sizeof(buf); - b3 = (char *) buf + 3; - - switch (tok->type) - { - case LINE_NUM_TOKEN: - case CHAR_TOKEN: - case SHORT_TOKEN: - case INT_TOKEN: - case LONG_TOKEN: - sprintf (b3, "%ld", tok->v.long_val); - break; - - case UCHAR_TOKEN: - case USHORT_TOKEN: - case UINT_TOKEN: - case ULONG_TOKEN: - sprintf (b3, "%lu", tok->v.long_val); - break; - - case _BSTRING_TOKEN: - s = (unsigned char *) tok->v.s_val; - len = (unsigned int) tok->hash; - - if (-1 == escape_string (s, s + len, - (unsigned char *)b3, buf_max, - &is_escaped)) - return; - - buf[0] = ESC_STRING_TOKEN; - break; - - case BSTRING_TOKEN: - if (NULL == (s = SLbstring_get_pointer (tok->v.b_val, &len))) - return; - - if (-1 == escape_string (s, s + len, - (unsigned char *)b3, buf_max, - &is_escaped)) - return; - buf[0] = ESC_STRING_TOKEN; - break; - - case STRING_TOKEN: - s = (unsigned char *)tok->v.s_val; - - if (-1 == escape_string (s, s + strlen ((char *)s), - (unsigned char *)b3, buf_max, - &is_escaped)) - return; - - if (is_escaped) - buf[0] = ESC_STRING_TOKEN; - break; - - /* a _SCALAR_* token is attached to an identifier. */ - case _DEREF_ASSIGN_TOKEN: - case _SCALAR_ASSIGN_TOKEN: - case _SCALAR_PLUSEQS_TOKEN: - case _SCALAR_MINUSEQS_TOKEN: - case _SCALAR_TIMESEQS_TOKEN: - case _SCALAR_DIVEQS_TOKEN: - case _SCALAR_BOREQS_TOKEN: - case _SCALAR_BANDEQS_TOKEN: - case _SCALAR_PLUSPLUS_TOKEN: - case _SCALAR_POST_PLUSPLUS_TOKEN: - case _SCALAR_MINUSMINUS_TOKEN: - case _SCALAR_POST_MINUSMINUS_TOKEN: - case DOT_TOKEN: - case TMP_TOKEN: - case DEFINE_TOKEN: - case DEFINE_STATIC_TOKEN: - case DEFINE_PRIVATE_TOKEN: - case DEFINE_PUBLIC_TOKEN: - case FLOAT_TOKEN: - case DOUBLE_TOKEN: - case COMPLEX_TOKEN: - case IDENT_TOKEN: - case _REF_TOKEN: - case _STRUCT_ASSIGN_TOKEN: - case _STRUCT_PLUSEQS_TOKEN: - case _STRUCT_MINUSEQS_TOKEN: - case _STRUCT_TIMESEQS_TOKEN: - case _STRUCT_DIVEQS_TOKEN: - case _STRUCT_BOREQS_TOKEN: - case _STRUCT_BANDEQS_TOKEN: - case _STRUCT_POST_MINUSMINUS_TOKEN: - case _STRUCT_MINUSMINUS_TOKEN: - case _STRUCT_POST_PLUSPLUS_TOKEN: - case _STRUCT_PLUSPLUS_TOKEN: - strcpy (b3, tok->v.s_val); - break; - - default: - b3 = NULL; - } - - if (b3 != NULL) - { - len = strlen (b3); - buf[1] = (unsigned char) ((len & 0x7F) + 32); - buf[2] = (unsigned char) (((len >> 7) & 0x7F) + 32); - len += 3; - } - else len = 1; - - (void) bytecomp_write_data ((char *)buf, len); -} - -int SLang_byte_compile_file (char *name, int method) -{ - char file [1024]; - - (void) method; - if (strlen (name) + 2 >= sizeof (file)) - { - SLang_verror (SL_INVALID_PARM, "Filename too long"); - return -1; - } - sprintf (file, "%sc", name); - if (NULL == (Byte_Compile_Fp = fopen (file, "w"))) - { - SLang_verror(SL_OBJ_NOPEN, "%s: unable to open", file); - return -1; - } - - Byte_Compile_Line_Len = 0; - if (-1 != bytecomp_write_data (".#", 2)) - { - _SLcompile_ptr = byte_compile_token; - (void) SLang_load_file (name); - _SLcompile_ptr = _SLcompile; - - (void) bytecomp_write_data ("\n", 1); - } - - if (EOF == fclose (Byte_Compile_Fp)) - SLang_doerror ("Write Error"); - - if (SLang_Error) - { - SLang_verror (0, "Error processing %s", name); - return -1; - } - return 0; -} - -int SLang_generate_debug_info (int x) -{ - int y = Default_Compile_Line_Num_Info; - Default_Compile_Line_Num_Info = x; - return y; -} diff --git a/mdk-stage1/slang/sltypes.c b/mdk-stage1/slang/sltypes.c deleted file mode 100644 index 05b8741b1..000000000 --- a/mdk-stage1/slang/sltypes.c +++ /dev/null @@ -1,966 +0,0 @@ -/* Basic type operations for S-Lang */ -/* Copyright (c) 1992, 1996, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#if SLANG_HAS_FLOAT -# include -#endif - -#define SL_APP_WANTS_FOREACH /* for String_Type */ -#include "slang.h" -#include "_slang.h" - -int SLpop_string (char **s) /*{{{*/ -{ - char *sls; - - *s = NULL; - - if (-1 == SLang_pop_slstring (&sls)) - return -1; - - if (NULL == (*s = SLmake_string (sls))) - { - SLang_free_slstring (sls); - return -1; - } - - SLang_free_slstring (sls); - return 0; -} - -/*}}}*/ - -int SLang_pop_slstring (char **s) /*{{{*/ -{ - return SLclass_pop_ptr_obj (SLANG_STRING_TYPE, (VOID_STAR *)s); -} - -/*}}}*/ - -/* if *data != 0, string should be freed upon use. */ -int SLang_pop_string(char **s, int *data) /*{{{*/ -{ - if (SLpop_string (s)) - return -1; - - *data = 1; - return 0; -} - -/*}}}*/ - -int _SLang_push_slstring (char *s) -{ - if (0 == SLclass_push_ptr_obj (SLANG_STRING_TYPE, (VOID_STAR)s)) - return 0; - - SLang_free_slstring (s); - return -1; -} - -int _SLpush_alloced_slstring (char *s, unsigned int len) -{ - if (NULL == (s = _SLcreate_via_alloced_slstring (s, len))) - return -1; - - return _SLang_push_slstring (s); -} - -int SLang_push_string (char *t) /*{{{*/ -{ - if (t == NULL) - return SLang_push_null (); - - if (NULL == (t = SLang_create_slstring (t))) - return -1; - - return _SLang_push_slstring (t); -} - -/*}}}*/ - -int _SLang_dup_and_push_slstring (char *s) -{ - if (NULL == (s = _SLstring_dup_slstring (s))) - return SLang_push_null (); - - return _SLang_push_slstring (s); -} - - -/* This function _always_ frees the malloced string */ -int SLang_push_malloced_string (char *c) /*{{{*/ -{ - int ret; - - ret = SLang_push_string (c); - SLfree (c); - - return ret; -} - -/*}}}*/ - -#if 0 -static int int_int_power (int a, int b) -{ - int r, s; - - if (a == 0) return 0; - if (b < 0) return 0; - if (b == 0) return 1; - - s = 1; - if (a < 0) - { - if ((b % 2) == 1) s = -1; - a = -a; - } - - /* FIXME: Priority=low - * This needs optimized - */ - r = 1; - while (b) - { - r = r * a; - b--; - } - return r * s; -} -#endif - -static int -string_string_bin_op_result (int op, unsigned char a, unsigned char b, - unsigned char *c) -{ - (void) a; - (void) b; - switch (op) - { - default: - return 0; - - case SLANG_PLUS: - *c = SLANG_STRING_TYPE; - break; - - case SLANG_GT: - case SLANG_GE: - case SLANG_LT: - case SLANG_LE: - case SLANG_EQ: - case SLANG_NE: - *c = SLANG_CHAR_TYPE; - break; - } - return 1; -} - -static int -string_string_bin_op (int op, - unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp, unsigned int nb, - VOID_STAR cp) -{ - char *ic; - char **a, **b, **c; - unsigned int n, n_max; - unsigned int da, db; - - (void) a_type; - (void) b_type; - - if (na == 1) da = 0; else da = 1; - if (nb == 1) db = 0; else db = 1; - - if (na > nb) n_max = na; else n_max = nb; - - a = (char **) ap; - b = (char **) bp; - for (n = 0; n < n_max; n++) - { - if ((*a == NULL) || (*b == NULL)) - { - SLang_verror (SL_VARIABLE_UNINITIALIZED, "String element[%u] not initialized for binary operation", n); - return -1; - } - a += da; b += db; - } - - a = (char **) ap; - b = (char **) bp; - ic = (char *) cp; - c = NULL; - - switch (op) - { - case SLANG_DIVIDE: - case SLANG_MINUS: - default: - return 0; - - case SLANG_PLUS: - /* Concat */ - c = (char **) cp; - for (n = 0; n < n_max; n++) - { - if (NULL == (c[n] = SLang_concat_slstrings (*a, *b))) - goto return_error; - - a += da; b += db; - } - break; - - case SLANG_NE: - for (n = 0; n < n_max; n++) - { - ic [n] = (0 != strcmp (*a, *b)); - a += da; - b += db; - } - break; - case SLANG_GT: - for (n = 0; n < n_max; n++) - { - ic [n] = (strcmp (*a, *b) > 0); - a += da; - b += db; - } - break; - case SLANG_GE: - for (n = 0; n < n_max; n++) - { - ic [n] = (strcmp (*a, *b) >= 0); - a += da; - b += db; - } - break; - case SLANG_LT: - for (n = 0; n < n_max; n++) - { - ic [n] = (strcmp (*a, *b) < 0); - a += da; - b += db; - } - break; - case SLANG_LE: - for (n = 0; n < n_max; n++) - { - ic [n] = (strcmp (*a, *b) <= 0); - a += da; - b += db; - } - break; - case SLANG_EQ: - for (n = 0; n < n_max; n++) - { - ic [n] = (strcmp (*a, *b) == 0); - a += da; - b += db; - } - break; - } - return 1; - - return_error: - if (c != NULL) - { - unsigned int nn; - for (nn = 0; nn < n; nn++) - { - SLang_free_slstring (c[nn]); - c[nn] = NULL; - } - for (nn = n; nn < n_max; nn++) - c[nn] = NULL; - } - return -1; -} - -static void string_destroy (unsigned char unused, VOID_STAR s) -{ - (void) unused; - SLang_free_slstring (*(char **) s); -} - -static int string_push (unsigned char unused, VOID_STAR sptr) -{ - (void) unused; - return SLang_push_string (*(char **) sptr); -} - -static int string_cmp (unsigned char unused, VOID_STAR ap, VOID_STAR bp, int *c) -{ - char *a, *b; - (void) unused; - - a = *(char **) ap; - b = *(char **) bp; - if (a != b) - { - if (a == NULL) *c = -1; - else if (b == NULL) *c = 1; - else *c = strcmp (a, b); - return 0; - } - *c = 0; - return 0; -} - -static int string_to_int (unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp) -{ - char **s; - unsigned int i; - int *b; - - (void) a_type; - (void) b_type; - - s = (char **) ap; - b = (int *) bp; - for (i = 0; i < na; i++) - { - if (s[i] == NULL) b[i] = 0; - else b[i] = s[i][0]; - } - return 1; -} - -struct _SLang_Foreach_Context_Type -{ - char *string; - unsigned int n; -}; - -static SLang_Foreach_Context_Type * -string_foreach_open (unsigned char type, unsigned int num) -{ - char *s; - SLang_Foreach_Context_Type *c; - - (void) type; - if (num != 0) - { - SLang_verror (SL_NOT_IMPLEMENTED, - "'foreach using' form not supported by String_Type"); - SLdo_pop_n (num + 1); - return NULL; - } - if (-1 == SLang_pop_slstring (&s)) - return NULL; - - c = (SLang_Foreach_Context_Type *)SLmalloc (sizeof (SLang_Foreach_Context_Type)); - if (c == NULL) - { - SLang_free_slstring (s); - return NULL; - } - - memset ((char *) c, 0, sizeof (SLang_Foreach_Context_Type)); - c->string = s; - - return c; -} - -static void string_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c) -{ - (void) type; - if (c == NULL) return; - SLang_free_slstring (c->string); - SLfree ((char *) c); -} - -static int string_foreach (unsigned char type, SLang_Foreach_Context_Type *c) -{ - char ch; - - (void) type; - ch = c->string[c->n]; - if (ch == 0) - return 0; /* done */ - - c->n += 1; - - if (-1 == SLclass_push_int_obj (SLANG_INT_TYPE, ch)) - return -1; - - return 1; -} - -int _SLstring_list_push (_SLString_List_Type *p) -{ - unsigned int num; - int inum; - SLang_Array_Type *at; - char **buf; - - if ((buf = p->buf) == NULL) - return SLang_push_null (); - - num = p->num; - inum = (int) num; - - if (num == 0) num++; - if (num != p->max_num) - { - if (NULL == (buf = (char **)SLrealloc ((char *) buf, sizeof (char *) * num))) - { - _SLstring_list_delete (p); - return -1; - } - p->max_num = num; - p->buf = buf; - } - - if (NULL == (at = SLang_create_array (SLANG_STRING_TYPE, 0, (VOID_STAR) buf, &inum, 1))) - { - _SLstring_list_delete (p); - return -1; - } - p->buf = NULL; - _SLstring_list_delete (p); - return SLang_push_array (at, 1); -} - -int _SLstring_list_init (_SLString_List_Type *p, unsigned int max_num, unsigned int delta_num) -{ - if (NULL == (p->buf = (char **) SLmalloc (max_num * sizeof (char *)))) - return -1; - - p->max_num = max_num; - p->num = 0; - p->delta_num = delta_num; - return 0; -} - -int _SLstring_list_append (_SLString_List_Type *p, char *s) -{ - if (s == NULL) - { - _SLstring_list_delete (p); - return -1; - } - - if (p->max_num == p->num) - { - char **b; - unsigned int max_num = p->num + p->delta_num; - b = (char **)SLrealloc ((char *)p->buf, max_num * sizeof (char *)); - if (b == NULL) - { - _SLstring_list_delete (p); - SLang_free_slstring (s); - return -1; - } - p->buf = b; - p->max_num = max_num; - } - - p->buf[p->num] = s; - p->num++; - return 0; -} - -void _SLstring_list_delete (_SLString_List_Type *p) -{ - if (p->buf != NULL) - { - unsigned int i, imax; - char **buf = p->buf; - imax = p->num; - for (i = 0; i < imax; i++) - SLang_free_slstring (buf[i]); - SLfree ((char *)buf); - p->buf = NULL; - } -} - -/* Ref type */ -int SLang_pop_ref (SLang_Ref_Type **ref) -{ - return SLclass_pop_ptr_obj (SLANG_REF_TYPE, (VOID_STAR *)ref); -} - -/* Note: This is ok if ptr is NULL. Some routines rely on this behavior */ -int _SLang_push_ref (int is_global, VOID_STAR ptr) -{ - SLang_Ref_Type *r; - - if (ptr == NULL) - return SLang_push_null (); - - r = (SLang_Ref_Type *) SLmalloc (sizeof (SLang_Ref_Type)); - if (r == NULL) return -1; - - r->is_global = is_global; - r->v.nt = (SLang_Name_Type *) ptr; - - if (-1 == SLclass_push_ptr_obj (SLANG_REF_TYPE, (VOID_STAR) r)) - { - SLfree ((char *) r); - return -1; - } - return 0; -} - -static void ref_destroy (unsigned char type, VOID_STAR ptr) -{ - (void) type; - SLfree ((char *) *(SLang_Ref_Type **)ptr); -} - -void SLang_free_ref (SLang_Ref_Type *ref) -{ - SLfree ((char *) ref); -} - -static int ref_push (unsigned char type, VOID_STAR ptr) -{ - SLang_Ref_Type *ref; - - (void) type; - - ref = *(SLang_Ref_Type **) ptr; - - if (ref == NULL) - return SLang_push_null (); - - return _SLang_push_ref (ref->is_global, (VOID_STAR) ref->v.nt); -} - -int SLang_assign_to_ref (SLang_Ref_Type *ref, unsigned char type, VOID_STAR v) -{ - SLang_Object_Type *stkptr; - SLang_Class_Type *cl; - - cl = _SLclass_get_class (type); - - /* Use apush since this function is passing ``array'' bytes rather than the - * address of the data. I need to somehow make this more consistent. To - * see what I mean, consider: - * - * double z[2]; - * char *s = "silly"; - * int i; - * - * SLang_assign_to_ref (ref, SLANG_INT_TYPE, &i); - * SLang_assign_to_ref (ref, SLANG_STRING_TYPE, &s); - * SLang_assign_to_ref (ref, SLANG_COMPLEX_TYPE, z); - * - * That is, all external routines that take a VOID_STAR argument need to - * be documented such that how the function should be called with the - * various class_types. - */ - if (-1 == (*cl->cl_apush) (type, v)) - return -1; - - stkptr = _SLStack_Pointer; - if (0 == _SLang_deref_assign (ref)) - return 0; - - if (stkptr != _SLStack_Pointer) - SLdo_pop (); - - return -1; -} - -static char *ref_string (unsigned char type, VOID_STAR ptr) -{ - SLang_Ref_Type *ref; - - (void) type; - ref = *(SLang_Ref_Type **) ptr; - if (ref->is_global) - { - char *name, *s; - - name = ref->v.nt->name; - if ((name != NULL) - && (NULL != (s = SLmalloc (strlen(name) + 2)))) - { - *s = '&'; - strcpy (s + 1, name); - return s; - } - - return NULL; - } - return SLmake_string ("Local Variable Reference"); -} - -static int ref_dereference (unsigned char unused, VOID_STAR ptr) -{ - (void) unused; - return _SLang_dereference_ref (*(SLang_Ref_Type **) ptr); -} - -static int ref_cmp (unsigned char type, VOID_STAR a, VOID_STAR b, int *c) -{ - SLang_Ref_Type *ra, *rb; - - (void) type; - - ra = *(SLang_Ref_Type **)a; - rb = *(SLang_Ref_Type **)b; - - if (ra == NULL) - { - if (rb == NULL) *c = 0; - else *c = -1; - return 0; - } - if (rb == NULL) - { - *c = 1; - return 0; - } - - if (ra->v.nt == rb->v.nt) - *c = 0; - else *c = strcmp (ra->v.nt->name, rb->v.nt->name); - return 0; -} - - -SLang_Name_Type *SLang_pop_function (void) -{ - SLang_Ref_Type *ref; - SLang_Name_Type *f; - - if (SLang_peek_at_stack () == SLANG_STRING_TYPE) - { - char *name; - - if (-1 == SLang_pop_slstring (&name)) - return NULL; - - if (NULL == (f = SLang_get_function (name))) - { - SLang_verror (SL_UNDEFINED_NAME, "Function %s does not exist", name); - SLang_free_slstring (name); - return NULL; - } - SLang_free_slstring (name); - return f; - } - - if (-1 == SLang_pop_ref (&ref)) - return NULL; - - f = SLang_get_fun_from_ref (ref); - SLang_free_ref (ref); - return f; -} - -/* This is a placeholder for version 2 */ -void SLang_free_function (SLang_Name_Type *f) -{ - (void) f; -} - -/* NULL type */ -int SLang_push_null (void) -{ - return SLclass_push_ptr_obj (SLANG_NULL_TYPE, NULL); -} - -int SLang_pop_null (void) -{ - SLang_Object_Type obj; - return _SLang_pop_object_of_type (SLANG_NULL_TYPE, &obj, 0); -} - -static int null_push (unsigned char unused, VOID_STAR ptr_unused) -{ - (void) unused; (void) ptr_unused; - return SLang_push_null (); -} - -static int null_pop (unsigned char type, VOID_STAR ptr) -{ - (void) type; - - if (-1 == SLang_pop_null ()) - return -1; - - *(char **) ptr = NULL; - return 0; -} - -/* Implement foreach (NULL) using (whatever) to do nothing. This is useful - * because suppose that X is a list but is NULL in some situations. Then - * when it is NULL, we want foreach(X) to do nothing. - */ -static SLang_Foreach_Context_Type * -null_foreach_open (unsigned char type, unsigned int num) -{ - (void) type; - SLdo_pop_n (num + 1); - return (SLang_Foreach_Context_Type *)1; -} - -static void null_foreach_close (unsigned char type, SLang_Foreach_Context_Type *c) -{ - (void) type; - (void) c; -} - -static int null_foreach (unsigned char type, SLang_Foreach_Context_Type *c) -{ - (void) type; - (void) c; - return 0; -} - -static int null_to_bool (unsigned char type, int *t) -{ - (void) type; - *t = 0; - return SLang_pop_null (); -} - -/* AnyType */ -int _SLanytype_typecast (unsigned char a_type, VOID_STAR ap, unsigned int na, - unsigned char b_type, VOID_STAR bp) -{ - SLang_Class_Type *cl; - SLang_Any_Type **any; - unsigned int i; - unsigned int sizeof_type; - - (void) b_type; - - any = (SLang_Any_Type **) bp; - - cl = _SLclass_get_class (a_type); - sizeof_type = cl->cl_sizeof_type; - - for (i = 0; i < na; i++) - { - if ((-1 == (*cl->cl_apush) (a_type, ap)) - || (-1 == SLang_pop_anytype (&any[i]))) - { - while (i != 0) - { - i--; - SLang_free_anytype (any[i]); - any[i] = NULL; - } - return -1; - } - ap = (VOID_STAR)((char *)ap + sizeof_type); - } - - return 1; -} - -int SLang_pop_anytype (SLang_Any_Type **any) -{ - SLang_Object_Type *obj; - - *any = NULL; - - if (NULL == (obj = (SLang_Object_Type *) SLmalloc (sizeof (SLang_Object_Type)))) - return -1; - - if (-1 == SLang_pop (obj)) - { - SLfree ((char *) obj); - return -1; - } - *any = (SLang_Any_Type *)obj; - return 0; -} - -/* This function will result in an object that is represented by the - * anytype object. - */ -int SLang_push_anytype (SLang_Any_Type *any) -{ - return _SLpush_slang_obj ((SLang_Object_Type *)any); -} - -/* After this call, the stack will contain an Any_Type object */ -static int anytype_push (unsigned char type, VOID_STAR ptr) -{ - SLang_Any_Type *obj; - - /* Push the object onto the stack, then pop it back off into our anytype - * container. That way, any memory managing associated with the type - * will be performed automatically. Another way to think of it is that - * pushing an Any_Type onto the stack will create another copy of the - * object represented by it. - */ - if (-1 == _SLpush_slang_obj (*(SLang_Object_Type **)ptr)) - return -1; - - if (-1 == SLang_pop_anytype (&obj)) - return -1; - - /* There is no need to reference count the anytype objects since every - * push results in a new anytype container. - */ - if (-1 == SLclass_push_ptr_obj (type, (VOID_STAR) obj)) - { - SLang_free_anytype (obj); - return -1; - } - - return 0; -} - -static void anytype_destroy (unsigned char type, VOID_STAR ptr) -{ - SLang_Object_Type *obj; - - (void) type; - obj = *(SLang_Object_Type **)ptr; - SLang_free_object (obj); - SLfree ((char *) obj); -} - -void SLang_free_anytype (SLang_Any_Type *any) -{ - if (any != NULL) - anytype_destroy (SLANG_ANY_TYPE, (VOID_STAR) &any); -} - -static int anytype_dereference (unsigned char unused, VOID_STAR ptr) -{ - (void) unused; - return _SLpush_slang_obj (*(SLang_Object_Type **) ptr); -} - -/* SLANG_INTP_TYPE */ -static int intp_push (unsigned char unused, VOID_STAR ptr) -{ - (void) unused; - return SLclass_push_int_obj (SLANG_INT_TYPE, **(int **)ptr); -} - -static int intp_pop (unsigned char unused, VOID_STAR ptr) -{ - (void) unused; - return SLang_pop_integer (*(int **) ptr); -} - -static int undefined_push (unsigned char t, VOID_STAR p) -{ - (void) t; (void) p; - if (SLang_Error == 0) - SLang_Error = SL_VARIABLE_UNINITIALIZED; - return -1; -} - -int _SLregister_types (void) -{ - SLang_Class_Type *cl; - - /* A good compiler should optimize this code away. */ - if ((sizeof(short) != SIZEOF_SHORT) - || (sizeof(int) != SIZEOF_INT) - || (sizeof(long) != SIZEOF_LONG) - || (sizeof(float) != SIZEOF_FLOAT) - || (sizeof(double) != SIZEOF_DOUBLE)) - SLang_exit_error ("S-Lang Library not built properly. Fix SIZEOF_* in config.h and recompile"); - - if (-1 == _SLclass_init ()) - return -1; - - /* Undefined Type */ - if (NULL == (cl = SLclass_allocate_class ("Undefined_Type"))) - return -1; - (void) SLclass_set_push_function (cl, undefined_push); - (void) SLclass_set_pop_function (cl, undefined_push); - if (-1 == SLclass_register_class (cl, SLANG_UNDEFINED_TYPE, sizeof (int), - SLANG_CLASS_TYPE_SCALAR)) - return -1; - /* Make Void_Type a synonym for Undefined_Type. Note that this does - * not mean that Void_Type represents SLANG_VOID_TYPE. Void_Type is - * used by array_map to indicate no array is to be created. - */ - if (-1 == SLclass_create_synonym ("Void_Type", SLANG_UNDEFINED_TYPE)) - return -1; - - if (-1 == _SLarith_register_types ()) - return -1; - - /* SLANG_INTP_TYPE */ - if (NULL == (cl = SLclass_allocate_class ("_IntegerP_Type"))) - return -1; - (void) SLclass_set_push_function (cl, intp_push); - (void) SLclass_set_pop_function (cl, intp_pop); - if (-1 == SLclass_register_class (cl, SLANG_INTP_TYPE, sizeof (int), - SLANG_CLASS_TYPE_SCALAR)) - return -1; - - /* String Type */ - - if (NULL == (cl = SLclass_allocate_class ("String_Type"))) - return -1; - (void) SLclass_set_destroy_function (cl, string_destroy); - (void) SLclass_set_push_function (cl, string_push); - cl->cl_foreach_open = string_foreach_open; - cl->cl_foreach_close = string_foreach_close; - cl->cl_foreach = string_foreach; - cl->cl_cmp = string_cmp; - if (-1 == SLclass_register_class (cl, SLANG_STRING_TYPE, sizeof (char *), - SLANG_CLASS_TYPE_PTR)) - return -1; - - /* ref Type */ - if (NULL == (cl = SLclass_allocate_class ("Ref_Type"))) - return -1; - cl->cl_dereference = ref_dereference; - cl->cl_push = ref_push; - cl->cl_destroy = ref_destroy; - cl->cl_string = ref_string; - cl->cl_cmp = ref_cmp; - if (-1 == SLclass_register_class (cl, SLANG_REF_TYPE, - sizeof (SLang_Ref_Type *), - SLANG_CLASS_TYPE_PTR)) - return -1; - - /* NULL Type */ - - if (NULL == (cl = SLclass_allocate_class ("Null_Type"))) - return -1; - cl->cl_push = null_push; - cl->cl_pop = null_pop; - cl->cl_foreach_open = null_foreach_open; - cl->cl_foreach_close = null_foreach_close; - cl->cl_foreach = null_foreach; - cl->cl_to_bool = null_to_bool; - if (-1 == SLclass_register_class (cl, SLANG_NULL_TYPE, sizeof (char *), - SLANG_CLASS_TYPE_SCALAR)) - return -1; - - /* AnyType */ - if (NULL == (cl = SLclass_allocate_class ("Any_Type"))) - return -1; - (void) SLclass_set_push_function (cl, anytype_push); - (void) SLclass_set_destroy_function (cl, anytype_destroy); - cl->cl_dereference = anytype_dereference; - if (-1 == SLclass_register_class (cl, SLANG_ANY_TYPE, sizeof (VOID_STAR), - SLANG_CLASS_TYPE_PTR)) - return -1; - - if (-1 == _SLang_init_bstring ()) - return -1; - - if ((-1 == SLclass_add_typecast (SLANG_STRING_TYPE, SLANG_INT_TYPE, string_to_int, 0)) - || (-1 == SLclass_add_binary_op (SLANG_STRING_TYPE, SLANG_STRING_TYPE, string_string_bin_op, string_string_bin_op_result))) - return -1; - - return 0; -} - diff --git a/mdk-stage1/slang/slutty.c b/mdk-stage1/slang/slutty.c deleted file mode 100644 index 636c1bb90..000000000 --- a/mdk-stage1/slang/slutty.c +++ /dev/null @@ -1,596 +0,0 @@ -/* slutty.c --- Unix Low level terminal (tty) functions for S-Lang */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include -/* sequent support thanks to Kenneth Lorber */ -/* SYSV (SYSV ISC R3.2 v3.0) provided by iain.lea@erlm.siemens.de */ - -#if defined (_AIX) && !defined (_ALL_SOURCE) -# define _ALL_SOURCE /* so NBBY is defined in */ -#endif - -#include -#include - -#ifdef SYSV -# include -# ifndef CRAY -# include -# include -# include -# include -# endif -#endif - -#ifdef __BEOS__ -/* Prototype for select */ -# include -#endif - -#include - -#ifndef sun -# include -#endif - -#ifdef __QNX__ -# include -#endif - -#include -#include - -#if defined (_AIX) && !defined (FD_SET) -# include /* for FD_ISSET, FD_SET, FD_ZERO */ -#endif - -#ifndef O_RDWR -# include -#endif - -#include "slang.h" -#include "_slang.h" - -int SLang_TT_Read_FD = -1; -int SLang_TT_Baud_Rate; - -#ifdef HAVE_TERMIOS_H -# if !defined(HAVE_TCGETATTR) || !defined(HAVE_TCSETATTR) -# undef HAVE_TERMIOS_H -# endif -#endif - -#ifndef HAVE_TERMIOS_H - -# if !defined(CBREAK) && defined(sun) -# ifndef BSD_COMP -# define BSD_COMP 1 -# endif -# include -# endif - -typedef struct - { - struct tchars t; - struct ltchars lt; - struct sgttyb s; - } -TTY_Termio_Type; -#else -# include -typedef struct termios TTY_Termio_Type; -#endif - -static TTY_Termio_Type Old_TTY; - -#ifdef HAVE_TERMIOS_H -typedef struct -{ - unsigned int key; - unsigned int value; -} Baud_Rate_Type; - -static Baud_Rate_Type Baud_Rates [] = -{ -#ifdef B0 - {B0, 0}, -#endif -#ifdef B50 - {B50, 50}, -#endif -#ifdef B75 - {B75, 75}, -#endif -#ifdef B110 - {B110, 110}, -#endif -#ifdef B134 - {B134, 134}, -#endif -#ifdef B150 - {B150, 150}, -#endif -#ifdef B200 - {B200, 200}, -#endif -#ifdef B300 - {B300, 300}, -#endif -#ifdef B600 - {B600, 600}, -#endif -#ifdef B1200 - {B1200, 1200}, -#endif -#ifdef B1800 - {B1800, 1800}, -#endif -#ifdef B2400 - {B2400, 2400}, -#endif -#ifdef B4800 - {B4800, 4800}, -#endif -#ifdef B9600 - {B9600, 9600}, -#endif -#ifdef B19200 - {B19200, 19200}, -#endif -#ifdef B38400 - {B38400, 38400}, -#endif -#ifdef B57600 - {B57600, 57600}, -#endif -#ifdef B115200 - {B115200, 115200}, -#endif -#ifdef B230400 - {B230400, 230400}, -#endif - {0, 0} -}; - -static void -set_baud_rate (TTY_Termio_Type *tty) -{ -#ifdef HAVE_CFGETOSPEED - unsigned int speed; - Baud_Rate_Type *b, *bmax; - - if (SLang_TT_Baud_Rate) - return; /* already set */ - - speed = (unsigned int) cfgetospeed (tty); - - b = Baud_Rates; - bmax = b + (sizeof (Baud_Rates)/sizeof(Baud_Rates[0])); - while (b < bmax) - { - if (b->key == speed) - { - SLang_TT_Baud_Rate = b->value; - return; - } - b++; - } -#else - (void) tty; -#endif -} - -#endif /* HAVE_TERMIOS_H */ - -#ifdef HAVE_TERMIOS_H -# define GET_TERMIOS(fd, x) tcgetattr(fd, x) -# define SET_TERMIOS(fd, x) tcsetattr(fd, TCSADRAIN, x) -#else -# ifdef TCGETS -# define GET_TERMIOS(fd, x) ioctl(fd, TCGETS, x) -# define SET_TERMIOS(fd, x) ioctl(fd, TCSETS, x) -# else -# define X(x,m) &(((TTY_Termio_Type *)(x))->m) -# define GET_TERMIOS(fd, x) \ - ((ioctl(fd, TIOCGETC, X(x,t)) || \ - ioctl(fd, TIOCGLTC, X(x,lt)) || \ - ioctl(fd, TIOCGETP, X(x,s))) ? -1 : 0) -# define SET_TERMIOS(fd, x) \ - ((ioctl(fd, TIOCSETC, X(x,t)) ||\ - ioctl(fd, TIOCSLTC, X(x,lt)) || \ - ioctl(fd, TIOCSETP, X(x,s))) ? -1 : 0) -# endif -#endif - -static int TTY_Inited = 0; -static int TTY_Open = 0; - -#ifdef ultrix /* Ultrix gets _POSIX_VDISABLE wrong! */ -# define NULL_VALUE -1 -#else -# ifdef _POSIX_VDISABLE -# define NULL_VALUE _POSIX_VDISABLE -# else -# define NULL_VALUE 255 -# endif -#endif - -int SLang_init_tty (int abort_char, int no_flow_control, int opost) -{ - TTY_Termio_Type newtty; - - SLsig_block_signals (); - - if (TTY_Inited) - { - SLsig_unblock_signals (); - return 0; - } - - TTY_Open = 0; - - if ((SLang_TT_Read_FD == -1) - || (1 != isatty (SLang_TT_Read_FD))) - { -#ifdef O_RDWR -# ifndef __BEOS__ /* I have been told that BEOS will HANG if passed /dev/tty */ - if ((SLang_TT_Read_FD = open("/dev/tty", O_RDWR)) >= 0) - { - TTY_Open = 1; - } -# endif -#endif - if (TTY_Open == 0) - { - SLang_TT_Read_FD = fileno (stderr); - if (1 != isatty (SLang_TT_Read_FD)) - { - SLang_TT_Read_FD = fileno (stdin); - if (1 != isatty (SLang_TT_Read_FD)) - { - fprintf (stderr, "Failed to open terminal."); - return -1; - } - } - } - } - - SLang_Abort_Char = abort_char; - - /* Some systems may not permit signals to be blocked. As a result, the - * return code must be checked. - */ - while (-1 == GET_TERMIOS(SLang_TT_Read_FD, &Old_TTY)) - { - if (errno != EINTR) - { - SLsig_unblock_signals (); - return -1; - } - } - - while (-1 == GET_TERMIOS(SLang_TT_Read_FD, &newtty)) - { - if (errno != EINTR) - { - SLsig_unblock_signals (); - return -1; - } - } - -#ifndef HAVE_TERMIOS_H - newtty.s.sg_flags &= ~(ECHO); - newtty.s.sg_flags &= ~(CRMOD); - /* if (Flow_Control == 0) newtty.s.sg_flags &= ~IXON; */ - newtty.t.t_eofc = 1; - if (abort_char == -1) SLang_Abort_Char = newtty.t.t_intrc; - newtty.t.t_intrc = SLang_Abort_Char; /* ^G */ - newtty.t.t_quitc = 255; - newtty.lt.t_suspc = 255; /* to ignore ^Z */ - newtty.lt.t_dsuspc = 255; /* to ignore ^Y */ - newtty.lt.t_lnextc = 255; - newtty.s.sg_flags |= CBREAK; /* do I want cbreak or raw????? */ -#else - - /* get baud rate */ - - newtty.c_iflag &= ~(ECHO | INLCR | ICRNL); -#ifdef ISTRIP - /* newtty.c_iflag &= ~ISTRIP; */ -#endif - if (opost == 0) newtty.c_oflag &= ~OPOST; - - set_baud_rate (&newtty); - - if (no_flow_control) newtty.c_iflag &= ~IXON; else newtty.c_iflag |= IXON; - - newtty.c_cc[VEOF] = 1; - newtty.c_cc[VMIN] = 1; - newtty.c_cc[VTIME] = 0; - newtty.c_lflag = ISIG | NOFLSH; - if (abort_char == -1) SLang_Abort_Char = newtty.c_cc[VINTR]; - newtty.c_cc[VINTR] = SLang_Abort_Char; /* ^G */ - newtty.c_cc[VQUIT] = NULL_VALUE; - newtty.c_cc[VSUSP] = NULL_VALUE; /* to ignore ^Z */ -#ifdef VDSUSP - newtty.c_cc[VDSUSP] = NULL_VALUE; /* to ignore ^Y */ -#endif -#ifdef VLNEXT - newtty.c_cc[VLNEXT] = NULL_VALUE; /* to ignore ^V ? */ -#endif -#ifdef VSWTCH - newtty.c_cc[VSWTCH] = NULL_VALUE; /* to ignore who knows what */ -#endif -#endif /* NOT HAVE_TERMIOS_H */ - - while (-1 == SET_TERMIOS(SLang_TT_Read_FD, &newtty)) - { - if (errno != EINTR) - { - SLsig_unblock_signals (); - return -1; - } - } - - TTY_Inited = 1; - SLsig_unblock_signals (); - return 0; -} - -void SLtty_set_suspend_state (int mode) -{ - TTY_Termio_Type newtty; - - SLsig_block_signals (); - - if (TTY_Inited == 0) - { - SLsig_unblock_signals (); - return; - } - - while ((-1 == GET_TERMIOS (SLang_TT_Read_FD, &newtty)) - && (errno == EINTR)) - ; - -#ifndef HAVE_TERMIOS_H - /* I do not know if all systems define the t_dsuspc field */ - if (mode == 0) - { - newtty.lt.t_suspc = 255; - newtty.lt.t_dsuspc = 255; - } - else - { - newtty.lt.t_suspc = Old_TTY.lt.t_suspc; - newtty.lt.t_dsuspc = Old_TTY.lt.t_dsuspc; - } -#else - if (mode == 0) - { - newtty.c_cc[VSUSP] = NULL_VALUE; -#ifdef VDSUSP - newtty.c_cc[VDSUSP] = NULL_VALUE; -#endif - } - else - { - newtty.c_cc[VSUSP] = Old_TTY.c_cc[VSUSP]; -#ifdef VDSUSP - newtty.c_cc[VDSUSP] = Old_TTY.c_cc[VDSUSP]; -#endif - } -#endif - - while ((-1 == SET_TERMIOS (SLang_TT_Read_FD, &newtty)) - && (errno == EINTR)) - ; - - SLsig_unblock_signals (); -} - -void SLang_reset_tty (void) -{ - SLsig_block_signals (); - - if (TTY_Inited == 0) - { - SLsig_unblock_signals (); - return; - } - - while ((-1 == SET_TERMIOS(SLang_TT_Read_FD, &Old_TTY)) - && (errno == EINTR)) - ; - - if (TTY_Open) - { - while ((-1 == close (SLang_TT_Read_FD)) - && (errno == EINTR)) - ; - - TTY_Open = 0; - SLang_TT_Read_FD = -1; - } - - TTY_Inited = 0; - SLsig_unblock_signals (); -} - -static void default_sigint (int sig) -{ - sig = errno; /* use parameter */ - - SLKeyBoard_Quit = 1; - if (SLang_Ignore_User_Abort == 0) SLang_Error = SL_USER_BREAK; - SLsignal_intr (SIGINT, default_sigint); - errno = sig; -} - -int SLang_set_abort_signal (void (*hand)(int)) -{ - int save_errno = errno; - SLSig_Fun_Type *f; - - if (hand == NULL) hand = default_sigint; - f = SLsignal_intr (SIGINT, hand); - - errno = save_errno; - - if (f == (SLSig_Fun_Type *) SIG_ERR) - return -1; - - return 0; -} - -#ifndef FD_SET -#define FD_SET(fd, tthis) *(tthis) = 1 << (fd) -#define FD_ZERO(tthis) *(tthis) = 0 -#define FD_ISSET(fd, tthis) (*(tthis) & (1 << fd)) -typedef int fd_set; -#endif - -static fd_set Read_FD_Set; - -/* HACK: If > 0, use 1/10 seconds. If < 0, use 1/1000 seconds */ - -int _SLsys_input_pending(int tsecs) -{ - struct timeval wait; - long usecs, secs; - - if (TTY_Inited == 0) return -1; - - if (tsecs >= 0) - { - secs = tsecs / 10; - usecs = (tsecs % 10) * 100000; - } - else - { - tsecs = -tsecs; - secs = tsecs / 1000; - usecs = (tsecs % 1000) * 1000; - } - - wait.tv_sec = secs; - wait.tv_usec = usecs; - - FD_ZERO(&Read_FD_Set); - FD_SET(SLang_TT_Read_FD, &Read_FD_Set); - - return select(SLang_TT_Read_FD + 1, &Read_FD_Set, NULL, NULL, &wait); -} - -int (*SLang_getkey_intr_hook) (void); - -static int handle_interrupt (void) -{ - if (SLang_getkey_intr_hook != NULL) - { - int save_tty_fd = SLang_TT_Read_FD; - - if (-1 == (*SLang_getkey_intr_hook) ()) - return -1; - - if (save_tty_fd != SLang_TT_Read_FD) - return -1; - } - - return 0; -} - -unsigned int _SLsys_getkey (void) -{ - unsigned char c; - - if (TTY_Inited == 0) - { - int ic = fgetc (stdin); - if (ic == EOF) return SLANG_GETKEY_ERROR; - return (unsigned int) ic; - } - - while (1) - { - int ret; - - if (SLKeyBoard_Quit) - return SLang_Abort_Char; - - if (0 == (ret = _SLsys_input_pending (100))) - continue; - - if (ret != -1) - break; - - if (SLKeyBoard_Quit) - return SLang_Abort_Char; - - if (errno == EINTR) - { - if (-1 == handle_interrupt ()) - return SLANG_GETKEY_ERROR; - - continue; - } - - break; /* let read handle it */ - } - - while (1) - { - int status = read(SLang_TT_Read_FD, (char *) &c, 1); - - if (status > 0) - break; - - if (status == 0) - { - /* We are at the end of a file. Let application handle it. */ - return SLANG_GETKEY_ERROR; - } - - if (errno == EINTR) - { - if (-1 == handle_interrupt ()) - return SLANG_GETKEY_ERROR; - - if (SLKeyBoard_Quit) - return SLang_Abort_Char; - - continue; - } -#ifdef EAGAIN - if (errno == EAGAIN) - { - sleep (1); - continue; - } -#endif -#ifdef EWOULDBLOCK - if (errno == EWOULDBLOCK) - { - sleep (1); - continue; - } -#endif -#ifdef EIO - if (errno == EIO) - { - SLang_exit_error ("_SLsys_getkey: EIO error."); - } -#endif - return SLANG_GETKEY_ERROR; - } - - return((unsigned int) c); -} - diff --git a/mdk-stage1/slang/slxstrng.c b/mdk-stage1/slang/slxstrng.c deleted file mode 100644 index 3f8a4dffa..000000000 --- a/mdk-stage1/slang/slxstrng.c +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -/* These routines are simple and inefficient. They were designed to work on - * SunOS when using Electric Fence. - */ - -#include "slang.h" -#include "_slang.h" -char *SLstrcpy(register char *aa, register char *b) -{ - char *a = aa; - while ((*a++ = *b++) != 0); - return aa; -} - -int SLstrcmp(register char *a, register char *b) -{ - while (*a && (*a == *b)) - { - a++; - b++; - } - if (*a) return((unsigned char) *a - (unsigned char) *b); - else if (*b) return ((unsigned char) *a - (unsigned char) *b); - else return 0; -} - -char *SLstrncpy(char *a, register char *b,register int n) -{ - register char *aa = a; - while ((n > 0) && *b) - { - *aa++ = *b++; - n--; - } - while (n-- > 0) *aa++ = 0; - return (a); -} diff --git a/mdk-stage1/stage1-data/stage1-with-busybox.tar.bz2 b/mdk-stage1/stage1-data/stage1-with-busybox.tar.bz2 deleted file mode 100644 index 337b13666..000000000 Binary files a/mdk-stage1/stage1-data/stage1-with-busybox.tar.bz2 and /dev/null differ diff --git a/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 b/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 deleted file mode 100644 index 56279ae90..000000000 Binary files a/mdk-stage1/stage1-data/stage1-with-sash.tar.bz2 and /dev/null differ diff --git a/mdk-stage1/stage1-data/stage1.tar.bz2 b/mdk-stage1/stage1-data/stage1.tar.bz2 deleted file mode 100644 index 98e62b362..000000000 Binary files a/mdk-stage1/stage1-data/stage1.tar.bz2 and /dev/null differ diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c deleted file mode 100644 index cf973f615..000000000 --- a/mdk-stage1/stage1.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * View the homepage: http://us.mandrakesoft.com/~gc/html/stage1.html - * - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "stage1.h" - -#include "log.h" -#include "probing.h" -#include "frontend.h" -#include "modules.h" -#include "tools.h" -#include "automatic.h" -#include "mount.h" -#include "insmod.h" - -#ifdef ENABLE_PCMCIA -#include "pcmcia/pcmcia.h" -#endif - -#ifndef DISABLE_CDROM -#include "cdrom.h" -#endif - -#ifndef DISABLE_NETWORK -#include "network.h" -#endif - -#ifndef DISABLE_DISK -#include "disk.h" -#endif - - -/************************************************************ - * globals */ - -char * method_name; - - -void fatal_error(char *msg) -{ - printf("FATAL ERROR IN STAGE1: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg); - while (1); -} - - -/************************************************************ - * special frontend functs - * (the principle is to not pollute frontend code with stage1-specific stuff) */ - -void stg1_error_message(char *msg, ...) -{ - va_list args; - va_start(args, msg); - log_message("unsetting automatic"); - unset_param(MODE_AUTOMATIC); - verror_message(msg, args); - va_end(args); -} - -void stg1_info_message(char *msg, ...) -{ - va_list args; - va_start(args, msg); - if (IS_AUTOMATIC) { - vlog_message(msg, args); - return; - } - vinfo_message(msg, args); - va_end(args); -} - - -/************************************************************ - * spawns a shell on console #2 */ -static void spawn_shell(void) -{ -#ifdef SPAWN_SHELL - int fd; - char * shell_name[] = { "/tmp/sh", NULL }; - - log_message("spawning a shell"); - - if (!IS_TESTING) { - fd = open("/dev/tty2", O_RDWR); - if (fd == -1) { - log_message("cannot open /dev/tty2 -- no shell will be provided"); - return; - } - else if (access(shell_name[0], X_OK)) { - log_message("cannot open shell - %s doesn't exist", shell_name[0]); - return; - } - - if (!fork()) { - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - - close(fd); - setsid(); - if (ioctl(0, TIOCSCTTY, NULL)) - log_perror("could not set new controlling tty"); - - execve(shell_name[0], shell_name, grab_env()); - log_message("execve of %s failed: %s", shell_name[0], strerror(errno)); - exit(-1); - } - - close(fd); - } -#endif -} - - -char * interactive_fifo = "/tmp/stage1-fifo"; -static pid_t interactive_pid = 0; - -/* spawns my small interactive on console #6 */ -static void spawn_interactive(void) -{ -#ifdef SPAWN_INTERACTIVE - int fd; - char * dev = "/dev/tty6"; - - printf("spawning my interactive on %s\n", dev); - - if (!IS_TESTING) { - fd = open(dev, O_RDWR); - if (fd == -1) { - printf("cannot open %s -- no interactive\n", dev); - return; - } - - if (mkfifo(interactive_fifo, O_RDWR)) { - printf("cannot create fifo -- no interactive\n"); - return; - } - - if (!(interactive_pid = fork())) { - int fif_out; - - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - - close(fd); - setsid(); - if (ioctl(0, TIOCSCTTY, NULL)) - perror("could not set new controlling tty"); - - fif_out = open(interactive_fifo, O_WRONLY); - printf("Please enter your command (availables: [+,-] [rescue,expert]).\n"); - - while (1) { - char s[50]; - int i = 0; - printf("? "); - fflush(stdout); - read(0, &(s[i++]), 1); - fcntl(0, F_SETFL, O_NONBLOCK); - while (read(0, &(s[i++]), 1) > 0 && i < sizeof(s)); - fcntl(0, F_SETFL, 0); - write(fif_out, s, i-2); - printf("Ok.\n"); - } - } - - close(fd); - } -#endif -} - - -/************************************************************ - */ - -static void expert_third_party_modules(void) -{ - enum return_type results; - char * floppy_mount_location = "/tmp/floppy"; - char ** modules; - char final_name[500]; - char * choice; - int rc; - char * questions[] = { "Options", NULL }; - static char ** answers = NULL; - - results = ask_yes_no("If you want to insert third-party kernel modules, insert " - "a Linux (ext2fs) formatted floppy containing the modules and confirm. Otherwise, select \"no\".");; - if (results != RETURN_OK) - return; - - my_insmod("floppy", ANY_DRIVER_TYPE, NULL); - - if (my_mount("/dev/fd0", floppy_mount_location, "ext2") == -1) { - stg1_error_message("I can't find a Linux ext2 floppy in first floppy drive."); - return expert_third_party_modules(); - } - - modules = list_directory(floppy_mount_location); - - if (!modules || !*modules) { - stg1_error_message("No modules found on floppy disk."); - umount(floppy_mount_location); - return expert_third_party_modules(); - } - - results = ask_from_list("Which driver would you like to insmod?", modules, &choice); - if (results != RETURN_OK) { - umount(floppy_mount_location); - return; - } - - sprintf(final_name, "%s/%s", floppy_mount_location, choice); - - results = ask_from_entries("Please enter the options:", questions, &answers, 24, NULL); - if (results != RETURN_OK) { - umount(floppy_mount_location); - return expert_third_party_modules(); - } - - rc = insmod_call(final_name, answers[0]); - umount(floppy_mount_location); - - if (rc) { - log_message("\tfailed"); - stg1_error_message("Insmod failed."); - } - - return expert_third_party_modules(); -} - - -static void handle_pcmcia(char ** pcmcia_adapter) -{ -#ifdef ENABLE_PCMCIA - *pcmcia_adapter = pcmcia_probe(); - if (!*pcmcia_adapter) { - log_message("no pcmcia adapter found"); - return; - } - my_insmod("pcmcia_core", ANY_DRIVER_TYPE, NULL); - my_insmod(*pcmcia_adapter, ANY_DRIVER_TYPE, NULL); - my_insmod("ds", ANY_DRIVER_TYPE, NULL); - - /* call to cardmgr takes time, let's use the wait message */ - wait_message("Enabling PCMCIA extension cards..."); - log_message("cardmgr rc: %d", cardmgr_call()); - remove_wait_message(); -#endif -} - - -/************************************************************ - */ - -static enum return_type method_select_and_prepare(void) -{ - enum return_type results; - char * choice; - char * means[10], * means_auto[10]; - int i; - -#ifndef DISABLE_DISK - char * disk_install = "Hard disk"; char * disk_install_auto = "disk"; -#endif -#ifndef DISABLE_CDROM - char * cdrom_install = "CDROM drive"; char * cdrom_install_auto = "cdrom"; -#endif -#ifndef DISABLE_NETWORK - char * network_nfs_install = "NFS server"; char * network_nfs_install_auto = "nfs"; - char * network_ftp_install = "FTP server"; char * network_ftp_install_auto = "ftp"; - char * network_http_install = "HTTP server"; char * network_http_install_auto = "http"; -#endif - - i = 0; -#ifndef DISABLE_NETWORK - means[i] = network_nfs_install; means_auto[i++] = network_nfs_install_auto; - means[i] = network_ftp_install; means_auto[i++] = network_ftp_install_auto; - means[i] = network_http_install; means_auto[i++] = network_http_install_auto; -#endif -#ifndef DISABLE_CDROM - means[i] = cdrom_install; means_auto[i++] = cdrom_install_auto; -#endif -#ifndef DISABLE_DISK - means[i] = disk_install; means_auto[i++] = disk_install_auto; -#endif - means[i] = NULL; - - results = ask_from_list_auto("Please choose the installation method.", means, &choice, "method", means_auto); - - if (results != RETURN_OK) - return method_select_and_prepare(); - - results = RETURN_ERROR; - -#ifndef DISABLE_CDROM - if (!strcmp(choice, cdrom_install)) - results = cdrom_prepare(); -#endif - -#ifndef DISABLE_DISK - if (!strcmp(choice, disk_install)) - results = disk_prepare(); -#endif - -#ifndef DISABLE_NETWORK - if (!strcmp(choice, network_nfs_install)) - results = nfs_prepare(); - - if (!strcmp(choice, network_ftp_install)) - results = ftp_prepare(); - - if (!strcmp(choice, network_http_install)) - results = http_prepare(); -#endif - - if (results != RETURN_OK) - return method_select_and_prepare(); - - return RETURN_OK; -} - - -int main(int argc, char **argv, char **env) -{ - enum return_type ret; - char ** argptr; - char * stage2_args[30]; - char * pcmcia_adapter = NULL; - - if (getpid() > 50) - set_param(MODE_TESTING); - - spawn_interactive(); - - open_log(); - log_message("welcome to the " DISTRIB_NAME " install (mdk-stage1, version " VERSION " built " __DATE__ " " __TIME__")"); - process_cmdline(); - handle_env(env); - spawn_shell(); - init_modules_insmoding(); - init_frontend("Welcome to " DISTRIB_NAME " (" VERSION ") " __DATE__ " " __TIME__); - - if (IS_EXPERT) - expert_third_party_modules(); - - handle_pcmcia(&pcmcia_adapter); - - ret = method_select_and_prepare(); - - finish_frontend(); - close_log(); - - if (ret != RETURN_OK) - fatal_error("could not select an installation method"); - - if (!IS_RAMDISK) { - if (symlink(IMAGE_LOCATION LIVE_LOCATION, STAGE2_LOCATION) != 0) { - printf("symlink from " IMAGE_LOCATION LIVE_LOCATION " to " STAGE2_LOCATION " failed"); - fatal_error(strerror(errno)); - } - } - - if (interactive_pid != 0) - kill(interactive_pid, 9); - - if (IS_RESCUE) { - int fd = open("/proc/sys/kernel/real-root-dev", O_RDWR); -#if defined(__powerpc__) || defined (__sparc__) - write(fd, "0x1030000", sizeof("0x1030000")); /* ram3 or sparc */ -#else - write(fd, "0x103", sizeof("0x103")); /* ram3 */ -#endif - close(fd); - return 66; - } - - if (IS_TESTING) - return 0; - - argptr = stage2_args; - *argptr++ = "/usr/bin/runinstall2"; - *argptr++ = "--method"; - *argptr++ = method_name; - if (pcmcia_adapter) { - *argptr++ = "--pcmcia"; - *argptr++ = pcmcia_adapter; - } - *argptr++ = NULL; - - execve(stage2_args[0], stage2_args, grab_env()); - - printf("error in exec of stage2 :-(\n"); - fatal_error(strerror(errno)); - - return 0; /* shut up compiler (we can't get here anyway!) */ -} diff --git a/mdk-stage1/stage1.h b/mdk-stage1/stage1.h deleted file mode 100644 index a9ca99b32..000000000 --- a/mdk-stage1/stage1.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#ifndef _STAGE1_H_ -#define _STAGE1_H_ - -#include "config-stage1.h" -#include "tools.h" - - -/* Some global stuff */ - -extern char * method_name; -extern char * interactive_fifo; - -#define MODE_TESTING (1 << 0) -#define MODE_EXPERT (1 << 1) -#define MODE_RESCUE (1 << 3) -#define MODE_AUTOMATIC (1 << 4) -#define MODE_SPECIAL_STAGE2 (1 << 8) -#define MODE_RAMDISK (1 << 9) - -#define IS_TESTING (get_param(MODE_TESTING)) -#define IS_EXPERT (get_param(MODE_EXPERT)) -#define IS_RESCUE (get_param(MODE_RESCUE)) -#define IS_AUTOMATIC (get_param(MODE_AUTOMATIC)) -#define IS_SPECIAL_STAGE2 (get_param(MODE_SPECIAL_STAGE2)) -#define IS_RAMDISK (get_param(MODE_RAMDISK)) - -void fatal_error(char *msg) __attribute__ ((noreturn)); - - -void stg1_error_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); -void stg1_info_message(char *msg, ...) __attribute__ ((format (printf, 1, 2))); - -#endif diff --git a/mdk-stage1/stdio-frontend.c b/mdk-stage1/stdio-frontend.c deleted file mode 100644 index 5b37eafcd..000000000 --- a/mdk-stage1/stdio-frontend.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - - -/* - * Each different frontend must implement all functions defined in frontend.h - */ - - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "frontend.h" - - -void init_frontend(char * welcome_msg) -{ - printf(welcome_msg); -} - - -void finish_frontend(void) -{ -} - -static void get_any_response(void) -{ - unsigned char t; - printf("\n\t(press to proceed)"); - fflush(stdout); - read(0, &t, 1); - fcntl(0, F_SETFL, O_NONBLOCK); - while (read(0, &t, 1) > 0); - fcntl(0, F_SETFL, 0); -} - -static int get_int_response(void) -{ - char s[50]; - int j = 0, i = 0; /* (0) tied to Cancel */ - fflush(stdout); - read(0, &(s[i++]), 1); - fcntl(0, F_SETFL, O_NONBLOCK); - do { - int v = s[i-1]; - if (v >= '0' && v <= '9') - j = j*10 + (v - '0'); - } while (read(0, &(s[i++]), 1) > 0 && i < sizeof(s)); - fcntl(0, F_SETFL, 0); - return j; -} - -static char * get_string_response(char * initial_string) -{ - /* I won't use a scanf/%s since I also want the null string to be accepted -- also, I want the initial_string */ - char s[500]; - int i = 0; - char buf[10]; - int b_index = 0; - char b; - - struct termios t; - - memset(s, '\0', sizeof(s)); - - if (initial_string) { - printf(initial_string); - strcpy(s, initial_string); - i = strlen(s); - } - - /* from ncurses/tinfo/lib_raw.c:(cbreak) */ - tcgetattr(0, &t); - t.c_lflag &= ~ICANON; - t.c_lflag |= ISIG; - t.c_lflag &= ~ECHO; - t.c_iflag &= ~ICRNL; - t.c_cc[VMIN] = 1; - t.c_cc[VTIME] = 0; - tcsetattr(0, TCSADRAIN, &t); - - fflush(stdout); - - fcntl(0, F_SETFL, O_NONBLOCK); - - while (1) { - if (read(0, &b, 1) > 0) { - if (b_index == 1) { - if (b == 91) { - buf[b_index] = b; - b_index++; - continue; - } - else - b_index = 0; - } - if (b_index == 2) { - if (b == 67) { - if (s[i] != '\0') { - printf("\033[C"); - i++; - } - } - if (b == 68) { - if (i > 0) { - printf("\033[D"); - i--; - } - } - b_index = 0; - continue; - } - - if (b == 13) - break; - if (b == 127) { - if (i > 0) { - printf("\033[D"); - printf(" "); - printf("\033[D"); - if (s[i] == '\0') - s[i-1] = '\0'; - else - s[i-1] = ' '; - i--; - } - } else if (b == 27) { - buf[b_index] = b; - b_index++; - } else { - printf("%c", b); - s[i] = b; - i++; - } - } - } - - t.c_lflag |= ICANON; - t.c_lflag |= ECHO; - t.c_iflag |= ICRNL; - tcsetattr(0, TCSADRAIN, &t); - - fcntl(0, F_SETFL, 0); - - printf("\n"); - return strdup(s); -} - -static void blocking_msg(char *type, char *fmt, va_list ap) -{ - printf(type); - vprintf(fmt, ap); - get_any_response(); -} - -void verror_message(char *msg, va_list ap) -{ - blocking_msg("> Error! ", msg, ap); -} - -void vinfo_message(char *msg, va_list ap) -{ - blocking_msg("> Notice: ", msg, ap); -} - -void vwait_message(char *msg, va_list ap) -{ - printf("Please wait: "); - vprintf(msg, ap); - fflush(stdout); -} - -void remove_wait_message(void) -{ - printf("\n"); -} - - -static int size_progress; -static int actually_drawn; -#define PROGRESS_SIZE 45 -void init_progression(char *msg, int size) -{ - int i; - size_progress = size; - printf("%s ", msg); - if (size) { - actually_drawn = 0; - for (i=0; i size_progress) - current_size = size_progress; - while ((int)((current_size*PROGRESS_SIZE)/size_progress) > actually_drawn) { - printf("*"); - actually_drawn++; - } - } else - printf("\033[GStatus: [%8d] bytes loaded...", current_size); - - fflush(stdout); -} - -void end_progression(void) -{ - if (size_progress) { - update_progression(size_progress); - printf("]\n"); - } else - printf(" done.\n"); -} - - -enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice) -{ - int justify_number = 1; - void print_choice_number(int i) { - char tmp[500]; - snprintf(tmp, sizeof(tmp), "[%%%dd]", justify_number); - printf(tmp, i); - } - char ** sav_elems = elems; - int i = 1; - int j = 0; - - while (elems && *elems) { - elems++; - i++; - } - if (i >= 10) - justify_number = 2; - - elems = sav_elems; - i = 1; - - printf("> %s\n", msg); - print_choice_number(0); - printf(" Cancel"); - - while (elems && *elems) { - if (elems_comments && *elems_comments) { - printf("\n"); - print_choice_number(i); - printf(" %s (%s)", *elems, *elems_comments); - j = 0; - } else { - if (j == 0) - printf("\n"); - print_choice_number(i); - printf(" %-14s ", *elems); - j++; - } - if (j == 4) - j = 0; - - if (elems_comments) - elems_comments++; - i++; - elems++; - } - - printf("\n? "); - - j = get_int_response(); - - if (j == 0) - return RETURN_BACK; - - if (j >= 1 && j <= i) { - *choice = strdup(sav_elems[j-1]); - return RETURN_OK; - } - - return RETURN_ERROR; -} - - -enum return_type ask_from_list(char *msg, char ** elems, char ** choice) -{ - return ask_from_list_comments(msg, elems, NULL, choice); -} - - -enum return_type ask_yes_no(char *msg) -{ - int j; - - printf("> %s\n[0] Yes [1] No [2] Back\n? ", msg); - - j = get_int_response(); - - if (j == 0) - return RETURN_OK; - else if (j == 2) - return RETURN_BACK; - else return RETURN_ERROR; -} - - -enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings)) -{ - int j, i = 0; - char ** already_answers = NULL; - - printf("> %s\n", msg); - - while (questions && *questions) { - printf("(%c) %s\n", i + 'a', *questions); - i++; - questions++; - } - - if (*answers == NULL) - *answers = (char **) malloc(sizeof(char *) * i); - else - already_answers = *answers; - - while (1) { - int r; - for (j = 0 ; j < i ; j++) { - printf("(%c) ? ", j + 'a'); - if (already_answers && *already_answers) { - (*answers)[j] = get_string_response(*already_answers); - already_answers++; - } else - (*answers)[j] = get_string_response(NULL); - - } - printf("[0] Cancel [1] Accept [2] Re-enter answers\n? "); - r = get_int_response(); - if (r == 0) - return RETURN_BACK; - if (r == 1) - return RETURN_OK; - } -} diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c deleted file mode 100644 index deafdc8fe..000000000 --- a/mdk-stage1/tools.c +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "stage1.h" -#include "log.h" -#include "mount.h" -#include "frontend.h" -#include "automatic.h" - -#include "tools.h" - - -static struct param_elem params[50]; -static int param_number = 0; - -void process_cmdline(void) -{ - char buf[512]; - int fd, size, i; - - log_message("opening /proc/cmdline... "); - - if ((fd = open("/proc/cmdline", O_RDONLY)) == -1) - fatal_error("could not open /proc/cmdline"); - - size = read(fd, buf, sizeof(buf)); - buf[size-1] = '\0'; // -1 to eat the \n - close(fd); - - log_message("\t%s", buf); - - i = 0; - while (buf[i] != '\0') { - char *name, *value = NULL; - int j = i; - while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0') - i++; - if (i == j) { - i++; - continue; - } - name = memdup(&buf[j], i-j + 1); - name[i-j] = '\0'; - - if (buf[i] == '=') { - int k = i+1; - i++; - while (buf[i] != ' ' && buf[i] != '\0') - i++; - value = memdup(&buf[k], i-k + 1); - value[i-k] = '\0'; - } - - params[param_number].name = name; - params[param_number].value = value; - param_number++; - if (!strcmp(name, "expert")) set_param(MODE_EXPERT); - if (!strcmp(name, "rescue")) set_param(MODE_RESCUE); - if (!strcmp(name, "special_stage2")) set_param(MODE_SPECIAL_STAGE2); - if (!strcmp(name, "automatic")) { - set_param(MODE_AUTOMATIC); - grab_automatic_params(value); - } - if (buf[i] == '\0') - break; - i++; - } - - log_message("\tgot %d args", param_number); -} - - -int stage1_mode = 0; - -int get_param(int i) -{ -#ifdef SPAWN_INTERACTIVE - static int fd = 0; - char buf[5000]; - char * ptr; - int nb; - - if (fd <= 0) { - fd = open(interactive_fifo, O_RDONLY); - if (fd == -1) - return (stage1_mode & i); - fcntl(fd, F_SETFL, O_NONBLOCK); - } - - if (fd > 0) { - if ((nb = read(fd, buf, sizeof(buf))) > 0) { - buf[nb] = '\0'; - ptr = buf; - while ((ptr = strstr(ptr, "+ "))) { - if (!strncmp(ptr+2, "expert", 6)) set_param(MODE_EXPERT); - if (!strncmp(ptr+2, "rescue", 6)) set_param(MODE_RESCUE); - ptr++; - } - ptr = buf; - while ((ptr = strstr(ptr, "- "))) { - if (!strncmp(ptr+2, "expert", 6)) unset_param(MODE_EXPERT); - if (!strncmp(ptr+2, "rescue", 6)) unset_param(MODE_RESCUE); - ptr++; - } - } - } -#endif - - return (stage1_mode & i); -} - -char * get_param_valued(char *param_name) -{ - int i; - for (i = 0; i < param_number ; i++) - if (!strcmp(params[i].name, param_name)) - return params[i].value; - - return NULL; -} - -void set_param_valued(char *param_name, char *param_value) -{ - params[param_number].name = param_name; - params[param_number].value = param_value; - param_number++; -} - -void set_param(int i) -{ - stage1_mode |= i; - if (i == MODE_RESCUE) { - set_param_valued("special_stage2", "rescue"); - set_param(MODE_SPECIAL_STAGE2); - } -} - -void unset_param(int i) -{ - stage1_mode &= ~i; -} - -int charstar_to_int(char * s) -{ - int number = 0; - while (*s && isdigit(*s)) { - number = (number * 10) + (*s - '0'); - s++; - } - return number; -} - -int total_memory(void) -{ - int value; - struct stat statr; - if (stat("/proc/kcore", &statr)) - return 0; - - /* drakx powered: use /proc/kcore and rounds every 4 Mbytes */ - value = 4 * ((int)((float)statr.st_size / 1024 / 1024 / 4 + 0.5)); - log_message("Total Memory: %d Mbytes", value); - - return value; -} - - -int ramdisk_possible(void) -{ - if (total_memory() > MEM_LIMIT_RAMDISK) - return 1; - else { - log_message("warning, ramdisk is not possible due to low mem!"); - return 0; - } -} - - -static void save_stuff_for_rescue(void) -{ - void save_this_file(char * file) { - char buf[5000]; - int fd_r, fd_w, i; - char location[100]; - - if ((fd_r = open(file, O_RDONLY)) < 0) { - log_message("can't open %s for read", file); - return; - } - strcpy(location, STAGE2_LOCATION); - strcat(location, file); - if ((fd_w = open(location, O_WRONLY)) < 0) { - log_message("can't open %s for write", location); - close(fd_r); - return; - } - if ((i = read(fd_r, buf, sizeof(buf))) <= 0) { - log_message("can't read from %s", file); - close(fd_r); close(fd_w); - return; - } - if (write(fd_w, buf, i) != i) - log_message("can't write %d bytes to %s", i, location); - close(fd_r); close(fd_w); - log_message("saved file %s for rescue (%d bytes)", file, i); - } - save_this_file("/etc/resolv.conf"); -} - - -enum return_type load_ramdisk_fd(int ramdisk_fd, int size) -{ - BZFILE * st2; - char * ramdisk = "/dev/ram3"; /* warning, verify that this file exists in the initrd (and actually is a ramdisk device file) */ - int ram_fd; - char buffer[4096]; - int z_errnum; - char * wait_msg = "Loading program into memory..."; - int bytes_read = 0; - int actually; - int seems_ok = 0; - - st2 = BZ2_bzdopen(ramdisk_fd, "r"); - - if (!st2) { - log_message("Opening compressed ramdisk: %s", BZ2_bzerror(st2, &z_errnum)); - stg1_error_message("Could not open compressed ramdisk file."); - return RETURN_ERROR; - } - - ram_fd = open(ramdisk, O_WRONLY); - if (ram_fd == -1) { - log_perror(ramdisk); - stg1_error_message("Could not open ramdisk device file."); - return RETURN_ERROR; - } - - init_progression(wait_msg, size); - - while ((actually = BZ2_bzread(st2, buffer, sizeof(buffer))) > 0) { - seems_ok = 1; - if (write(ram_fd, buffer, actually) != actually) { - log_perror("writing ramdisk"); - remove_wait_message(); - return RETURN_ERROR; - } - update_progression((int)((bytes_read += actually) / RAMDISK_COMPRESSION_RATIO)); - } - - if (!seems_ok) { - log_message("reading compressed ramdisk: %s", BZ2_bzerror(st2, &z_errnum)); - remove_wait_message(); - stg1_error_message("Could not uncompress second stage ramdisk."); - return RETURN_ERROR; - } - - end_progression(); - - BZ2_bzclose(st2); /* opened by gzdopen, but also closes the associated fd */ - close(ram_fd); - - if (my_mount(ramdisk, STAGE2_LOCATION, "ext2")) - return RETURN_ERROR; - - set_param(MODE_RAMDISK); - - if (IS_RESCUE) { - save_stuff_for_rescue(); - if (umount(STAGE2_LOCATION)) { - log_perror(ramdisk); - return RETURN_ERROR; - } - return RETURN_OK; /* fucksike, I lost several hours wondering why the kernel won't see the rescue if it is alreay mounted */ - } - - return RETURN_OK; -} - - -char * get_ramdisk_realname(void) -{ - char img_name[500]; - char * stg2_name = get_param_valued("special_stage2"); - char * begin_img = RAMDISK_LOCATION; - char * end_img = "_stage2.bz2"; - - if (!stg2_name) - stg2_name = "mdkinst"; - - if (IS_RESCUE) - stg2_name = "rescue"; - - strcpy(img_name, begin_img); - strcat(img_name, stg2_name); - strcat(img_name, end_img); - - return strdup(img_name); -} - - -enum return_type load_ramdisk(void) -{ - int st2_fd; - struct stat statr; - char img_name[500]; - - strcpy(img_name, IMAGE_LOCATION); - strcat(img_name, get_ramdisk_realname()); - - log_message("trying to load %s as a ramdisk", img_name); - - st2_fd = open(img_name, O_RDONLY); /* to be able to see the progression */ - - if (st2_fd == -1) { - log_message("open ramdisk file (%s) failed", img_name); - stg1_error_message("Could not open compressed ramdisk file (%s).", img_name); - return RETURN_ERROR; - } - - if (stat(img_name, &statr)) - return RETURN_ERROR; - else - return load_ramdisk_fd(st2_fd, statr.st_size); -} - -/* pixel's */ -void * memdup(void *src, size_t size) -{ - void * r; - r = malloc(size); - memcpy(r, src, size); - return r; -} - - -static char ** my_env = NULL; -static int env_size = 0; - -void handle_env(char ** env) -{ - char ** ptr = env; - while (ptr && *ptr) { - ptr++; - env_size++; - } - my_env = malloc(sizeof(char *) * 100); - memcpy(my_env, env, sizeof(char *) * (env_size+1)); -} - -char ** grab_env(void) { - return my_env; -} - -void add_to_env(char * name, char * value) -{ - char tmp[500]; - sprintf(tmp, "%s=%s", name, value); - my_env[env_size] = strdup(tmp); - env_size++; - my_env[env_size] = NULL; -} - - -char ** list_directory(char * direct) -{ - char * tmp[50000]; /* in /dev there can be many many files.. */ - int i = 0; - struct dirent *ep; - DIR *dp = opendir(direct); - while (dp && (ep = readdir(dp))) { - if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) { - tmp[i] = strdup(ep->d_name); - i++; - } - } - if (dp) - closedir(dp); - tmp[i] = NULL; - return memdup(tmp, sizeof(char*) * (i+1)); -} - - -int string_array_length(char ** a) -{ - int i = 0; - if (!a) - return -1; - while (a && *a) { - a++; - i++; - } - return i; -} diff --git a/mdk-stage1/tools.h b/mdk-stage1/tools.h deleted file mode 100644 index 5d38b0364..000000000 --- a/mdk-stage1/tools.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan (ewt@redhat.com) - * - * Copyright 1996 Red Hat Software - * - */ - -#ifndef _TOOLS_H_ -#define _TOOLS_H_ - -#include - -void process_cmdline(void); -int get_param(int i); -void set_param(int i); -void unset_param(int i); -int charstar_to_int(char * s); -int total_memory(void); -int ramdisk_possible(void); -char * get_ramdisk_realname(void); -enum return_type load_ramdisk(void); -enum return_type load_ramdisk_fd(int ramdisk_fd, int size); -void * memdup(void *src, size_t size); -void add_to_env(char * name, char * value); -void handle_env(char ** env); -char ** grab_env(void); -char ** list_directory(char * direct); -int string_array_length(char ** a); - -struct param_elem -{ - char * name; - char * value; -}; - -#define ptr_begins_static_str(pointer,static_str) (!strncmp(pointer,static_str,sizeof(static_str)-1)) -#define streq !strcmp - -#endif diff --git a/mdk-stage1/url.c b/mdk-stage1/url.c deleted file mode 100644 index 236782a50..000000000 --- a/mdk-stage1/url.c +++ /dev/null @@ -1,501 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan and Matt Wilson - * - * Copyright 1999 Red Hat, Inc. - * - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "dns.h" -#include "log.h" -#include "tools.h" - -#include "url.h" - - -#define TIMEOUT_SECS 60 -#define BUFFER_SIZE 4096 - - -static int ftp_check_response(int sock, char ** str) -{ - static char buf[BUFFER_SIZE + 1]; - int bufLength = 0; - struct pollfd polls; - char * chptr, * start; - int bytesRead, rc = 0; - int doesContinue = 1; - char errorCode[4]; - - errorCode[0] = '\0'; - - do { - polls.fd = sock; - polls.events = POLLIN; - if (poll(&polls, 1, TIMEOUT_SECS*1000) != 1) - return FTPERR_BAD_SERVER_RESPONSE; - - bytesRead = read(sock, buf + bufLength, sizeof(buf) - bufLength - 1); - - bufLength += bytesRead; - - buf[bufLength] = '\0'; - - /* divide the response into lines, checking each one to see if - we are finished or need to continue */ - - start = chptr = buf; - - do { - while (*chptr != '\n' && *chptr) chptr++; - - if (*chptr == '\n') { - *chptr = '\0'; - if (*(chptr - 1) == '\r') *(chptr - 1) = '\0'; - if (str) *str = start; - - if (errorCode[0]) { - if (!strncmp(start, errorCode, 3) && start[3] == ' ') - doesContinue = 0; - } else { - strncpy(errorCode, start, 3); - errorCode[3] = '\0'; - if (start[3] != '-') { - doesContinue = 0; - } - } - - start = chptr + 1; - chptr++; - } else { - chptr++; - } - } while (*chptr); - - if (doesContinue && chptr > start) { - memcpy(buf, start, chptr - start - 1); - bufLength = chptr - start - 1; - } else { - bufLength = 0; - } - } while (doesContinue); - - if (*errorCode == '4' || *errorCode == '5') { - if (!strncmp(errorCode, "550", 3)) { - return FTPERR_FILE_NOT_FOUND; - } - - return FTPERR_BAD_SERVER_RESPONSE; - } - - if (rc) return rc; - - return 0; -} - -static int ftp_command(int sock, char * command, char * param) -{ - char buf[500]; - int rc; - - strcpy(buf, command); - if (param) { - strcat(buf, " "); - strcat(buf, param); - } - - strcat(buf, "\r\n"); - - if (write(sock, buf, strlen(buf)) != strlen(buf)) { - return FTPERR_SERVER_IO_ERROR; - } - - if ((rc = ftp_check_response(sock, NULL))) - return rc; - - return 0; -} - -static int get_host_address(char * host, struct in_addr * address) -{ - if (isdigit(host[0])) { - if (!inet_aton(host, address)) { - return FTPERR_BAD_HOST_ADDR; - } - } else { - if (mygethostbyname(host, address)) - return FTPERR_BAD_HOSTNAME; - } - - return 0; -} - -int ftp_open_connection(char * host, char * name, char * password, char * proxy) -{ - int sock; - struct in_addr serverAddress; - struct sockaddr_in destPort; - char * buf; - int rc; - int port = 21; - - if (!strcmp(name, "")) { - name = "anonymous"; - password = "-drakx@"; - } - - if (strcmp(proxy, "")) { - buf = alloca(strlen(name) + strlen(host) + 5); - sprintf(buf, "%s@%s", name, host); - name = buf; - host = proxy; - } - - if ((rc = get_host_address(host, &serverAddress))) return rc; - - sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (sock < 0) { - return FTPERR_FAILED_CONNECT; - } - - destPort.sin_family = AF_INET; - destPort.sin_port = htons(port); - destPort.sin_addr = serverAddress; - - if (connect(sock, (struct sockaddr *) &destPort, sizeof(destPort))) { - close(sock); - return FTPERR_FAILED_CONNECT; - } - - /* ftpCheckResponse() assumes the socket is nonblocking */ - if (fcntl(sock, F_SETFL, O_NONBLOCK)) { - close(sock); - return FTPERR_FAILED_CONNECT; - } - - if ((rc = ftp_check_response(sock, NULL))) { - return rc; - } - - if ((rc = ftp_command(sock, "USER", name))) { - close(sock); - return rc; - } - - if ((rc = ftp_command(sock, "PASS", password))) { - close(sock); - return rc; - } - - if ((rc = ftp_command(sock, "TYPE", "I"))) { - close(sock); - return rc; - } - - return sock; -} - - -int ftp_data_command(int sock, char * command, char * param) -{ - int dataSocket; - struct sockaddr_in dataAddress; - int i, j; - char * passReply; - char * chptr; - char retrCommand[500]; - int rc; - - if (write(sock, "PASV\r\n", 6) != 6) { - return FTPERR_SERVER_IO_ERROR; - } - if ((rc = ftp_check_response(sock, &passReply))) - return FTPERR_PASSIVE_ERROR; - - chptr = passReply; - while (*chptr && *chptr != '(') chptr++; - if (*chptr != '(') return FTPERR_PASSIVE_ERROR; - chptr++; - passReply = chptr; - while (*chptr && *chptr != ')') chptr++; - if (*chptr != ')') return FTPERR_PASSIVE_ERROR; - *chptr-- = '\0'; - - while (*chptr && *chptr != ',') chptr--; - if (*chptr != ',') return FTPERR_PASSIVE_ERROR; - chptr--; - while (*chptr && *chptr != ',') chptr--; - if (*chptr != ',') return FTPERR_PASSIVE_ERROR; - *chptr++ = '\0'; - - /* now passReply points to the IP portion, and chptr points to the - port number portion */ - - dataAddress.sin_family = AF_INET; - if (sscanf(chptr, "%d,%d", &i, &j) != 2) { - return FTPERR_PASSIVE_ERROR; - } - dataAddress.sin_port = htons((i << 8) + j); - - chptr = passReply; - while (*chptr++) { - if (*chptr == ',') *chptr = '.'; - } - - if (!inet_aton(passReply, &dataAddress.sin_addr)) - return FTPERR_PASSIVE_ERROR; - - dataSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (dataSocket < 0) { - return FTPERR_FAILED_CONNECT; - } - - if (!param) - sprintf(retrCommand, "%s\r\n", command); - else - sprintf(retrCommand, "%s %s\r\n", command, param); - - i = strlen(retrCommand); - - if (write(sock, retrCommand, i) != i) { - return FTPERR_SERVER_IO_ERROR; - } - - if (connect(dataSocket, (struct sockaddr *) &dataAddress, - sizeof(dataAddress))) { - close(dataSocket); - return FTPERR_FAILED_DATA_CONNECT; - } - - if ((rc = ftp_check_response(sock, NULL))) { - close(dataSocket); - return rc; - } - - return dataSocket; -} - - -static int ftp_get_filesize(int sock, char * remotename) -{ - int size = 0; - char buf[2000]; - char file[500]; - char * ptr; - int fd, rc, tot; - int i; - - strcpy(buf, remotename); - ptr = strrchr(buf, '/'); - if (!*ptr) - return -1; - *ptr = '\0'; - - strcpy(file, ptr+1); - - if ((rc = ftp_command(sock, "CWD", buf))) { - return -1; - } - - fd = ftp_data_command(sock, "LIST", NULL); - if (fd <= 0) { - close(sock); - return -1; - } - - ptr = buf; - while ((tot = read(fd, ptr, sizeof(buf) - (ptr - buf))) != 0) - ptr += tot; - *ptr = '\0'; - close(fd); - - if (!(ptr = strstr(buf, file))) { - log_message("FTP/get_filesize: Bad mood, directory does not contain searched file (%s)", file); - if (ftp_end_data_command(sock)) - close(sock); - return -1; - } - - for (i=0; i<4; i++) { - while (*ptr && *ptr != ' ') - ptr--; - while (*ptr && *ptr == ' ') - ptr--; - } - while (*ptr && *ptr != ' ') - ptr--; - - if (ptr) - size = charstar_to_int(ptr+1); - else - size = 0; - - if (ftp_end_data_command(sock)) { - close(sock); - return -1; - } - - return size; -} - - -int ftp_start_download(int sock, char * remotename, int * size) -{ - if ((*size = ftp_get_filesize(sock, remotename)) == -1) { - log_message("FTP: could not get filesize (trying to continue)"); - *size = 0; - } - return ftp_data_command(sock, "RETR", remotename); -} - - -int ftp_end_data_command(int sock) -{ - if (ftp_check_response(sock, NULL)) - return FTPERR_BAD_SERVER_RESPONSE; - - return 0; -} - - -int http_download_file(char * hostname, char * remotename, int * size) -{ - char * buf; - char headers[4096]; - char * nextChar = headers; - int checkedCode; - struct in_addr serverAddress; - struct pollfd polls; - int sock; - int rc; - struct sockaddr_in destPort; - char * header_content_length = "Content-Length: "; - - if ((rc = get_host_address(hostname, &serverAddress))) return rc; - - sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (sock < 0) { - return FTPERR_FAILED_CONNECT; - } - - destPort.sin_family = AF_INET; - destPort.sin_port = htons(80); - destPort.sin_addr = serverAddress; - - if (connect(sock, (struct sockaddr *) &destPort, sizeof(destPort))) { - close(sock); - return FTPERR_FAILED_CONNECT; - } - - buf = alloca(strlen(remotename) + 20); - sprintf(buf, "GET %s HTTP/0.9\r\n\r\n", remotename); - write(sock, buf, strlen(buf)); - - /* This is fun; read the response a character at a time until we: - - 1) Get our first \r\n; which lets us check the return code - 2) Get a \r\n\r\n, which means we're done */ - - *nextChar = '\0'; - checkedCode = 0; - while (!strstr(headers, "\r\n\r\n")) { - polls.fd = sock; - polls.events = POLLIN; - rc = poll(&polls, 1, TIMEOUT_SECS*1000); - - if (rc == 0) { - close(sock); - return FTPERR_SERVER_TIMEOUT; - } else if (rc < 0) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - - if (read(sock, nextChar, 1) != 1) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - - nextChar++; - *nextChar = '\0'; - - if (nextChar - headers == sizeof(headers)) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - - if (!checkedCode && strstr(headers, "\r\n")) { - char * start, * end; - - checkedCode = 1; - start = headers; - while (!isspace(*start) && *start) start++; - if (!*start) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - start++; - - end = start; - while (!isspace(*end) && *end) end++; - if (!*end) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - - *end = '\0'; - if (!strcmp(start, "404")) { - close(sock); - return FTPERR_FILE_NOT_FOUND; - } else if (strcmp(start, "200")) { - close(sock); - return FTPERR_BAD_SERVER_RESPONSE; - } - - *end = ' '; - } - } - - if ((buf = strstr(headers, header_content_length))) - *size = charstar_to_int(buf + strlen(header_content_length)); - else - *size = 0; - - return sock; -} diff --git a/mdk-stage1/url.h b/mdk-stage1/url.h deleted file mode 100644 index 5a59bd814..000000000 --- a/mdk-stage1/url.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Guillaume Cottenceau (gc@mandrakesoft.com) - * - * Copyright 2000 MandrakeSoft - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan and Matt Wilson - * - * Copyright 1999 Red Hat, Inc. - * - */ - -#ifndef _URL_H_ -#define _URL_H_ - -int ftp_open_connection(char * host, char * name, char * password, char * proxy); -int ftp_start_download(int sock, char * remotename, int * size); -int ftp_end_data_command(int sock); - -int http_download_file(char * hostname, char * remotename, int * size); - - -#define FTPERR_BAD_SERVER_RESPONSE -1 -#define FTPERR_SERVER_IO_ERROR -2 -#define FTPERR_SERVER_TIMEOUT -3 -#define FTPERR_BAD_HOST_ADDR -4 -#define FTPERR_BAD_HOSTNAME -5 -#define FTPERR_FAILED_CONNECT -6 -#define FTPERR_FILE_IO_ERROR -7 -#define FTPERR_PASSIVE_ERROR -8 -#define FTPERR_FAILED_DATA_CONNECT -9 -#define FTPERR_FILE_NOT_FOUND -10 -#define FTPERR_UNKNOWN -100 - -#endif -- cgit v1.2.1