diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-09-27 21:32:50 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2016-09-27 21:32:50 +0000 |
commit | 14cda8a1cf9ea107eb711aed0f679e56c5d62f26 (patch) | |
tree | 4eeac85a5e0601b3388e7dae2761be84b26514a6 /libgo | |
parent | c7ff137489343e20405473156ed589ad791149d2 (diff) | |
download | gcc-14cda8a1cf9ea107eb711aed0f679e56c5d62f26.zip gcc-14cda8a1cf9ea107eb711aed0f679e56c5d62f26.tar.gz gcc-14cda8a1cf9ea107eb711aed0f679e56c5d62f26.tar.bz2 |
libgo: separate mksysinfo inputs into separate Makefile targets
This is a step toward a version of mksysinfo that generates information
for the runtime package. This will be used to generate the
runtime_sysinfo.go file, which is currently directly generated by a
Makefile target.
Reviewed-on: https://go-review.googlesource.com/29683
From-SVN: r240560
Diffstat (limited to 'libgo')
-rw-r--r-- | libgo/Makefile.am | 21 | ||||
-rw-r--r-- | libgo/Makefile.in | 21 | ||||
-rwxr-xr-x | libgo/mksysinfo.sh | 276 | ||||
-rw-r--r-- | libgo/sysinfo.c | 259 |
4 files changed, 305 insertions, 272 deletions
diff --git a/libgo/Makefile.am b/libgo/Makefile.am index bd75dd3..81533be 100644 --- a/libgo/Makefile.am +++ b/libgo/Makefile.am @@ -691,9 +691,26 @@ s-syscall_arch: Makefile $(SHELL) $(srcdir)/mvifdiff.sh syscall_arch.go.tmp syscall_arch.go $(STAMP) $@ +SYSINFO_FLAGS = \ + $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(OSCFLAGS) -O + +gen-sysinfo.go: s-gen-sysinfo; @true +s-gen-sysinfo: $(srcdir)/sysinfo.c config.h + $(CC) $(SYSINFO_FLAGS) -fdump-go-spec=tmp-gen-sysinfo.go -std=gnu99 -S -o sysinfo.s $(srcdir)/sysinfo.c + rm -f sysinfo.s + $(SHELL) $(srcdir)/mvifdiff.sh tmp-gen-sysinfo.go gen-sysinfo.go + $(STAMP) $@ + +errno.i: s-errno; @true +s-errno: + echo '#include <errno.h>' | $(CC) $(SYSINFO_FLAGS) -x c - -E -dM > tmp-errno.i + $(SHELL) $(srcdir)/mvifdiff.sh tmp-errno.i errno.i + $(STAMP) $@ + sysinfo.go: s-sysinfo; @true -s-sysinfo: $(srcdir)/mksysinfo.sh config.h - CC="$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(OSCFLAGS) -O" $(SHELL) $(srcdir)/mksysinfo.sh +s-sysinfo: $(srcdir)/mksysinfo.sh gen-sysinfo.go errno.i + $(SHELL) $(srcdir)/mksysinfo.sh $(SHELL) $(srcdir)/mvifdiff.sh tmp-sysinfo.go sysinfo.go $(STAMP) $@ diff --git a/libgo/Makefile.in b/libgo/Makefile.in index 78771c6..ebb7ddf 100644 --- a/libgo/Makefile.in +++ b/libgo/Makefile.in @@ -946,6 +946,10 @@ extra_go_files_syscall = \ syscall_arch.go \ $(syscall_epoll_file) +SYSINFO_FLAGS = \ + $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(OSCFLAGS) -O + libgo_go_objs = \ bufio.lo \ bytes.lo \ @@ -3638,9 +3642,22 @@ s-syscall_arch: Makefile $(SHELL) $(srcdir)/mvifdiff.sh syscall_arch.go.tmp syscall_arch.go $(STAMP) $@ +gen-sysinfo.go: s-gen-sysinfo; @true +s-gen-sysinfo: $(srcdir)/sysinfo.c config.h + $(CC) $(SYSINFO_FLAGS) -fdump-go-spec=tmp-gen-sysinfo.go -std=gnu99 -S -o sysinfo.s $(srcdir)/sysinfo.c + rm -f sysinfo.s + $(SHELL) $(srcdir)/mvifdiff.sh tmp-gen-sysinfo.go gen-sysinfo.go + $(STAMP) $@ + +errno.i: s-errno; @true +s-errno: + echo '#include <errno.h>' | $(CC) $(SYSINFO_FLAGS) -x c - -E -dM > tmp-errno.i + $(SHELL) $(srcdir)/mvifdiff.sh tmp-errno.i errno.i + $(STAMP) $@ + sysinfo.go: s-sysinfo; @true -s-sysinfo: $(srcdir)/mksysinfo.sh config.h - CC="$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(OSCFLAGS) -O" $(SHELL) $(srcdir)/mksysinfo.sh +s-sysinfo: $(srcdir)/mksysinfo.sh gen-sysinfo.go errno.i + $(SHELL) $(srcdir)/mksysinfo.sh $(SHELL) $(srcdir)/mvifdiff.sh tmp-sysinfo.go sysinfo.go $(STAMP) $@ diff --git a/libgo/mksysinfo.sh b/libgo/mksysinfo.sh index 10e3803..eeac94a 100755 --- a/libgo/mksysinfo.sh +++ b/libgo/mksysinfo.sh @@ -4,280 +4,21 @@ # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file. -# Create sysinfo.go. +# Create sysinfo.go from gen-sysinfo.go and errno.i. # This shell script creates the sysinfo.go file which holds types and -# constants extracted from the system header files. This relies on a -# hook in gcc: the -fdump-go-spec option will generate debugging -# information in Go syntax. +# constants extracted from the system header files. This reads the +# raw data from gen-sysinfo.go which is generated using the +# -fdump-go-spec option. -# We currently #include all the files at once, which works, but leads -# to exposing some names which ideally should not be exposed, as they -# match grep patterns. E.g., WCHAR_MIN gets exposed because it starts -# with W, like the wait flags. +# This currently exposes some names that ideally should not be +# exposed, as they match grep patterns. E.g., WCHAR_MIN gets exposed +# because it starts with W, like the wait flags. -CC=${CC:-gcc} OUT=tmp-sysinfo.go set -e -rm -f sysinfo.c -cat > sysinfo.c <<EOF -#include "config.h" - -#include <sys/types.h> -#include <dirent.h> -#include <errno.h> -#include <fcntl.h> -#include <ucontext.h> -#include <netinet/in.h> -/* <netinet/tcp.h> needs u_char/u_short, but <sys/bsd_types> is only - included by <netinet/in.h> if _SGIAPI (i.e. _SGI_SOURCE - && !_XOPEN_SOURCE. - <sys/termios.h> only defines TIOCNOTTY if !_XOPEN_SOURCE, while - <sys/ttold.h> does so unconditionally. */ -#ifdef __sgi__ -#include <sys/bsd_types.h> -#include <sys/ttold.h> -#endif -#include <netinet/tcp.h> -#if defined(HAVE_NETINET_IN_SYSTM_H) -#include <netinet/in_systm.h> -#endif -#if defined(HAVE_NETINET_IP_H) -#include <netinet/ip.h> -#endif -#if defined(HAVE_NETINET_IP_MROUTE_H) -#include <netinet/ip_mroute.h> -#endif -#if defined(HAVE_NETINET_IF_ETHER_H) -#include <netinet/if_ether.h> -#endif -#include <signal.h> -#include <sys/ioctl.h> -#include <termios.h> -#if defined(HAVE_SYSCALL_H) -#include <syscall.h> -#endif -#if defined(HAVE_SYS_SYSCALL_H) -#include <sys/syscall.h> -#endif -#if defined(HAVE_SYS_EPOLL_H) -#include <sys/epoll.h> -#endif -#if defined(HAVE_SYS_FILE_H) -#include <sys/file.h> -#endif -#if defined(HAVE_SYS_MMAN_H) -#include <sys/mman.h> -#endif -#if defined(HAVE_SYS_PRCTL_H) -#include <sys/prctl.h> -#endif -#if defined(HAVE_SYS_PTRACE_H) -#include <sys/ptrace.h> -#endif -#include <sys/resource.h> -#include <sys/uio.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/time.h> -#include <sys/times.h> -#include <sys/wait.h> -#include <sys/un.h> -#if defined(HAVE_SYS_USER_H) -#include <sys/user.h> -#endif -#if defined(HAVE_SYS_UTSNAME_H) -#include <sys/utsname.h> -#endif -#if defined(HAVE_SYS_SELECT_H) -#include <sys/select.h> -#endif -#include <time.h> -#include <unistd.h> -#include <netdb.h> -#include <pwd.h> -#include <grp.h> -#if defined(HAVE_LINUX_FILTER_H) -#include <linux/filter.h> -#endif -#if defined(HAVE_LINUX_IF_ADDR_H) -#include <linux/if_addr.h> -#endif -#if defined(HAVE_LINUX_IF_ETHER_H) -#include <linux/if_ether.h> -#endif -#if defined(HAVE_LINUX_IF_TUN_H) -#include <linux/if_tun.h> -#endif -#if defined(HAVE_LINUX_NETLINK_H) -#include <linux/netlink.h> -#endif -#if defined(HAVE_LINUX_RTNETLINK_H) -#include <linux/rtnetlink.h> -#endif -#if defined(HAVE_NET_IF_H) -#include <net/if.h> -#endif -#if defined(HAVE_NET_IF_ARP_H) -#include <net/if_arp.h> -#endif -#if defined(HAVE_NET_ROUTE_H) -#include <net/route.h> -#endif -#if defined (HAVE_NETPACKET_PACKET_H) -#include <netpacket/packet.h> -#endif -#if defined(HAVE_SYS_MOUNT_H) -#include <sys/mount.h> -#endif -#if defined(HAVE_SYS_VFS_H) -#include <sys/vfs.h> -#endif -#if defined(HAVE_STATFS_H) -#include <sys/statfs.h> -#endif -#if defined(HAVE_SYS_TIMEX_H) -#include <sys/timex.h> -#endif -#if defined(HAVE_SYS_SYSINFO_H) -#include <sys/sysinfo.h> -#endif -#if defined(HAVE_USTAT_H) -#include <ustat.h> -#endif -#if defined(HAVE_UTIME_H) -#include <utime.h> -#endif -#if defined(HAVE_LINUX_ETHER_H) -#include <linux/ether.h> -#endif -#if defined(HAVE_LINUX_FS_H) -#include <linux/fs.h> -#endif -#if defined(HAVE_LINUX_REBOOT_H) -#include <linux/reboot.h> -#endif -#if defined(HAVE_SYS_INOTIFY_H) -#include <sys/inotify.h> -#endif -#if defined(HAVE_NETINET_ICMP6_H) -#include <netinet/icmp6.h> -#endif -#if defined(HAVE_SCHED_H) -#include <sched.h> -#endif - -/* Constants that may only be defined as expressions on some systems, - expressions too complex for -fdump-go-spec to handle. These are - handled specially below. */ -enum { -#ifdef TIOCGWINSZ - TIOCGWINSZ_val = TIOCGWINSZ, -#endif -#ifdef TIOCSWINSZ - TIOCSWINSZ_val = TIOCSWINSZ, -#endif -#ifdef TIOCNOTTY - TIOCNOTTY_val = TIOCNOTTY, -#endif -#ifdef TIOCSCTTY - TIOCSCTTY_val = TIOCSCTTY, -#endif -#ifdef TIOCGPGRP - TIOCGPGRP_val = TIOCGPGRP, -#endif -#ifdef TIOCSPGRP - TIOCSPGRP_val = TIOCSPGRP, -#endif -#ifdef TIOCGPTN - TIOCGPTN_val = TIOCGPTN, -#endif -#ifdef TIOCSPTLCK - TIOCSPTLCK_val = TIOCSPTLCK, -#endif -#ifdef TIOCGDEV - TIOCGDEV_val = TIOCGDEV, -#endif -#ifdef TIOCSIG - TIOCSIG_val = TIOCSIG, -#endif -#ifdef TCGETS - TCGETS_val = TCGETS, -#endif -#ifdef TCSETS - TCSETS_val = TCSETS, -#endif -#ifdef TUNSETIFF - TUNSETIFF_val = TUNSETIFF, -#endif -#ifdef TUNSETNOCSUM - TUNSETNOCSUM_val = TUNSETNOCSUM, -#endif -#ifdef TUNSETDEBUG - TUNSETDEBUG_val = TUNSETDEBUG, -#endif -#ifdef TUNSETPERSIST - TUNSETPERSIST_val = TUNSETPERSIST, -#endif -#ifdef TUNSETOWNER - TUNSETOWNER_val = TUNSETOWNER, -#endif -#ifdef TUNSETLINK - TUNSETLINK_val = TUNSETLINK, -#endif -#ifdef TUNSETGROUP - TUNSETGROUP_val = TUNSETGROUP, -#endif -#ifdef TUNGETFEATURES - TUNGETFEATURES_val = TUNGETFEATURES, -#endif -#ifdef TUNSETOFFLOAD - TUNSETOFFLOAD_val = TUNSETOFFLOAD, -#endif -#ifdef TUNSETTXFILTER - TUNSETTXFILTER_val = TUNSETTXFILTER, -#endif -#ifdef TUNGETIFF - TUNGETIFF_val = TUNGETIFF, -#endif -#ifdef TUNGETSNDBUF - TUNGETSNDBUF_val = TUNGETSNDBUF, -#endif -#ifdef TUNSETSNDBUF - TUNSETSNDBUF_val = TUNSETSNDBUF, -#endif -#ifdef TUNATTACHFILTER - TUNATTACHFILTER_val = TUNATTACHFILTER, -#endif -#ifdef TUNDETACHFILTER - TUNDETACHFILTER_val = TUNDETACHFILTER, -#endif -#ifdef TUNGETVNETHDRSZ - TUNGETVNETHDRSZ_val = TUNGETVNETHDRSZ, -#endif -#ifdef TUNSETVNETHDRSZ - TUNSETVNETHDRSZ_val = TUNSETVNETHDRSZ, -#endif -#ifdef TUNSETQUEUE - TUNSETQUEUE_val = TUNSETQUEUE, -#endif -#ifdef TUNSETIFINDEX - TUNSETIFINDEX_val = TUNSETIFINDEX, -#endif -#ifdef TUNGETFILTER - TUNGETFILTER_val = TUNGETFILTER, -#endif -#ifdef NLA_HDRLEN - NLA_HDRLEN_val = NLA_HDRLEN, -#endif - -}; -EOF - -${CC} -fdump-go-spec=gen-sysinfo.go -std=gnu99 -S -o sysinfo.s sysinfo.c - echo 'package syscall' > ${OUT} echo 'import "unsafe"' >> ${OUT} echo 'type _ unsafe.Pointer' >> ${OUT} @@ -302,8 +43,7 @@ grep -v '^// ' gen-sysinfo.go | \ >> ${OUT} # The errno constants. These get type Errno. -echo '#include <errno.h>' | ${CC} -x c - -E -dM | \ - egrep '#define E[A-Z0-9_]+ ' | \ + egrep '#define E[A-Z0-9_]+ ' errno.i | \ sed -e 's/^#define \(E[A-Z0-9_]*\) .*$/const \1 = Errno(_\1)/' >> ${OUT} # The O_xxx flags. diff --git a/libgo/sysinfo.c b/libgo/sysinfo.c new file mode 100644 index 0000000..07d68673 --- /dev/null +++ b/libgo/sysinfo.c @@ -0,0 +1,259 @@ +/* sysinfo.c -- input for mksysinfo.sh + + Copyright 2009 The Go Authors. All rights reserved. + Use of this source code is governed by a BSD-style + license that can be found in the LICENSE file. */ + +/* This file is passed to GCC with the -fdump-go-spec option to + generate a Go version of the system information. */ + +#include "config.h" + +#include <sys/types.h> +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> +#include <ucontext.h> +#include <netinet/in.h> +/* <netinet/tcp.h> needs u_char/u_short, but <sys/bsd_types> is only + included by <netinet/in.h> if _SGIAPI (i.e. _SGI_SOURCE + && !_XOPEN_SOURCE. + <sys/termios.h> only defines TIOCNOTTY if !_XOPEN_SOURCE, while + <sys/ttold.h> does so unconditionally. */ +#ifdef __sgi__ +#include <sys/bsd_types.h> +#include <sys/ttold.h> +#endif +#include <netinet/tcp.h> +#if defined(HAVE_NETINET_IN_SYSTM_H) +#include <netinet/in_systm.h> +#endif +#if defined(HAVE_NETINET_IP_H) +#include <netinet/ip.h> +#endif +#if defined(HAVE_NETINET_IP_MROUTE_H) +#include <netinet/ip_mroute.h> +#endif +#if defined(HAVE_NETINET_IF_ETHER_H) +#include <netinet/if_ether.h> +#endif +#include <signal.h> +#include <sys/ioctl.h> +#include <termios.h> +#if defined(HAVE_SYSCALL_H) +#include <syscall.h> +#endif +#if defined(HAVE_SYS_SYSCALL_H) +#include <sys/syscall.h> +#endif +#if defined(HAVE_SYS_EPOLL_H) +#include <sys/epoll.h> +#endif +#if defined(HAVE_SYS_FILE_H) +#include <sys/file.h> +#endif +#if defined(HAVE_SYS_MMAN_H) +#include <sys/mman.h> +#endif +#if defined(HAVE_SYS_PRCTL_H) +#include <sys/prctl.h> +#endif +#if defined(HAVE_SYS_PTRACE_H) +#include <sys/ptrace.h> +#endif +#include <sys/resource.h> +#include <sys/uio.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/times.h> +#include <sys/wait.h> +#include <sys/un.h> +#if defined(HAVE_SYS_USER_H) +#include <sys/user.h> +#endif +#if defined(HAVE_SYS_UTSNAME_H) +#include <sys/utsname.h> +#endif +#if defined(HAVE_SYS_SELECT_H) +#include <sys/select.h> +#endif +#include <time.h> +#include <unistd.h> +#include <netdb.h> +#include <pwd.h> +#include <grp.h> +#if defined(HAVE_LINUX_FILTER_H) +#include <linux/filter.h> +#endif +#if defined(HAVE_LINUX_IF_ADDR_H) +#include <linux/if_addr.h> +#endif +#if defined(HAVE_LINUX_IF_ETHER_H) +#include <linux/if_ether.h> +#endif +#if defined(HAVE_LINUX_IF_TUN_H) +#include <linux/if_tun.h> +#endif +#if defined(HAVE_LINUX_NETLINK_H) +#include <linux/netlink.h> +#endif +#if defined(HAVE_LINUX_RTNETLINK_H) +#include <linux/rtnetlink.h> +#endif +#if defined(HAVE_NET_IF_H) +#include <net/if.h> +#endif +#if defined(HAVE_NET_IF_ARP_H) +#include <net/if_arp.h> +#endif +#if defined(HAVE_NET_ROUTE_H) +#include <net/route.h> +#endif +#if defined (HAVE_NETPACKET_PACKET_H) +#include <netpacket/packet.h> +#endif +#if defined(HAVE_SYS_MOUNT_H) +#include <sys/mount.h> +#endif +#if defined(HAVE_SYS_VFS_H) +#include <sys/vfs.h> +#endif +#if defined(HAVE_STATFS_H) +#include <sys/statfs.h> +#endif +#if defined(HAVE_SYS_TIMEX_H) +#include <sys/timex.h> +#endif +#if defined(HAVE_SYS_SYSINFO_H) +#include <sys/sysinfo.h> +#endif +#if defined(HAVE_USTAT_H) +#include <ustat.h> +#endif +#if defined(HAVE_UTIME_H) +#include <utime.h> +#endif +#if defined(HAVE_LINUX_ETHER_H) +#include <linux/ether.h> +#endif +#if defined(HAVE_LINUX_FS_H) +#include <linux/fs.h> +#endif +#if defined(HAVE_LINUX_REBOOT_H) +#include <linux/reboot.h> +#endif +#if defined(HAVE_SYS_INOTIFY_H) +#include <sys/inotify.h> +#endif +#if defined(HAVE_NETINET_ICMP6_H) +#include <netinet/icmp6.h> +#endif +#if defined(HAVE_SCHED_H) +#include <sched.h> +#endif + +/* Constants that may only be defined as expressions on some systems, + expressions too complex for -fdump-go-spec to handle. These are + handled specially below. */ +enum { +#ifdef TIOCGWINSZ + TIOCGWINSZ_val = TIOCGWINSZ, +#endif +#ifdef TIOCSWINSZ + TIOCSWINSZ_val = TIOCSWINSZ, +#endif +#ifdef TIOCNOTTY + TIOCNOTTY_val = TIOCNOTTY, +#endif +#ifdef TIOCSCTTY + TIOCSCTTY_val = TIOCSCTTY, +#endif +#ifdef TIOCGPGRP + TIOCGPGRP_val = TIOCGPGRP, +#endif +#ifdef TIOCSPGRP + TIOCSPGRP_val = TIOCSPGRP, +#endif +#ifdef TIOCGPTN + TIOCGPTN_val = TIOCGPTN, +#endif +#ifdef TIOCSPTLCK + TIOCSPTLCK_val = TIOCSPTLCK, +#endif +#ifdef TIOCGDEV + TIOCGDEV_val = TIOCGDEV, +#endif +#ifdef TIOCSIG + TIOCSIG_val = TIOCSIG, +#endif +#ifdef TCGETS + TCGETS_val = TCGETS, +#endif +#ifdef TCSETS + TCSETS_val = TCSETS, +#endif +#ifdef TUNSETIFF + TUNSETIFF_val = TUNSETIFF, +#endif +#ifdef TUNSETNOCSUM + TUNSETNOCSUM_val = TUNSETNOCSUM, +#endif +#ifdef TUNSETDEBUG + TUNSETDEBUG_val = TUNSETDEBUG, +#endif +#ifdef TUNSETPERSIST + TUNSETPERSIST_val = TUNSETPERSIST, +#endif +#ifdef TUNSETOWNER + TUNSETOWNER_val = TUNSETOWNER, +#endif +#ifdef TUNSETLINK + TUNSETLINK_val = TUNSETLINK, +#endif +#ifdef TUNSETGROUP + TUNSETGROUP_val = TUNSETGROUP, +#endif +#ifdef TUNGETFEATURES + TUNGETFEATURES_val = TUNGETFEATURES, +#endif +#ifdef TUNSETOFFLOAD + TUNSETOFFLOAD_val = TUNSETOFFLOAD, +#endif +#ifdef TUNSETTXFILTER + TUNSETTXFILTER_val = TUNSETTXFILTER, +#endif +#ifdef TUNGETIFF + TUNGETIFF_val = TUNGETIFF, +#endif +#ifdef TUNGETSNDBUF + TUNGETSNDBUF_val = TUNGETSNDBUF, +#endif +#ifdef TUNSETSNDBUF + TUNSETSNDBUF_val = TUNSETSNDBUF, +#endif +#ifdef TUNATTACHFILTER + TUNATTACHFILTER_val = TUNATTACHFILTER, +#endif +#ifdef TUNDETACHFILTER + TUNDETACHFILTER_val = TUNDETACHFILTER, +#endif +#ifdef TUNGETVNETHDRSZ + TUNGETVNETHDRSZ_val = TUNGETVNETHDRSZ, +#endif +#ifdef TUNSETVNETHDRSZ + TUNSETVNETHDRSZ_val = TUNSETVNETHDRSZ, +#endif +#ifdef TUNSETQUEUE + TUNSETQUEUE_val = TUNSETQUEUE, +#endif +#ifdef TUNSETIFINDEX + TUNSETIFINDEX_val = TUNSETIFINDEX, +#endif +#ifdef TUNGETFILTER + TUNGETFILTER_val = TUNGETFILTER, +#endif +#ifdef NLA_HDRLEN + NLA_HDRLEN_val = NLA_HDRLEN, +#endif +}; |