Redo the xified cc based on bin/cc.c, also add an xified ld based on bin/ld.c
authorNick Downing <downing.nick@gmail.com>
Sat, 21 Jan 2017 06:32:56 +0000 (17:32 +1100)
committerNick Downing <downing.nick@gmail.com>
Sat, 21 Jan 2017 06:32:56 +0000 (17:32 +1100)
27 files changed:
.gitignore
lib/libx_c/Makefile
lib/libx_c/compat-4.1/Makefile
lib/libx_c/compat-sys5/Makefile
lib/libx_c/gen/Makefile
lib/libx_c/inet/Makefile
lib/libx_c/linux/csu/Makefile
lib/libx_c/linux/gen/Makefile
lib/libx_c/linux/sys/Makefile
lib/libx_c/net/Makefile
lib/libx_c/net/hosttable/Makefile
lib/libx_c/net/named/Makefile
lib/libx_c/ns/Makefile
lib/libx_c/post.patch
lib/libx_c/stdio.h
lib/libx_c/stdio/Makefile
lib/libx_c/sys/Makefile
test/Makefile
xify/Makefile
xify/cc.c
xify/errfunc.sh [new file with mode: 0755]
xify/ld.c [new file with mode: 0644]
xify/nonvoid.sh [new file with mode: 0755]
xify/noproto.sh [new file with mode: 0755]
xify/xify [new file with mode: 0755]
xify/xify.sh [deleted file]
xify/xifyfilt.c [moved from xify/xify.c with 86% similarity]

index a6d9255..87aeb91 100644 (file)
@@ -1,4 +1,4 @@
-.x
+.xify
 *.a
 *.nocomm
 *.o
@@ -39,7 +39,8 @@ lib/libx_c/xx*
 test/hello
 test/hello.txt
 xify/cc
+xify/ld
 xify/newline
 xify/nocomment
 xify/nostring
-xify/xify
+xify/xifyfilt
index 634e3cd..238e221 100644 (file)
@@ -77,27 +77,43 @@ ${MACHINE}/csu ${ALL} net/${HOSTLOOKUP}: FRC
 
 FRC:
 
-install:
-       rm -rf ${DESTDIR}/usr/include/*
+install-headers:
+       rm -rf ${DESTDIR}/usr/include
        for i in `find . -name '*.h' -print`; \
        do \
                mkdir -p ${DESTDIR}/usr/include/`dirname $$i`; \
-               ${ROOT}/cross/lib/xify.sh <$$i >${DESTDIR}/usr/include/`dirname $$i`/x_`basename $$i`; \
+               cp $$i ${DESTDIR}/usr/include/$$i; \
        done
        cd ${DESTDIR}/usr/include; \
        ln -s vax machine; \
+       ln -s machine/frame.h frame.h; \
+       ln -s sys/errno.h errno.h; \
+       ln -s sys/file.h fcntl.h; \
+       ln -s a.out.h nlist.h; \
+       ln -s sys/signal.h signal.h; \
+       ln -s sys/syslog.h syslog.h
+       for i in `find . -name '*.h' -print`; \
+       do \
+               mkdir -p ${DESTDIR}/usr/include/.xify/`dirname $$i`; \
+               ${ROOT}/cross/lib/xify $$i ${DESTDIR}/usr/include/.xify/`dirname $$i`/x_`basename $$i`; \
+       done
+       cd ${DESTDIR}/usr/include/.xify; \
+       ln -s vax machine; \
        ln -s machine/x_frame.h x_frame.h; \
        ln -s sys/x_errno.h x_errno.h; \
        ln -s sys/x_file.h x_fcntl.h; \
        ln -s x_a.out.h x_nlist.h; \
        ln -s sys/x_signal.h x_signal.h; \
        ln -s sys/x_syslog.h x_syslog.h
-#      ${INSTALL} libc.a ${DESTDIR}/lib/libc.a
-#      ranlib ${DESTDIR}/lib/libc.a
+
+install:
+       ${INSTALL} libc.a ${DESTDIR}/lib/libc.a
+       ranlib ${DESTDIR}/lib/libc.a
+       mkdir -p ${DESTDIR}/lib/.xify
+       ${INSTALL} libc.a ${DESTDIR}/lib/.xify/libx_c.a
+       ranlib ${DESTDIR}/lib/.xify/libx_c.a
 #      ${INSTALL} libc_p.a ${DESTDIR}/usr/lib/libc_p.a
 #      ranlib ${DESTDIR}/usr/lib/libc_p.a
-       ${INSTALL} libc.a ${DESTDIR}/lib/libx_c.a
-       ranlib ${DESTDIR}/lib/libx_c.a
        cd ${MACHINE}/csu; make DESTDIR=${DESTDIR} install
 
 tags:
index 91591f0..96e6f9f 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1980 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -26,7 +26,7 @@ TAGSFILE=tags
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #compat-4.1lib compat-4.1lib_p: ${OBJS}
index d569651..48a79b7 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #      Makefile        1.5     85/09/05
 #
 CFLAGS=        -O ${DEFS}
@@ -18,7 +18,7 @@ TAGSFILE=tags
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #compat-sys5lib compat-sys5lib_p: ${OBJS}
index 41b4c29..e72b1e4 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1980 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -44,7 +44,7 @@ TAGSFILE=tags
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 genlib genlib_p: ${OBJS}
index a8d8c4c..1480cd8 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1980 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -24,7 +24,7 @@ TAGSFILE=tags
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #inetlib inetlib_p: ${OBJS}
index 0aee91a..a2310bb 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 DESTDIR=${ROOT}/cross
 #
 # Copyright (c) 1980 Regents of the University of California.
@@ -32,7 +32,7 @@ crt0.o:       crt0.c
 #      as -o x.o x.s
 #      ld -x -r -o crt0.o x.o
 #      rm -f x.s x.o crt0.s
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #moncrt0.o: crt0.c
index cc25be1..8f871e5 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1980 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -19,7 +19,7 @@ TAGSFILE=tags
 #      /lib/cpp -E ${DEFS} $*.c | ${AS} -o $*.o
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #genlib genlib_p: ${OBJS}
index db489fd..c444078 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1980 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -21,7 +21,7 @@ TAGSFILE=tags
 #      /lib/cpp -E ${DEFS} $*.c | ${AS} -o $*.o
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #syslib syslib_p: ${OBJS}
index fa9a60d..2596d4e 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1983 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -29,7 +29,7 @@ TAGSFILE=tags
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #netlib netlib_p: ${OBJS}
index e1eb01d..3d1df7b 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 
 #
 # Copyright (c) 1983 Regents of the University of California.
@@ -20,7 +20,7 @@ CFLAGS=       -O ${DEFS}
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 hostlib hostlib_p: ${OBJS} 
index 656ae5e..a263a9f 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1983 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -23,7 +23,7 @@ DESTDIR=
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #hostlib hostlib_p: ${OBJS}
index 45a50f3..0ebdc48 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1980 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -20,7 +20,7 @@ TAGSFILE=tags
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #nslib nslib_p: ${OBJS}
index 30ba78d..cc566c0 100644 (file)
@@ -1,9 +1,9 @@
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/compat-4.1/Makefile libx_c/compat-4.1/Makefile
 --- libx_c.post/compat-4.1/Makefile    2017-01-20 15:08:37.023597586 +1100
-+++ libx_c/compat-4.1/Makefile 2017-01-20 15:08:37.059597681 +1100
++++ libx_c/compat-4.1/Makefile 2017-01-21 12:54:10.195680463 +1100
 @@ -1,3 +1,5 @@
 +ROOT=../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
  #
  # Copyright (c) 1980 Regents of the University of California.
  # All rights reserved.  The Berkeley software License Agreement
@@ -27,7 +27,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#compat-4.1lib compat-4.1lib_p: ${OBJS}
@@ -53,10 +53,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 -
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/compat-sys5/Makefile libx_c/compat-sys5/Makefile
 --- libx_c.post/compat-sys5/Makefile   2017-01-20 15:08:37.051597659 +1100
-+++ libx_c/compat-sys5/Makefile        2017-01-20 15:08:37.059597681 +1100
++++ libx_c/compat-sys5/Makefile        2017-01-21 12:54:10.199680491 +1100
 @@ -1,3 +1,5 @@
 +ROOT=../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
  #     Makefile        1.5     85/09/05
  #
  CFLAGS=       -O ${DEFS}
@@ -80,7 +80,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#compat-sys5lib compat-sys5lib_p: ${OBJS}
@@ -213,10 +213,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
  
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/gen/Makefile libx_c/gen/Makefile
 --- libx_c.post/gen/Makefile   2017-01-20 15:08:37.051597659 +1100
-+++ libx_c/gen/Makefile        2017-01-20 15:08:37.059597681 +1100
++++ libx_c/gen/Makefile        2017-01-21 12:54:10.199680491 +1100
 @@ -1,3 +1,5 @@
 +ROOT=../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
  #
  # Copyright (c) 1980 Regents of the University of California.
  # All rights reserved.  The Berkeley software License Agreement
@@ -302,7 +302,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
  
  genlib genlib_p: ${OBJS}
@@ -664,10 +664,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
  int srandom __P((unsigned x));
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/inet/Makefile libx_c/inet/Makefile
 --- libx_c.post/inet/Makefile  2017-01-20 15:08:37.027597596 +1100
-+++ libx_c/inet/Makefile       2017-01-20 15:08:37.063597691 +1100
++++ libx_c/inet/Makefile       2017-01-21 12:54:10.199680491 +1100
 @@ -1,3 +1,5 @@
 +ROOT=../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
  #
  # Copyright (c) 1980 Regents of the University of California.
  # All rights reserved.  The Berkeley software License Agreement
@@ -691,7 +691,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#inetlib inetlib_p: ${OBJS}
@@ -750,10 +750,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +}
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/linux/csu/Makefile libx_c/linux/csu/Makefile
 --- libx_c.post/linux/csu/Makefile     1970-01-01 10:00:00.000000000 +1000
-+++ libx_c/linux/csu/Makefile  2017-01-20 15:08:37.063597691 +1100
++++ libx_c/linux/csu/Makefile  2017-01-21 12:54:10.195680463 +1100
 @@ -0,0 +1,97 @@
 +ROOT=../../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 +DESTDIR=${ROOT}/cross
 +#
 +# Copyright (c) 1980 Regents of the University of California.
@@ -786,7 +786,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     as -o x.o x.s
 +#     ld -x -r -o crt0.o x.o
 +#     rm -f x.s x.o crt0.s
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#moncrt0.o: crt0.c
@@ -862,10 +862,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +}
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/linux/gen/Makefile libx_c/linux/gen/Makefile
 --- libx_c.post/linux/gen/Makefile     1970-01-01 10:00:00.000000000 +1000
-+++ libx_c/linux/gen/Makefile  2017-01-20 15:08:37.063597691 +1100
++++ libx_c/linux/gen/Makefile  2017-01-21 12:54:10.199680491 +1100
 @@ -0,0 +1,55 @@
 +ROOT=../../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 +#
 +# Copyright (c) 1980 Regents of the University of California.
 +# All rights reserved.  The Berkeley software License Agreement
@@ -885,7 +885,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     /lib/cpp -E ${DEFS} $*.c | ${AS} -o $*.o
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#genlib genlib_p: ${OBJS}
@@ -932,7 +932,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +}
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/linux/Makefile libx_c/linux/Makefile
 --- libx_c.post/linux/Makefile 1970-01-01 10:00:00.000000000 +1000
-+++ libx_c/linux/Makefile      2017-01-20 15:08:37.063597691 +1100
++++ libx_c/linux/Makefile      2017-01-21 12:54:10.199680491 +1100
 @@ -0,0 +1,43 @@
 +#
 +# Copyright (c) 1980 Regents of the University of California.
@@ -1075,10 +1075,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +}
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/linux/sys/Makefile libx_c/linux/sys/Makefile
 --- libx_c.post/linux/sys/Makefile     1970-01-01 10:00:00.000000000 +1000
-+++ libx_c/linux/sys/Makefile  2017-01-20 15:08:37.063597691 +1100
++++ libx_c/linux/sys/Makefile  2017-01-21 12:54:10.199680491 +1100
 @@ -0,0 +1,57 @@
 +ROOT=../../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 +#
 +# Copyright (c) 1980 Regents of the University of California.
 +# All rights reserved.  The Berkeley software License Agreement
@@ -1100,7 +1100,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     /lib/cpp -E ${DEFS} $*.c | ${AS} -o $*.o
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#syslib syslib_p: ${OBJS}
@@ -1305,7 +1305,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +}
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/Makefile libx_c/Makefile
 --- libx_c.post/Makefile       2017-01-20 15:08:37.027597596 +1100
-+++ libx_c/Makefile    2017-01-20 15:08:37.063597691 +1100
++++ libx_c/Makefile    2017-01-21 13:04:29.367675920 +1100
 @@ -1,3 +1,5 @@
 +ROOT=${shell pwd}/../..
 +DESTDIR=${ROOT}/cross
@@ -1361,29 +1361,59 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
        rm -rf t1 tmp
  
  ${MACHINE}/csu ${ALL} net/${HOSTLOOKUP}: FRC
-@@ -72,10 +78,12 @@
+@@ -71,11 +77,43 @@
  FRC:
  
- install: 
--      ${INSTALL} libc.a ${DESTDIR}/lib/libc.a
--      ranlib ${DESTDIR}/lib/libc.a
+-install: 
++install-headers:
++      rm -rf ${DESTDIR}/usr/include
++      for i in `find . -name '*.h' -print`; \
++      do \
++              mkdir -p ${DESTDIR}/usr/include/`dirname $$i`; \
++              cp $$i ${DESTDIR}/usr/include/$$i; \
++      done
++      cd ${DESTDIR}/usr/include; \
++      ln -s vax machine; \
++      ln -s machine/frame.h frame.h; \
++      ln -s sys/errno.h errno.h; \
++      ln -s sys/file.h fcntl.h; \
++      ln -s a.out.h nlist.h; \
++      ln -s sys/signal.h signal.h; \
++      ln -s sys/syslog.h syslog.h
++      for i in `find . -name '*.h' -print`; \
++      do \
++              mkdir -p ${DESTDIR}/usr/include/.xify/`dirname $$i`; \
++              ${ROOT}/cross/lib/xify $$i ${DESTDIR}/usr/include/.xify/`dirname $$i`/x_`basename $$i`; \
++      done
++      cd ${DESTDIR}/usr/include/.xify; \
++      ln -s vax machine; \
++      ln -s machine/x_frame.h x_frame.h; \
++      ln -s sys/x_errno.h x_errno.h; \
++      ln -s sys/x_file.h x_fcntl.h; \
++      ln -s x_a.out.h x_nlist.h; \
++      ln -s sys/x_signal.h x_signal.h; \
++      ln -s sys/x_syslog.h x_syslog.h
++
++install:
+       ${INSTALL} libc.a ${DESTDIR}/lib/libc.a
+       ranlib ${DESTDIR}/lib/libc.a
 -      ${INSTALL} libc_p.a ${DESTDIR}/usr/lib/libc_p.a
 -      ranlib ${DESTDIR}/usr/lib/libc_p.a
-+#     ${INSTALL} libc.a ${DESTDIR}/lib/libc.a
-+#     ranlib ${DESTDIR}/lib/libc.a
++      mkdir -p ${DESTDIR}/lib/.xify
++      ${INSTALL} libc.a ${DESTDIR}/lib/.xify/libx_c.a
++      ranlib ${DESTDIR}/lib/.xify/libx_c.a
 +#     ${INSTALL} libc_p.a ${DESTDIR}/usr/lib/libc_p.a
 +#     ranlib ${DESTDIR}/usr/lib/libc_p.a
-+      ${INSTALL} libc.a ${DESTDIR}/lib/libx_c.a
-+      ranlib ${DESTDIR}/lib/libx_c.a
        cd ${MACHINE}/csu; make DESTDIR=${DESTDIR} install
  
  tags:
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/net/hosttable/Makefile libx_c/net/hosttable/Makefile
 --- libx_c.post/net/hosttable/Makefile 2017-01-20 15:08:37.023597586 +1100
-+++ libx_c/net/hosttable/Makefile      2017-01-20 15:08:37.063597691 +1100
++++ libx_c/net/hosttable/Makefile      2017-01-21 12:54:10.195680463 +1100
 @@ -1,3 +1,5 @@
 +ROOT=../../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
  
  #
  # Copyright (c) 1983 Regents of the University of California.
@@ -1403,7 +1433,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
  
  hostlib hostlib_p: ${OBJS} 
@@ -1437,10 +1467,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 -# see make depend above
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/net/Makefile libx_c/net/Makefile
 --- libx_c.post/net/Makefile   2017-01-20 15:08:37.023597586 +1100
-+++ libx_c/net/Makefile        2017-01-20 15:08:37.063597691 +1100
++++ libx_c/net/Makefile        2017-01-21 12:54:10.195680463 +1100
 @@ -1,3 +1,5 @@
 +ROOT=../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
  #
  # Copyright (c) 1983 Regents of the University of California.
  # All rights reserved.  The Berkeley software License Agreement
@@ -1464,7 +1494,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#netlib netlib_p: ${OBJS}
@@ -1567,10 +1597,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
  #ifdef DEBUG
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/net/named/Makefile libx_c/net/named/Makefile
 --- libx_c.post/net/named/Makefile     2017-01-20 15:08:37.027597596 +1100
-+++ libx_c/net/named/Makefile  2017-01-20 15:08:37.063597691 +1100
++++ libx_c/net/named/Makefile  2017-01-21 12:54:10.195680463 +1100
 @@ -1,3 +1,5 @@
 +ROOT=../../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
  #
  # Copyright (c) 1983 Regents of the University of California.
  # All rights reserved.  The Berkeley software License Agreement
@@ -1594,7 +1624,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#hostlib hostlib_p: ${OBJS}
@@ -1630,10 +1660,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 -# see make depend above
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/ns/Makefile libx_c/ns/Makefile
 --- libx_c.post/ns/Makefile    2017-01-20 15:08:37.019597575 +1100
-+++ libx_c/ns/Makefile 2017-01-20 15:08:37.063597691 +1100
++++ libx_c/ns/Makefile 2017-01-21 12:54:10.195680463 +1100
 @@ -1,3 +1,5 @@
 +ROOT=../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
  #
  # Copyright (c) 1980 Regents of the University of California.
  # All rights reserved.  The Berkeley software License Agreement
@@ -1657,7 +1687,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#nslib nslib_p: ${OBJS}
@@ -1745,10 +1775,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
  
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/stdio/Makefile libx_c/stdio/Makefile
 --- libx_c.post/stdio/Makefile 2017-01-20 15:08:37.019597575 +1100
-+++ libx_c/stdio/Makefile      2017-01-20 15:08:37.063597691 +1100
++++ libx_c/stdio/Makefile      2017-01-21 12:54:10.195680463 +1100
 @@ -1,3 +1,5 @@
 +ROOT=../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
  #
  # Copyright (c) 1980 Regents of the University of California.
  # All rights reserved.  The Berkeley software License Agreement
@@ -1816,7 +1846,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#stdiolib stdiolib_p: ${OBJS}
@@ -1879,7 +1909,25 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 -# see make depend above
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/stdio.h libx_c/stdio.h
 --- libx_c.post/stdio.h        2017-01-20 15:08:37.031597606 +1100
-+++ libx_c/stdio.h     2017-01-20 15:08:37.063597691 +1100
++++ libx_c/stdio.h     2017-01-21 15:03:39.049076033 +1100
+@@ -82,7 +82,7 @@
+ #endif
+ /* stdio/clrerr.c */
+-int clearerr __P((register FILE *iop));
++/*int clearerr __P((register FILE *iop));*/
+ /* stdio/doprnt.c */
+ int _doprnt __P((u_char *fmt0, va_list argp, register FILE *fp));
+@@ -97,7 +97,7 @@
+ FILE *fdopen __P((int fd, register char *mode));
+ /* stdio/fgetc.c */
+-int fgetc __P((FILE *fp));
++/*int fgetc __P((FILE *fp));*/
+ /* stdio/fgets.c */
+ char *fgets __P((char *s, int n, register FILE *iop));
 @@ -109,7 +109,7 @@
  FILE *_findiop __P((void));
  int _f_morefiles __P((void));
@@ -1889,6 +1937,33 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
  void _cleanup __P((void));
  
  /* stdio/flsbuf.c */
+@@ -124,7 +124,7 @@
+ int fprintf __P((register FILE *iop, char *fmt, ...));
+ /* stdio/fputc.c */
+-int fputc __P((int c, register FILE *fp));
++/*int fputc __P((int c, register FILE *fp));*/
+ /* stdio/fputs.c */
+ int fputs __P((register char *s, register FILE *iop));
+@@ -145,7 +145,7 @@
+ int fwrite __P((void *_ptr, unsigned size, unsigned count, register FILE *iop));
+ /* stdio/getchar.c */
+-int getchar __P((void));
++/*int getchar __P((void));*/
+ /* stdio/gets.c */
+ char *gets __P((char *s));
+@@ -161,7 +161,7 @@
+ int printf __P((char *fmt, ...));
+ /* stdio/putchar.c */
+-int putchar __P((register c));
++/*int putchar __P((register c));*/
+ /* stdio/puts.c */
+ int puts __P((register char *s));
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/sys/dir.h libx_c/sys/dir.h
 --- libx_c.post/sys/dir.h      2017-01-20 15:08:37.035597617 +1100
 +++ libx_c/sys/dir.h   2017-01-20 15:08:37.063597691 +1100
@@ -1903,10 +1978,10 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
  /* gen/seekdir.c */
 diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '--exclude=*.sh' '--exclude=*.a' '--exclude=*.o' '--exclude=*.[ch].nocomm' '--exclude=*.[ch].protos' '--exclude=*.[ch].protos.nocomm' '--exclude=*.temp' '--exclude=*.temp.c' '--exclude=*.[ch].usedby' '--exclude=*.[ch].uses' libx_c.post/sys/Makefile libx_c/sys/Makefile
 --- libx_c.post/sys/Makefile   1970-01-01 10:00:00.000000000 +1000
-+++ libx_c/sys/Makefile        2017-01-20 15:08:37.063597691 +1100
++++ libx_c/sys/Makefile        2017-01-21 12:54:10.199680491 +1100
 @@ -0,0 +1,93 @@
 +ROOT=../../..
-+CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
++CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 +#
 +# Copyright (c) 1980 Regents of the University of California.
 +# All rights reserved.  The Berkeley software License Agreement
@@ -1959,7 +2034,7 @@ diff --unified --recursive --new-file '--exclude=[abcdefghijklmnopqrstuvwxyz]' '
 +#     ${CC} ${CFLAGS} -c $*.c
 +#     -ld -x -r $*.o
 +#     mv a.out $*.o
-+      ${ROOT}/xify/xify.sh <$< >$*.temp.c
++      ${ROOT}/xify/xify $< $*.temp.c
 +      ${CC} -o $@ -c $*.temp.c
 +
 +#syslib syslib_p: ${OBJS}
index c90603e..3c12925 100644 (file)
@@ -82,7 +82,7 @@ extern        struct  _iobuf {
 #endif
 
 /* stdio/clrerr.c */
-int clearerr __P((register FILE *iop));
+/*int clearerr __P((register FILE *iop));*/
 
 /* stdio/doprnt.c */
 int _doprnt __P((u_char *fmt0, va_list argp, register FILE *fp));
@@ -97,7 +97,7 @@ int exit __P((int code));
 FILE *fdopen __P((int fd, register char *mode));
 
 /* stdio/fgetc.c */
-int fgetc __P((FILE *fp));
+/*int fgetc __P((FILE *fp));*/
 
 /* stdio/fgets.c */
 char *fgets __P((char *s, int n, register FILE *iop));
@@ -124,7 +124,7 @@ FILE *fopen __P((char *file, register char *mode));
 int fprintf __P((register FILE *iop, char *fmt, ...));
 
 /* stdio/fputc.c */
-int fputc __P((int c, register FILE *fp));
+/*int fputc __P((int c, register FILE *fp));*/
 
 /* stdio/fputs.c */
 int fputs __P((register char *s, register FILE *iop));
@@ -145,7 +145,7 @@ long ftell __P((register FILE *iop));
 int fwrite __P((void *_ptr, unsigned size, unsigned count, register FILE *iop));
 
 /* stdio/getchar.c */
-int getchar __P((void));
+/*int getchar __P((void));*/
 
 /* stdio/gets.c */
 char *gets __P((char *s));
@@ -161,7 +161,7 @@ int pclose __P((FILE *ptr));
 int printf __P((char *fmt, ...));
 
 /* stdio/putchar.c */
-int putchar __P((register c));
+/*int putchar __P((register c));*/
 
 /* stdio/puts.c */
 int puts __P((register char *s));
index d29e1d0..8ea59c2 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1980 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -29,7 +29,7 @@ TAGSFILE=tags
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #stdiolib stdiolib_p: ${OBJS}
index 3354085..2e72242 100644 (file)
@@ -1,5 +1,5 @@
 ROOT=../../..
-CC=gcc -g -I${ROOT}/cross/include -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -I${ROOT}/cross/usr/include/.xify -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 #
 # Copyright (c) 1980 Regents of the University of California.
 # All rights reserved.  The Berkeley software License Agreement
@@ -52,7 +52,7 @@ TAGSFILE=tags
 #      ${CC} ${CFLAGS} -c $*.c
 #      -ld -x -r $*.o
 #      mv a.out $*.o
-       ${ROOT}/xify/xify.sh <$< >$*.temp.c
+       ${ROOT}/xify/xify $< $*.temp.c
        ${CC} -o $@ -c $*.temp.c
 
 #syslib syslib_p: ${OBJS}
index 73a994e..bbfb286 100644 (file)
@@ -1,8 +1,13 @@
 ROOT=..
-CC=${ROOT}/cross/bin/cc -g -Dx_vax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=FAKEROOT=${ROOT}/cross ${ROOT}/cross/bin/cc
+CFLAGS=-d -g -Dvax
+#CC=${ROOT}/cross/bin/cc -g -Dvax -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+
+.c.o:
+       ${CC} ${CFLAGS} -c $<
 
 hello: hello.o
-       ${CC} -o $@ hello.o
+       ${CC} ${CFLAGS} -o $@ hello.o
 
 clean:
        rm -f hello *.o
index efa54e4..460899d 100644 (file)
@@ -1,14 +1,17 @@
 ROOT=..
-CC=gcc -g -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
+CC=gcc -g -Wall -Wno-char-subscripts -Wno-deprecated-declarations -Wno-maybe-uninitialized -Wno-parentheses -Wno-unused-result
 DESTDIR=${ROOT}/cross
 
-BIN=cc
-LIB=newline nocomment nostring xify
+BIN=cc ld
+LIB=newline nocomment nostring xifyfilt
 
 all: ${BIN} ${LIB}
 
 cc: cc.c
-       ${CC} -o $@ cc.c
+       ${CC} -DXIFY -o $@ cc.c
+
+ld: ld.c
+       ${CC} -DXIFY -o $@ ld.c
 
 newline: newline.c
        ${CC} -o $@ newline.c
@@ -19,8 +22,8 @@ nocomment: nocomment.c
 nostring: nostring.c
        ${CC} -o $@ nostring.c
 
-xify: xify.c
-       ${CC} -o $@ xify.c
+xifyfilt: xifyfilt.c
+       ${CC} -o $@ xifyfilt.c
 
 clean:
        rm -f ${BIN} ${LIB}
@@ -29,4 +32,4 @@ install: all
        mkdir -p ${DESTDIR}/bin
        cp ${BIN} ${DESTDIR}/bin
        mkdir -p ${DESTDIR}/lib
-       cp ${LIB} xify.sh ${DESTDIR}/lib
+       cp ${LIB} xify ${DESTDIR}/lib
index 8f1e124..18c0b24 100644 (file)
--- a/xify/cc.c
+++ b/xify/cc.c
+#if defined(DOSCCS) && !defined(lint)
+static char sccsid[] = "@(#)cc.c 4.13 9/18/85";
+#endif
+/*
+ * cc - front end for C compiler
+ */
+#include <sys/param.h>
 #include <stdio.h>
-#include <stdlib.h>
+#include <ctype.h>
+#include <signal.h>
 #include <string.h>
+#include <sys/dir.h>
+#include <sys/wait.h>
+#ifdef XIFY
+#include <errno.h>
+#include <sys/stat.h>
+#endif
+
+#ifdef __STDC__
+#include <stdlib.h>
 #include <unistd.h>
+#endif
+
+#ifdef XIFY
+char   *gcc = "/usr/bin/gcc";
+char   *xify = "/lib/xify";
+char   *include = "/usr/include/.xify";
+#else
+char   *cpp = "/lib/cpp";
+char   *ccom = "/lib/ccom";
+char   *sccom = "/lib/sccom";
+char   *c2 = "/lib/c2";
+char   *as = "/bin/as";
+#endif
+char   *ld = "/bin/ld";
+char   *crt0 = "/lib/crt0.o";
+
+#ifndef XIFY
+char   tmp0[30];               /* big enough for /tmp/ctm%05.5d */
+char   *tmp1, *tmp2, *tmp3, *tmp4, *tmp5;
+#endif
+char   *outfile;
+/*char *savestr(), *strspl(), *setsuf();*/
+/*void idexit();*/
+char   **av, **clist, **llist, **plist;
+int    cflag, eflag, oflag, pflag, sflag, wflag, Rflag, exflag, proflag;
+int    fflag, gflag, Gflag, Mflag, debug;
+char   *dflag;
+int    exfail;
+char   *chpass;
+char   *npassname;
+
+int    nc, nl, np, nxo, na;
+
+#define        cunlink(s)      if (s) unlink(s)
+
+#ifndef __P
+#ifdef __STDC__
+#define __P(args) args
+#else
+#define __P(args) ()
+#endif
+#endif
+
+int main __P((int argc, char **argv));
+void idexit __P((void));
+int dexit __P((void));
+void error __P((char *s, char *x));
+int getsuf __P((char as[]));
+char *setsuf __P((char *as, int ch));
+int callsys __P((char *f, char **v));
+int nodup __P((char **l, char *os));
+char *savestr __P((register char *cp));
+char *strspl __P((char *left, char *right));
+
+int main(argc, argv) int argc; char **argv; {
+       char *t;
+#ifndef XIFY
+       char *assource;
+#endif
+       int i, j, c;
+
+       /* ld currently adds upto 5 args; 10 is room to spare */
+       av = (char **)calloc(argc+10, sizeof (char **));
+       clist = (char **)calloc(argc, sizeof (char **));
+       llist = (char **)calloc(argc, sizeof (char **));
+       plist = (char **)calloc(argc, sizeof (char **));
+       for (i = 1; i < argc; i++) {
+               if (*argv[i] == '-') switch (argv[i][1]) {
+
+               case 'S':
+                       sflag++;
+                       cflag++;
+                       continue;
+               case 'o':
+                       if (++i < argc) {
+                               outfile = argv[i];
+                               switch (getsuf(outfile)) {
+
+                               case 'c':
+                                       error("-o would overwrite %s",
+                                           outfile);
+                                       exit(8);
+                               }
+                       }
+                       continue;
+               case 'R':
+                       Rflag++;
+                       continue;
+               case 'O':
+                       oflag++;
+                       continue;
+               case 'p':
+                       proflag++;
+                       crt0 = "/lib/mcrt0.o";
+                       if (argv[i][2] == 'g')
+                               crt0 = "/usr/lib/gcrt0.o";
+                       continue;
+               case 'f':
+                       fflag++;
+                       continue;
+               case 'g':
+                       if (argv[i][2] == 'o') {
+                           Gflag++;    /* old format for -go */
+                       } else {
+                           gflag++;    /* new format for -g */
+                       }
+                       continue;
+               case 'w':
+                       wflag++;
+                       continue;
+               case 'E':
+                       exflag++;
+               case 'P':
+                       pflag++;
+                       if (argv[i][1]=='P')
+                               fprintf(stderr,
+       "cc: warning: -P option obsolete; you should use -E instead\n");
+                       plist[np++] = argv[i];
+               case 'c':
+                       cflag++;
+                       continue;
+               case 'M':
+                       exflag++;
+                       pflag++;
+                       Mflag++;
+                       /* and fall through */
+#ifdef XIFY
+                       plist[np++] = argv[i];
+                       continue;
+               case 'D':
+                       t = strspl("-D", argv[i]);
+                       goto define;
+               case 'U':
+                       t = strspl("-U", argv[i]);
+               define:
+                       t[2] = 'x';
+                       t[3] = '_';
+                       plist[np++] = t;
+                       continue;
+               case 'I':
+                       plist[np++] = strspl(argv[i], "/.xify");
+                       continue;
+               case 'C':
+                       error("-C not implemented", 0);
+                       exit(1);
+#else
+               case 'D':
+               case 'I':
+               case 'U':
+               case 'C':
+                       plist[np++] = argv[i];
+                       continue;
+#endif
+               case 'L':
+                       llist[nl++] = argv[i];
+                       continue;
+               case 't':
+                       if (chpass)
+                               error("-t overwrites earlier option", 0);
+                       chpass = argv[i]+2;
+                       if (chpass[0]==0)
+                               chpass = "012p";
+                       continue;
+               case 'B':
+                       if (npassname)
+                               error("-B overwrites earlier option", 0);
+                       npassname = argv[i]+2;
+                       if (npassname[0]==0)
+                               npassname = "/usr/c/o";
+                       continue;
+               case 'd':
+                       if (argv[i][2] == '\0') {
+                               debug++;
+                               continue;
+                       }
+                       dflag = argv[i];
+                       continue;
+               }
+               t = argv[i];
+               c = getsuf(t);
+               if (c=='c' || c=='s' || exflag) {
+                       clist[nc++] = t;
+                       t = setsuf(t, 'o');
+               }
+               if (nodup(llist, t)) {
+                       llist[nl++] = t;
+                       if (getsuf(t)=='o')
+                               nxo++;
+               }
+       }
+       if (gflag || Gflag) {
+               if (oflag)
+                       fprintf(stderr, "cc: warning: -g disables -O\n");
+               oflag = 0;
+       }
+       if (npassname && chpass ==0)
+               chpass = "012p";
+       if (chpass && npassname==0)
+               npassname = "/usr/new";
+       if (chpass)
+#ifdef XIFY
+               gcc = strspl(npassname, "gcc");
+#else
+       for (t=chpass; *t; t++) {
+               switch (*t) {
+
+               case '0':
+                       if (fflag)
+                               sccom = strspl(npassname, "sccom");
+                       else
+                               ccom = strspl(npassname, "ccom");
+                       continue;
+               case '2':
+                       c2 = strspl(npassname, "c2");
+                       continue;
+               case 'p':
+                       cpp = strspl(npassname, "cpp");
+                       continue;
+               }
+       }
+#endif
+       if (nc==0)
+               goto nocom;
+       if (signal(SIGINT, SIG_IGN) != SIG_IGN)
+               signal(SIGINT, (void (*) __P((int sig)))idexit);
+       if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
+               signal(SIGTERM, (void (*) __P((int sig)))idexit);
+       if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
+               signal(SIGHUP, (void (*) __P((int sig)))idexit);
+#ifdef XIFY
+       plist[np++] = "-I/usr/include/.xify";
+       t = getenv("FAKEROOT");
+       if (t) {
+               xify = strspl(t, xify);
+               for (i = 0; i < np; ++i)
+                       if (plist[i][2] == '/')
+                               plist[i] = strspl("-I", strspl(t, plist[i] + 2));
+       }
+#else
+       if (pflag==0)
+               sprintf(tmp0, "/tmp/ctm%05.5d", getpid());
+       tmp1 = strspl(tmp0, "1");
+       tmp2 = strspl(tmp0, "2");
+       tmp3 = strspl(tmp0, "3");
+       if (pflag==0)
+               tmp4 = strspl(tmp0, "4");
+       if (oflag)
+               tmp5 = strspl(tmp0, "5");
+#endif
+       for (i=0; i<nc; i++) {
+               if (nc > 1 && !Mflag) {
+                       printf("%s:\n", clist[i]);
+                       fflush(stdout);
+               }
+#ifdef XIFY
+               c = getsuf(clist[i]);
+               if (c == 'c') {
+                       t = ".xify";
+                       if (mkdir(t, 0777) == -1 && errno != EEXIST) {
+                               error("can't mkdir: %s", t);
+                               exit(1);
+                       }
+                       t = strspl(".xify/x_", setsuf(clist[i], 'c'));
+                       av[0] = "xify"; av[1] = clist[i]; av[2] = t; av[3] = 0;
+                       if (callsys(xify, av)) {
+                               cflag++;
+                               eflag++;
+                               continue;
+                       }
+                       clist[i] = t;
+               }
+               av[0] = "gcc"; av[1] = "-o";
+               na = 2;
+               if (cflag && nc==1 && outfile)
+                       av[na++] = outfile;
+               else if (c == 'c' && !exflag)
+                       av[na++] = setsuf(clist[i] + 8, sflag ? 's' : 'o');
+               else
+                       --na;
+               for (j = 0; j < np; ++j)
+                       av[na++] = plist[j];
+               if (proflag)
+                       av[na++] = "-pg";
+               if (gflag || Gflag)
+                       av[na++] = "-g";
+               if (wflag)
+                       av[na++] = "-Wall";
+               if (oflag)
+                       av[na++] = "-O3";
+               if (exflag)
+                       av[na++] = "-E";
+               else if (sflag)
+                       av[na++] = "-s";
+               else
+                       av[na++] = "-c";
+               av[na++] = clist[i];
+               av[na] = 0;
+               if (callsys(gcc, av)) {
+                       cflag++;
+                       eflag++;
+                       continue;
+               }
+#else
+               if (!Mflag && getsuf(clist[i]) == 's') {
+                       assource = clist[i];
+                       goto assemble;
+               } else
+                       assource = tmp3;
+               if (pflag)
+                       tmp4 = setsuf(clist[i], 'i');
+               av[0] = "cpp"; av[1] = clist[i];
+               na = 2;
+               if (!exflag)
+                       av[na++] = tmp4;
+               for (j = 0; j < np; j++)
+                       av[na++] = plist[j];
+               av[na++] = 0;
+               if (callsys(cpp, av)) {
+                       exfail++;
+                       eflag++;
+               }
+               if (pflag || exfail) {
+                       cflag++;
+                       continue;
+               }
+               if (sflag) {
+                       if (nc==1 && outfile)
+                               tmp3 = outfile;
+                       else
+                               tmp3 = setsuf(clist[i], 's');
+                       assource = tmp3;
+               }
+               av[0] = fflag ? "sccom" : "ccom";
+               av[1] = tmp4; av[2] = oflag?tmp5:tmp3; na = 3;
+               if (proflag)
+                       av[na++] = "-XP";
+               if (gflag) {
+                       av[na++] = "-Xg";
+               } else if (Gflag) {
+                       av[na++] = "-XG";
+               }
+               if (wflag)
+                       av[na++] = "-w";
+               av[na] = 0;
+               if (callsys(fflag ? sccom : ccom, av)) {
+                       cflag++;
+                       eflag++;
+                       continue;
+               }
+               if (oflag) {
+                       av[0] = "c2"; av[1] = tmp5; av[2] = tmp3; av[3] = 0;
+                       if (callsys(c2, av)) {
+                               unlink(tmp3);
+                               tmp3 = assource = tmp5;
+                       } else
+                               unlink(tmp5);
+               }
+               if (sflag)
+                       continue;
+       assemble:
+               cunlink(tmp1); cunlink(tmp2); cunlink(tmp4);
+               av[0] = "as"; av[1] = "-o";
+               if (cflag && nc==1 && outfile)
+                       av[2] = outfile;
+               else
+                       av[2] = setsuf(clist[i], 'o');
+               na = 3;
+               if (Rflag)
+                       av[na++] = "-R";
+               if (dflag)
+                       av[na++] = dflag;
+               av[na++] = assource;
+               av[na] = 0;
+               if (callsys(as, av) > 1) {
+                       cflag++;
+                       eflag++;
+                       continue;
+               }
+#endif
+       }
+nocom:
+       if (cflag==0 && nl!=0) {
+#ifdef XIFY
+               t = getenv("FAKEROOT");
+               if (t) {
+                       ld = strspl(t, ld);
+                       if (crt0[0] == '/')
+                               crt0 = strspl(t, crt0);
+               }
+#endif
+               i = 0;
+               av[0] = "ld"; av[1] = "-X"; av[2] = crt0; na = 3;
+               if (outfile) {
+                       av[na++] = "-o";
+                       av[na++] = outfile;
+               }
+#ifdef XIFY
+               if (debug)
+                       av[na++] = "-t";
+#endif
+               while (i < nl)
+                       av[na++] = llist[i++];
+#ifndef XIFY
+               if (gflag || Gflag)
+                       av[na++] = "-lg";
+#endif
+               if (proflag)
+                       av[na++] = "-lc_p";
+               else
+                       av[na++] = "-lc";
+               av[na++] = 0;
+               eflag |= callsys(ld, av);
+               if (nc==1 && nxo==1 && eflag==0)
+                       unlink(setsuf(clist[0], 'o'));
+       }
+       dexit();
+}
 
-char *root;
+void idexit() {
 
-void *_malloc(size) int size; {
-  void *p = malloc(size);
-  if (p == 0) {
-    perror("malloc()");
-    exit(1);
-  }
-  return p;
+       eflag = 100;
+       dexit();
 }
 
-char *xify_file(char *path) {
-  char *new_path = _malloc(strlen(path) + 4);
-  strcpy(new_path, ".x/");
-  strcat(new_path, path);
-
-  char *command = _malloc(17 + strlen(root) + strlen(path) + strlen(new_path));
-  sprintf(command, "%s/lib/xify.sh <%s >%s", root, path, new_path);
-  int status = system(command);
-  free(command);
-  if (status == -1 || !WIFEXITED(status) || WEXITSTATUS(status)) {
-    fprintf(stderr, "system()\n");
-    exit(1);
-  }
-
-  return new_path;
+int dexit() {
+
+#ifndef XIFY
+       if (!pflag) {
+               cunlink(tmp1);
+               cunlink(tmp2);
+               if (sflag==0)
+                       cunlink(tmp3);
+               cunlink(tmp4);
+               cunlink(tmp5);
+       }
+#endif
+       exit(eflag);
 }
 
-int main(argc, argv) int argc; char **argv; {
-  int i;
-  for (i = strlen(argv[0]); i > 0 && argv[0][i - 1] != '/'; --i)
-    ;
-  root = _malloc(i + 3);
-  memcpy(root, argv[0], i);
-  strcpy(root + i, "..");
-
-  int want_link = 1;
-  int want_compile = 0;
-  int first_file = argc;
-  for (i = 1; i < argc; ++i)
-    if (argv[i][0] == '-')
-      switch (argv[i][1]) {
-      case 'D':
-      case 'I':
-      case 'L':
-      case 'U':
-      case 'W':
-      case 'f':
-      case 'm':
-      case 'o':
-        if (argv[i][2] == 0)
-          ++i;
-        break;
-      case 'E':
-      case 'S':
-      case 'c':
-        want_link = 0;
-        break;
-      }
-    else {
-      if (i < first_file)
-        first_file = i;
-      int j = strlen(argv[i]);
-      if (j >= 2 && strcmp(argv[i] + j - 2, ".c") == 0) {
-        want_compile = 1;
-        argv[i] = xify_file(argv[i]);
-      }
-    }
-  if (first_file >= argc) {
-    fprintf(stderr, "%s: no input files\n", argv[0]);
-    exit(1);
-  }
-
-  int new_argc = 0;
-  char **new_argv = _malloc((argc + 5) * sizeof(char **));
-  new_argv[new_argc++] = "gcc";
-  if (want_compile) {
-    char *p = _malloc(strlen(root) + 15);
-    strcpy(p, "-I");
-    strcat(p, root);
-    strcat(p, "/usr/include");
-    new_argv[new_argc++] = p;
-  }
-  if (want_link) {
-    char *p = _malloc(strlen(root) + 7);
-    strcpy(p, "-L");
-    strcat(p, root);
-    strcat(p, "/lib");
-    new_argv[new_argc++] = p;
-  }
-  for (i = 1; i < first_file; ++i)
-    new_argv[new_argc++] = argv[i];
-  if (want_link) {
-    char *p = _malloc(strlen(root) + 12);
-    strcpy(p, root);
-    strcat(p, "/lib/crt0.o");
-    new_argv[new_argc++] = p;
-  }
-  for (; i < argc; ++i)
-    new_argv[new_argc++] = argv[i];
-  if (want_link)
-    new_argv[new_argc++] = "-lx_c";
-  new_argv[new_argc] = 0;
-#if 0
-  for (i = 0; i < new_argc; ++i)
-    fprintf(stderr, "new_argv[%d]=%s\n", i, new_argv[i]);
-#endif
-
-  execvp(new_argv[0], new_argv);
-  perror("execvp()");
-  exit(1);
+void error(s, x) char *s; char *x; {
+       FILE *diag = exflag ? stderr : stdout;
+
+       fprintf(diag, "cc: ");
+       fprintf(diag, s, x);
+       putc('\n', diag);
+       exfail++;
+       cflag++;
+       eflag++;
+}
+
+int getsuf(as) char as[]; {
+       register int c;
+       register char *s;
+       register int t;
+
+       s = as;
+       c = 0;
+       while (t = *s++)
+               if (t=='/')
+                       c = 0;
+               else
+                       c++;
+       s -= 3;
+       if (c <= MAXNAMLEN && c > 2 && *s++ == '.')
+               return (*s);
+       return (0);
+}
+
+char *setsuf(as, ch) char *as; int ch; {
+       register char *s, *s1;
+
+       s = s1 = savestr(as);
+       while (*s)
+               if (*s++ == '/')
+                       s1 = s;
+       s[-1] = ch;
+       return (s1);
+}
+
+int callsys(f, v) char *f; char **v; {
+       int t, status;
+       char **cpp;
+
+       if (debug) {
+               fprintf(stderr, "%s:", f);
+               for (cpp = v; *cpp != 0; cpp++)
+                       fprintf(stderr, " %s", *cpp);
+               fprintf(stderr, "\n");
+       }
+       t = vfork();
+       if (t == -1) {
+               printf("No more processes\n");
+               return (100);
+       }
+       if (t == 0) {
+               execv(f, v);
+               printf("Can't find %s\n", f);
+               fflush(stdout);
+               _exit(100);
+       }
+       while (t != wait(&status))
+               ;
+       if ((t=(status&0377)) != 0 && t!=14) {
+               if (t!=2) {
+                       printf("Fatal error in %s\n", f);
+                       eflag = 8;
+               }
+               dexit();
+       }
+       return ((status>>8) & 0377);
+}
+
+int nodup(l, os) char **l; char *os; {
+       register char *t, *s;
+       register int c;
+
+       s = os;
+       if (getsuf(s) != 'o')
+               return (1);
+       while (t = *l++) {
+               while (c = *s++)
+                       if (c != *t++)
+                               break;
+               if (*t==0 && c==0)
+                       return (0);
+               s = os;
+       }
+       return (1);
+}
+
+#define        NSAVETAB        1024
+char   *savetab;
+int    saveleft;
+
+char *savestr(cp) register char *cp; {
+       register int len;
+
+       len = strlen(cp) + 1;
+       if (len > saveleft) {
+               saveleft = NSAVETAB;
+               if (len > saveleft)
+                       saveleft = len;
+               savetab = (char *)malloc(saveleft);
+               if (savetab == 0) {
+                       fprintf(stderr, "ran out of memory (savestr)\n");
+                       exit(1);
+               }
+       }
+       strncpy(savetab, cp, len);
+       cp = savetab;
+       savetab += len;
+       saveleft -= len;
+       return (cp);
+}
+
+char *strspl(left, right) char *left; char *right; {
+       char buf[BUFSIZ];
+
+       strcpy(buf, left);
+       strcat(buf, right);
+       return (savestr(buf));
 }
diff --git a/xify/errfunc.sh b/xify/errfunc.sh
new file mode 100755 (executable)
index 0000000..3186da7
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+prefix=
+while read i
+do
+  func=`echo $i |sed -ne 's/.*: In function ‘\(.*\)’:$/\1/p'`
+  if test -n "$func"
+  then
+    prefix="$func: "
+  else
+    echo "$prefix$i"
+  fi
+done
diff --git a/xify/ld.c b/xify/ld.c
new file mode 100644 (file)
index 0000000..7c57cfc
--- /dev/null
+++ b/xify/ld.c
@@ -0,0 +1,2209 @@
+/*
+ * Copyright (c) 1980 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#if defined(DOCOPYRIGHT) && !defined(lint)
+char copyright[] =
+"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif
+
+#if defined(DOSCCS) && !defined(lint)
+static char sccsid[] = "@(#)ld.c       5.4 (Berkeley) 11/26/85";
+#endif
+
+/*
+ * ld - string table version for VAX
+ */
+
+#include <sys/param.h>
+#include <signal.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <ctype.h>
+#ifndef XIFY
+#include <ar.h>
+#include <a.out.h>
+#include <ranlib.h>
+#endif
+#include <sys/stat.h>
+#include <sys/file.h>
+#ifdef XIFY
+#include <sys/wait.h>
+#endif
+
+#if defined(__STDC__) && !defined(X_)
+#include <stdlib.h>
+#include <unistd.h>
+#else
+#include <gen.h> /* revisit, bcopy() and friends should be in strings.h */
+#include <sys.h>
+#endif
+
+/*
+ * Basic strategy:
+ *
+ * The loader takes a number of files and libraries as arguments.
+ * A first pass examines each file in turn.  Normal files are
+ * unconditionally loaded, and the (external) symbols they define and require
+ * are noted in the symbol table.   Libraries are searched, and the
+ * library members which define needed symbols are remembered
+ * in a special data structure so they can be selected on the second
+ * pass.  Symbols defined and required by library members are also
+ * recorded.
+ *
+ * After the first pass, the loader knows the size of the basic text
+ * data, and bss segments from the sum of the sizes of the modules which
+ * were required.  It has computed, for each ``common'' symbol, the
+ * maximum size of any reference to it, and these symbols are then assigned
+ * storage locations after their sizes are appropriately _rounded.
+ * The loader now knows all sizes for the eventual output file, and
+ * can determine the final locations of external symbols before it
+ * begins a second pass.
+ *
+ * On the second pass each normal file and required library member
+ * is processed again.  The symbol table for each such file is
+ * reread and relevant parts of it are placed in the output.  The offsets
+ * in the local symbol table for externally defined symbols are recorded
+ * since relocation information refers to symbols in this way.
+ * Armed with all necessary information, the text and data segments
+ * are relocated and the result is placed in the output file, which
+ * is pasted together, ``in place'', by writing to it in several
+ * different places concurrently.
+ */
+
+#ifndef XIFY
+/*
+ * Internal data structures
+ *
+ * All internal data structures are segmented and dynamically extended.
+ * The basic structures hold 1103 (NSYM) symbols, ~~200 (NROUT)
+ * referenced library members, and 100 (NSYMPR) private (local) symbols
+ * per object module.  For large programs and/or modules, these structures
+ * expand to be up to 40 (NSEG) times as large as this as necessary.
+ */
+#define        NSEG    40              /* Number of segments, each data structure */
+#define        NSYM    1103            /* Number of symbols per segment */
+#define        NROUT   250             /* Number of library references per segment */
+#define        NSYMPR  100             /* Number of private symbols per segment */
+
+/*
+ * Structure describing each symbol table segment.
+ * Each segment has its own hash table.  We record the first
+ * address in and first address beyond both the symbol and hash
+ * tables, for use in the routine symx and the lookup routine respectively.
+ * The symfree routine also understands this structure well as it used
+ * to back out symbols from modules we decide that we don't need in pass 1.
+ *
+ * Csymseg points to the current symbol table segment;
+ * csymseg->sy_first[csymseg->sy_used] is the next symbol slot to be allocated,
+ * (unless csymseg->sy_used == NSYM in which case we will allocate another
+ * symbol table segment first.)
+ */
+struct symseg {
+       struct  nlist *sy_first;        /* base of this alloc'ed segment */
+       struct  nlist *sy_last;         /* end of this segment, for n_strx */
+       int     sy_used;                /* symbols used in this seg */
+       struct  nlist **sy_hfirst;      /* base of hash table, this seg */
+       struct  nlist **sy_hlast;       /* end of hash table, this seg */
+} symseg[NSEG], *csymseg;
+
+/*
+ * The lookup routine uses quadratic rehash.  Since a quadratic rehash
+ * only probes 1/2 of the buckets in the table, and since the hash
+ * table is segmented the same way the symbol table is, we make the
+ * hash table have twice as many buckets as there are symbol table slots
+ * in the segment.  This guarantees that the quadratic rehash will never
+ * fail to find an empty bucket if the segment is not full and the
+ * symbol is not there.
+ */
+#define        HSIZE   (NSYM*2)
+
+/*
+ * Xsym converts symbol table indices (ala x) into symbol table pointers.
+ * Symx (harder, but never used in loops) inverts pointers into the symbol
+ * table into indices using the symseg[] structure.
+ */
+#define        xsym(x) (symseg[(x)/NSYM].sy_first+((x)%NSYM))
+/* symx() is a function, defined below */
+
+struct nlist cursym;           /* current symbol */
+struct nlist *lastsym;         /* last symbol entered */
+struct nlist *nextsym;         /* next available symbol table entry */
+struct nlist *addsym;          /* first sym defined during incr load */
+int    nsym;                   /* pass2: number of local symbols in a.out */
+/* nsym + symx(nextsym) is the symbol table size during pass2 */
+
+struct nlist **lookup(), **slookup();
+struct nlist *p_etext, *p_edata, *p_end, *entrypt;
+
+/*
+ * Definitions of segmentation for library member table.
+ * For each library we encounter on pass 1 we record pointers to all
+ * members which we will load on pass 2.  These are recorded as offsets
+ * into the archive in the library member table.  Libraries are
+ * separated in the table by the special offset value -1.
+ */
+off_t  li_init[NROUT];
+struct libseg {
+       off_t   *li_first;
+       int     li_used;
+       int     li_used2;
+} libseg[NSEG] = {
+       li_init, 0, 0,
+}, *clibseg = libseg;
+
+/*
+ * In processing each module on pass 2 we must relocate references
+ * relative to external symbols.  These references are recorded
+ * in the relocation information as relative to local symbol numbers
+ * assigned to the external symbols when the module was created.
+ * Thus before relocating the module in pass 2 we create a table
+ * which maps these internal numbers to symbol table entries.
+ * A hash table is constructed, based on the local symbol table indices,
+ * for quick lookup of these symbols.
+ */
+#define        LHSIZ   31
+struct local {
+       int     l_index;                /* index to symbol in file */
+       struct  nlist *l_symbol;        /* ptr to symbol table */
+       struct  local *l_link;          /* hash link */
+} *lochash[LHSIZ], lhinit[NSYMPR];
+struct locseg {
+       struct  local *lo_first;
+       int     lo_used;
+} locseg[NSEG] = {
+       lhinit, 0
+}, *clocseg;
+
+/*
+ * Libraries are typically built with a table of contents,
+ * which is the first member of a library with special file
+ * name __.SYMDEF and contains a list of symbol names
+ * and with each symbol the offset of the library member which defines
+ * it.  The loader uses this table to quickly tell which library members
+ * are (potentially) useful.  The alternative, examining the symbol
+ * table of each library member, is painfully slow for large archives.
+ *
+ * See <ranlib.h> for the definition of the ranlib structure and an
+ * explanation of the __.SYMDEF file format.
+ */
+int    tnum;           /* number of symbols in table of contents */
+int    ssiz;           /* size of string table for table of contents */
+struct ranlib *tab;    /* the table of contents (dynamically allocated) */
+char   *tabstr;        /* string table for table of contents */
+
+/*
+ * We open each input file or library only once, but in pass2 we
+ * (historically) read from such a file at 2 different places at the
+ * same time.  These structures are remnants from those days,
+ * and now serve only to catch ``Premature EOF''.
+ * In order to make I/O more efficient, we provide routines which
+ * use the optimal block size returned by stat().
+ */
+#define BLKSIZE 1024
+typedef struct {
+       short   *fakeptr;
+       int     bno;
+       int     nibuf;
+       int     nuser;
+       char    *buff;
+       int     bufsize;
+} PAGE;
+
+PAGE   page[2];
+int    p_blksize;
+int    p_blkshift;
+int    p_blkmask;
+
+struct {
+       short   *fakeptr;
+       int     bno;
+       int     nibuf;
+       int     nuser;
+} fpage;
+
+typedef struct {
+       char    *ptr;
+       int     bno;
+       int     nibuf;
+       long    size;
+       long    pos;
+       PAGE    *pno;
+} STREAM;
+
+STREAM text;
+STREAM reloc;
+
+/*
+ * Header from the a.out and the archive it is from (if any).
+ */
+struct exec filhdr;
+struct ar_hdr archdr;
+#define        OARMAG 0177545
+#endif
+
+/*
+ * Options.
+ */
+int    trace;
+int    xflag;          /* discard local symbols */
+int    Xflag;          /* discard locals starting with 'L' */
+int    Sflag;          /* discard all except locals and globals*/
+int    rflag;          /* preserve relocation bits, don't define common */
+int    arflag;         /* original copy of rflag */
+int    sflag;          /* discard all symbols */
+int    Mflag;          /* print rudimentary load map */
+int    nflag;          /* pure procedure */
+int    dflag;          /* define common even with rflag */
+int    zflag;          /* demand paged  */
+long   hsize;          /* size of hole at beginning of data to be squashed */
+int    Aflag;          /* doing incremental load */
+int    Nflag;          /* want impure a.out */
+int    funding;        /* reading fundamental file for incremental load */
+int    yflag;          /* number of symbols to be traced */
+char   **ytab;         /* the symbols */
+
+#ifndef XIFY
+/*
+ * These are the cumulative sizes, set in pass 1, which
+ * appear in the a.out header when the loader is finished.
+ */
+off_t  tsize, dsize, bsize, trsize, drsize, ssize;
+
+/*
+ * Symbol relocation: c?rel is a scale factor which is
+ * added to an old relocation to convert it to new units;
+ * i.e. it is the difference between segment origins.
+ * (Thus if we are loading from a data segment which began at location
+ * 4 in a .o file into an a.out where it will be loaded starting at
+ * 1024, cdrel will be 1020.)
+ */
+long   ctrel, cdrel, cbrel;
+
+/*
+ * Textbase is the start address of all text, 0 unless given by -T.
+ * Database is the base of all data, computed before and used during pass2.
+ */
+long   textbase, database;
+
+/*
+ * The base addresses for the loaded text, data and bss from the
+ * current module during pass2 are given by torigin, dorigin and borigin.
+ */
+long   torigin, dorigin, borigin;
+#endif
+
+/*
+ * Errlev is nonzero when errors have occured.
+ * Delarg is an implicit argument to the routine delexit
+ * which is called on error.  We do ``delarg = errlev'' before normal
+ * exits, and only if delarg is 0 (i.e. errlev was 0) do we make the
+ * result file executable.
+ */
+int    errlev;
+int    delarg  = 4;
+
+#ifndef XIFY
+/*
+ * The biobuf structure and associated routines are used to write
+ * into one file at several places concurrently.  Calling bopen
+ * with a biobuf structure sets it up to write ``biofd'' starting
+ * at the specified offset.  You can then use ``bwrite'' and/or ``bputc''
+ * to stuff characters in the stream, much like ``fwrite'' and ``fputc''.
+ * Calling bflush drains all the buffers and MUST be done before exit.
+ */
+struct biobuf {
+       short   b_nleft;                /* Number free spaces left in b_buf */
+/* Initialize to be less than b_bufsize initially, to boundary align in file */
+       char    *b_ptr;                 /* Next place to stuff characters */
+       char    *b_buf;                 /* Pointer to the buffer */
+       int     b_bufsize;              /* Size of the buffer */
+       off_t   b_off;                  /* Current file offset */
+       struct  biobuf *b_link;         /* Link in chain for bflush() */
+} *biobufs;
+#define        bputc(c,b) ((b)->b_nleft ? (--(b)->b_nleft, *(b)->b_ptr++ = (c)) \
+                      : bflushc(b, c))
+int    biofd;
+off_t  boffset;
+struct biobuf *tout, *dout, *trout, *drout, *sout, *strout;
+
+/*
+ * Offset is the current offset in the string file.
+ * Its initial value reflects the fact that we will
+ * eventually stuff the size of the string table at the
+ * beginning of the string table (i.e. offset itself!).
+ */
+off_t  offset = sizeof (off_t);
+#endif
+
+int    ofilfnd;                /* -o given; otherwise move l.out to a.out */
+char   *ofilename = "l.out";
+int    ofilemode;              /* respect umask even for unsucessful ld's */
+int    infil;                  /* current input file descriptor */
+char   *filname;               /* and its name */
+
+#define        NDIRS   25
+#define NDEFDIRS 3             /* number of default directories in dirs[] */
+char   *dirs[NDIRS];           /* directories for library search */
+int    ndir;                   /* number of directories */
+
+#ifdef XIFY
+char   *gcc = "/usr/bin/gcc";
+char   **av;
+int    na;
+#else
+/*
+ * Base of the string table of the current module (pass1 and pass2).
+ */
+char   *curstr;
+
+/*
+ * System software page size, as returned by getpagesize.
+ */
+int    pagesize;
+#endif
+
+/*char         get();*/
+/*int  delexit();*/
+/*char *savestr();*/
+/*char *malloc();*/
+
+#ifndef __P
+#ifdef __STDC__
+#define __P(args) args
+#else
+#define __P(args) ()
+#endif
+#endif
+
+int main __P((int argc, char **argv));
+#ifndef XIFY
+int htoi __P((register char *p));
+#endif
+void delexit __P((void));
+void endload __P((int argc, char **argv));
+#ifdef XIFY
+int callsys __P((char *f, char **v));
+#else
+void load1arg __P((register char *cp));
+int step __P((off_t nloc));
+void nextlibp __P((off_t val));
+int ldrand __P((void));
+int load1 __P((int libflg, off_t loc));
+void middle __P((void));
+void fixspec __P((struct nlist *sym, long offset));
+void ldrsym __P((register struct nlist *sp, long val, int type));
+void setupout __P((void));
+void outb __P((register struct biobuf **bp, int inc, int bufsize));
+void load2arg __P((char *acp));
+void load2 __P((long loc));
+void tracesym __P((void));
+void load2td __P((long creloc, int position, struct biobuf *b1, struct biobuf *b2));
+#endif
+void finishout __P((void));
+#ifndef XIFY
+void mkfsym __P((char *s));
+void getarhdr __P((void));
+void mget __P((void *_loc, int n, register STREAM *sp));
+void symwrite __P((struct nlist *sp, struct biobuf *bp));
+void dseek __P((register STREAM *sp, long loc, long s));
+char get __P((STREAM *asp));
+int getfile __P((char *acp));
+int libopen __P((char *name, int oflags));
+struct nlist **lookup __P((void));
+void symfree __P((struct nlist *saved));
+struct nlist **slookup __P((char *s));
+int enter __P((register struct nlist **hp));
+int symx __P((struct nlist *sp));
+void symreloc __P((void));
+#endif
+void error __P((int n, char *s));
+#ifndef XIFY
+void readhdr __P((off_t loc));
+int _round __P((int v, u_long r));
+#endif
+char *savestr __P((register char *cp));
+#ifdef XIFY
+char *strspl __P((char *left, char *right));
+#else
+void bopen __P((register struct biobuf *bp, int off, int bufsize));
+void bwrite __P((void *_p, register int cnt, register struct biobuf *bp));
+void bflush __P((void));
+void bflush1 __P((register struct biobuf *bp));
+void bflushc __P((register struct biobuf *bp, int c));
+void bseek __P((register struct biobuf *bp, register off_t off));
+#endif
+
+int main(argc, argv) int argc; char **argv; {
+       register int c, i;
+#ifndef XIFY
+       int num;
+#endif
+       register char *ap, **p;
+#ifndef XIFY
+       char save;
+#endif
+
+       if (signal(SIGINT, SIG_IGN) != SIG_IGN) {
+               signal(SIGINT, (void (*) __P((int sig)))delexit);
+               signal(SIGTERM, (void (*) __P((int sig)))delexit);
+       }
+       if (argc == 1)
+               exit(4);
+#ifndef XIFY
+       pagesize = getpagesize();
+#endif
+
+       /* 
+        * Pull out search directories.
+        */
+       for (c = 1; c < argc; c++) {
+               ap = argv[c];
+               if (ap[0] == '-' && ap[1] == 'L') {
+                       if (ap[2] == 0)
+                               error(1, "-L: pathname missing");
+                       if (ndir >= NDIRS - NDEFDIRS)
+                               error(1, "-L: too many directories");
+#ifdef XIFY
+                       dirs[ndir++] = strspl(&ap[2], "/.xify");
+#else
+                       dirs[ndir++] = &ap[2];
+#endif
+               }
+       }
+       /* add default search directories */
+#ifdef XIFY
+       dirs[ndir++] = "/lib/.xify";
+       dirs[ndir++] = "/usr/lib/.xify";
+       dirs[ndir++] = "/usr/local/lib/.xify";
+       ap = getenv("FAKEROOT");
+       if (ap) {
+               for (i = 0; i < ndir; ++i)
+                       if (dirs[i][0] == '/')
+                               dirs[i] = strspl(ap, dirs[i]);
+       }
+#else
+       dirs[ndir++] = "/lib";
+       dirs[ndir++] = "/usr/lib";
+       dirs[ndir++] = "/usr/local/lib";
+#endif
+
+       p = argv+1;
+       /*
+        * Scan files once to find where symbols are defined.
+        */
+       for (c=1; c<argc; c++) {
+#ifndef XIFY
+               if (trace)
+                       printf("%s:\n", *p);
+#endif
+               filname = 0;
+               ap = *p++;
+               if (*ap != '-') {
+#ifndef XIFY
+                       load1arg(ap);
+#endif
+                       continue;
+               }
+               for (i=1; ap[i]; i++) switch (ap[i]) {
+
+               case 'o':
+                       if (++c >= argc)
+                               error(1, "-o where?");
+                       ofilename = *p++;
+                       ofilfnd++;
+                       continue;
+               case 'u':
+               case 'e':
+                       if (++c >= argc)
+                               error(1, "-u or -c: arg missing");
+#ifdef XIFY
+                       error(1, "-u or -c: not implemented");
+#else
+                       enter(slookup(*p++));
+                       if (ap[i]=='e')
+                               entrypt = lastsym;
+#endif
+                       continue;
+               case 'H':
+                       if (++c >= argc)
+                               error(1, "-H: arg missing");
+#ifdef XIFY
+                       error(1, "-H: not implemented");
+#else
+                       if (tsize!=0)
+                               error(1, "-H: too late, some text already loaded");
+                       hsize = atoi(*p++);
+#endif
+                       continue;
+               case 'A':
+                       if (++c >= argc)
+                               error(1, "-A: arg missing");
+#ifdef XIFY
+                       error(1, "-A: not implemented");
+#else
+                       if (Aflag) 
+                               error(1, "-A: only one base file allowed");
+                       Aflag = 1;
+                       nflag = 0;
+                       funding = 1;
+                       load1arg(*p++);
+                       trsize = drsize = tsize = dsize = bsize = 0;
+                       ctrel = cdrel = cbrel = 0;
+                       funding = 0;
+                       addsym = nextsym;
+#endif
+                       continue;
+               case 'D':
+                       if (++c >= argc)
+                               error(1, "-D: arg missing");
+#ifdef XIFY
+                       error(1, "-D: not implemented");
+#else
+                       num = htoi(*p++);
+                       if (dsize > num)
+                               error(1, "-D: too small");
+                       dsize = num;
+#endif
+                       continue;
+               case 'T':
+                       if (++c >= argc)
+                               error(1, "-T: arg missing");
+#ifdef XIFY
+                       error(1, "-T: not implemented");
+#else
+                       if (tsize!=0)
+                               error(1, "-T: too late, some text already loaded");
+                       textbase = htoi(*p++);
+#endif
+                       continue;
+               case 'l':
+#ifndef XIFY
+                       save = ap[--i]; 
+                       ap[i]='-';
+                       load1arg(&ap[i]);
+                       ap[i]=save;
+#endif
+                       goto next;
+               case 'M':
+                       Mflag++;
+                       continue;
+               case 'x':
+                       xflag++;
+                       continue;
+               case 'X':
+                       Xflag++;
+                       continue;
+               case 'S':
+                       Sflag++; 
+                       continue;
+               case 'r':
+                       rflag++;
+                       arflag++;
+                       continue;
+               case 's':
+                       sflag++;
+                       xflag++;
+                       continue;
+               case 'n':
+                       nflag++;
+                       Nflag = zflag = 0;
+                       continue;
+               case 'N':
+                       Nflag++;
+                       nflag = zflag = 0;
+                       continue;
+               case 'd':
+                       dflag++;
+                       continue;
+               case 'i':
+                       printf("ld: -i ignored\n");
+                       continue;
+               case 't':
+                       trace++;
+                       continue;
+               case 'y':
+                       if (ap[i+1] == 0)
+                               error(1, "-y: symbol name missing");
+                       if (yflag == 0) {
+                               ytab = (char **)calloc(argc, sizeof (char **));
+                               if (ytab == 0)
+                                       error(1, "ran out of memory (-y)");
+                       }
+                       ytab[yflag++] = &ap[i+1];
+                       goto next;
+               case 'z':
+                       zflag++;
+                       Nflag = nflag = 0;
+                       continue;
+               case 'L':
+                       goto next;
+               default:
+                       filname = savestr("-x");        /* kludge */
+                       filname[1] = ap[i];             /* kludge */
+#ifndef XIFY
+                       archdr.ar_name[0] = 0;          /* kludge */
+#endif
+                       error(1, "bad flag");
+               }
+next:
+               ;
+       }
+       if (rflag == 0 && Nflag == 0 && nflag == 0)
+               zflag++;
+       endload(argc, argv);
+       exit(0);
+}
+
+#ifndef XIFY
+/*
+ * Convert a ascii string which is a hex number.
+ * Used by -T and -D options.
+ */
+int htoi(p) register char *p; {
+       register int c, n;
+
+       n = 0;
+       while (c = *p++) {
+               n <<= 4;
+               if (isdigit(c))
+                       n += c - '0';
+               else if (c >= 'a' && c <= 'f')
+                       n += 10 + (c - 'a');
+               else if (c >= 'A' && c <= 'F')
+                       n += 10 + (c - 'A');
+               else
+                       error(1, "badly formed hex number");
+       }
+       return (n);
+}
+#endif
+
+void delexit() {
+#ifndef XIFY
+       struct stat stbuf;
+       long size;
+       char c = 0;
+
+       bflush();
+#endif
+       unlink("l.out");
+#ifndef XIFY
+       /*
+        * We have to insure that the last block of the data segment
+        * is allocated a full pagesize block. If the underlying
+        * file system allocates frags that are smaller than pagesize,
+        * a full zero filled pagesize block needs to be allocated so 
+        * that when it is demand paged, the paged in block will be 
+        * appropriately filled with zeros.
+        */
+       fstat(biofd, &stbuf);
+       size = _round(stbuf.st_size, pagesize);
+       if (!rflag && size > stbuf.st_size) {
+               lseek(biofd, size - 1, 0);
+               if (write(biofd, &c, 1) != 1)
+                       delarg |= 4;
+       }
+       if (delarg==0 && Aflag==0)
+               (void) chmod(ofilename, ofilemode);
+#endif
+       exit (delarg);
+}
+
+void endload(argc, argv) int argc; char **argv; {
+       register int c, i; 
+#ifndef XIFY
+       long dnum;
+#endif
+       register char *ap, **p;
+
+#ifdef XIFY
+       /* ld currently adds upto 5 args; 10 is room to spare */
+       av = (char **)calloc(argc+10, sizeof (char **));
+       av[0] = "gcc"; av[1] = "-o"; av[2] = ofilename;
+       na = 3;
+       for (i = 0; i < ndir; ++i)
+               av[na++] = strspl("-L", dirs[i]);
+#else
+       clibseg = libseg;
+       filname = 0;
+       middle();
+       setupout();
+#endif
+       p = argv+1;
+       for (c=1; c<argc; c++) {
+               ap = *p++;
+#ifndef XIFY
+               if (trace)
+                       printf("%s:\n", ap);
+#endif
+               if (*ap != '-') {
+#ifdef XIFY
+                       av[na++] = ap;
+#else
+                       load2arg(ap);
+#endif
+                       continue;
+               }
+               for (i=1; ap[i]; i++) switch (ap[i]) {
+
+#ifndef XIFY
+               case 'D':
+                       dnum = htoi(*p);
+                       if (dorigin < dnum)
+                               while (dorigin < dnum)
+                                       bputc(0, dout), dorigin++;
+                       /* fall into ... */
+               case 'T':
+               case 'u':
+               case 'e':
+#endif
+               case 'o':
+#ifndef XIFY
+               case 'H':
+#endif
+                       ++c; 
+                       ++p;
+                       /* fall into ... */
+               default:
+                       continue;
+#ifndef XIFY
+               case 'A':
+                       funding = 1;
+                       load2arg(*p++);
+                       funding = 0;
+                       c++;
+                       continue;
+#endif
+               case 'y':
+               case 'L':
+                       goto next;
+               case 'l':
+#ifdef XIFY
+                       av[na++] = strspl("-lx_", ap + i + 1);
+#else
+                       ap[--i]='-';
+                       load2arg(&ap[i]);
+#endif
+                       goto next;
+               }
+next:
+               ;
+       }
+#ifdef XIFY
+       if (callsys(gcc, av))
+               delexit();
+#endif
+       finishout();
+}
+
+#ifdef XIFY
+int callsys(f, v) char *f; char **v; {
+       int t, status;
+       char **cpp;
+
+       if (/*debug*/trace) {
+               fprintf(stderr, "%s:", f);
+               for (cpp = v; *cpp != 0; cpp++)
+                       fprintf(stderr, " %s", *cpp);
+               fprintf(stderr, "\n");
+       }
+       t = vfork();
+       if (t == -1) {
+               printf("No more processes\n");
+               return (100);
+       }
+       if (t == 0) {
+               execv(f, v);
+               printf("Can't find %s\n", f);
+               fflush(stdout);
+               _exit(100);
+       }
+       while (t != wait(&status))
+               ;
+       if ((t=(status&0377)) != 0 && t!=14) {
+               if (t!=2) {
+                       printf("Fatal error in %s\n", f);
+                       /*eflag*/delarg = 8;
+               }
+               /*dexit*/delexit();
+       }
+       return ((status>>8) & 0377);
+}
+#else
+/*
+ * Scan file to find defined symbols.
+ */
+void load1arg(cp) register char *cp; {
+       register struct ranlib *tp;
+       off_t nloc;
+       int kind;
+
+       kind = getfile(cp);
+       if (Mflag)
+               printf("%s\n", filname);
+       switch (kind) {
+
+       /*
+        * Plain file.
+        */
+       case 0:
+               load1(0, 0L);
+               break;
+
+       /*
+        * Archive without table of contents.
+        * (Slowly) process each member.
+        */
+       case 1:
+               error(-1,
+"warning: archive has no table of contents; add one using ranlib(1)");
+               nloc = SARMAG;
+               while (step(nloc))
+                       nloc += sizeof(archdr) +
+                           _round(atol(archdr.ar_size), sizeof (short));
+               break;
+
+       /*
+        * Archive with table of contents.
+        * Read the table of contents and its associated string table.
+        * Pass through the library resolving symbols until nothing changes
+        * for an entire pass (i.e. you can get away with backward references
+        * when there is a table of contents!)
+        */
+       case 2:
+               nloc = SARMAG + sizeof (archdr);
+               dseek(&text, nloc, sizeof (tnum));
+               mget(&tnum, sizeof (tnum), &text);
+               nloc += sizeof (tnum);
+               tab = (struct ranlib *)malloc(tnum);
+               if (tab == 0)
+                       error(1, "ran out of memory (toc)");
+               dseek(&text, nloc, tnum);
+               mget(tab, tnum, &text);
+               nloc += tnum;
+               tnum /= sizeof (struct ranlib);
+               dseek(&text, nloc, sizeof (ssiz));
+               mget(&ssiz, sizeof (ssiz), &text);
+               nloc += sizeof (ssiz);
+               tabstr = (char *)malloc(ssiz);
+               if (tabstr == 0)
+                       error(1, "ran out of memory (tocstr)");
+               dseek(&text, nloc, ssiz);
+               mget(tabstr, ssiz, &text);
+               for (tp = &tab[tnum]; --tp >= tab;) {
+                       if (tp->ran_un.ran_strx < 0 ||
+                           tp->ran_un.ran_strx >= ssiz)
+                               error(1, "mangled archive table of contents");
+                       tp->ran_un.ran_name = tabstr + tp->ran_un.ran_strx;
+               }
+               while (ldrand())
+                       continue;
+               free((char *)tab);
+               free(tabstr);
+               nextlibp(-1);
+               break;
+
+       /*
+        * Table of contents is out of date, so search
+        * as a normal library (but skip the __.SYMDEF file).
+        */
+       case 3:
+               error(-1,
+"warning: table of contents for archive is out of date; rerun ranlib(1)");
+               nloc = SARMAG;
+               do
+                       nloc += sizeof(archdr) +
+                           _round(atol(archdr.ar_size), sizeof(short));
+               while (step(nloc));
+               break;
+       }
+       close(infil);
+}
+
+/*
+ * Advance to the next archive member, which
+ * is at offset nloc in the archive.  If the member
+ * is useful, record its location in the liblist structure
+ * for use in pass2.  Mark the end of the archive in libilst with a -1.
+ */
+int step(nloc) off_t nloc; {
+
+       dseek(&text, nloc, (long) sizeof archdr);
+       if (text.size <= 0) {
+               nextlibp(-1);
+               return (0);
+       }
+       getarhdr();
+       if (load1(1, nloc + (sizeof archdr)))
+               nextlibp(nloc);
+       return (1);
+}
+
+/*
+ * Record the location of a useful archive member.
+ * Recording -1 marks the end of files from an archive.
+ * The liblist data structure is dynamically extended here.
+ */
+void nextlibp(val) off_t val; {
+
+       if (clibseg->li_used == NROUT) {
+               if (++clibseg == &libseg[NSEG])
+                       error(1, "too many files loaded from libraries");
+               clibseg->li_first = (off_t *)malloc(NROUT * sizeof (off_t));
+               if (clibseg->li_first == 0)
+                       error(1, "ran out of memory (nextlibp)");
+       }
+       clibseg->li_first[clibseg->li_used++] = val;
+       if (val != -1 && Mflag)
+               printf("\t%s\n", archdr.ar_name);
+}
+
+/*
+ * One pass over an archive with a table of contents.
+ * Remember the number of symbols currently defined,
+ * then call step on members which look promising (i.e.
+ * that define a symbol which is currently externally undefined).
+ * Indicate to our caller whether this process netted any more symbols.
+ */
+int ldrand() {
+       register struct nlist *sp, **hp;
+       register struct ranlib *tp, *tplast;
+       off_t loc;
+       int nsymt = symx(nextsym);
+
+       tplast = &tab[tnum-1];
+       for (tp = tab; tp <= tplast; tp++) {
+               if ((hp = slookup(tp->ran_un.ran_name)) == 0 || *hp == 0)
+                       continue;
+               sp = *hp;
+               if (sp->n_type != N_EXT+N_UNDF)
+                       continue;
+               step(tp->ran_off);
+               loc = tp->ran_off;
+               while (tp < tplast && (tp+1)->ran_off == loc)
+                       tp++;
+       }
+       return (symx(nextsym) != nsymt);
+}
+
+/*
+ * Examine a single file or archive member on pass 1.
+ */
+int load1(libflg, loc) int libflg; off_t loc; {
+       register struct nlist *sp;
+       struct nlist *savnext;
+       int ndef, nlocal, type, size, nsymt;
+       register int i;
+       off_t maxoff;
+       struct stat stb;
+
+       readhdr(loc);
+       if (filhdr.a_syms == 0) {
+               if (filhdr.a_text+filhdr.a_data == 0)
+                       return (0);
+               error(1, "no namelist");
+       }
+       if (libflg)
+               maxoff = atol(archdr.ar_size);
+       else {
+               fstat(infil, &stb);
+               maxoff = stb.st_size;
+       }
+       if (N_STROFF(filhdr) + sizeof (off_t) >= maxoff)
+               error(1, "too small (old format .o?)");
+       ctrel = tsize; cdrel += dsize; cbrel += bsize;
+       ndef = 0;
+       nlocal = sizeof(cursym);
+       savnext = nextsym;
+       loc += N_SYMOFF(filhdr);
+       dseek(&text, loc, filhdr.a_syms);
+       dseek(&reloc, loc + filhdr.a_syms, sizeof(off_t));
+       mget(&size, sizeof (size), &reloc);
+       dseek(&reloc, loc + filhdr.a_syms+sizeof (off_t), size-sizeof (off_t));
+       curstr = (char *)malloc(size);
+       if (curstr == NULL)
+               error(1, "no space for string table");
+       mget(curstr+sizeof(off_t), size-sizeof(off_t), &reloc);
+       while (text.size > 0) {
+               mget(&cursym, sizeof(struct nlist), &text);
+               if (cursym.n_un.n_strx) {
+                       if (cursym.n_un.n_strx<sizeof(size) ||
+                           cursym.n_un.n_strx>=size)
+                               error(1, "bad string table index (pass 1)");
+                       cursym.n_un.n_name = curstr + cursym.n_un.n_strx;
+               }
+               type = cursym.n_type;
+               if ((type&N_EXT)==0) {
+                       if (Xflag==0 || cursym.n_un.n_name[0]!='L' ||
+                           type & N_STAB)
+                               nlocal += sizeof cursym;
+                       continue;
+               }
+               symreloc();
+               if (enter(lookup()))
+                       continue;
+               if ((sp = lastsym)->n_type != N_EXT+N_UNDF)
+                       continue;
+               if (cursym.n_type == N_EXT+N_UNDF) {
+                       if (cursym.n_value > sp->n_value)
+                               sp->n_value = cursym.n_value;
+                       continue;
+               }
+               if (sp->n_value != 0 && cursym.n_type == N_EXT+N_TEXT)
+                       continue;
+               ndef++;
+               sp->n_type = cursym.n_type;
+               sp->n_value = cursym.n_value;
+       }
+       if (libflg==0 || ndef) {
+               tsize += filhdr.a_text;
+               dsize += _round(filhdr.a_data, sizeof (long));
+               bsize += _round(filhdr.a_bss, sizeof (long));
+               ssize += nlocal;
+               trsize += filhdr.a_trsize;
+               drsize += filhdr.a_drsize;
+               if (funding)
+                       textbase = (*slookup("_end"))->n_value;
+               nsymt = symx(nextsym);
+               for (i = symx(savnext); i < nsymt; i++) {
+                       sp = xsym(i);
+                       sp->n_un.n_name = savestr(sp->n_un.n_name);
+               }
+               free(curstr);
+               return (1);
+       }
+       /*
+        * No symbols defined by this library member.
+        * Rip out the hash table entries and reset the symbol table.
+        */
+       symfree(savnext);
+       free(curstr);
+       return(0);
+}
+
+void middle() {
+       register struct nlist *sp;
+       long csize, t, corigin, ocsize;
+       int nund, rnd;
+       char s;
+       register int i;
+       int nsymt;
+
+       torigin = 0; 
+       dorigin = 0; 
+       borigin = 0;
+
+       p_etext = *slookup("_etext");
+       p_edata = *slookup("_edata");
+       p_end = *slookup("_end");
+       /*
+        * If there are any undefined symbols, save the relocation bits.
+        */
+       nsymt = symx(nextsym);
+       if (rflag==0) {
+               for (i = 0; i < nsymt; i++) {
+                       sp = xsym(i);
+                       if (sp->n_type==N_EXT+N_UNDF && sp->n_value==0 &&
+                           sp!=p_end && sp!=p_edata && sp!=p_etext) {
+                               rflag++;
+                               dflag = 0;
+                               break;
+                       }
+               }
+       }
+       if (rflag) 
+               sflag = zflag = 0;
+       /*
+        * Assign common locations.
+        */
+       csize = 0;
+       if (!Aflag)
+               addsym = symseg[0].sy_first;
+       database = _round(tsize+textbase,
+           (nflag||zflag? pagesize : sizeof (long)));
+       database += hsize;
+       if (dflag || rflag==0) {
+               ldrsym(p_etext, tsize, N_EXT+N_TEXT);
+               ldrsym(p_edata, dsize, N_EXT+N_DATA);
+               ldrsym(p_end, bsize, N_EXT+N_BSS);
+               for (i = symx(addsym); i < nsymt; i++) {
+                       sp = xsym(i);
+                       if ((s=sp->n_type)==N_EXT+N_UNDF &&
+                           (t = sp->n_value)!=0) {
+                               if (t >= sizeof (double))
+                                       rnd = sizeof (double);
+                               else if (t >= sizeof (long))
+                                       rnd = sizeof (long);
+                               else
+                                       rnd = sizeof (short);
+                               csize = _round(csize, rnd);
+                               sp->n_value = csize;
+                               sp->n_type = N_EXT+N_COMM;
+                               ocsize = csize; 
+                               csize += t;
+                       }
+                       if (s&N_EXT && (s&N_TYPE)==N_UNDF && s&N_STAB) {
+                               sp->n_value = ocsize;
+                               sp->n_type = (s&N_STAB) | (N_EXT+N_COMM);
+                       }
+               }
+       }
+       /*
+        * Now set symbols to their final value
+        */
+       csize = _round(csize, sizeof (long));
+       torigin = textbase;
+       dorigin = database;
+       corigin = dorigin + dsize;
+       borigin = corigin + csize;
+       nund = 0;
+       nsymt = symx(nextsym);
+       for (i = symx(addsym); i<nsymt; i++) {
+               sp = xsym(i);
+               switch (sp->n_type & (N_TYPE+N_EXT)) {
+
+               case N_EXT+N_UNDF:
+                       if (arflag == 0)
+                               errlev |= 01;
+                       if ((arflag==0 || dflag) && sp->n_value==0) {
+                               if (sp==p_end || sp==p_etext || sp==p_edata)
+                                       continue;
+                               if (nund==0)
+                                       printf("Undefined:\n");
+                               nund++;
+                               printf("%s\n", sp->n_un.n_name);
+                       }
+                       continue;
+               case N_EXT+N_ABS:
+               default:
+                       continue;
+               case N_EXT+N_TEXT:
+                       sp->n_value += torigin;
+                       continue;
+               case N_EXT+N_DATA:
+                       sp->n_value += dorigin;
+                       continue;
+               case N_EXT+N_BSS:
+                       sp->n_value += borigin;
+                       continue;
+               case N_EXT+N_COMM:
+                       sp->n_type = (sp->n_type & N_STAB) | (N_EXT+N_BSS);
+                       sp->n_value += corigin;
+                       continue;
+               }
+       }
+       if (sflag || xflag)
+               ssize = 0;
+       bsize += csize;
+       nsym = ssize / (sizeof cursym);
+       if (Aflag) {
+               fixspec(p_etext,torigin);
+               fixspec(p_edata,dorigin);
+               fixspec(p_end,borigin);
+       }
+}
+
+void fixspec(sym, offset) struct nlist *sym; long offset; {
+
+       if(symx(sym) < symx(addsym) && sym!=0)
+               sym->n_value += offset;
+}
+
+void ldrsym(sp, val, type) register struct nlist *sp; long val; int type; {
+
+       if (sp == 0)
+               return;
+       if ((sp->n_type != N_EXT+N_UNDF || sp->n_value) && !Aflag) {
+               printf("%s: ", sp->n_un.n_name);
+               error(0, "user attempt to redfine loader-defined symbol");
+               return;
+       }
+       sp->n_type = type;
+       sp->n_value = val;
+}
+
+off_t  wroff;
+struct biobuf toutb;
+
+void setupout() {
+       int bss;
+       struct stat stbuf;
+       extern char *sys_errlist[];
+       extern int errno;
+
+       ofilemode = 0777 & ~umask(0);
+       biofd = creat(ofilename, 0666 & ofilemode);
+       if (biofd < 0) {
+               filname = ofilename;            /* kludge */
+               archdr.ar_name[0] = 0;          /* kludge */
+               error(1, sys_errlist[errno]);   /* kludge */
+       }
+       fstat(biofd, &stbuf);           /* suppose file exists, wrong*/
+       if (stbuf.st_mode & 0111) {     /* mode, ld fails? */
+               chmod(ofilename, stbuf.st_mode & 0666);
+               ofilemode = stbuf.st_mode;
+       }
+       filhdr.a_magic = nflag ? NMAGIC : (zflag ? ZMAGIC : OMAGIC);
+       filhdr.a_text = nflag ? tsize :
+           _round(tsize, zflag ? pagesize : sizeof (long));
+       filhdr.a_data = zflag ? _round(dsize, pagesize) : dsize;
+       bss = bsize - (filhdr.a_data - dsize);
+       if (bss < 0)
+               bss = 0;
+       filhdr.a_bss = bss;
+       filhdr.a_trsize = trsize;
+       filhdr.a_drsize = drsize;
+       filhdr.a_syms = sflag? 0: (ssize + (sizeof cursym)*symx(nextsym));
+       if (entrypt) {
+               if (entrypt->n_type!=N_EXT+N_TEXT)
+                       error(0, "entry point not in text");
+               else
+                       filhdr.a_entry = entrypt->n_value;
+       } else
+               filhdr.a_entry = 0;
+       filhdr.a_trsize = (rflag ? trsize:0);
+       filhdr.a_drsize = (rflag ? drsize:0);
+       tout = &toutb;
+       bopen(tout, 0, stbuf.st_blksize);
+       bwrite(&filhdr, sizeof (filhdr), tout);
+       if (zflag)
+               bseek(tout, pagesize);
+       wroff = N_TXTOFF(filhdr) + filhdr.a_text;
+       outb(&dout, filhdr.a_data, stbuf.st_blksize);
+       if (rflag) {
+               outb(&trout, filhdr.a_trsize, stbuf.st_blksize);
+               outb(&drout, filhdr.a_drsize, stbuf.st_blksize);
+       }
+       if (sflag==0 || xflag==0) {
+               outb(&sout, filhdr.a_syms, stbuf.st_blksize);
+               wroff += sizeof (offset);
+               outb(&strout, 0, stbuf.st_blksize);
+       }
+}
+
+void outb(bp, inc, bufsize) register struct biobuf **bp; int inc; int bufsize; {
+
+       *bp = (struct biobuf *)malloc(sizeof (struct biobuf));
+       if (*bp == 0)
+               error(1, "ran out of memory (outb)");
+       bopen(*bp, wroff, bufsize);
+       wroff += inc;
+}
+
+void load2arg(acp) char *acp; {
+       register char *cp;
+       off_t loc;
+
+       cp = acp;
+       if (getfile(cp) == 0) {
+               while (*cp)
+                       cp++;
+               while (cp >= acp && *--cp != '/');
+               mkfsym(++cp);
+               load2(0L);
+       } else {        /* scan archive members referenced */
+               for (;;) {
+                       if (clibseg->li_used2 == clibseg->li_used) {
+                               if (clibseg->li_used < NROUT)
+                                       error(1, "libseg botch");
+                               clibseg++;
+                       }
+                       loc = clibseg->li_first[clibseg->li_used2++];
+                       if (loc == -1)
+                               break;
+                       dseek(&text, loc, (long)sizeof(archdr));
+                       getarhdr();
+                       mkfsym(archdr.ar_name);
+                       load2(loc + (long)sizeof(archdr));
+               }
+       }
+       close(infil);
+}
+
+void load2(loc) long loc; {
+       int size;
+       register struct nlist *sp;
+       register struct local *lp;
+       register int symno, i;
+       int type;
+
+       readhdr(loc);
+       if (!funding) {
+               ctrel = torigin;
+               cdrel += dorigin;
+               cbrel += borigin;
+       }
+       /*
+        * Reread the symbol table, recording the numbering
+        * of symbols for fixing external references.
+        */
+       for (i = 0; i < LHSIZ; i++)
+               lochash[i] = 0;
+       clocseg = locseg;
+       clocseg->lo_used = 0;
+       symno = -1;
+       loc += N_TXTOFF(filhdr);
+       dseek(&text, loc+filhdr.a_text+filhdr.a_data+
+               filhdr.a_trsize+filhdr.a_drsize+filhdr.a_syms, sizeof(off_t));
+       mget(&size, sizeof(size), &text);
+       dseek(&text, loc+filhdr.a_text+filhdr.a_data+
+               filhdr.a_trsize+filhdr.a_drsize+filhdr.a_syms+sizeof(off_t),
+               size - sizeof(off_t));
+       curstr = (char *)malloc(size);
+       if (curstr == NULL)
+               error(1, "out of space reading string table (pass 2)");
+       mget(curstr+sizeof(off_t), size-sizeof(off_t), &text);
+       dseek(&text, loc+filhdr.a_text+filhdr.a_data+
+               filhdr.a_trsize+filhdr.a_drsize, filhdr.a_syms);
+       while (text.size > 0) {
+               symno++;
+               mget(&cursym, sizeof(struct nlist), &text);
+               if (cursym.n_un.n_strx) {
+                       if (cursym.n_un.n_strx<sizeof(size) ||
+                           cursym.n_un.n_strx>=size)
+                               error(1, "bad string table index (pass 2)");
+                       cursym.n_un.n_name = curstr + cursym.n_un.n_strx;
+               }
+/* inline expansion of symreloc() */
+               switch (cursym.n_type & 017) {
+
+               case N_TEXT:
+               case N_EXT+N_TEXT:
+                       cursym.n_value += ctrel;
+                       break;
+               case N_DATA:
+               case N_EXT+N_DATA:
+                       cursym.n_value += cdrel;
+                       break;
+               case N_BSS:
+               case N_EXT+N_BSS:
+                       cursym.n_value += cbrel;
+                       break;
+               case N_EXT+N_UNDF:
+                       break;
+               default:
+                       if (cursym.n_type&N_EXT)
+                               cursym.n_type = N_EXT+N_ABS;
+               }
+/* end inline expansion of symreloc() */
+               type = cursym.n_type;
+               if (yflag && cursym.n_un.n_name)
+                       for (i = 0; i < yflag; i++)
+                               /* fast check for 2d character! */
+                               if (ytab[i][1] == cursym.n_un.n_name[1] &&
+                                   !strcmp(ytab[i], cursym.n_un.n_name)) {
+                                       tracesym();
+                                       break;
+                               }
+               if ((type&N_EXT) == 0) {
+                       if (!sflag&&!xflag&&
+                           (!Xflag||cursym.n_un.n_name[0]!='L'||type&N_STAB))
+                               symwrite(&cursym, sout);
+                       continue;
+               }
+               if (funding)
+                       continue;
+               if ((sp = *lookup()) == 0)
+                       error(1, "internal error: symbol not found");
+               if (cursym.n_type == N_EXT+N_UNDF) {
+                       if (clocseg->lo_used == NSYMPR) {
+                               if (++clocseg == &locseg[NSEG])
+                                       error(1, "local symbol overflow");
+                               clocseg->lo_used = 0;
+                       }
+                       if (clocseg->lo_first == 0) {
+                               clocseg->lo_first = (struct local *)
+                                   malloc(NSYMPR * sizeof (struct local));
+                               if (clocseg->lo_first == 0)
+                                       error(1, "out of memory (clocseg)");
+                       }
+                       lp = &clocseg->lo_first[clocseg->lo_used++];
+                       lp->l_index = symno;
+                       lp->l_symbol = sp;
+                       lp->l_link = lochash[symno % LHSIZ];
+                       lochash[symno % LHSIZ] = lp;
+                       continue;
+               }
+               if (cursym.n_type & N_STAB)
+                       continue;
+               if (cursym.n_type!=sp->n_type || cursym.n_value!=sp->n_value) {
+                       printf("%s: ", cursym.n_un.n_name);
+                       error(0, "multiply defined");
+               }
+       }
+       if (funding)
+               return;
+       dseek(&text, loc, filhdr.a_text);
+       dseek(&reloc, loc+filhdr.a_text+filhdr.a_data, filhdr.a_trsize);
+       load2td(ctrel, torigin - textbase, tout, trout);
+       dseek(&text, loc+filhdr.a_text, filhdr.a_data);
+       dseek(&reloc, loc+filhdr.a_text+filhdr.a_data+filhdr.a_trsize,
+           filhdr.a_drsize);
+       load2td(cdrel, dorigin - database, dout, drout);
+       while (filhdr.a_data & (sizeof(long)-1)) {
+               bputc(0, dout);
+               filhdr.a_data++;
+       }
+       torigin += filhdr.a_text;
+       dorigin += _round(filhdr.a_data, sizeof (long));
+       borigin += _round(filhdr.a_bss, sizeof (long));
+       free(curstr);
+}
+
+struct tynames {
+       int     ty_value;
+       char    *ty_name;
+} tynames[] = {
+       N_UNDF, "undefined",
+       N_ABS,  "absolute",
+       N_TEXT, "text",
+       N_DATA, "data",
+       N_BSS,  "bss",
+       N_COMM, "common",
+       0,      0,
+};
+
+void tracesym() {
+       register struct tynames *tp;
+
+       if (cursym.n_type & N_STAB)
+               return;
+       printf("%s", filname);
+       if (archdr.ar_name[0])
+               printf("(%s)", archdr.ar_name);
+       printf(": ");
+       if ((cursym.n_type&N_TYPE) == N_UNDF && cursym.n_value) {
+               printf("definition of common %s size %d\n",
+                   cursym.n_un.n_name, cursym.n_value);
+               return;
+       }
+       for (tp = tynames; tp->ty_name; tp++)
+               if (tp->ty_value == (cursym.n_type&N_TYPE))
+                       break;
+       printf((cursym.n_type&N_TYPE) ? "definition of" : "reference to");
+       if (cursym.n_type&N_EXT)
+               printf(" external");
+       if (tp->ty_name)
+               printf(" %s", tp->ty_name);
+       printf(" %s\n", cursym.n_un.n_name);
+}
+
+/*
+ * This routine relocates the single text or data segment argument.
+ * Offsets from external symbols are resolved by adding the value
+ * of the external symbols.  Non-external reference are updated to account
+ * for the relative motion of the segments (ctrel, cdrel, ...).  If
+ * a relocation was pc-relative, then we update it to reflect the
+ * change in the positioning of the segments by adding the displacement
+ * of the referenced segment and subtracting the displacement of the
+ * current segment (creloc).
+ *
+ * If we are saving the relocation information, then we increase
+ * each relocation datum address by our base position in the new segment.
+ */
+void load2td(creloc, position, b1, b2) long creloc; int position; struct biobuf *b1; struct biobuf *b2; {
+       register struct nlist *sp;
+       register struct local *lp;
+       long tw;
+       register struct relocation_info *rp, *rpend;
+       struct relocation_info *relp;
+       char *codep;
+       register char *cp;
+       int relsz, codesz;
+
+       relsz = reloc.size;
+       relp = (struct relocation_info *)malloc(relsz);
+       codesz = text.size;
+       codep = (char *)malloc(codesz);
+       if (relp == 0 || codep == 0)
+               error(1, "out of memory (load2td)");
+       mget(relp, relsz, &reloc);
+       rpend = &relp[relsz / sizeof (struct relocation_info)];
+       mget(codep, codesz, &text);
+       for (rp = relp; rp < rpend; rp++) {
+               cp = codep + rp->r_address;
+               /*
+                * Pick up previous value at location to be relocated.
+                */
+               switch (rp->r_length) {
+
+               case 0:         /* byte */
+                       tw = *cp;
+                       break;
+
+               case 1:         /* word */
+                       tw = *(short *)cp;
+                       break;
+
+               case 2:         /* long */
+                       tw = *(long *)cp;
+                       break;
+
+               default:
+                       error(1, "load2td botch: bad length");
+               }
+               /*
+                * If relative to an external which is defined,
+                * resolve to a simpler kind of reference in the
+                * result file.  If the external is undefined, just
+                * convert the symbol number to the number of the
+                * symbol in the result file and leave it undefined.
+                */
+               if (rp->r_extern) {
+                       /*
+                        * Search the hash table which maps local
+                        * symbol numbers to symbol tables entries
+                        * in the new a.out file.
+                        */
+                       lp = lochash[rp->r_symbolnum % LHSIZ];
+                       while (lp->l_index != rp->r_symbolnum) {
+                               lp = lp->l_link;
+                               if (lp == 0)
+                                       error(1, "local symbol botch");
+                       }
+                       sp = lp->l_symbol;
+                       if (sp->n_type == N_EXT+N_UNDF)
+                               rp->r_symbolnum = nsym+symx(sp);
+                       else {
+                               rp->r_symbolnum = sp->n_type & N_TYPE;
+                               tw += sp->n_value;
+                               rp->r_extern = 0;
+                       }
+               } else switch (rp->r_symbolnum & N_TYPE) {
+               /*
+                * Relocation is relative to the loaded position
+                * of another segment.  Update by the change in position
+                * of that segment.
+                */
+               case N_TEXT:
+                       tw += ctrel;
+                       break;
+               case N_DATA:
+                       tw += cdrel;
+                       break;
+               case N_BSS:
+                       tw += cbrel;
+                       break;
+               case N_ABS:
+                       break;
+               default:
+                       error(1, "relocation format botch (symbol type))");
+               }
+               /*
+                * Relocation is pc relative, so decrease the relocation
+                * by the amount the current segment is displaced.
+                * (E.g if we are a relative reference to a text location
+                * from data space, we added the increase in the text address
+                * above, and subtract the increase in our (data) address
+                * here, leaving the net change the relative change in the
+                * positioning of our text and data segments.)
+                */
+               if (rp->r_pcrel)
+                       tw -= creloc;
+               /*
+                * Put the value back in the segment,
+                * while checking for overflow.
+                */
+               switch (rp->r_length) {
+
+               case 0:         /* byte */
+                       if (tw < -128 || tw > 127)
+                               error(0, "byte displacement overflow");
+                       *cp = tw;
+                       break;
+               case 1:         /* word */
+                       if (tw < -32768 || tw > 32767)
+                               error(0, "word displacement overflow");
+                       *(short *)cp = tw;
+                       break;
+               case 2:         /* long */
+                       *(long *)cp = tw;
+                       break;
+               }
+               /*
+                * If we are saving relocation information,
+                * we must convert the address in the segment from
+                * the old .o file into an address in the segment in
+                * the new a.out, by adding the position of our
+                * segment in the new larger segment.
+                */
+               if (rflag)
+                       rp->r_address += position;
+       }
+       bwrite(codep, codesz, b1);
+       if (rflag)
+               bwrite(relp, relsz, b2);
+       free((char *)relp);
+       free(codep);
+}
+#endif
+
+void finishout() {
+#ifndef XIFY
+       register int i;
+       int nsymt;
+
+       if (sflag==0) {
+               nsymt = symx(nextsym);
+               for (i = 0; i < nsymt; i++)
+                       symwrite(xsym(i), sout);
+               bwrite(&offset, sizeof offset, sout);
+       }
+#endif
+       if (!ofilfnd) {
+               unlink("a.out");
+               if (link("l.out", "a.out") < 0)
+                       error(1, "cannot move l.out to a.out");
+               ofilename = "a.out";
+       }
+       delarg = errlev;
+       delexit();
+}
+
+#ifndef XIFY
+void mkfsym(s) char *s; {
+
+       if (sflag || xflag)
+               return;
+       cursym.n_un.n_name = s;
+       cursym.n_type = N_TEXT;
+       cursym.n_value = torigin;
+       symwrite(&cursym, sout);
+}
+
+void getarhdr() {
+       register char *cp;
+
+       mget(&archdr, sizeof archdr, &text);
+       for (cp=archdr.ar_name; cp<&archdr.ar_name[sizeof(archdr.ar_name)];)
+               if (*cp++ == ' ') {
+                       cp[-1] = 0;
+                       return;
+               }
+}
+
+void mget(_loc, n, sp) void *_loc; int n; register STREAM *sp; {
+#define loc (*(char **)&_loc)
+       register char *p;
+       register int take;
+
+top:
+       if (n == 0)
+               return;
+       if (sp->size && sp->nibuf) {
+               p = sp->ptr;
+               take = sp->size;
+               if (take > sp->nibuf)
+                       take = sp->nibuf;
+               if (take > n)
+                       take = n;
+               n -= take;
+               sp->size -= take;
+               sp->nibuf -= take;
+               sp->pos += take;
+               do
+                       *loc++ = *p++;
+               while (--take > 0);
+               sp->ptr = p;
+               goto top;
+       }
+       if (n > p_blksize) {
+               take = n - n % p_blksize;
+               lseek(infil, (sp->bno+1)<<p_blkshift, 0);
+               if (take > sp->size || read(infil, loc, take) != take)
+                       error(1, "premature EOF");
+               loc += take;
+               n -= take;
+               sp->size -= take;
+               sp->pos += take;
+               dseek(sp, (sp->bno+1+(take>>p_blkshift))<<p_blkshift, -1);
+               goto top;
+       }
+       *loc++ = get(sp);
+       --n;
+       goto top;
+#undef loc
+}
+
+void symwrite(sp, bp) struct nlist *sp; struct biobuf *bp; {
+       register int len;
+       register char *str;
+
+       str = sp->n_un.n_name;
+       if (str) {
+               sp->n_un.n_strx = offset;
+               len = strlen(str) + 1;
+               bwrite(str, len, strout);
+               offset += len;
+       }
+       bwrite(sp, sizeof (*sp), bp);
+       sp->n_un.n_name = str;
+}
+
+void dseek(sp, loc, s) register STREAM *sp; long loc; long s; {
+       register PAGE *p;
+       register b, o;
+       int n;
+
+       b = loc>>p_blkshift;
+       o = loc&p_blkmask;
+       if (o&01)
+               error(1, "loader error; odd offset");
+       --sp->pno->nuser;
+       if ((p = &page[0])->bno!=b && (p = &page[1])->bno!=b)
+               if (p->nuser==0 || (p = &page[0])->nuser==0) {
+                       if (page[0].nuser==0 && page[1].nuser==0)
+                               if (page[0].bno < page[1].bno)
+                                       p = &page[0];
+                       p->bno = b;
+                       lseek(infil, loc & ~(long)p_blkmask, 0);
+                       if ((n = read(infil, p->buff, p_blksize)) < 0)
+                               n = 0;
+                       p->nibuf = n;
+               } else
+                       error(1, "botch: no pages");
+       ++p->nuser;
+       sp->bno = b;
+       sp->pno = p;
+       if (s != -1) {sp->size = s; sp->pos = 0;}
+       sp->ptr = (char *)(p->buff + o);
+       if ((sp->nibuf = p->nibuf-o) <= 0)
+               sp->size = 0;
+}
+
+char get(asp) STREAM *asp; {
+       register STREAM *sp;
+
+       sp = asp;
+       if ((sp->nibuf -= sizeof(char)) < 0) {
+               dseek(sp, ((long)(sp->bno+1)<<p_blkshift), (long)-1);
+               sp->nibuf -= sizeof(char);
+       }
+       if ((sp->size -= sizeof(char)) <= 0) {
+               if (sp->size < 0)
+                       error(1, "premature EOF");
+               ++fpage.nuser;
+               --sp->pno->nuser;
+               sp->pno = (PAGE *) &fpage;
+       }
+       sp->pos += sizeof(char);
+       return(*sp->ptr++);
+}
+
+int getfile(acp) char *acp; {
+       register int c;
+       char arcmag[SARMAG+1];
+       struct stat stb;
+
+       archdr.ar_name[0] = '\0';
+       filname = acp;
+       if (filname[0] == '-' && filname[1] == 'l')
+               infil = libopen(filname + 2, O_RDONLY);
+       else
+               infil = open(filname, O_RDONLY);
+       if (infil < 0)
+               error(1, "cannot open");
+       fstat(infil, &stb);
+       page[0].bno = page[1].bno = -1;
+       page[0].nuser = page[1].nuser = 0;
+       c = stb.st_blksize;
+       if (c == 0 || (c & (c - 1)) != 0) {
+               /* use default size if not a power of two */
+               c = BLKSIZE;
+       }
+       if (p_blksize != c) {
+               p_blksize = c;
+               p_blkmask = c - 1;
+               for (p_blkshift = 0; c > 1 ; p_blkshift++)
+                       c >>= 1;
+               if (page[0].buff != NULL)
+                       free(page[0].buff);
+               page[0].buff = (char *)malloc(p_blksize);
+               if (page[0].buff == NULL)
+                       error(1, "ran out of memory (getfile)");
+               if (page[1].buff != NULL)
+                       free(page[1].buff);
+               page[1].buff = (char *)malloc(p_blksize);
+               if (page[1].buff == NULL)
+                       error(1, "ran out of memory (getfile)");
+       }
+       text.pno = reloc.pno = (PAGE *) &fpage;
+       fpage.nuser = 2;
+       dseek(&text, 0L, SARMAG);
+       if (text.size <= 0)
+               error(1, "premature EOF");
+       mget(arcmag, SARMAG, &text);
+       arcmag[SARMAG] = 0;
+       if (strcmp(arcmag, ARMAG))
+               return (0);
+       dseek(&text, SARMAG, sizeof archdr);
+       if (text.size <= 0)
+               return (1);
+       getarhdr();
+       if (strncmp(archdr.ar_name, "__.SYMDEF", sizeof(archdr.ar_name)) != 0)
+               return (1);
+       return (stb.st_mtime > atol(archdr.ar_date) ? 3 : 2);
+}
+
+/*
+ * Search for a library with given name
+ * using the directory search array.
+ */
+int libopen(name, oflags) char *name; int oflags; {
+       register char *p, *cp;
+       register int i;
+       static char buf[MAXPATHLEN+1];
+       int fd = -1;
+
+       if (*name == '\0')                      /* backwards compat */
+               name = "a";
+       for (i = 0; i < ndir && fd == -1; i++) {
+               p = buf;
+               for (cp = dirs[i]; *cp; *p++ = *cp++)
+                       ;
+               *p++ = '/';
+               for (cp = "lib"; *cp; *p++ = *cp++)
+                       ;
+               for (cp = name; *cp; *p++ = *cp++)
+                       ;
+               cp = ".a";
+               while (*p++ = *cp++)
+                       ;
+               fd = open(buf, oflags);
+       }
+       if (fd != -1)
+               filname = buf;
+       return (fd);
+}
+
+struct nlist **lookup() {
+       register int sh; 
+       register struct nlist **hp;
+       register char *cp, *cp1;
+       register struct symseg *gp;
+       register int i;
+
+       sh = 0;
+       for (cp = cursym.n_un.n_name; *cp;)
+               sh = (sh<<1) + *cp++;
+       sh = (sh & 0x7fffffff) % HSIZE;
+       for (gp = symseg; gp < &symseg[NSEG]; gp++) {
+               if (gp->sy_first == 0) {
+                       gp->sy_first = (struct nlist *)
+                           calloc(NSYM, sizeof (struct nlist));
+                       gp->sy_hfirst = (struct nlist **)
+                           calloc(HSIZE, sizeof (struct nlist *));
+                       if (gp->sy_first == 0 || gp->sy_hfirst == 0)
+                               error(1, "ran out of space for symbol table");
+                       gp->sy_last = gp->sy_first + NSYM;
+                       gp->sy_hlast = gp->sy_hfirst + HSIZE;
+               }
+               if (gp > csymseg)
+                       csymseg = gp;
+               hp = gp->sy_hfirst + sh;
+               i = 1;
+               do {
+                       if (*hp == 0) {
+                               if (gp->sy_used == NSYM)
+                                       break;
+                               return (hp);
+                       }
+                       cp1 = (*hp)->n_un.n_name; 
+                       for (cp = cursym.n_un.n_name; *cp == *cp1++;)
+                               if (*cp++ == 0)
+                                       return (hp);
+                       hp += i;
+                       i += 2;
+                       if (hp >= gp->sy_hlast)
+                               hp -= HSIZE;
+               } while (i < HSIZE);
+               if (i > HSIZE)
+                       error(1, "hash table botch");
+       }
+       error(1, "symbol table overflow");
+       /*NOTREACHED*/
+#ifdef __GNUC__
+       return 0;
+#endif
+}
+
+void symfree(saved) struct nlist *saved; {
+       register struct symseg *gp;
+       register struct nlist *sp;
+
+       for (gp = csymseg; gp >= symseg; gp--, csymseg--) {
+               sp = gp->sy_first + gp->sy_used;
+               if (sp == saved) {
+                       nextsym = sp;
+                       return;
+               }
+               for (sp--; sp >= gp->sy_first; sp--) {
+                       gp->sy_hfirst[sp->n_hash] = 0;
+                       gp->sy_used--;
+                       if (sp == saved) {
+                               nextsym = sp;
+                               return;
+                       }
+               }
+       }
+       if (saved == 0)
+               return;
+       error(1, "symfree botch");
+}
+
+struct nlist **slookup(s) char *s; {
+
+       cursym.n_un.n_name = s;
+       cursym.n_type = N_EXT+N_UNDF;
+       cursym.n_value = 0;
+       return (lookup());
+}
+
+int enter(hp) register struct nlist **hp; {
+       register struct nlist *sp;
+
+       if (*hp==0) {
+               if (hp < csymseg->sy_hfirst || hp >= csymseg->sy_hlast)
+                       error(1, "enter botch");
+               *hp = lastsym = sp = csymseg->sy_first + csymseg->sy_used;
+               csymseg->sy_used++;
+               sp->n_un.n_name = cursym.n_un.n_name;
+               sp->n_type = cursym.n_type;
+               sp->n_hash = hp - csymseg->sy_hfirst;
+               sp->n_value = cursym.n_value;
+               nextsym = lastsym + 1;
+               return(1);
+       } else {
+               lastsym = *hp;
+               return(0);
+       }
+}
+
+int symx(sp) struct nlist *sp; {
+       register struct symseg *gp;
+
+       if (sp == 0)
+               return (0);
+       for (gp = csymseg; gp >= symseg; gp--)
+               /* <= is sloppy so nextsym will always work */
+               if (sp >= gp->sy_first && sp <= gp->sy_last)
+                       return ((gp - symseg) * NSYM + sp - gp->sy_first);
+       error(1, "symx botch");
+       /*NOTREACHED*/
+#ifdef __GNUC__
+       return -1;
+#endif
+}
+
+void symreloc() {
+       if(funding) return;
+       switch (cursym.n_type & 017) {
+
+       case N_TEXT:
+       case N_EXT+N_TEXT:
+               cursym.n_value += ctrel;
+               return;
+
+       case N_DATA:
+       case N_EXT+N_DATA:
+               cursym.n_value += cdrel;
+               return;
+
+       case N_BSS:
+       case N_EXT+N_BSS:
+               cursym.n_value += cbrel;
+               return;
+
+       case N_EXT+N_UNDF:
+               return;
+
+       default:
+               if (cursym.n_type&N_EXT)
+                       cursym.n_type = N_EXT+N_ABS;
+               return;
+       }
+}
+#endif
+
+void error(n, s) int n; char *s; {
+
+       if (errlev==0)
+               printf("ld:");
+       if (filname) {
+               printf("%s", filname);
+#ifndef XIFY
+               if (n != -1 && archdr.ar_name[0])
+                       printf("(%s)", archdr.ar_name);
+#endif
+               printf(": ");
+       }
+       printf("%s\n", s);
+       if (n == -1)
+               return;
+       if (n)
+               delexit();
+       errlev = 2;
+}
+
+#ifndef XIFY
+void readhdr(loc) off_t loc; {
+
+       dseek(&text, loc, (long)sizeof(filhdr));
+       mget(&filhdr, sizeof(filhdr), &text);
+       if (N_BADMAG(filhdr)) {
+               if (filhdr.a_magic == OARMAG)
+                       error(1, "old archive");
+               error(1, "bad magic number");
+       }
+       if (filhdr.a_text&01 || filhdr.a_data&01)
+               error(1, "text/data size odd");
+       if (filhdr.a_magic == NMAGIC || filhdr.a_magic == ZMAGIC) {
+               cdrel = -_round(filhdr.a_text, pagesize);
+               cbrel = cdrel - filhdr.a_data;
+       } else if (filhdr.a_magic == OMAGIC) {
+               cdrel = -filhdr.a_text;
+               cbrel = cdrel - filhdr.a_data;
+       } else
+               error(1, "bad format");
+}
+
+int _round(v, r) int v; u_long r; {
+
+       r--;
+       v += r;
+       v &= ~(long)r;
+       return(v);
+}
+#endif
+
+#define        NSAVETAB        8192
+char   *savetab;
+int    saveleft;
+
+char *savestr(cp) register char *cp; {
+       register int len;
+
+       len = strlen(cp) + 1;
+       if (len > saveleft) {
+               saveleft = NSAVETAB;
+               if (len > saveleft)
+                       saveleft = len;
+               savetab = malloc(saveleft);
+               if (savetab == 0)
+                       error(1, "ran out of memory (savestr)");
+       }
+       strncpy(savetab, cp, len);
+       cp = savetab;
+       savetab += len;
+       saveleft -= len;
+       return (cp);
+}
+
+#ifdef XIFY
+char *strspl(left, right) char *left; char *right; {
+       char buf[BUFSIZ];
+
+       strcpy(buf, left);
+       strcat(buf, right);
+       return (savestr(buf));
+}
+#else
+void bopen(bp, off, bufsize) register struct biobuf *bp; int off; int bufsize; {
+
+       bp->b_ptr = bp->b_buf = malloc(bufsize);
+       if (bp->b_ptr == (char *)0)
+               error(1, "ran out of memory (bopen)");
+       bp->b_bufsize = bufsize;
+       bp->b_nleft = bufsize - (off % bufsize);
+       bp->b_off = off;
+       bp->b_link = biobufs;
+       biobufs = bp;
+}
+
+int    bwrerror;
+
+void bwrite(_p, cnt, bp) void *_p; register int cnt; register struct biobuf *bp; {
+#define p (*(char **)&_p)
+       register int put;
+       register char *to;
+
+top:
+       if (cnt == 0)
+               return;
+       if (bp->b_nleft) {
+               put = bp->b_nleft;
+               if (put > cnt)
+                       put = cnt;
+               bp->b_nleft -= put;
+               to = bp->b_ptr;
+               bcopy(p, to, put);
+               bp->b_ptr += put;
+               p += put;
+               cnt -= put;
+               goto top;
+       }
+       if (cnt >= bp->b_bufsize) {
+               if (bp->b_ptr != bp->b_buf)
+                       bflush1(bp);
+               put = cnt - cnt % bp->b_bufsize;
+               if (boffset != bp->b_off)
+                       lseek(biofd, bp->b_off, 0);
+               if (write(biofd, p, put) != put) {
+                       bwrerror = 1;
+                       error(1, "output write error");
+               }
+               bp->b_off += put;
+               boffset = bp->b_off;
+               p += put;
+               cnt -= put;
+               goto top;
+       }
+       bflush1(bp);
+       goto top;
+#undef p
+}
+
+void bflush() {
+       register struct biobuf *bp;
+
+       if (bwrerror)
+               return;
+       for (bp = biobufs; bp; bp = bp->b_link)
+               bflush1(bp);
+}
+
+void bflush1(bp) register struct biobuf *bp; {
+       register int cnt = bp->b_ptr - bp->b_buf;
+
+       if (cnt == 0)
+               return;
+       if (boffset != bp->b_off)
+               lseek(biofd, bp->b_off, 0);
+       if (write(biofd, bp->b_buf, cnt) != cnt) {
+               bwrerror = 1;
+               error(1, "output write error");
+       }
+       bp->b_off += cnt;
+       boffset = bp->b_off;
+       bp->b_ptr = bp->b_buf;
+       bp->b_nleft = bp->b_bufsize;
+}
+
+void bflushc(bp, c) register struct biobuf *bp; int c; {
+
+       bflush1(bp);
+       bputc(c, bp);
+}
+
+void bseek(bp, off) register struct biobuf *bp; register off_t off; {
+       bflush1(bp);
+       
+       bp->b_nleft = bp->b_bufsize - (off % bp->b_bufsize);
+       bp->b_off = off;
+}
+#endif
diff --git a/xify/nonvoid.sh b/xify/nonvoid.sh
new file mode 100755 (executable)
index 0000000..4a3877a
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./errfunc.sh |grep "control reaches end of non-void function\|‘return’ with no value, in function returning non-void" |sed -e 's/:.*//' |sort |uniq |sed -e 's/.*/s\/^int &\\((\\| __P((\\)\/void &\\1\//'
diff --git a/xify/noproto.sh b/xify/noproto.sh
new file mode 100755 (executable)
index 0000000..65dbf36
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+sed -e 's/ __P(([^()]*\(([^()]*)[^()]*\)*))/()/g' -i $@
diff --git a/xify/xify b/xify/xify
new file mode 100755 (executable)
index 0000000..178c278
--- /dev/null
+++ b/xify/xify
@@ -0,0 +1,26 @@
+#!/bin/sh
+(
+  cat <<EOF
+#ifndef X_
+#define X_
+
+#include <stdint.h>
+
+#define _va_arg_short(argp) va_arg(argp, int)
+#define _va_arg_int(argp) va_arg(argp, int)
+#define _va_arg_long(argp) va_arg(argp, int)
+#define _va_arg_unsigned_short(argp) va_arg(argp, unsigned int)
+#define _va_arg_unsigned_int(argp) va_arg(argp, unsigned int)
+#define _va_arg_unsigned_long(argp) va_arg(argp, unsigned int)
+
+typedef int16_t x_short;
+typedef int32_t x_int;
+typedef int32_t x_long;
+typedef uint16_t x_unsigned_short;
+typedef uint32_t x_unsigned_int;
+typedef uint32_t x_unsigned_long;
+
+#endif
+EOF
+  "`dirname "$0"`/xifyfilt" <$1 |sed -e 's/\(extern\|register\|static\) x_int x_\(datum\|off_t\|time_t\|u_int\|u_short\|u_long\)/\1 x_\2/g; s/va_arg(x_argp, x_\(unsigned_\)\?\(short\|int\|long\))/_va_arg_\1\2(x_argp)/g'
+) >$2
diff --git a/xify/xify.sh b/xify/xify.sh
deleted file mode 100755 (executable)
index 5fb07f7..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-"`dirname "$0"`/xify" |\
-sed -e 's/\(extern\|register\|static\) x_int x_\(datum\|u_short\|u_int\|u_long\)/\1 x_\2/g; s/va_arg(x_argp, x_\(unsigned_\)\?\(short\|int\|long\))/_va_arg_\1\2(x_argp)/g'
similarity index 86%
rename from xify/xify.c
rename to xify/xifyfilt.c
index 32e7eb1..da9d9d3 100644 (file)
@@ -11,29 +11,6 @@ int main() {
   int l, m;
   int e;
 
-  printf(
-    "#ifndef X_\n"
-    "#define X_\n"
-    "\n"
-    "#include <stdint.h>\n"
-    "\n"
-    "#define _va_arg_short(argp) va_arg(argp, int)\n"
-    "#define _va_arg_int(argp) va_arg(argp, int)\n"
-    "#define _va_arg_long(argp) va_arg(argp, int)\n"
-    "#define _va_arg_unsigned_short(argp) va_arg(argp, unsigned int)\n"
-    "#define _va_arg_unsigned_int(argp) va_arg(argp, unsigned int)\n"
-    "#define _va_arg_unsigned_long(argp) va_arg(argp, unsigned int)\n"
-    "\n"
-    "typedef int16_t x_short;\n"
-    "typedef int32_t x_int;\n"
-    "typedef int32_t x_long;\n"
-    "typedef uint16_t x_unsigned_short;\n"
-    "typedef uint32_t x_unsigned_int;\n"
-    "typedef uint32_t x_unsigned_long;\n"
-    "\n"
-    "#endif\n"
-    "\n"
-  );
   while (fgets(buf, sizeof(buf), stdin)) {
     p = buf;
     l = 0;
@@ -60,28 +37,30 @@ int main() {
           include:
             fwrite(p, ++l, 1, stdout);
             p += l;
-            l = 0;
-            while (p[l]) {
-              if (p[l] == '/') {
-                fwrite(p, ++l, 1, stdout);
-                p += l;
-                l = 0;
-              } 
-              else if (p[l] == e) {
-                if (l >= 4 && memcmp(p, "nox_", 4) == 0) {
-                  p += 4;
-                  l -= 4;
-                }
-                else if (
-                  (l != 8 || memcmp(p, "stdarg.h", 8) != 0) /*&&
-                  (l != 9 || memcmp(p, "varargs.h", 9) != 0)*/
-                )
-                  fwrite("x_", 2, 1, stdout);
-                break;
-              }
-              else
-                ++l;
+            for (m = 0; p[m] && p[m] != e; ++m)
+              ;
+            for (l = m; l > 0 && p[l - 1] != '/'; --l)
+              ;
+            q = p + l;
+            m -= l;
+            if (m >= 4 && memcmp(q, "nox_", 4) == 0) {
+              fwrite(p, l, 1, stdout);
+              p = q + 4;
+              l = m - 4;
+            }
+            else if (
+              (l != 0 || m != 8 || memcmp(p, "stdarg.h", 8) != 0) /*&&
+              (l != 0 || m != 9 || memcmp(p, "varargs.h", 9) != 0)*/
+            ) {
+              fwrite(p - 1, l + m + 2, 1, stderr); /* include <> or "" */
+              fputc('\n', stderr);
+              fwrite(p, l, 1, stdout);
+              fwrite("x_", 2, 1, stdout);
+              p = q;
+              l = m;
             }
+            else
+              l += m;
           }
         }
       }