Page MenuHomeFreeBSD

D13015.id34997.diff
No OneTemporary

D13015.id34997.diff

This file is larger than 256 KB, so syntax highlighting was skipped.
Index: ObsoleteFiles.inc
===================================================================
--- ObsoleteFiles.inc
+++ ObsoleteFiles.inc
@@ -38,6 +38,15 @@
# xargs -n1 | sort | uniq -d;
# done
+# 2017XXXX: lint(1) removal
+OLD_FILES+=usr/bin/lint
+OLD_FILES+=usr/libexec/lint1
+OLD_FILES+=usr/libexec/lint2
+OLD_FILES+=usr/libdata/lint/llib-lposix.ln
+OLD_FILES+=usr/libdata/lint/llib-lstdc.ln
+OLD_FILES+=usr/share/man/man1/lint.1.gz
+OLD_FILES+=usr/share/man/man7/lint.7.gz
+OLD_DIRS+=usr/libdata/lint
# 20171108: badsect(8) removal
OLD_FILES+=sbin/badsect
OLD_FILES+=rescue/badsect
Index: etc/mtree/BSD.usr.dist
===================================================================
--- etc/mtree/BSD.usr.dist
+++ etc/mtree/BSD.usr.dist
@@ -56,8 +56,6 @@
..
ldscripts
..
- lint
- ..
pkgconfig
..
..
Index: share/man/man7/hier.7
===================================================================
--- share/man/man7/hier.7
+++ share/man/man7/hier.7
@@ -364,10 +364,6 @@
linker scripts;
see
.Xr ld 1
-.It Pa lint/
-various prebuilt lint libraries;
-see
-.Xr lint 1
.El
.Pp
.It Pa libexec/
Index: share/man/man9/style.9
===================================================================
--- share/man/man9/style.9
+++ share/man/man9/style.9
@@ -867,14 +867,11 @@
compliant in the repository must not diverge from compliance.
.Pp
Whenever possible, code should be run through a code checker
-(e.g.,
-.Xr lint 1
-or
+(e.g., various static analyzers or
.Nm cc Fl Wall )
and produce minimal warnings.
.Sh SEE ALSO
.Xr indent 1 ,
-.Xr lint 1 ,
.Xr err 3 ,
.Xr warn 3 ,
.Xr style.Makefile 5
Index: usr.bin/Makefile
===================================================================
--- usr.bin/Makefile
+++ usr.bin/Makefile
@@ -278,9 +278,6 @@
SUBDIR.${MK_TOOLCHAIN}+= unifdef
SUBDIR.${MK_TOOLCHAIN}+= size
SUBDIR.${MK_TOOLCHAIN}+= strings
-.if ${MACHINE_ARCH} != "aarch64" # ARM64TODO xlint does not build
-SUBDIR.${MK_TOOLCHAIN}+= xlint
-.endif
SUBDIR.${MK_TOOLCHAIN}+= xstr
SUBDIR.${MK_TOOLCHAIN}+= yacc
SUBDIR.${MK_VI}+= vi
Index: usr.bin/xlint/Makefile
===================================================================
--- usr.bin/xlint/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-# $NetBSD: Makefile,v 1.2 1995/07/03 21:23:45 cgd Exp $
-# $FreeBSD$
-
-.if ${LINT} == "lint"
-_llib= llib
-.else
-_llib=
-.endif
-
-SUBDIR= lint1 lint2 xlint ${_llib}
-
-.include <bsd.subdir.mk>
Index: usr.bin/xlint/Makefile.inc
===================================================================
--- usr.bin/xlint/Makefile.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-# $NetBSD: Makefile.inc,v 1.8 2002/02/04 00:18:32 thorpej Exp $
-# $FreeBSD$
-
-WARNS?= 0
-
-.PATH: ${.CURDIR}/../common
-
-.if exists(${.CURDIR}/../arch/${MACHINE_ARCH})
-CFLAGS+= -I${.CURDIR}/../arch/${MACHINE_ARCH}
-.else
-CFLAGS+= -I${.CURDIR}/../arch/${MACHINE_CPUARCH}
-.endif
-CFLAGS+= -I${.CURDIR}/../common
-
-OBJECT_FMT= ELF
Index: usr.bin/xlint/arch/aarch64/targparam.h
===================================================================
--- usr.bin/xlint/arch/aarch64/targparam.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2014/08/10 05:47:38 matt Exp $ */
-
-/*-
- * Copyright (c) 2014 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by Matt Thomas of 3am Software Foundry.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (16 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/amd64/targparam.h
===================================================================
--- usr.bin/xlint/arch/amd64/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.2 2002/01/30 06:55:00 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (16 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/arm/targparam.h
===================================================================
--- usr.bin/xlint/arch/arm/targparam.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:19 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#if defined(TARGET_OBJFMT_ELF)
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#else
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#endif
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#if defined(TARGET_OBJFMT_ELF)
-/* XXX ARM ELF ABI says packed enums -- variable size! */
-#define ENUM_SIZE (4 * CHAR_BIT)
-#else
-#define ENUM_SIZE (4 * CHAR_BIT)
-#endif
Index: usr.bin/xlint/arch/i386/targparam.h
===================================================================
--- usr.bin/xlint/arch/i386/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:19 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (12 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/m68000/targparam.h
===================================================================
--- usr.bin/xlint/arch/m68000/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD$ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/m68k/targparam.h
===================================================================
--- usr.bin/xlint/arch/m68k/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:19 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (12 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/mips/targparam.h
===================================================================
--- usr.bin/xlint/arch/mips/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:19 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/ns32k/targparam.h
===================================================================
--- usr.bin/xlint/arch/ns32k/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:20 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (12 * CHAR_BIT) /* XXX double-check */
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/powerpc/targparam.h
===================================================================
--- usr.bin/xlint/arch/powerpc/targparam.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:20 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/powerpc64/targparam.h
===================================================================
--- usr.bin/xlint/arch/powerpc64/targparam.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:20 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/riscv/targparam.h
===================================================================
--- usr.bin/xlint/arch/riscv/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.2 2002/01/30 06:55:00 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (16 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/sh3/targparam.h
===================================================================
--- usr.bin/xlint/arch/sh3/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:20 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/sparc/targparam.h
===================================================================
--- usr.bin/xlint/arch/sparc/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:21 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/sparc64/targparam.h
===================================================================
--- usr.bin/xlint/arch/sparc64/targparam.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/* $NetBSD: targparam.h,v 1.3 2002/01/31 23:31:34 he Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (16 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/vax/targparam.h
===================================================================
--- usr.bin/xlint/arch/vax/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:22 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "ilp32.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (8 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/arch/x86_64/targparam.h
===================================================================
--- usr.bin/xlint/arch/x86_64/targparam.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* $NetBSD: targparam.h,v 1.1 2002/01/18 20:39:22 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Machine-dependent target parameters for lint1.
- */
-
-#include "lp64.h"
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long. Note this MUST be
- * kept in sync with the compiler!
- */
-
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-
-#define FLOAT_SIZE (4 * CHAR_BIT)
-#define DOUBLE_SIZE (8 * CHAR_BIT)
-#define LDOUBLE_SIZE (16 * CHAR_BIT)
-
-#define ENUM_SIZE (4 * CHAR_BIT)
Index: usr.bin/xlint/common/emit.c
===================================================================
--- usr.bin/xlint/common/emit.c
+++ /dev/null
@@ -1,234 +0,0 @@
-/* $NetBSD: emit.c,v 1.2 2002/01/21 19:49:51 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: emit.c,v 1.2 2002/01/21 19:49:51 tv Exp $");
-#endif
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "lint.h"
-
-/* name and handle of output file */
-static const char *loname;
-static FILE *lout;
-
-/* output buffer data */
-ob_t ob;
-
-static void outxbuf(void);
-
-
-/*
- * initialize output
- */
-void
-outopen(const char *name)
-{
-
- loname = name;
-
- /* Open output file */
- if ((lout = fopen(name, "w")) == NULL)
- err(1, "cannot open '%s'", name);
-
- /* Create output buffer */
- ob.o_len = 1024;
- ob.o_end = (ob.o_buf = ob.o_nxt = xmalloc(ob.o_len)) + ob.o_len;
-}
-
-/*
- * flush output buffer and close file
- */
-void
-outclose(void)
-{
-
- outclr();
- if (fclose(lout) == EOF)
- err(1, "cannot close '%s'", loname);
-}
-
-/*
- * resize output buffer
- */
-static void
-outxbuf(void)
-{
- ptrdiff_t coffs;
-
- coffs = ob.o_nxt - ob.o_buf;
- ob.o_len *= 2;
- ob.o_end = (ob.o_buf = xrealloc(ob.o_buf, ob.o_len)) + ob.o_len;
- ob.o_nxt = ob.o_buf + coffs;
-}
-
-/*
- * reset output buffer
- * if it is not empty, it is flushed
- */
-void
-outclr(void)
-{
- size_t sz;
-
- if (ob.o_buf != ob.o_nxt) {
- outchar('\n');
- sz = ob.o_nxt - ob.o_buf;
- if (sz > ob.o_len)
- errx(1, "internal error: outclr() 1");
- if (fwrite(ob.o_buf, sz, 1, lout) != 1)
- err(1, "cannot write to %s", loname);
- ob.o_nxt = ob.o_buf;
- }
-}
-
-/*
- * write a character to the output buffer
- */
-void
-outchar(int c)
-{
-
- if (ob.o_nxt == ob.o_end)
- outxbuf();
- *ob.o_nxt++ = (char)c;
-}
-
-/*
- * write a character to the output buffer, qouted if necessary
- */
-void
-outqchar(int c)
-{
-
- if (isprint(c) && c != '\\' && c != '"' && c != '\'') {
- outchar(c);
- } else {
- outchar('\\');
- switch (c) {
- case '\\':
- outchar('\\');
- break;
- case '"':
- outchar('"');
- break;
- case '\'':
- outchar('\'');
- break;
- case '\b':
- outchar('b');
- break;
- case '\t':
- outchar('t');
- break;
- case '\n':
- outchar('n');
- break;
- case '\f':
- outchar('f');
- break;
- case '\r':
- outchar('r');
- break;
- case '\v':
- outchar('v');
- break;
- case '\a':
- outchar('a');
- break;
- default:
- outchar((((u_int)c >> 6) & 07) + '0');
- outchar((((u_int)c >> 3) & 07) + '0');
- outchar((c & 07) + '0');
- break;
- }
- }
-}
-
-/*
- * write a strint to the output buffer
- * the string must not contain any characters which
- * should be quoted
- */
-void
-outstrg(const char *s)
-{
-
- while (*s != '\0') {
- if (ob.o_nxt == ob.o_end)
- outxbuf();
- *ob.o_nxt++ = *s++;
- }
-}
-
-/*
- * write an integer value to toe output buffer
- */
-void
-outint(int i)
-{
-
- if ((ob.o_end - ob.o_nxt) < 3 * sizeof (int))
- outxbuf();
- ob.o_nxt += sprintf(ob.o_nxt, "%d", i);
-}
-
-/*
- * write the name of a symbol to the output buffer
- * the name is preceded by its length
- */
-void
-outname(const char *name)
-{
-
- if (name == NULL)
- errx(1, "internal error: outname() 1");
- outint((int)strlen(name));
- outstrg(name);
-}
-
-/*
- * write the name of the .c source
- */
-void
-outsrc(const char *name)
-{
-
- outclr();
- outchar('S');
- outstrg(name);
-}
Index: usr.bin/xlint/common/externs.h
===================================================================
--- usr.bin/xlint/common/externs.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* $NetBSD: externs.h,v 1.1 2002/01/18 20:39:23 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * main[12].c
- */
-extern int pflag;
-
-/*
- * inittyp.c
- */
-extern void inittyp(void);
-
-/*
- * mem.c
- */
-extern void *xmalloc(size_t);
-extern void *xcalloc(size_t, size_t);
-extern void *xrealloc(void *, size_t);
-extern char *xstrdup(const char *);
-extern void nomem(void);
-
-/*
- * emit.c
- */
-extern ob_t ob;
-
-extern void outopen(const char *);
-extern void outclose(void);
-extern void outclr(void);
-extern void outchar(int);
-extern void outqchar(int);
-extern void outstrg(const char *);
-extern void outint(int);
-extern void outname(const char *);
-extern void outsrc(const char *);
Index: usr.bin/xlint/common/ilp32.h
===================================================================
--- usr.bin/xlint/common/ilp32.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $NetBSD: ilp32.h,v 1.1 2002/01/18 20:39:23 thorpej Exp $ */
-
-/*
- * Copyright (c) 2001 Wasabi Systems, Inc.
- * All rights reserved.
- *
- * Written by Jason R. Thorpe for Wasabi Systems, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed for the NetBSD Project by
- * Wasabi Systems, Inc.
- * 4. The name of Wasabi Systems, Inc. may not be used to endorse
- * or promote products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Type sizes for IPL32 platforms (int, long, pointer: 32-bit)
- */
-
-#define CHAR_SIZE (CHAR_BIT)
-#define SHORT_SIZE (2 * CHAR_BIT)
-#define INT_SIZE (4 * CHAR_BIT)
-#define LONG_SIZE (4 * CHAR_BIT)
-#define QUAD_SIZE (8 * CHAR_BIT)
-#define PTR_SIZE (4 * CHAR_BIT)
-
-#define TARG_INT_MAX ((int32_t) (((uint32_t) -1) >> 1))
-#define TARG_INT_MIN ((-TARG_INT_MAX) - 1)
-#define TARG_UINT_MAX ((uint32_t) -1)
-
-#define TARG_LONG_MAX TARG_INT_MAX
-#define TARG_LONG_MIN TARG_INT_MIN
-#define TARG_ULONG_MAX TARG_UINT_MAX
-
-#define TARG_QUAD_MAX ((int64_t) (((uint64_t) -1) >> 1))
-#define TARG_QUAD_MIN ((-TARG_QUAD_MAX) - 1)
-#define TARG_UQUAD_MAX ((uint64_t) -1)
Index: usr.bin/xlint/common/inittyp.c
===================================================================
--- usr.bin/xlint/common/inittyp.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* $NetBSD: inittyp.c,v 1.3 2002/01/30 06:55:02 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: inittyp.c,v 1.3 2002/01/30 06:55:02 thorpej Exp $");
-#endif
-
-#include <ctype.h>
-#include <limits.h>
-#include <stdlib.h>
-
-#include "lint.h"
-
-/* various type information */
-ttab_t ttab[NTSPEC];
-
-void
-inittyp(void)
-{
- int i;
- static const struct {
- tspec_t it_tspec;
- ttab_t it_ttab;
- } ittab[NTSPEC] = {
- { SIGNED, { 0, 0,
- SIGNED, UNSIGN,
- 0, 0, 0, 0, 0, "signed" } },
- { UNSIGN, { 0, 0,
- SIGNED, UNSIGN,
- 0, 0, 0, 0, 0, "unsigned" } },
- { CHAR, { CHAR_SIZE, CHAR_BIT,
- SCHAR, UCHAR,
- 1, 0, 0, 1, 1, "char" } },
- { SCHAR, { CHAR_SIZE, CHAR_BIT,
- SCHAR, UCHAR,
- 1, 0, 0, 1, 1, "signed char" } },
- { UCHAR, { CHAR_SIZE, CHAR_BIT,
- SCHAR, UCHAR,
- 1, 1, 0, 1, 1, "unsigned char" } },
- { SHORT, { SHORT_SIZE, 2 * CHAR_BIT,
- SHORT, USHORT,
- 1, 0, 0, 1, 1, "short" } },
- { USHORT, { SHORT_SIZE, 2 * CHAR_BIT,
- SHORT, USHORT,
- 1, 1, 0, 1, 1, "unsigned short" } },
- { INT, { INT_SIZE, 3 * CHAR_BIT,
- INT, UINT,
- 1, 0, 0, 1, 1, "int" } },
- { UINT, { INT_SIZE, 3 * CHAR_BIT,
- INT, UINT,
- 1, 1, 0, 1, 1, "unsigned int" } },
- { LONG, { LONG_SIZE, 4 * CHAR_BIT,
- LONG, ULONG,
- 1, 0, 0, 1, 1, "long" } },
- { ULONG, { LONG_SIZE, 4 * CHAR_BIT,
- LONG, ULONG,
- 1, 1, 0, 1, 1, "unsigned long" } },
- { QUAD, { QUAD_SIZE, 8 * CHAR_BIT,
- QUAD, UQUAD,
- 1, 0, 0, 1, 1, "long long" } },
- { UQUAD, { QUAD_SIZE, 8 * CHAR_BIT,
- QUAD, UQUAD,
- 1, 1, 0, 1, 1, "unsigned long long" } },
- { FLOAT, { FLOAT_SIZE, 4 * CHAR_BIT,
- FLOAT, FLOAT,
- 0, 0, 1, 1, 1, "float" } },
- { DOUBLE, { DOUBLE_SIZE, 8 * CHAR_BIT,
- DOUBLE, DOUBLE,
- 0, 0, 1, 1, 1, "double" } },
- { LDOUBLE, { LDOUBLE_SIZE, 10 * CHAR_BIT,
- LDOUBLE, LDOUBLE,
- 0, 0, 1, 1, 1, "long double" } },
- { VOID, { -1, -1,
- VOID, VOID,
- 0, 0, 0, 0, 0, "void" } },
- { STRUCT, { -1, -1,
- STRUCT, STRUCT,
- 0, 0, 0, 0, 0, "struct" } },
- { UNION, { -1, -1,
- UNION, UNION,
- 0, 0, 0, 0, 0, "union" } },
- { ENUM, { ENUM_SIZE, 3 * CHAR_BIT,
- ENUM, ENUM,
- 1, 0, 0, 1, 1, "enum" } },
- { PTR, { PTR_SIZE, 4 * CHAR_BIT,
- PTR, PTR,
- 0, 1, 0, 0, 1, "pointer" } },
- { ARRAY, { -1, -1,
- ARRAY, ARRAY,
- 0, 0, 0, 0, 0, "array" } },
- { FUNC, { -1, -1,
- FUNC, FUNC,
- 0, 0, 0, 0, 0, "function" } },
- };
-
- for (i = 0; i < sizeof (ittab) / sizeof (ittab[0]); i++)
- STRUCT_ASSIGN(ttab[ittab[i].it_tspec], ittab[i].it_ttab);
- if (!pflag) {
- for (i = 0; i < NTSPEC; i++)
- ttab[i].tt_psz = ttab[i].tt_sz;
- }
-}
Index: usr.bin/xlint/common/lint.h
===================================================================
--- usr.bin/xlint/common/lint.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* $NetBSD: lint.h,v 1.7 2003/10/27 00:12:44 lukem Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#if HAVE_CONFIG_H
-#include "config.h"
-#else
-#define HAVE_DECL_SYS_SIGNAME 1
-#endif
-
-#include <sys/types.h>
-#include <stddef.h>
-#include <err.h>
-#include <inttypes.h>
-#include <stdio.h>
-
-#include "param.h"
-
-/*
- * Type specifiers, used in type structures (type_t) and otherwere.
- */
-typedef enum {
- NOTSPEC = 0,
- SIGNED, /* keyword "signed", only used in the parser */
- UNSIGN, /* keyword "unsigned", only used in the parser */
- CHAR, /* char */
- SCHAR, /* signed char */
- UCHAR, /* unsigned char */
- SHORT, /* (signed) short */
- USHORT, /* unsigned short */
- INT, /* (signed) int */
- UINT, /* unsigned int */
- LONG, /* (signed) long */
- ULONG, /* unsigned long */
- QUAD, /* (signed) long long */
- UQUAD, /* unsigned long long */
- FLOAT, /* float */
- DOUBLE, /* double or, with tflag, long float */
- LDOUBLE, /* long double */
- VOID, /* void */
- STRUCT, /* structure tag */
- UNION, /* union tag */
- ENUM, /* enum tag */
- PTR, /* pointer */
- ARRAY, /* array */
- FUNC, /* function */
- NTSPEC
-} tspec_t;
-
-/*
- * size of types, name and classification
- */
-typedef struct {
- int tt_sz; /* size in bits */
- int tt_psz; /* size, different from tt_sz
- if pflag is set */
- tspec_t tt_styp; /* signed counterpart */
- tspec_t tt_utyp; /* unsigned counterpart */
- u_int tt_isityp : 1; /* 1 if integer type */
- u_int tt_isutyp : 1; /* 1 if unsigned integer type */
- u_int tt_isftyp : 1; /* 1 if floating point type */
- u_int tt_isatyp : 1; /* 1 if arithmetic type */
- u_int tt_issclt : 1; /* 1 if scalar type */
- const char *tt_name; /* Bezeichnung des Typs */
-} ttab_t;
-
-#define size(t) (ttab[t].tt_sz)
-#define psize(t) (ttab[t].tt_psz)
-#define styp(t) (ttab[t].tt_styp)
-#define utyp(t) (ttab[t].tt_utyp)
-#define isityp(t) (ttab[t].tt_isityp)
-#define isutyp(t) (ttab[t].tt_isutyp)
-#define isftyp(t) (ttab[t].tt_isftyp)
-#define isatyp(t) (ttab[t].tt_isatyp)
-#define issclt(t) (ttab[t].tt_issclt)
-
-extern ttab_t ttab[];
-
-
-typedef enum {
- NODECL, /* until now not declared */
- DECL, /* declared */
- TDEF, /* tentative defined */
- DEF /* defined */
-} def_t;
-
-/*
- * Following structure contains some data used for the output buffer.
- */
-typedef struct ob {
- char *o_buf; /* buffer */
- char *o_end; /* first byte after buffer */
- size_t o_len; /* length of buffer */
- char *o_nxt; /* next free byte in buffer */
-} ob_t;
-
-#include "externs.h"
Index: usr.bin/xlint/common/lp64.h
===================================================================
--- usr.bin/xlint/common/lp64.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* $NetBSD: lp64.h,v 1.1 2002/01/18 20:39:23 thorpej Exp $ */
-
-/*
- * Copyright (c) 2001 Wasabi Systems, Inc.
- * All rights reserved.
- *
- * Written by Jason R. Thorpe for Wasabi Systems, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed for the NetBSD Project by
- * Wasabi Systems, Inc.
- * 4. The name of Wasabi Systems, Inc. may not be used to endorse
- * or promote products derived from this software without specific prior
- * written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Type sizes for LP64 platforms (long, pointer: 64-bit)
- */
-
-#define CHAR_SIZE (CHAR_BIT)
-#define SHORT_SIZE (2 * CHAR_BIT)
-#define INT_SIZE (4 * CHAR_BIT)
-#define LONG_SIZE (8 * CHAR_BIT)
-#define QUAD_SIZE (8 * CHAR_BIT)
-#define PTR_SIZE (8 * CHAR_BIT)
-
-#define TARG_INT_MAX ((int32_t) (((uint32_t) -1) >> 1))
-#define TARG_INT_MIN ((-TARG_INT_MAX) - 1)
-#define TARG_UINT_MAX ((uint32_t) -1)
-
-#define TARG_QUAD_MAX ((int64_t) (((uint64_t) -1) >> 1))
-#define TARG_QUAD_MIN ((-TARG_QUAD_MAX) - 1)
-#define TARG_UQUAD_MAX ((uint64_t) -1)
-
-#define TARG_LONG_MAX TARG_QUAD_MAX
-#define TARG_LONG_MIN TARG_QUAD_MIN
-#define TARG_ULONG_MAX TARG_UQUAD_MAX
Index: usr.bin/xlint/common/mem.c
===================================================================
--- usr.bin/xlint/common/mem.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $NetBSD: mem.c,v 1.4 2003/10/16 06:35:26 itojun Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: mem.c,v 1.4 2003/10/16 06:35:26 itojun Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint.h"
-
-void *
-xmalloc(size_t s)
-{
- void *p;
-
- if ((p = malloc(s)) == NULL)
- nomem();
- return (p);
-}
-
-void *
-xcalloc(size_t n, size_t s)
-{
- void *p;
-
- if ((p = calloc(n, s)) == NULL)
- nomem();
- return (p);
-}
-
-void *
-xrealloc(void *p, size_t s)
-{
- void *n;
-
- if ((n = realloc(p, s)) == NULL) {
- free(p);
- nomem();
- }
- p = n;
- return (p);
-}
-
-char *
-xstrdup(const char *s)
-{
- char *s2;
-
- if ((s2 = strdup(s)) == NULL)
- nomem();
- return (s2);
-}
-
-void
-nomem(void)
-{
-
- errx(1, "virtual memory exhausted");
-}
Index: usr.bin/xlint/common/param.h
===================================================================
--- usr.bin/xlint/common/param.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/* $NetBSD: param.h,v 1.2 2002/02/05 03:04:26 thorpej Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Minimun size of string buffer. If this is not enough, the buffer
- * is enlarged in steps of STRBLEN bytes.
- */
-#define STRBLEN 256
-
-/*
- * This defines the size of memory blocks which are used to allocate
- * memory in larger chunks.
- */
-#define MBLKSIZ ((size_t)0x4000)
-
-/*
- * Sizes of hash tables
- * Should be a prime. Possible primes are
- * 307, 401, 503, 601, 701, 809, 907, 1009, 1103, 1201, 1301, 1409, 1511.
- *
- * HSHSIZ1 symbol table 1st pass
- * HSHSIZ2 symbol table 2nd pass
- * THSHSIZ2 type table 2nd pass
- */
-#define HSHSIZ1 503
-#define HSHSIZ2 1009
-#define THSHSIZ2 1009
-
-/*
- * Pull in target-specific parameters.
- */
-#include "targparam.h"
-
-/*
- * Make sure this matches wchar_t.
- */
-#define WCHAR INT
-
-/*
- * And the sparc64 long double code generation is broken.
- */
-#if !defined(__sparc64__)
-typedef long double ldbl_t;
-#else
-typedef double ldbl_t;
-#endif
-
-/*
- * Some traditional compilers are not able to assign structures.
- */
-#define STRUCT_ASSIGN(dest, src) (dest) = (src)
Index: usr.bin/xlint/lint1/Makefile
===================================================================
--- usr.bin/xlint/lint1/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-# $NetBSD: Makefile,v 1.3 1995/07/04 01:53:05 cgd Exp $
-# $FreeBSD$
-
-PROG= lint1
-SRCS= cgram.y scan.l mem1.c mem.c err.c main1.c decl.c tree.c func.c \
- init.c emit.c emit1.c inittyp.c
-MAN= lint.7
-CLEANFILES= lint.7
-
-LIBADD= l m
-CFLAGS+= -I. -I${.CURDIR}
-LINTFLAGS=-aehpz
-
-BINDIR= ${LIBEXECDIR}
-
-.PATH: ${.CURDIR}/../common
-
-lint.7: makeman
- sh ${.CURDIR}/makeman ${DESTDIR}${BINDIR}/${PROG} -m >${.TARGET}
-
-.include <bsd.prog.mk>
Index: usr.bin/xlint/lint1/Makefile.depend
===================================================================
--- usr.bin/xlint/lint1/Makefile.depend
+++ /dev/null
@@ -1,20 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
- lib/msun \
- usr.bin/lex/lib \
- usr.bin/yacc.host \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: usr.bin/xlint/lint1/cgram.y
===================================================================
--- usr.bin/xlint/lint1/cgram.y
+++ /dev/null
@@ -1,1893 +0,0 @@
-%{
-/* $NetBSD: cgram.y,v 1.40 2008/04/25 17:18:24 christos Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: cgram.y,v 1.40 2008/04/25 17:18:24 christos Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#include "lint1.h"
-
-/*
- * Contains the level of current declaration. 0 is extern.
- * Used for symbol table entries.
- */
-int blklev;
-
-/*
- * level for memory allocation. Normaly the same as blklev.
- * An exeption is the declaration of arguments in prototypes. Memory
- * for these can't be freed after the declaration, but symbols must
- * be removed from the symbol table after the declaration.
- */
-int mblklev;
-
-/*
- * Save the no-warns state and restore it to avoid the problem where
- * if (expr) { stmt } / * NOLINT * / stmt;
- */
-static int onowarn = -1;
-
-static int toicon(tnode_t *, int);
-static void idecl(sym_t *, int, sbuf_t *);
-static void ignuptorp(void);
-
-#ifdef DEBUG
-static inline void CLRWFLGS(void);
-static inline void CLRWFLGS(void)
-{
- printf("%s, %d: clear flags %s %d\n", curr_pos.p_file,
- curr_pos.p_line, __FILE__, __LINE__);
- clrwflgs();
- onowarn = -1;
-}
-
-static inline void SAVE(void);
-static inline void SAVE(void)
-{
- if (onowarn != -1)
- abort();
- printf("%s, %d: save flags %s %d = %d\n", curr_pos.p_file,
- curr_pos.p_line, __FILE__, __LINE__, nowarn);
- onowarn = nowarn;
-}
-
-static inline void RESTORE(void);
-static inline void RESTORE(void)
-{
- if (onowarn != -1) {
- nowarn = onowarn;
- printf("%s, %d: restore flags %s %d = %d\n", curr_pos.p_file,
- curr_pos.p_line, __FILE__, __LINE__, nowarn);
- onowarn = -1;
- } else
- CLRWFLGS();
-}
-#else
-#define CLRWFLGS() clrwflgs(), onowarn = -1
-#define SAVE() onowarn = nowarn
-#define RESTORE() (void)(onowarn == -1 ? (clrwflgs(), 0) : (nowarn = onowarn))
-#endif
-%}
-
-%expect 1
-
-%union {
- int y_int;
- val_t *y_val;
- sbuf_t *y_sb;
- sym_t *y_sym;
- op_t y_op;
- scl_t y_scl;
- tspec_t y_tspec;
- tqual_t y_tqual;
- type_t *y_type;
- tnode_t *y_tnode;
- range_t y_range;
- strg_t *y_strg;
- pqinf_t *y_pqinf;
-};
-
-%token T_LBRACE T_RBRACE T_LBRACK T_RBRACK T_LPARN T_RPARN
-%token <y_op> T_STROP
-%token <y_op> T_UNOP
-%token <y_op> T_INCDEC
-%token T_SIZEOF
-%token <y_op> T_MULT
-%token <y_op> T_DIVOP
-%token <y_op> T_ADDOP
-%token <y_op> T_SHFTOP
-%token <y_op> T_RELOP
-%token <y_op> T_EQOP
-%token <y_op> T_AND
-%token <y_op> T_XOR
-%token <y_op> T_OR
-%token <y_op> T_LOGAND
-%token <y_op> T_LOGOR
-%token T_QUEST
-%token T_COLON
-%token <y_op> T_ASSIGN
-%token <y_op> T_OPASS
-%token T_COMMA
-%token T_SEMI
-%token T_ELLIPSE
-
-/* storage classes (extern, static, auto, register and typedef) */
-%token <y_scl> T_SCLASS
-
-/* types (char, int, short, long, unsigned, signed, float, double, void) */
-%token <y_tspec> T_TYPE
-
-/* qualifiers (const, volatile) */
-%token <y_tqual> T_QUAL
-
-/* struct or union */
-%token <y_tspec> T_SOU
-
-/* enum */
-%token T_ENUM
-
-/* remaining keywords */
-%token T_CASE
-%token T_DEFAULT
-%token T_IF
-%token T_ELSE
-%token T_SWITCH
-%token T_DO
-%token T_WHILE
-%token T_FOR
-%token T_GOTO
-%token T_CONTINUE
-%token T_BREAK
-%token T_RETURN
-%token T_ASM
-%token T_SYMBOLRENAME
-
-%left T_COMMA
-%right T_ASSIGN T_OPASS
-%right T_QUEST T_COLON
-%left T_LOGOR
-%left T_LOGAND
-%left T_OR
-%left T_XOR
-%left T_AND
-%left T_EQOP
-%left T_RELOP
-%left T_SHFTOP
-%left T_ADDOP
-%left T_MULT T_DIVOP
-%right T_UNOP T_INCDEC T_SIZEOF
-%left T_LPARN T_LBRACK T_STROP
-
-%token <y_sb> T_NAME
-%token <y_sb> T_TYPENAME
-%token <y_val> T_CON
-%token <y_strg> T_STRING
-
-%type <y_sym> func_decl
-%type <y_sym> notype_decl
-%type <y_sym> type_decl
-%type <y_type> typespec
-%type <y_type> clrtyp_typespec
-%type <y_type> notype_typespec
-%type <y_type> struct_spec
-%type <y_type> enum_spec
-%type <y_sym> struct_tag
-%type <y_sym> enum_tag
-%type <y_tspec> struct
-%type <y_sym> struct_declaration
-%type <y_sb> identifier
-%type <y_sym> member_declaration_list_with_rbrace
-%type <y_sym> member_declaration_list
-%type <y_sym> member_declaration
-%type <y_sym> notype_member_decls
-%type <y_sym> type_member_decls
-%type <y_sym> notype_member_decl
-%type <y_sym> type_member_decl
-%type <y_tnode> constant
-%type <y_sym> enum_declaration
-%type <y_sym> enums_with_opt_comma
-%type <y_sym> enums
-%type <y_sym> enumerator
-%type <y_sym> ename
-%type <y_sym> notype_direct_decl
-%type <y_sym> type_direct_decl
-%type <y_pqinf> pointer
-%type <y_pqinf> asterisk
-%type <y_sym> param_decl
-%type <y_sym> param_list
-%type <y_sym> abs_decl_param_list
-%type <y_sym> direct_param_decl
-%type <y_sym> notype_param_decl
-%type <y_sym> direct_notype_param_decl
-%type <y_pqinf> type_qualifier_list
-%type <y_pqinf> type_qualifier
-%type <y_sym> identifier_list
-%type <y_sym> abs_decl
-%type <y_sym> direct_abs_decl
-%type <y_sym> vararg_parameter_type_list
-%type <y_sym> parameter_type_list
-%type <y_sym> parameter_declaration
-%type <y_tnode> expr
-%type <y_tnode> expr_stmnt_val
-%type <y_tnode> expr_stmnt_list
-%type <y_tnode> term
-%type <y_tnode> func_arg_list
-%type <y_op> point_or_arrow
-%type <y_type> type_name
-%type <y_sym> abstract_declaration
-%type <y_tnode> do_while_expr
-%type <y_tnode> opt_expr
-%type <y_strg> string
-%type <y_strg> string2
-%type <y_sb> opt_asm_or_symbolrename
-%type <y_range> range
-%type <y_range> lorange
-
-
-%%
-
-program:
- /* empty */ {
- if (sflag) {
- /* empty translation unit */
- error(272);
- } else if (!tflag) {
- /* empty translation unit */
- warning(272);
- }
- }
- | translation_unit
- ;
-
-translation_unit:
- ext_decl
- | translation_unit ext_decl
- ;
-
-ext_decl:
- asm_stmnt
- | func_def {
- glclup(0);
- CLRWFLGS();
- }
- | data_def {
- glclup(0);
- CLRWFLGS();
- }
- ;
-
-data_def:
- T_SEMI {
- if (sflag) {
- /* syntax error: empty declaration */
- error(0);
- } else if (!tflag) {
- /* syntax error: empty declaration */
- warning(0);
- }
- }
- | clrtyp deftyp notype_init_decls T_SEMI {
- if (sflag) {
- /* old style declaration; add "int" */
- error(1);
- } else if (!tflag) {
- /* old style declaration; add "int" */
- warning(1);
- }
- }
- | declmods deftyp T_SEMI {
- if (dcs->d_scl == TYPEDEF) {
- /* typedef declares no type name */
- warning(72);
- } else {
- /* empty declaration */
- warning(2);
- }
- }
- | declmods deftyp notype_init_decls T_SEMI
- | declspecs deftyp T_SEMI {
- if (dcs->d_scl == TYPEDEF) {
- /* typedef declares no type name */
- warning(72);
- } else if (!dcs->d_nedecl) {
- /* empty declaration */
- warning(2);
- }
- }
- | declspecs deftyp type_init_decls T_SEMI
- | error T_SEMI {
- globclup();
- }
- | error T_RBRACE {
- globclup();
- }
- ;
-
-func_def:
- func_decl {
- if ($1->s_type->t_tspec != FUNC) {
- /* syntax error */
- error(249);
- YYERROR;
- }
- if ($1->s_type->t_typedef) {
- /* ()-less function definition */
- error(64);
- YYERROR;
- }
- funcdef($1);
- blklev++;
- pushdecl(ARG);
- } opt_arg_declaration_list {
- popdecl();
- blklev--;
- cluparg();
- pushctrl(0);
- } comp_stmnt {
- funcend();
- popctrl(0);
- }
- ;
-
-func_decl:
- clrtyp deftyp notype_decl {
- $$ = $3;
- }
- | declmods deftyp notype_decl {
- $$ = $3;
- }
- | declspecs deftyp type_decl {
- $$ = $3;
- }
- ;
-
-opt_arg_declaration_list:
- /* empty */
- | arg_declaration_list
- ;
-
-arg_declaration_list:
- arg_declaration
- | arg_declaration_list arg_declaration
- /* XXX or better "arg_declaration error" ? */
- | error
- ;
-
-/*
- * "arg_declaration" is separated from "declaration" because it
- * needs other error handling.
- */
-
-arg_declaration:
- declmods deftyp T_SEMI {
- /* empty declaration */
- warning(2);
- }
- | declmods deftyp notype_init_decls T_SEMI
- | declspecs deftyp T_SEMI {
- if (!dcs->d_nedecl) {
- /* empty declaration */
- warning(2);
- } else {
- tspec_t ts = dcs->d_type->t_tspec;
- /* %s declared in argument declaration list */
- warning(3, ts == STRUCT ? "struct" :
- (ts == UNION ? "union" : "enum"));
- }
- }
- | declspecs deftyp type_init_decls T_SEMI {
- if (dcs->d_nedecl) {
- tspec_t ts = dcs->d_type->t_tspec;
- /* %s declared in argument declaration list */
- warning(3, ts == STRUCT ? "struct" :
- (ts == UNION ? "union" : "enum"));
- }
- }
- | declmods error
- | declspecs error
- ;
-
-declaration:
- declmods deftyp T_SEMI {
- if (dcs->d_scl == TYPEDEF) {
- /* typedef declares no type name */
- warning(72);
- } else {
- /* empty declaration */
- warning(2);
- }
- }
- | declmods deftyp notype_init_decls T_SEMI
- | declspecs deftyp T_SEMI {
- if (dcs->d_scl == TYPEDEF) {
- /* typedef declares no type name */
- warning(72);
- } else if (!dcs->d_nedecl) {
- /* empty declaration */
- warning(2);
- }
- }
- | declspecs deftyp type_init_decls T_SEMI
- | error T_SEMI
- ;
-
-clrtyp:
- {
- clrtyp();
- }
- ;
-
-deftyp:
- /* empty */ {
- deftyp();
- }
- ;
-
-declspecs:
- clrtyp_typespec {
- addtype($1);
- }
- | declmods typespec {
- addtype($2);
- }
- | declspecs declmod
- | declspecs notype_typespec {
- addtype($2);
- }
- ;
-
-declmods:
- clrtyp T_QUAL {
- addqual($2);
- }
- | clrtyp T_SCLASS {
- addscl($2);
- }
- | declmods declmod
- ;
-
-declmod:
- T_QUAL {
- addqual($1);
- }
- | T_SCLASS {
- addscl($1);
- }
- ;
-
-clrtyp_typespec:
- clrtyp notype_typespec {
- $$ = $2;
- }
- | T_TYPENAME clrtyp {
- $$ = getsym($1)->s_type;
- }
- ;
-
-typespec:
- notype_typespec {
- $$ = $1;
- }
- | T_TYPENAME {
- $$ = getsym($1)->s_type;
- }
- ;
-
-notype_typespec:
- T_TYPE {
- $$ = gettyp($1);
- }
- | struct_spec {
- popdecl();
- $$ = $1;
- }
- | enum_spec {
- popdecl();
- $$ = $1;
- }
- ;
-
-struct_spec:
- struct struct_tag {
- /*
- * STDC requires that "struct a;" always introduces
- * a new tag if "a" is not declared at current level
- *
- * yychar is valid because otherwise the parser would
- * not been able to deceide if he must shift or reduce
- */
- $$ = mktag($2, $1, 0, yychar == T_SEMI);
- }
- | struct struct_tag {
- dcs->d_tagtyp = mktag($2, $1, 1, 0);
- } struct_declaration {
- $$ = compltag(dcs->d_tagtyp, $4);
- }
- | struct {
- dcs->d_tagtyp = mktag(NULL, $1, 1, 0);
- } struct_declaration {
- $$ = compltag(dcs->d_tagtyp, $3);
- }
- | struct error {
- symtyp = FVFT;
- $$ = gettyp(INT);
- }
- ;
-
-struct:
- T_SOU {
- symtyp = FTAG;
- pushdecl($1 == STRUCT ? MOS : MOU);
- dcs->d_offset = 0;
- dcs->d_stralign = CHAR_BIT;
- $$ = $1;
- }
- ;
-
-struct_tag:
- identifier {
- $$ = getsym($1);
- }
- ;
-
-struct_declaration:
- struct_decl_lbrace member_declaration_list_with_rbrace {
- $$ = $2;
- }
- ;
-
-struct_decl_lbrace:
- T_LBRACE {
- symtyp = FVFT;
- }
- ;
-
-member_declaration_list_with_rbrace:
- member_declaration_list T_SEMI T_RBRACE {
- $$ = $1;
- }
- | member_declaration_list T_RBRACE {
- if (sflag) {
- /* syntax req. ";" after last struct/union member */
- error(66);
- } else {
- /* syntax req. ";" after last struct/union member */
- warning(66);
- }
- $$ = $1;
- }
- | T_RBRACE {
- $$ = NULL;
- }
- ;
-
-member_declaration_list:
- member_declaration {
- $$ = $1;
- }
- | member_declaration_list T_SEMI member_declaration {
- $$ = lnklst($1, $3);
- }
- ;
-
-member_declaration:
- noclass_declmods deftyp {
- /* too late, i know, but getsym() compensates it */
- symtyp = FMOS;
- } notype_member_decls {
- symtyp = FVFT;
- $$ = $4;
- }
- | noclass_declspecs deftyp {
- symtyp = FMOS;
- } type_member_decls {
- symtyp = FVFT;
- $$ = $4;
- }
- | noclass_declmods deftyp {
- /* struct or union member must be named */
- warning(49);
- $$ = NULL;
- }
- | noclass_declspecs deftyp {
- /* struct or union member must be named */
- warning(49);
- $$ = NULL;
- }
- | error {
- symtyp = FVFT;
- $$ = NULL;
- }
- ;
-
-noclass_declspecs:
- clrtyp_typespec {
- addtype($1);
- }
- | noclass_declmods typespec {
- addtype($2);
- }
- | noclass_declspecs T_QUAL {
- addqual($2);
- }
- | noclass_declspecs notype_typespec {
- addtype($2);
- }
- ;
-
-noclass_declmods:
- clrtyp T_QUAL {
- addqual($2);
- }
- | noclass_declmods T_QUAL {
- addqual($2);
- }
- ;
-
-notype_member_decls:
- notype_member_decl {
- $$ = decl1str($1);
- }
- | notype_member_decls {
- symtyp = FMOS;
- } T_COMMA type_member_decl {
- $$ = lnklst($1, decl1str($4));
- }
- ;
-
-type_member_decls:
- type_member_decl {
- $$ = decl1str($1);
- }
- | type_member_decls {
- symtyp = FMOS;
- } T_COMMA type_member_decl {
- $$ = lnklst($1, decl1str($4));
- }
- ;
-
-notype_member_decl:
- notype_decl {
- $$ = $1;
- }
- | notype_decl T_COLON constant {
- $$ = bitfield($1, toicon($3, 1));
- }
- | {
- symtyp = FVFT;
- } T_COLON constant {
- $$ = bitfield(NULL, toicon($3, 1));
- }
- ;
-
-type_member_decl:
- type_decl {
- $$ = $1;
- }
- | type_decl T_COLON constant {
- $$ = bitfield($1, toicon($3, 1));
- }
- | {
- symtyp = FVFT;
- } T_COLON constant {
- $$ = bitfield(NULL, toicon($3, 1));
- }
- ;
-
-enum_spec:
- enum enum_tag {
- $$ = mktag($2, ENUM, 0, 0);
- }
- | enum enum_tag {
- dcs->d_tagtyp = mktag($2, ENUM, 1, 0);
- } enum_declaration {
- $$ = compltag(dcs->d_tagtyp, $4);
- }
- | enum {
- dcs->d_tagtyp = mktag(NULL, ENUM, 1, 0);
- } enum_declaration {
- $$ = compltag(dcs->d_tagtyp, $3);
- }
- | enum error {
- symtyp = FVFT;
- $$ = gettyp(INT);
- }
- ;
-
-enum:
- T_ENUM {
- symtyp = FTAG;
- pushdecl(ENUMCON);
- }
- ;
-
-enum_tag:
- identifier {
- $$ = getsym($1);
- }
- ;
-
-enum_declaration:
- enum_decl_lbrace enums_with_opt_comma T_RBRACE {
- $$ = $2;
- }
- ;
-
-enum_decl_lbrace:
- T_LBRACE {
- symtyp = FVFT;
- enumval = 0;
- }
- ;
-
-enums_with_opt_comma:
- enums {
- $$ = $1;
- }
- | enums T_COMMA {
- if (sflag) {
- /* trailing "," prohibited in enum declaration */
- error(54);
- } else {
- /* trailing "," prohibited in enum declaration */
- (void)gnuism(54);
- }
- $$ = $1;
- }
- ;
-
-enums:
- enumerator {
- $$ = $1;
- }
- | enums T_COMMA enumerator {
- $$ = lnklst($1, $3);
- }
- | error {
- $$ = NULL;
- }
- ;
-
-enumerator:
- ename {
- $$ = ename($1, enumval, 1);
- }
- | ename T_ASSIGN constant {
- $$ = ename($1, toicon($3, 1), 0);
- }
- ;
-
-ename:
- identifier {
- $$ = getsym($1);
- }
- ;
-
-
-notype_init_decls:
- notype_init_decl
- | notype_init_decls T_COMMA type_init_decl
- ;
-
-type_init_decls:
- type_init_decl
- | type_init_decls T_COMMA type_init_decl
- ;
-
-notype_init_decl:
- notype_decl opt_asm_or_symbolrename {
- idecl($1, 0, $2);
- chksz($1);
- }
- | notype_decl opt_asm_or_symbolrename {
- idecl($1, 1, $2);
- } T_ASSIGN initializer {
- chksz($1);
- }
- ;
-
-type_init_decl:
- type_decl opt_asm_or_symbolrename {
- idecl($1, 0, $2);
- chksz($1);
- }
- | type_decl opt_asm_or_symbolrename {
- idecl($1, 1, $2);
- } T_ASSIGN initializer {
- chksz($1);
- }
- ;
-
-notype_decl:
- notype_direct_decl {
- $$ = $1;
- }
- | pointer notype_direct_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-notype_direct_decl:
- T_NAME {
- $$ = dname(getsym($1));
- }
- | T_LPARN type_decl T_RPARN {
- $$ = $2;
- }
- | notype_direct_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | notype_direct_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3, 0));
- }
- | notype_direct_decl param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-type_decl:
- type_direct_decl {
- $$ = $1;
- }
- | pointer type_direct_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-type_direct_decl:
- identifier {
- $$ = dname(getsym($1));
- }
- | T_LPARN type_decl T_RPARN {
- $$ = $2;
- }
- | type_direct_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | type_direct_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3, 0));
- }
- | type_direct_decl param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-/*
- * param_decl and notype_param_decl exist to avoid a conflict in
- * argument lists. A typename enclosed in parens should always be
- * treated as a typename, not an argument.
- * "typedef int a; f(int (a));" is "typedef int a; f(int foo(a));"
- * not "typedef int a; f(int a);"
- */
-param_decl:
- direct_param_decl {
- $$ = $1;
- }
- | pointer direct_param_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-direct_param_decl:
- identifier {
- $$ = dname(getsym($1));
- }
- | T_LPARN notype_param_decl T_RPARN {
- $$ = $2;
- }
- | direct_param_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | direct_param_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3, 0));
- }
- | direct_param_decl param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-notype_param_decl:
- direct_notype_param_decl {
- $$ = $1;
- }
- | pointer direct_notype_param_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-direct_notype_param_decl:
- T_NAME {
- $$ = dname(getsym($1));
- }
- | T_LPARN notype_param_decl T_RPARN {
- $$ = $2;
- }
- | direct_notype_param_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | direct_notype_param_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3, 0));
- }
- | direct_notype_param_decl param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-pointer:
- asterisk {
- $$ = $1;
- }
- | asterisk type_qualifier_list {
- $$ = mergepq($1, $2);
- }
- | asterisk pointer {
- $$ = mergepq($1, $2);
- }
- | asterisk type_qualifier_list pointer {
- $$ = mergepq(mergepq($1, $2), $3);
- }
- ;
-
-asterisk:
- T_MULT {
- $$ = xcalloc(1, sizeof (pqinf_t));
- $$->p_pcnt = 1;
- }
- ;
-
-type_qualifier_list:
- type_qualifier {
- $$ = $1;
- }
- | type_qualifier_list type_qualifier {
- $$ = mergepq($1, $2);
- }
- ;
-
-type_qualifier:
- T_QUAL {
- $$ = xcalloc(1, sizeof (pqinf_t));
- if ($1 == CONST) {
- $$->p_const = 1;
- } else {
- $$->p_volatile = 1;
- }
- }
- ;
-
-param_list:
- id_list_lparn identifier_list T_RPARN {
- $$ = $2;
- }
- | abs_decl_param_list {
- $$ = $1;
- }
- ;
-
-id_list_lparn:
- T_LPARN {
- blklev++;
- pushdecl(PARG);
- }
- ;
-
-identifier_list:
- T_NAME {
- $$ = iname(getsym($1));
- }
- | identifier_list T_COMMA T_NAME {
- $$ = lnklst($1, iname(getsym($3)));
- }
- | identifier_list error {
- $$ = $1;
- }
- ;
-
-abs_decl_param_list:
- abs_decl_lparn T_RPARN {
- $$ = NULL;
- }
- | abs_decl_lparn vararg_parameter_type_list T_RPARN {
- dcs->d_proto = 1;
- $$ = $2;
- }
- | abs_decl_lparn error T_RPARN {
- $$ = NULL;
- }
- ;
-
-abs_decl_lparn:
- T_LPARN {
- blklev++;
- pushdecl(PARG);
- }
- ;
-
-vararg_parameter_type_list:
- parameter_type_list {
- $$ = $1;
- }
- | parameter_type_list T_COMMA T_ELLIPSE {
- dcs->d_vararg = 1;
- $$ = $1;
- }
- | T_ELLIPSE {
- if (sflag) {
- /* ANSI C requires formal parameter before "..." */
- error(84);
- } else if (!tflag) {
- /* ANSI C requires formal parameter before "..." */
- warning(84);
- }
- dcs->d_vararg = 1;
- $$ = NULL;
- }
- ;
-
-parameter_type_list:
- parameter_declaration {
- $$ = $1;
- }
- | parameter_type_list T_COMMA parameter_declaration {
- $$ = lnklst($1, $3);
- }
- ;
-
-parameter_declaration:
- declmods deftyp {
- $$ = decl1arg(aname(), 0);
- }
- | declspecs deftyp {
- $$ = decl1arg(aname(), 0);
- }
- | declmods deftyp notype_param_decl {
- $$ = decl1arg($3, 0);
- }
- /*
- * param_decl is needed because of following conflict:
- * "typedef int a; f(int (a));" could be parsed as
- * "function with argument a of type int", or
- * "function with an abstract argument of type function".
- * This grammar realizes the second case.
- */
- | declspecs deftyp param_decl {
- $$ = decl1arg($3, 0);
- }
- | declmods deftyp abs_decl {
- $$ = decl1arg($3, 0);
- }
- | declspecs deftyp abs_decl {
- $$ = decl1arg($3, 0);
- }
- ;
-
-opt_asm_or_symbolrename: /* expect only one */
- /* empty */ {
- $$ = NULL;
- }
- | T_ASM T_LPARN T_STRING T_RPARN {
- freeyyv(&$3, T_STRING);
- $$ = NULL;
- }
- | T_SYMBOLRENAME T_LPARN T_NAME T_RPARN {
- $$ = $3;
- }
- ;
-
-initializer:
- init_expr
- ;
-
-init_expr:
- expr %prec T_COMMA {
- mkinit($1);
- }
- | init_by_name init_expr %prec T_COMMA
- | init_lbrace init_expr_list init_rbrace
- | init_lbrace init_expr_list T_COMMA init_rbrace
- | error
- ;
-
-init_expr_list:
- init_expr %prec T_COMMA
- | init_expr_list T_COMMA init_expr
- ;
-
-lorange:
- constant T_ELLIPSE {
- $$.lo = toicon($1, 1);
- }
- ;
-range:
- constant {
- $$.lo = toicon($1, 1);
- $$.hi = $$.lo + 1;
- }
- | lorange constant {
- $$.lo = $1.lo;
- $$.hi = toicon($2, 1);
- }
- ;
-
-init_by_name:
- T_LBRACK range T_RBRACK T_ASSIGN {
- if (!Sflag)
- warning(321);
- }
- | point identifier T_ASSIGN {
- if (!Sflag)
- warning(313);
- memberpush($2);
- }
- | identifier T_COLON {
- gnuism(315);
- memberpush($1);
- }
- ;
-
-init_lbrace:
- T_LBRACE {
- initlbr();
- }
- ;
-
-init_rbrace:
- T_RBRACE {
- initrbr();
- }
- ;
-
-type_name:
- {
- pushdecl(ABSTRACT);
- } abstract_declaration {
- popdecl();
- $$ = $2->s_type;
- }
- ;
-
-abstract_declaration:
- noclass_declmods deftyp {
- $$ = decl1abs(aname());
- }
- | noclass_declspecs deftyp {
- $$ = decl1abs(aname());
- }
- | noclass_declmods deftyp abs_decl {
- $$ = decl1abs($3);
- }
- | noclass_declspecs deftyp abs_decl {
- $$ = decl1abs($3);
- }
- ;
-
-abs_decl:
- pointer {
- $$ = addptr(aname(), $1);
- }
- | direct_abs_decl {
- $$ = $1;
- }
- | pointer direct_abs_decl {
- $$ = addptr($2, $1);
- }
- ;
-
-direct_abs_decl:
- T_LPARN abs_decl T_RPARN {
- $$ = $2;
- }
- | T_LBRACK T_RBRACK {
- $$ = addarray(aname(), 0, 0);
- }
- | T_LBRACK constant T_RBRACK {
- $$ = addarray(aname(), 1, toicon($2, 0));
- }
- | direct_abs_decl T_LBRACK T_RBRACK {
- $$ = addarray($1, 0, 0);
- }
- | direct_abs_decl T_LBRACK constant T_RBRACK {
- $$ = addarray($1, 1, toicon($3, 0));
- }
- | abs_decl_param_list {
- $$ = addfunc(aname(), $1);
- popdecl();
- blklev--;
- }
- | direct_abs_decl abs_decl_param_list {
- $$ = addfunc($1, $2);
- popdecl();
- blklev--;
- }
- ;
-
-non_expr_stmnt:
- labeled_stmnt
- | comp_stmnt
- | selection_stmnt
- | iteration_stmnt
- | jump_stmnt {
- ftflg = 0;
- }
- | asm_stmnt
-
-stmnt:
- expr_stmnt
- | non_expr_stmnt
- ;
-
-labeled_stmnt:
- label stmnt
- ;
-
-label:
- identifier T_COLON {
- symtyp = FLAB;
- label(T_NAME, getsym($1), NULL);
- }
- | T_CASE constant T_COLON {
- label(T_CASE, NULL, $2);
- ftflg = 1;
- }
- | T_CASE constant T_ELLIPSE constant T_COLON {
- /* XXX: We don't fill all cases */
- label(T_CASE, NULL, $2);
- ftflg = 1;
- }
- | T_DEFAULT T_COLON {
- label(T_DEFAULT, NULL, NULL);
- ftflg = 1;
- }
- ;
-
-comp_stmnt:
- comp_stmnt_lbrace declaration_list opt_stmnt_list comp_stmnt_rbrace
- | comp_stmnt_lbrace opt_stmnt_list comp_stmnt_rbrace
- ;
-
-comp_stmnt_lbrace:
- T_LBRACE {
- blklev++;
- mblklev++;
- pushdecl(AUTO);
- }
- ;
-
-comp_stmnt_rbrace:
- T_RBRACE {
- popdecl();
- freeblk();
- mblklev--;
- blklev--;
- ftflg = 0;
- }
- ;
-
-opt_stmnt_list:
- /* empty */
- | stmnt_list
- ;
-
-stmnt_list:
- stmnt
- | stmnt_list stmnt {
- RESTORE();
- }
- | stmnt_list error T_SEMI
- ;
-
-expr_stmnt:
- expr T_SEMI {
- expr($1, 0, 0, 1);
- ftflg = 0;
- }
- | T_SEMI {
- ftflg = 0;
- }
- ;
-
-/*
- * The following two productions are used to implement
- * ({ [[decl-list] stmt-list] }).
- * XXX: This is not well tested.
- */
-expr_stmnt_val:
- expr T_SEMI {
- /* XXX: We should really do that only on the last name */
- if ($1->tn_op == NAME)
- $1->tn_sym->s_used = 1;
- $$ = $1;
- expr($1, 0, 0, 0);
- ftflg = 0;
- }
- | non_expr_stmnt {
- $$ = getnode();
- $$->tn_type = gettyp(VOID);
- }
- ;
-
-expr_stmnt_list:
- expr_stmnt_val
- | expr_stmnt_list expr_stmnt_val {
- $$ = $2;
- }
- | expr_stmnt_list expr_stmnt_val
- ;
-
-selection_stmnt:
- if_without_else {
- SAVE();
- if2();
- if3(0);
- }
- | if_without_else T_ELSE {
- SAVE();
- if2();
- } stmnt {
- CLRWFLGS();
- if3(1);
- }
- | if_without_else T_ELSE error {
- CLRWFLGS();
- if3(0);
- }
- | switch_expr stmnt {
- CLRWFLGS();
- switch2();
- }
- | switch_expr error {
- CLRWFLGS();
- switch2();
- }
- ;
-
-if_without_else:
- if_expr stmnt
- | if_expr error
- ;
-
-if_expr:
- T_IF T_LPARN expr T_RPARN {
- if1($3);
- CLRWFLGS();
- }
- ;
-
-switch_expr:
- T_SWITCH T_LPARN expr T_RPARN {
- switch1($3);
- CLRWFLGS();
- }
- ;
-
-do_stmnt:
- do stmnt {
- CLRWFLGS();
- }
- ;
-
-iteration_stmnt:
- while_expr stmnt {
- CLRWFLGS();
- while2();
- }
- | while_expr error {
- CLRWFLGS();
- while2();
- }
- | do_stmnt do_while_expr {
- do2($2);
- ftflg = 0;
- }
- | do error {
- CLRWFLGS();
- do2(NULL);
- }
- | for_exprs stmnt {
- CLRWFLGS();
- for2();
- }
- | for_exprs error {
- CLRWFLGS();
- for2();
- }
- ;
-
-while_expr:
- T_WHILE T_LPARN expr T_RPARN {
- while1($3);
- CLRWFLGS();
- }
- ;
-
-do:
- T_DO {
- do1();
- }
- ;
-
-do_while_expr:
- T_WHILE T_LPARN expr T_RPARN T_SEMI {
- $$ = $3;
- }
- ;
-
-for_exprs:
- T_FOR T_LPARN opt_expr T_SEMI opt_expr T_SEMI opt_expr T_RPARN {
- for1($3, $5, $7);
- CLRWFLGS();
- }
- ;
-
-opt_expr:
- /* empty */ {
- $$ = NULL;
- }
- | expr {
- $$ = $1;
- }
- ;
-
-jump_stmnt:
- goto identifier T_SEMI {
- dogoto(getsym($2));
- }
- | goto error T_SEMI {
- symtyp = FVFT;
- }
- | T_CONTINUE T_SEMI {
- docont();
- }
- | T_BREAK T_SEMI {
- dobreak();
- }
- | T_RETURN T_SEMI {
- doreturn(NULL);
- }
- | T_RETURN expr T_SEMI {
- doreturn($2);
- }
- ;
-
-goto:
- T_GOTO {
- symtyp = FLAB;
- }
- ;
-
-asm_stmnt:
- T_ASM T_LPARN read_until_rparn T_SEMI {
- setasm();
- }
- | T_ASM T_QUAL T_LPARN read_until_rparn T_SEMI {
- setasm();
- }
- | T_ASM error
- ;
-
-read_until_rparn:
- /* empty */ {
- ignuptorp();
- }
- ;
-
-declaration_list:
- declaration {
- CLRWFLGS();
- }
- | declaration_list declaration {
- CLRWFLGS();
- }
- ;
-
-constant:
- expr %prec T_COMMA {
- $$ = $1;
- }
- ;
-
-expr:
- expr T_MULT expr {
- $$ = build(MULT, $1, $3);
- }
- | expr T_DIVOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_ADDOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_SHFTOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_RELOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_EQOP expr {
- $$ = build($2, $1, $3);
- }
- | expr T_AND expr {
- $$ = build(AND, $1, $3);
- }
- | expr T_XOR expr {
- $$ = build(XOR, $1, $3);
- }
- | expr T_OR expr {
- $$ = build(OR, $1, $3);
- }
- | expr T_LOGAND expr {
- $$ = build(LOGAND, $1, $3);
- }
- | expr T_LOGOR expr {
- $$ = build(LOGOR, $1, $3);
- }
- | expr T_QUEST expr T_COLON expr {
- $$ = build(QUEST, $1, build(COLON, $3, $5));
- }
- | expr T_ASSIGN expr {
- $$ = build(ASSIGN, $1, $3);
- }
- | expr T_OPASS expr {
- $$ = build($2, $1, $3);
- }
- | expr T_COMMA expr {
- $$ = build(COMMA, $1, $3);
- }
- | term {
- $$ = $1;
- }
- ;
-
-term:
- T_NAME {
- /* XXX really necessary? */
- if (yychar < 0)
- yychar = yylex();
- $$ = getnnode(getsym($1), yychar);
- }
- | string {
- $$ = getsnode($1);
- }
- | T_CON {
- $$ = getcnode(gettyp($1->v_tspec), $1);
- }
- | T_LPARN expr T_RPARN {
- if ($2 != NULL)
- $2->tn_parn = 1;
- $$ = $2;
- }
- | T_LPARN comp_stmnt_lbrace declaration_list expr_stmnt_list {
- blklev--;
- mblklev--;
- initsym = mktempsym(duptyp($4->tn_type));
- mblklev++;
- blklev++;
- gnuism(320);
- } comp_stmnt_rbrace T_RPARN {
- $$ = getnnode(initsym, 0);
- }
- | T_LPARN comp_stmnt_lbrace expr_stmnt_list {
- blklev--;
- mblklev--;
- initsym = mktempsym($3->tn_type);
- mblklev++;
- blklev++;
- gnuism(320);
- } comp_stmnt_rbrace T_RPARN {
- $$ = getnnode(initsym, 0);
- }
- | term T_INCDEC {
- $$ = build($2 == INC ? INCAFT : DECAFT, $1, NULL);
- }
- | T_INCDEC term {
- $$ = build($1 == INC ? INCBEF : DECBEF, $2, NULL);
- }
- | T_MULT term {
- $$ = build(STAR, $2, NULL);
- }
- | T_AND term {
- $$ = build(AMPER, $2, NULL);
- }
- | T_UNOP term {
- $$ = build($1, $2, NULL);
- }
- | T_ADDOP term {
- if (tflag && $1 == PLUS) {
- /* unary + is illegal in traditional C */
- warning(100);
- }
- $$ = build($1 == PLUS ? UPLUS : UMINUS, $2, NULL);
- }
- | term T_LBRACK expr T_RBRACK {
- $$ = build(STAR, build(PLUS, $1, $3), NULL);
- }
- | term T_LPARN T_RPARN {
- $$ = funccall($1, NULL);
- }
- | term T_LPARN func_arg_list T_RPARN {
- $$ = funccall($1, $3);
- }
- | term point_or_arrow T_NAME {
- if ($1 != NULL) {
- sym_t *msym;
- /* XXX strmemb should be integrated in build() */
- if ($2 == ARROW) {
- /* must to this before strmemb is called */
- $1 = cconv($1);
- }
- msym = strmemb($1, $2, getsym($3));
- $$ = build($2, $1, getnnode(msym, 0));
- } else {
- $$ = NULL;
- }
- }
- | T_SIZEOF term %prec T_SIZEOF {
- if (($$ = $2 == NULL ? NULL : bldszof($2->tn_type)) != NULL)
- chkmisc($2, 0, 0, 0, 0, 0, 1);
- }
- | T_SIZEOF T_LPARN type_name T_RPARN %prec T_SIZEOF {
- $$ = bldszof($3);
- }
- | T_LPARN type_name T_RPARN term %prec T_UNOP {
- $$ = cast($4, $2);
- }
- | T_LPARN type_name T_RPARN %prec T_UNOP {
- sym_t *tmp = mktempsym($2);
- idecl(tmp, 1, NULL);
- } init_lbrace init_expr_list init_rbrace {
- if (!Sflag)
- gnuism(319);
- $$ = getnnode(initsym, 0);
- }
- ;
-
-string:
- T_STRING {
- $$ = $1;
- }
- | T_STRING string2 {
- $$ = catstrg($1, $2);
- }
- ;
-
-string2:
- T_STRING {
- if (tflag) {
- /* concatenated strings are illegal in traditional C */
- warning(219);
- }
- $$ = $1;
- }
- | string2 T_STRING {
- $$ = catstrg($1, $2);
- }
- ;
-
-func_arg_list:
- expr %prec T_COMMA {
- $$ = funcarg(NULL, $1);
- }
- | func_arg_list T_COMMA expr {
- $$ = funcarg($1, $3);
- }
- ;
-
-point_or_arrow:
- T_STROP {
- symtyp = FMOS;
- $$ = $1;
- }
- ;
-
-point:
- T_STROP {
- if ($1 != POINT)
- error(249);
- }
- ;
-
-identifier:
- T_NAME {
- $$ = $1;
- }
- | T_TYPENAME {
- $$ = $1;
- }
- ;
-
-%%
-
-/* ARGSUSED */
-int
-yyerror(char *msg)
-{
- error(249);
- if (++sytxerr >= 5)
- norecover();
- return (0);
-}
-
-static __inline int uq_gt(uint64_t, uint64_t);
-static __inline int
-uq_gt(uint64_t a, uint64_t b)
-{
-
- return (a > b);
-}
-
-static __inline int q_gt(int64_t, int64_t);
-static __inline int
-q_gt(int64_t a, int64_t b)
-{
-
- return (a > b);
-}
-
-#define q_lt(a, b) q_gt(b, a)
-
-/*
- * Gets a node for a constant and returns the value of this constant
- * as integer.
- * Is the node not constant or too large for int or of type float,
- * a warning will be printed.
- *
- * toicon() should be used only inside declarations. If it is used in
- * expressions, it frees the memory used for the expression.
- */
-static int
-toicon(tnode_t *tn, int required)
-{
- int i;
- tspec_t t;
- val_t *v;
-
- v = constant(tn, required);
-
- /*
- * Abstract declarations are used inside expression. To free
- * the memory would be a fatal error.
- */
- if (dcs->d_ctx != ABSTRACT)
- tfreeblk();
-
- if ((t = v->v_tspec) == FLOAT || t == DOUBLE || t == LDOUBLE) {
- i = (int)v->v_ldbl;
- /* integral constant expression expected */
- error(55);
- } else {
- i = (int)v->v_quad;
- if (isutyp(t)) {
- if (uq_gt((uint64_t)v->v_quad,
- (uint64_t)INT_MAX)) {
- /* integral constant too large */
- warning(56);
- }
- } else {
- if (q_gt(v->v_quad, (int64_t)INT_MAX) ||
- q_lt(v->v_quad, (int64_t)INT_MIN)) {
- /* integral constant too large */
- warning(56);
- }
- }
- }
- free(v);
- return (i);
-}
-
-static void
-idecl(sym_t *decl, int initflg, sbuf_t *rename)
-{
- char *s;
-
- initerr = 0;
- initsym = decl;
-
- switch (dcs->d_ctx) {
- case EXTERN:
- if (rename != NULL) {
- if (decl->s_rename != NULL)
- LERROR("idecl()");
-
- s = getlblk(1, rename->sb_len + 1);
- (void)memcpy(s, rename->sb_name, rename->sb_len + 1);
- decl->s_rename = s;
- freeyyv(&rename, T_NAME);
- }
- decl1ext(decl, initflg);
- break;
- case ARG:
- if (rename != NULL) {
- /* symbol renaming can't be used on function arguments */
- error(310);
- freeyyv(&rename, T_NAME);
- break;
- }
- (void)decl1arg(decl, initflg);
- break;
- case AUTO:
- if (rename != NULL) {
- /* symbol renaming can't be used on automatic variables */
- error(311);
- freeyyv(&rename, T_NAME);
- break;
- }
- decl1loc(decl, initflg);
- break;
- default:
- LERROR("idecl()");
- }
-
- if (initflg && !initerr)
- prepinit();
-}
-
-/*
- * Discard all input tokens up to and including the next
- * unmatched right paren
- */
-static void
-ignuptorp(void)
-{
- int level;
-
- if (yychar < 0)
- yychar = yylex();
- freeyyv(&yylval, yychar);
-
- level = 1;
- while (yychar != T_RPARN || --level > 0) {
- if (yychar == T_LPARN) {
- level++;
- } else if (yychar <= 0) {
- break;
- }
- freeyyv(&yylval, yychar = yylex());
- }
-
- yyclearin;
-}
Index: usr.bin/xlint/lint1/decl.c
===================================================================
--- usr.bin/xlint/lint1/decl.c
+++ /dev/null
@@ -1,3052 +0,0 @@
-/* $NetBSD: decl.c,v 1.33 2004/06/20 22:20:16 jmc Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: decl.c,v 1.33 2004/06/20 22:20:16 jmc Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint1.h"
-
-const char *unnamed = "<unnamed>";
-
-/* shared type structures for arithmtic types and void */
-static type_t *typetab;
-
-/* value of next enumerator during declaration of enum types */
-int enumval;
-
-/*
- * pointer to top element of a stack which contains informations local
- * to nested declarations
- */
-dinfo_t *dcs;
-
-static type_t *tdeferr(type_t *, tspec_t);
-static void settdsym(type_t *, sym_t *);
-static tspec_t mrgtspec(tspec_t, tspec_t);
-static void align(int, int);
-static sym_t *newtag(sym_t *, scl_t, int, int);
-static int eqargs(type_t *, type_t *, int *);
-static int mnoarg(type_t *, int *);
-static int chkosdef(sym_t *, sym_t *);
-static int chkptdecl(sym_t *, sym_t *);
-static sym_t *nsfunc(sym_t *, sym_t *);
-static void osfunc(sym_t *, sym_t *);
-static void ledecl(sym_t *);
-static int chkinit(sym_t *);
-static void chkausg(int, sym_t *);
-static void chkvusg(int, sym_t *);
-static void chklusg(sym_t *);
-static void chktusg(sym_t *);
-static void chkglvar(sym_t *);
-static void glchksz(sym_t *);
-
-/*
- * initializes all global vars used in declarations
- */
-void
-initdecl(void)
-{
- int i;
-
- /* declaration stack */
- if ((dcs = calloc(1, sizeof (dinfo_t))) == NULL)
- nomem();
- dcs->d_ctx = EXTERN;
- dcs->d_ldlsym = &dcs->d_dlsyms;
-
- /* type information and classification */
- inittyp();
-
- /* shared type structures */
- if ((typetab = calloc(NTSPEC, sizeof (type_t))) == NULL)
- nomem();
- for (i = 0; i < NTSPEC; i++)
- typetab[i].t_tspec = NOTSPEC;
- typetab[CHAR].t_tspec = CHAR;
- typetab[SCHAR].t_tspec = SCHAR;
- typetab[UCHAR].t_tspec = UCHAR;
- typetab[SHORT].t_tspec = SHORT;
- typetab[USHORT].t_tspec = USHORT;
- typetab[INT].t_tspec = INT;
- typetab[UINT].t_tspec = UINT;
- typetab[LONG].t_tspec = LONG;
- typetab[ULONG].t_tspec = ULONG;
- typetab[QUAD].t_tspec = QUAD;
- typetab[UQUAD].t_tspec = UQUAD;
- typetab[FLOAT].t_tspec = FLOAT;
- typetab[DOUBLE].t_tspec = DOUBLE;
- typetab[LDOUBLE].t_tspec = LDOUBLE;
- typetab[VOID].t_tspec = VOID;
- /*
- * Next two are not real types. They are only used by the parser
- * to return keywords "signed" and "unsigned"
- */
- typetab[SIGNED].t_tspec = SIGNED;
- typetab[UNSIGN].t_tspec = UNSIGN;
-}
-
-/*
- * Returns a shared type structure vor arithmetic types and void.
- *
- * It's important to duplicate this structure (using duptyp() or tdupdyp())
- * if it is to be modified (adding qualifiers or anything else).
- */
-type_t *
-gettyp(tspec_t t)
-{
-
- return (&typetab[t]);
-}
-
-type_t *
-duptyp(const type_t *tp)
-{
- type_t *ntp;
-
- ntp = getblk(sizeof (type_t));
- STRUCT_ASSIGN(*ntp, *tp);
- return (ntp);
-}
-
-/*
- * Use tduptyp() instead of duptyp() inside expressions (if the
- * allocated memory should be freed after the expr).
- */
-type_t *
-tduptyp(const type_t *tp)
-{
- type_t *ntp;
-
- ntp = tgetblk(sizeof (type_t));
- STRUCT_ASSIGN(*ntp, *tp);
- return (ntp);
-}
-
-/*
- * Returns 1 if the argument is void or an incomplete array,
- * struct, union or enum type.
- */
-int
-incompl(type_t *tp)
-{
- tspec_t t;
-
- if ((t = tp->t_tspec) == VOID) {
- return (1);
- } else if (t == ARRAY) {
- return (tp->t_aincompl);
- } else if (t == STRUCT || t == UNION) {
- return (tp->t_str->sincompl);
- } else if (t == ENUM) {
- return (tp->t_enum->eincompl);
- }
- return (0);
-}
-
-/*
- * Set the flag for (in)complete array, struct, union or enum
- * types.
- */
-void
-setcompl(type_t *tp, int ic)
-{
- tspec_t t;
-
- if ((t = tp->t_tspec) == ARRAY) {
- tp->t_aincompl = ic;
- } else if (t == STRUCT || t == UNION) {
- tp->t_str->sincompl = ic;
- } else {
- if (t != ENUM)
- LERROR("setcompl()");
- tp->t_enum->eincompl = ic;
- }
-}
-
-/*
- * Remember the storage class of the current declaration in dcs->d_scl
- * (the top element of the declaration stack) and detect multiple
- * storage classes.
- */
-void
-addscl(scl_t sc)
-{
-
- if (sc == INLINE) {
- if (dcs->d_inline)
- /* duplicate '%s' */
- warning(10, "inline");
- dcs->d_inline = 1;
- return;
- }
- if (dcs->d_type != NULL || dcs->d_atyp != NOTSPEC ||
- dcs->d_smod != NOTSPEC || dcs->d_lmod != NOTSPEC) {
- /* storage class after type is obsolescent */
- warning(83);
- }
- if (dcs->d_scl == NOSCL) {
- dcs->d_scl = sc;
- } else {
- /*
- * multiple storage classes. An error will be reported in
- * deftyp().
- */
- dcs->d_mscl = 1;
- }
-}
-
-/*
- * Remember the type, modifier or typedef name returned by the parser
- * in *dcs (top element of decl stack). This information is used in
- * deftyp() to build the type used for all declarators in this
- * declaration.
- *
- * Is tp->t_typedef 1, the type comes from a previously defined typename.
- * Otherwise it comes from a type specifier (int, long, ...) or a
- * struct/union/enum tag.
- */
-void
-addtype(type_t *tp)
-{
- tspec_t t;
-
- if (tp->t_typedef) {
- if (dcs->d_type != NULL || dcs->d_atyp != NOTSPEC ||
- dcs->d_lmod != NOTSPEC || dcs->d_smod != NOTSPEC) {
- /*
- * something like "typedef int a; int a b;"
- * This should not happen with current grammar.
- */
- LERROR("addtype()");
- }
- dcs->d_type = tp;
- return;
- }
-
- t = tp->t_tspec;
-
- if (t == STRUCT || t == UNION || t == ENUM) {
- /*
- * something like "int struct a ..."
- * struct/union/enum with anything else is not allowed
- */
- if (dcs->d_type != NULL || dcs->d_atyp != NOTSPEC ||
- dcs->d_lmod != NOTSPEC || dcs->d_smod != NOTSPEC) {
- /*
- * remember that an error must be reported in
- * deftyp().
- */
- dcs->d_terr = 1;
- dcs->d_atyp = dcs->d_lmod = dcs->d_smod = NOTSPEC;
- }
- dcs->d_type = tp;
- return;
- }
-
- if (dcs->d_type != NULL && !dcs->d_type->t_typedef) {
- /*
- * something like "struct a int"
- * struct/union/enum with anything else is not allowed
- */
- dcs->d_terr = 1;
- return;
- }
-
- if (t == LONG && dcs->d_lmod == LONG) {
- /* "long long" or "long ... long" */
- t = QUAD;
- dcs->d_lmod = NOTSPEC;
- if (!quadflg)
- /* %s C does not support 'long long' */
- (void)c99ism(265, tflag ? "traditional" : "c89");
- }
-
- if (dcs->d_type != NULL && dcs->d_type->t_typedef) {
- /* something like "typedef int a; a long ..." */
- dcs->d_type = tdeferr(dcs->d_type, t);
- return;
- }
-
- /* now it can be only a combination of arithmetic types and void */
- if (t == SIGNED || t == UNSIGN) {
- /* remember specifiers "signed" and "unsigned" in dcs->d_smod */
- if (dcs->d_smod != NOTSPEC)
- /*
- * more than one "signed" and/or "unsigned"; print
- * an error in deftyp()
- */
- dcs->d_terr = 1;
- dcs->d_smod = t;
- } else if (t == SHORT || t == LONG || t == QUAD) {
- /*
- * remember specifiers "short", "long" and "long long" in
- * dcs->d_lmod
- */
- if (dcs->d_lmod != NOTSPEC)
- /* more than one, print error in deftyp() */
- dcs->d_terr = 1;
- dcs->d_lmod = t;
- } else {
- /*
- * remember specifiers "void", "char", "int", "float" or
- * "double" int dcs->d_atyp
- */
- if (dcs->d_atyp != NOTSPEC)
- /* more than one, print error in deftyp() */
- dcs->d_terr = 1;
- dcs->d_atyp = t;
- }
-}
-
-/*
- * called if a list of declaration specifiers contains a typedef name
- * and other specifiers (except struct, union, enum, typedef name)
- */
-static type_t *
-tdeferr(type_t *td, tspec_t t)
-{
- tspec_t t2;
-
- t2 = td->t_tspec;
-
- switch (t) {
- case SIGNED:
- case UNSIGN:
- if (t2 == CHAR || t2 == SHORT || t2 == INT || t2 == LONG ||
- t2 == QUAD) {
- if (!tflag)
- /* modifying typedef with ... */
- warning(5, ttab[t].tt_name);
- td = duptyp(gettyp(mrgtspec(t2, t)));
- td->t_typedef = 1;
- return (td);
- }
- break;
- case SHORT:
- if (t2 == INT || t2 == UINT) {
- /* modifying typedef with ... */
- warning(5, "short");
- td = duptyp(gettyp(t2 == INT ? SHORT : USHORT));
- td->t_typedef = 1;
- return (td);
- }
- break;
- case LONG:
- if (t2 == INT || t2 == UINT || t2 == LONG || t2 == ULONG ||
- t2 == FLOAT || t2 == DOUBLE) {
- /* modifying typedef with ... */
- warning(5, "long");
- if (t2 == INT) {
- td = gettyp(LONG);
- } else if (t2 == UINT) {
- td = gettyp(ULONG);
- } else if (t2 == LONG) {
- td = gettyp(QUAD);
- } else if (t2 == ULONG) {
- td = gettyp(UQUAD);
- } else if (t2 == FLOAT) {
- td = gettyp(DOUBLE);
- } else if (t2 == DOUBLE) {
- td = gettyp(LDOUBLE);
- }
- td = duptyp(td);
- td->t_typedef = 1;
- return (td);
- }
- break;
- /* LINTED (enumeration values not handled in switch) */
- case NOTSPEC:
- case USHORT:
- case UCHAR:
- case SCHAR:
- case CHAR:
- case FUNC:
- case ARRAY:
- case PTR:
- case ENUM:
- case UNION:
- case STRUCT:
- case VOID:
- case LDOUBLE:
- case DOUBLE:
- case FLOAT:
- case UQUAD:
- case QUAD:
- case ULONG:
- case UINT:
- case INT:
- break;
- }
-
- /* Anything other is not accepted. */
-
- dcs->d_terr = 1;
- return (td);
-}
-
-/*
- * Remember the symbol of a typedef name (2nd arg) in a struct, union
- * or enum tag if the typedef name is the first defined for this tag.
- *
- * If the tag is unnamed, the typdef name is used for identification
- * of this tag in lint2. Although its possible that more than one typedef
- * name is defined for one tag, the first name defined should be unique
- * if the tag is unnamed.
- */
-static void
-settdsym(type_t *tp, sym_t *sym)
-{
- tspec_t t;
-
- if ((t = tp->t_tspec) == STRUCT || t == UNION) {
- if (tp->t_str->stdef == NULL)
- tp->t_str->stdef = sym;
- } else if (t == ENUM) {
- if (tp->t_enum->etdef == NULL)
- tp->t_enum->etdef = sym;
- }
-}
-
-/*
- * Remember a qualifier which is part of the declaration specifiers
- * (and not the declarator) in the top element of the declaration stack.
- * Also detect multiple qualifiers of the same kind.
-
- * The remembered qualifier is used by deftyp() to construct the type
- * for all declarators.
- */
-void
-addqual(tqual_t q)
-{
-
- if (q == CONST) {
- if (dcs->d_const) {
- /* duplicate "%s" */
- warning(10, "const");
- }
- dcs->d_const = 1;
- } else {
- if (q != VOLATILE)
- LERROR("addqual()");
- if (dcs->d_volatile) {
- /* duplicate "%s" */
- warning(10, "volatile");
- }
- dcs->d_volatile = 1;
- }
-}
-
-/*
- * Go to the next declaration level (structs, nested structs, blocks,
- * argument declaration lists ...)
- */
-void
-pushdecl(scl_t sc)
-{
- dinfo_t *di;
-
- if (dflag)
- (void)printf("pushdecl(%d)\n", (int)sc);
-
- /* put a new element on the declaration stack */
- if ((di = calloc(1, sizeof (dinfo_t))) == NULL)
- nomem();
- di->d_nxt = dcs;
- dcs = di;
- di->d_ctx = sc;
- di->d_ldlsym = &di->d_dlsyms;
-}
-
-/*
- * Go back to previous declaration level
- */
-void
-popdecl(void)
-{
- dinfo_t *di;
-
- if (dflag)
- (void)printf("popdecl(%d)\n", (int)dcs->d_ctx);
-
- if (dcs->d_nxt == NULL)
- LERROR("popdecl()");
- di = dcs;
- dcs = di->d_nxt;
- switch (di->d_ctx) {
- case EXTERN:
- /* there is nothing after external declarations */
- LERROR("popdecl()");
- /* NOTREACHED */
- case MOS:
- case MOU:
- case ENUMCON:
- /*
- * Symbols declared in (nested) structs or enums are
- * part of the next level (they are removed from the
- * symbol table if the symbols of the outher level are
- * removed)
- */
- if ((*dcs->d_ldlsym = di->d_dlsyms) != NULL)
- dcs->d_ldlsym = di->d_ldlsym;
- break;
- case ARG:
- /*
- * All symbols in dcs->d_dlsyms are introduced in old style
- * argument declarations (it's not clean, but possible).
- * They are appended to the list of symbols declared in
- * an old style argument identifier list or a new style
- * parameter type list.
- */
- if (di->d_dlsyms != NULL) {
- *di->d_ldlsym = dcs->d_fpsyms;
- dcs->d_fpsyms = di->d_dlsyms;
- }
- break;
- case ABSTRACT:
- /*
- * casts and sizeof
- * Append all symbols declared in the abstract declaration
- * to the list of symbols declared in the surrounding decl.
- * or block.
- * XXX I'm not sure whether they should be removed from the
- * symbol table now or later.
- */
- if ((*dcs->d_ldlsym = di->d_dlsyms) != NULL)
- dcs->d_ldlsym = di->d_ldlsym;
- break;
- case AUTO:
- /* check usage of local vars */
- chkusage(di);
- /* FALLTHROUGH */
- case PARG:
- /* usage of arguments will be checked by funcend() */
- rmsyms(di->d_dlsyms);
- break;
- default:
- LERROR("popdecl()");
- }
- free(di);
-}
-
-/*
- * Set flag d_asm in all declaration stack elements up to the
- * outermost one.
- *
- * This is used to mark compound statements which have, possibly in
- * nested compound statements, asm statements. For these compound
- * statements no warnings about unused or unitialized variables are
- * printed.
- *
- * There is no need to clear d_asm in dinfo structs with context AUTO,
- * because these structs are freed at the end of the compound statement.
- * But it must be cleard in the outermost dinfo struct, which has
- * context EXTERN. This could be done in clrtyp() and would work for
- * C, but not for C++ (due to mixed statements and declarations). Thus
- * we clear it in glclup(), which is used to do some cleanup after
- * global declarations/definitions.
- */
-void
-setasm(void)
-{
- dinfo_t *di;
-
- for (di = dcs; di != NULL; di = di->d_nxt)
- di->d_asm = 1;
-}
-
-/*
- * Clean all elements of the top element of declaration stack which
- * will be used by the next declaration
- */
-void
-clrtyp(void)
-{
-
- dcs->d_atyp = dcs->d_smod = dcs->d_lmod = NOTSPEC;
- dcs->d_scl = NOSCL;
- dcs->d_type = NULL;
- dcs->d_const = dcs->d_volatile = 0;
- dcs->d_inline = 0;
- dcs->d_mscl = dcs->d_terr = 0;
- dcs->d_nedecl = 0;
- dcs->d_notyp = 0;
-}
-
-/*
- * Create a type structure from the informations gathered in
- * the declaration stack.
- * Complain about storage classes which are not possible in current
- * context.
- */
-void
-deftyp(void)
-{
- tspec_t t, s, l;
- type_t *tp;
- scl_t scl;
-
- t = dcs->d_atyp; /* CHAR, INT, FLOAT, DOUBLE, VOID */
- s = dcs->d_smod; /* SIGNED, UNSIGNED */
- l = dcs->d_lmod; /* SHORT, LONG, QUAD */
- tp = dcs->d_type;
- scl = dcs->d_scl;
-
- if (t == NOTSPEC && s == NOTSPEC && l == NOTSPEC && tp == NULL)
- dcs->d_notyp = 1;
-
- if (tp != NULL && (t != NOTSPEC || s != NOTSPEC || l != NOTSPEC)) {
- /* should never happen */
- LERROR("deftyp()");
- }
-
- if (tp == NULL) {
- switch (t) {
- case NOTSPEC:
- t = INT;
- /* FALLTHROUGH */
- case INT:
- if (s == NOTSPEC)
- s = SIGNED;
- break;
- case CHAR:
- if (l != NOTSPEC) {
- dcs->d_terr = 1;
- l = NOTSPEC;
- }
- break;
- case FLOAT:
- if (l == LONG) {
- l = NOTSPEC;
- t = DOUBLE;
- if (!tflag)
- /* use 'double' instead of ... */
- warning(6);
- }
- break;
- case DOUBLE:
- if (l == LONG) {
- l = NOTSPEC;
- t = LDOUBLE;
- if (tflag)
- /* 'long double' is illegal in ... */
- warning(266);
- }
- break;
- case VOID:
- break;
- default:
- LERROR("deftyp()");
- }
- if (t != INT && t != CHAR && (s != NOTSPEC || l != NOTSPEC)) {
- dcs->d_terr = 1;
- l = s = NOTSPEC;
- }
- if (l != NOTSPEC)
- t = l;
- dcs->d_type = gettyp(mrgtspec(t, s));
- }
-
- if (dcs->d_mscl) {
- /* only one storage class allowed */
- error(7);
- }
- if (dcs->d_terr) {
- /* illegal type combination */
- error(4);
- }
-
- if (dcs->d_ctx == EXTERN) {
- if (scl == REG || scl == AUTO) {
- /* illegal storage class */
- error(8);
- scl = NOSCL;
- }
- } else if (dcs->d_ctx == ARG || dcs->d_ctx == PARG) {
- if (scl != NOSCL && scl != REG) {
- /* only "register" valid ... */
- error(9);
- scl = NOSCL;
- }
- }
-
- dcs->d_scl = scl;
-
- if (dcs->d_const && dcs->d_type->t_const) {
- if (!dcs->d_type->t_typedef)
- LERROR("deftyp()");
- /* typedef already qualified with "%s" */
- warning(68, "const");
- }
- if (dcs->d_volatile && dcs->d_type->t_volatile) {
- if (!dcs->d_type->t_typedef)
- LERROR("deftyp()");
- /* typedef already qualified with "%s" */
- warning(68, "volatile");
- }
-
- if (dcs->d_const || dcs->d_volatile) {
- dcs->d_type = duptyp(dcs->d_type);
- dcs->d_type->t_const |= dcs->d_const;
- dcs->d_type->t_volatile |= dcs->d_volatile;
- }
-}
-
-/*
- * Merge type specifiers (char, ..., long long, signed, unsigned).
- */
-static tspec_t
-mrgtspec(tspec_t t, tspec_t s)
-{
-
- if (s == SIGNED || s == UNSIGN) {
- if (t == CHAR) {
- t = s == SIGNED ? SCHAR : UCHAR;
- } else if (t == SHORT) {
- t = s == SIGNED ? SHORT : USHORT;
- } else if (t == INT) {
- t = s == SIGNED ? INT : UINT;
- } else if (t == LONG) {
- t = s == SIGNED ? LONG : ULONG;
- } else if (t == QUAD) {
- t = s == SIGNED ? QUAD : UQUAD;
- }
- }
-
- return (t);
-}
-
-/*
- * Return the length of a type in bit.
- *
- * Printing a message if the outhermost dimension of an array is 0 must
- * be done by the caller. All other problems are reported by length()
- * if name is not NULL.
- */
-int
-length(type_t *tp, const char *name)
-{
- int elem, elsz;
-
- elem = 1;
- while (tp && tp->t_tspec == ARRAY) {
- elem *= tp->t_dim;
- tp = tp->t_subt;
- }
- if (tp == NULL)
- return -1;
-
- switch (tp->t_tspec) {
- case FUNC:
- /* compiler takes size of function */
- LERROR("%s", msgs[12]);
- /* NOTREACHED */
- case STRUCT:
- case UNION:
- if (incompl(tp) && name != NULL) {
- /* incomplete structure or union %s: %s */
- error(31, tp->t_str->stag->s_name, name);
- }
- elsz = tp->t_str->size;
- break;
- case ENUM:
- if (incompl(tp) && name != NULL) {
- /* incomplete enum type: %s */
- warning(13, name);
- }
- /* FALLTHROUGH */
- default:
- elsz = size(tp->t_tspec);
- if (elsz <= 0)
- LERROR("length()");
- break;
- }
- return (elem * elsz);
-}
-
-/*
- * Get the alignment of the given type in bits.
- */
-int
-getbound(type_t *tp)
-{
- int a;
- tspec_t t;
-
- while (tp && tp->t_tspec == ARRAY)
- tp = tp->t_subt;
-
- if (tp == NULL)
- return -1;
-
- if ((t = tp->t_tspec) == STRUCT || t == UNION) {
- a = tp->t_str->align;
- } else if (t == FUNC) {
- /* compiler takes alignment of function */
- error(14);
- a = LINT_ALIGN(1) * CHAR_BIT;
- } else {
- if ((a = size(t)) == 0) {
- a = CHAR_BIT;
- } else if (a > LINT_ALIGN(1) * CHAR_BIT) {
- a = LINT_ALIGN(1) * CHAR_BIT;
- }
- }
- if (a < CHAR_BIT || a > LINT_ALIGN(1) * CHAR_BIT)
- LERROR("getbound()");
- return (a);
-}
-
-/*
- * Concatenate two lists of symbols by s_nxt. Used by declarations of
- * struct/union/enum elements and parameters.
- */
-sym_t *
-lnklst(sym_t *l1, sym_t *l2)
-{
- sym_t *l;
-
- if ((l = l1) == NULL)
- return (l2);
- while (l1->s_nxt != NULL)
- l1 = l1->s_nxt;
- l1->s_nxt = l2;
- return (l);
-}
-
-/*
- * Check if the type of the given symbol is valid and print an error
- * message if it is not.
- *
- * Invalid types are:
- * - arrays of incomlete types or functions
- * - functions returning arrays or functions
- * - void types other than type of function or pointer
- */
-void
-chktyp(sym_t *sym)
-{
- tspec_t to, t;
- type_t **tpp, *tp;
-
- tpp = &sym->s_type;
- to = NOTSPEC;
- while ((tp = *tpp) != NULL) {
- t = tp->t_tspec;
- /*
- * If this is the type of an old style function definition,
- * a better warning is printed in funcdef().
- */
- if (t == FUNC && !tp->t_proto &&
- !(to == NOTSPEC && sym->s_osdef)) {
- if (sflag && hflag)
- /* function declaration is not a prototype */
- warning(287);
- }
- if (to == FUNC) {
- if (t == FUNC || t == ARRAY) {
- /* function returns illegal type */
- error(15);
- if (t == FUNC) {
- *tpp = incref(*tpp, PTR);
- } else {
- *tpp = incref((*tpp)->t_subt, PTR);
- }
- return;
- } else if (tp->t_const || tp->t_volatile) {
- if (sflag) { /* XXX oder better !tflag ? */
- /* function cannot return const... */
- warning(228);
- }
- }
- } if (to == ARRAY) {
- if (t == FUNC) {
- /* array of function is illegal */
- error(16);
- *tpp = gettyp(INT);
- return;
- } else if (t == ARRAY && tp->t_dim == 0) {
- /* null dimension */
- error(17);
- return;
- } else if (t == VOID) {
- /* illegal use of void */
- error(18);
- *tpp = gettyp(INT);
-#if 0 /* errors are produced by length() */
- } else if (incompl(tp)) {
- /* array of incomplete type */
- if (sflag) {
- error(301);
- } else {
- warning(301);
- }
-#endif
- }
- } else if (to == NOTSPEC && t == VOID) {
- if (dcs->d_ctx == PARG) {
- if (sym->s_scl != ABSTRACT) {
- if (sym->s_name == unnamed)
- LERROR("chktyp()");
- /* void param cannot have name: %s */
- error(61, sym->s_name);
- *tpp = gettyp(INT);
- }
- } else if (dcs->d_ctx == ABSTRACT) {
- /* ok */
- } else if (sym->s_scl != TYPEDEF) {
- /* void type for %s */
- error(19, sym->s_name);
- *tpp = gettyp(INT);
- }
- }
- if (t == VOID && to != PTR) {
- if (tp->t_const || tp->t_volatile) {
- /* inappropriate qualifiers with "void" */
- warning(69);
- tp->t_const = tp->t_volatile = 0;
- }
- }
- tpp = &tp->t_subt;
- to = t;
- }
-}
-
-/*
- * Process the declarator of a struct/union element.
- */
-sym_t *
-decl1str(sym_t *dsym)
-{
- type_t *tp;
- tspec_t t;
- int sz, len;
- int o = 0; /* Appease gcc */
- scl_t sc;
-
- if ((sc = dsym->s_scl) != MOS && sc != MOU)
- LERROR("decl1str()");
-
- if (dcs->d_rdcsym != NULL) {
- if ((sc = dcs->d_rdcsym->s_scl) != MOS && sc != MOU)
- /* should be ensured by storesym() */
- LERROR("decl1str()");
- if (dsym->s_styp == dcs->d_rdcsym->s_styp) {
- /* duplicate member name: %s */
- error(33, dsym->s_name);
- rmsym(dcs->d_rdcsym);
- }
- }
-
- chktyp(dsym);
-
- t = (tp = dsym->s_type)->t_tspec;
-
- if (dsym->s_field) {
- /*
- * bit field
- *
- * only unsigned and signed int are portable bit-field types
- * (at least in ANSI C, in traditional C only unsigned int)
- */
- if (t == CHAR || t == UCHAR || t == SCHAR ||
- t == SHORT || t == USHORT || t == ENUM) {
- if (bitfieldtype_ok == 0) {
- if (sflag) {
- char buf[64];
- /*
- * bit-field type '%s' invalid in
- * ANSI C
- */
- warning(273,
- tyname(buf, sizeof(buf), tp));
- } else if (pflag) {
- /* nonportable bit-field type */
- warning(34);
- }
- }
- } else if (t == INT && dcs->d_smod == NOTSPEC) {
- if (pflag && bitfieldtype_ok == 0) {
- /* nonportable bit-field type */
- warning(34);
- }
- } else if (t != INT && t != UINT) {
- /*
- * Non-integer types are always illegal for
- * bitfields, regardless of BITFIELDTYPE.
- * Integer types not dealt with above are
- * okay only if BITFIELDTYPE is in effect.
- */
- if (bitfieldtype_ok == 0 || isityp(t) == 0) {
- /* illegal bit-field type */
- error(35);
- sz = tp->t_flen;
- dsym->s_type = tp = duptyp(gettyp(t = INT));
- if ((tp->t_flen = sz) > size(t))
- tp->t_flen = size(t);
- }
- }
- if ((len = tp->t_flen) < 0 || len > size(t)) {
- /* illegal bit-field size */
- error(36);
- tp->t_flen = size(t);
- } else if (len == 0 && dsym->s_name != unnamed) {
- /* zero size bit-field */
- error(37);
- tp->t_flen = size(t);
- }
- if (dsym->s_scl == MOU) {
- /* illegal use of bit-field */
- error(41);
- dsym->s_type->t_isfield = 0;
- dsym->s_field = 0;
- }
- } else if (t == FUNC) {
- /* function illegal in structure or union */
- error(38);
- dsym->s_type = tp = incref(tp, t = PTR);
- }
-
- /*
- * bit-fields of length 0 are not warned about because length()
- * does not return the length of the bit-field but the length
- * of the type the bit-field is packed in (its ok)
- */
- if ((sz = length(dsym->s_type, dsym->s_name)) == 0) {
- if (t == ARRAY && dsym->s_type->t_dim == 0) {
- /* illegal zero sized structure member: %s */
- c99ism(39, dsym->s_name);
- }
- }
-
- if (dcs->d_ctx == MOU) {
- o = dcs->d_offset;
- dcs->d_offset = 0;
- }
- if (dsym->s_field) {
- align(getbound(tp), tp->t_flen);
- dsym->s_value.v_quad = (dcs->d_offset / size(t)) * size(t);
- tp->t_foffs = dcs->d_offset - (int)dsym->s_value.v_quad;
- dcs->d_offset += tp->t_flen;
- } else {
- align(getbound(tp), 0);
- dsym->s_value.v_quad = dcs->d_offset;
- dcs->d_offset += sz;
- }
- if (dcs->d_ctx == MOU) {
- if (o > dcs->d_offset)
- dcs->d_offset = o;
- }
-
- chkfdef(dsym, 0);
-
- /*
- * Clear the BITFIELDTYPE indicator after processing each
- * structure element.
- */
- bitfieldtype_ok = 0;
-
- return (dsym);
-}
-
-/*
- * Aligns next structure element as required.
- *
- * al contains the required alignment, len the length of a bit-field.
- */
-static void
-align(int al, int len)
-{
- int no;
-
- /*
- * The alignment of the current element becomes the alignment of
- * the struct/union if it is larger than the current alignment
- * of the struct/union.
- */
- if (al > dcs->d_stralign)
- dcs->d_stralign = al;
-
- no = roundup2(dcs->d_offset, al);
- if (len == 0 || dcs->d_offset + len > no)
- dcs->d_offset = no;
-}
-
-/*
- * Remember the width of the field in its type structure.
- */
-sym_t *
-bitfield(sym_t *dsym, int len)
-{
-
- if (dsym == NULL) {
- dsym = getblk(sizeof (sym_t));
- dsym->s_name = unnamed;
- dsym->s_kind = FMOS;
- dsym->s_scl = MOS;
- dsym->s_type = gettyp(UINT);
- dsym->s_blklev = -1;
- }
- dsym->s_type = duptyp(dsym->s_type);
- dsym->s_type->t_isfield = 1;
- dsym->s_type->t_flen = len;
- dsym->s_field = 1;
- return (dsym);
-}
-
-/*
- * Collect informations about a sequence of asterisks and qualifiers
- * in a list of type pqinf_t.
- * Qualifiers refer always to the left asterisk. The rightmost asterisk
- * will be at the top of the list.
- */
-pqinf_t *
-mergepq(pqinf_t *p1, pqinf_t *p2)
-{
- pqinf_t *p;
-
- if (p2->p_pcnt != 0) {
- /* left '*' at the end of the list */
- for (p = p2; p->p_nxt != NULL; p = p->p_nxt)
- continue;
- p->p_nxt = p1;
- return (p2);
- } else {
- if (p2->p_const) {
- if (p1->p_const) {
- /* duplicate %s */
- warning(10, "const");
- }
- p1->p_const = 1;
- }
- if (p2->p_volatile) {
- if (p1->p_volatile) {
- /* duplicate %s */
- warning(10, "volatile");
- }
- p1->p_volatile = 1;
- }
- free(p2);
- return (p1);
- }
-}
-
-/*
- * Followint 3 functions extend the type of a declarator with
- * pointer, function and array types.
- *
- * The current type is the type built by deftyp() (dcs->d_type) and
- * pointer, function and array types already added for this
- * declarator. The new type extension is inserted between both.
- */
-sym_t *
-addptr(sym_t *decl, pqinf_t *pi)
-{
- type_t **tpp, *tp;
- pqinf_t *npi;
-
- tpp = &decl->s_type;
- while (*tpp && *tpp != dcs->d_type)
- tpp = &(*tpp)->t_subt;
- if (*tpp == NULL)
- return decl;
-
- while (pi != NULL) {
- *tpp = tp = getblk(sizeof (type_t));
- tp->t_tspec = PTR;
- tp->t_const = pi->p_const;
- tp->t_volatile = pi->p_volatile;
- *(tpp = &tp->t_subt) = dcs->d_type;
- npi = pi->p_nxt;
- free(pi);
- pi = npi;
- }
- return (decl);
-}
-
-/*
- * If a dimension was specified, dim is 1, otherwise 0
- * n is the specified dimension
- */
-sym_t *
-addarray(sym_t *decl, int dim, int n)
-{
- type_t **tpp, *tp;
-
- tpp = &decl->s_type;
- while (*tpp && *tpp != dcs->d_type)
- tpp = &(*tpp)->t_subt;
- if (*tpp == NULL)
- return decl;
-
- *tpp = tp = getblk(sizeof (type_t));
- tp->t_tspec = ARRAY;
- tp->t_subt = dcs->d_type;
- tp->t_dim = n;
-
- if (n < 0) {
- /* negative array dimension */
- error(20, n);
- n = 0;
- } else if (n == 0 && dim) {
- /* zero array dimension */
- c99ism(322, dim);
- } else if (n == 0 && !dim) {
- /* is incomplete type */
- setcompl(tp, 1);
- }
-
- return (decl);
-}
-
-sym_t *
-addfunc(sym_t *decl, sym_t *args)
-{
- type_t **tpp, *tp;
-
- if (dcs->d_proto) {
- if (tflag)
- /* function prototypes are illegal in traditional C */
- warning(270);
- args = nsfunc(decl, args);
- } else {
- osfunc(decl, args);
- }
-
- /*
- * The symbols are removed from the symbol table by popdecl() after
- * addfunc(). To be able to restore them if this is a function
- * definition, a pointer to the list of all symbols is stored in
- * dcs->d_nxt->d_fpsyms. Also a list of the arguments (concatenated
- * by s_nxt) is stored in dcs->d_nxt->d_fargs.
- * (dcs->d_nxt must be used because *dcs is the declaration stack
- * element created for the list of params and is removed after
- * addfunc())
- */
- if (dcs->d_nxt->d_ctx == EXTERN &&
- decl->s_type == dcs->d_nxt->d_type) {
- dcs->d_nxt->d_fpsyms = dcs->d_dlsyms;
- dcs->d_nxt->d_fargs = args;
- }
-
- tpp = &decl->s_type;
- while (*tpp && *tpp != dcs->d_nxt->d_type)
- tpp = &(*tpp)->t_subt;
- if (*tpp == NULL)
- return decl;
-
- *tpp = tp = getblk(sizeof (type_t));
- tp->t_tspec = FUNC;
- tp->t_subt = dcs->d_nxt->d_type;
- if ((tp->t_proto = dcs->d_proto) != 0)
- tp->t_args = args;
- tp->t_vararg = dcs->d_vararg;
-
- return (decl);
-}
-
-/*
- * Called for new style function declarations.
- */
-/* ARGSUSED */
-static sym_t *
-nsfunc(sym_t *decl, sym_t *args)
-{
- sym_t *arg, *sym;
- scl_t sc;
- int n;
-
- /*
- * Declarations of structs/unions/enums in param lists are legal,
- * but senseless.
- */
- for (sym = dcs->d_dlsyms; sym != NULL; sym = sym->s_dlnxt) {
- sc = sym->s_scl;
- if (sc == STRTAG || sc == UNIONTAG || sc == ENUMTAG) {
- /* dubious tag declaration: %s %s */
- warning(85, scltoa(sc), sym->s_name);
- }
- }
-
- n = 1;
- for (arg = args; arg != NULL; arg = arg->s_nxt) {
- if (arg->s_type->t_tspec == VOID) {
- if (n > 1 || arg->s_nxt != NULL) {
- /* "void" must be sole parameter */
- error(60);
- arg->s_type = gettyp(INT);
- }
- }
- n++;
- }
-
- /* return NULL if first param is VOID */
- return (args != NULL && args->s_type->t_tspec != VOID ? args : NULL);
-}
-
-/*
- * Called for old style function declarations.
- */
-static void
-osfunc(sym_t *decl, sym_t *args)
-{
-
- /*
- * Remember list of params only if this is really seams to be
- * a function definition.
- */
- if (dcs->d_nxt->d_ctx == EXTERN &&
- decl->s_type == dcs->d_nxt->d_type) {
- /*
- * We assume that this becomes a function definition. If
- * we are wrong, its corrected in chkfdef().
- */
- if (args != NULL) {
- decl->s_osdef = 1;
- decl->s_args = args;
- }
- } else {
- if (args != NULL)
- /* function prototype parameters must have types */
- warning(62);
- }
-}
-
-/*
- * Lists of Identifiers in functions declarations are allowed only if
- * its also a function definition. If this is not the case, print a
- * error message.
- */
-void
-chkfdef(sym_t *sym, int msg)
-{
-
- if (sym->s_osdef) {
- if (msg) {
- /* incomplete or misplaced function definition */
- error(22);
- }
- sym->s_osdef = 0;
- sym->s_args = NULL;
- }
-}
-
-/*
- * Process the name in a declarator.
- * If the symbol does already exists, a new one is created.
- * The symbol becomes one of the storage classes EXTERN, STATIC, AUTO or
- * TYPEDEF.
- * s_def and s_reg are valid after dname().
- */
-sym_t *
-dname(sym_t *sym)
-{
- scl_t sc = NOSCL;
-
- if (sym->s_scl == NOSCL) {
- dcs->d_rdcsym = NULL;
- } else if (sym->s_defarg) {
- sym->s_defarg = 0;
- dcs->d_rdcsym = NULL;
- } else {
- dcs->d_rdcsym = sym;
- sym = pushdown(sym);
- }
-
- switch (dcs->d_ctx) {
- case MOS:
- case MOU:
- /* Parent setzen */
- sym->s_styp = dcs->d_tagtyp->t_str;
- sym->s_def = DEF;
- sym->s_value.v_tspec = INT;
- sc = dcs->d_ctx;
- break;
- case EXTERN:
- /*
- * static and external symbols without "extern" are
- * considered to be tentative defined, external
- * symbols with "extern" are declared, and typedef names
- * are defined. Tentative defined and declared symbols
- * may become defined if an initializer is present or
- * this is a function definition.
- */
- if ((sc = dcs->d_scl) == NOSCL) {
- sc = EXTERN;
- sym->s_def = TDEF;
- } else if (sc == STATIC) {
- sym->s_def = TDEF;
- } else if (sc == TYPEDEF) {
- sym->s_def = DEF;
- } else if (sc == EXTERN) {
- sym->s_def = DECL;
- } else {
- LERROR("dname()");
- }
- break;
- case PARG:
- sym->s_arg = 1;
- /* FALLTHROUGH */
- case ARG:
- if ((sc = dcs->d_scl) == NOSCL) {
- sc = AUTO;
- } else if (sc == REG) {
- sym->s_reg = 1;
- sc = AUTO;
- } else {
- LERROR("dname()");
- }
- sym->s_def = DEF;
- break;
- case AUTO:
- if ((sc = dcs->d_scl) == NOSCL) {
- /*
- * XXX somewhat ugly because we dont know whether
- * this is AUTO or EXTERN (functions). If we are
- * wrong it must be corrected in decl1loc(), where
- * we have the necessary type information.
- */
- sc = AUTO;
- sym->s_def = DEF;
- } else if (sc == AUTO || sc == STATIC || sc == TYPEDEF) {
- sym->s_def = DEF;
- } else if (sc == REG) {
- sym->s_reg = 1;
- sc = AUTO;
- sym->s_def = DEF;
- } else if (sc == EXTERN) {
- sym->s_def = DECL;
- } else {
- LERROR("dname()");
- }
- break;
- default:
- LERROR("dname()");
- }
- sym->s_scl = sc;
-
- sym->s_type = dcs->d_type;
-
- dcs->d_fpsyms = NULL;
-
- return (sym);
-}
-
-/*
- * Process a name in the list of formal params in an old style function
- * definition.
- */
-sym_t *
-iname(sym_t *sym)
-{
-
- if (sym->s_scl != NOSCL) {
- if (blklev == sym->s_blklev) {
- /* redeclaration of formal parameter %s */
- error(21, sym->s_name);
- if (!sym->s_defarg)
- LERROR("iname()");
- }
- sym = pushdown(sym);
- }
- sym->s_type = gettyp(INT);
- sym->s_scl = AUTO;
- sym->s_def = DEF;
- sym->s_defarg = sym->s_arg = 1;
- return (sym);
-}
-
-/*
- * Create the type of a tag.
- *
- * tag points to the symbol table entry of the tag
- * kind is the kind of the tag (STRUCT/UNION/ENUM)
- * decl is 1 if the type of the tag will be completed in this declaration
- * (the following token is T_LBRACE)
- * semi is 1 if the following token is T_SEMI
- */
-type_t *
-mktag(sym_t *tag, tspec_t kind, int decl, int semi)
-{
- scl_t scl = NOSCL;
- type_t *tp;
-
- if (kind == STRUCT) {
- scl = STRTAG;
- } else if (kind == UNION) {
- scl = UNIONTAG;
- } else if (kind == ENUM) {
- scl = ENUMTAG;
- } else {
- LERROR("mktag()");
- }
-
- if (tag != NULL) {
- if (tag->s_scl != NOSCL) {
- tag = newtag(tag, scl, decl, semi);
- } else {
- /* a new tag, no empty declaration */
- dcs->d_nxt->d_nedecl = 1;
- if (scl == ENUMTAG && !decl) {
- if (!tflag && (sflag || pflag))
- /* forward reference to enum type */
- warning(42);
- }
- }
- if (tag->s_scl == NOSCL) {
- tag->s_scl = scl;
- tag->s_type = tp = getblk(sizeof (type_t));
- } else {
- tp = tag->s_type;
- }
- } else {
- tag = getblk(sizeof (sym_t));
- tag->s_name = unnamed;
- UNIQUE_CURR_POS(tag->s_dpos);
- tag->s_kind = FTAG;
- tag->s_scl = scl;
- tag->s_blklev = -1;
- tag->s_type = tp = getblk(sizeof (type_t));
- dcs->d_nxt->d_nedecl = 1;
- }
-
- if (tp->t_tspec == NOTSPEC) {
- tp->t_tspec = kind;
- if (kind != ENUM) {
- tp->t_str = getblk(sizeof (str_t));
- tp->t_str->align = CHAR_BIT;
- tp->t_str->stag = tag;
- } else {
- tp->t_isenum = 1;
- tp->t_enum = getblk(sizeof (enum_t));
- tp->t_enum->etag = tag;
- }
- /* is incomplete type */
- setcompl(tp, 1);
- }
-
- return (tp);
-}
-
-/*
- * Checks all possible cases of tag redeclarations.
- * decl is 1 if T_LBRACE follows
- * semi is 1 if T_SEMI follows
- */
-static sym_t *
-newtag(sym_t *tag, scl_t scl, int decl, int semi)
-{
-
- if (tag->s_blklev < blklev) {
- if (semi) {
- /* "struct a;" */
- if (!tflag) {
- if (!sflag)
- /* decl. introduces new type ... */
- warning(44, scltoa(scl), tag->s_name);
- tag = pushdown(tag);
- } else if (tag->s_scl != scl) {
- /* base type is really "%s %s" */
- warning(45, scltoa(tag->s_scl), tag->s_name);
- }
- dcs->d_nxt->d_nedecl = 1;
- } else if (decl) {
- /* "struct a { ... } " */
- if (hflag)
- /* redefinition hides earlier one: %s */
- warning(43, tag->s_name);
- tag = pushdown(tag);
- dcs->d_nxt->d_nedecl = 1;
- } else if (tag->s_scl != scl) {
- /* base type is really "%s %s" */
- warning(45, scltoa(tag->s_scl), tag->s_name);
- /* declaration introduces new type in ANSI C: %s %s */
- if (!sflag)
- warning(44, scltoa(scl), tag->s_name);
- tag = pushdown(tag);
- dcs->d_nxt->d_nedecl = 1;
- }
- } else {
- if (tag->s_scl != scl) {
- /* (%s) tag redeclared */
- error(46, scltoa(tag->s_scl));
- prevdecl(-1, tag);
- tag = pushdown(tag);
- dcs->d_nxt->d_nedecl = 1;
- } else if (decl && !incompl(tag->s_type)) {
- /* (%s) tag redeclared */
- error(46, scltoa(tag->s_scl));
- prevdecl(-1, tag);
- tag = pushdown(tag);
- dcs->d_nxt->d_nedecl = 1;
- } else if (semi || decl) {
- dcs->d_nxt->d_nedecl = 1;
- }
- }
- return (tag);
-}
-
-const char *
-scltoa(scl_t sc)
-{
- const char *s;
-
- switch (sc) {
- case EXTERN: s = "extern"; break;
- case STATIC: s = "static"; break;
- case AUTO: s = "auto"; break;
- case REG: s = "register"; break;
- case TYPEDEF: s = "typedef"; break;
- case STRTAG: s = "struct"; break;
- case UNIONTAG: s = "union"; break;
- case ENUMTAG: s = "enum"; break;
- default: LERROR("tagttoa()");
- }
- return (s);
-}
-
-/*
- * Completes the type of a tag in a struct/union/enum declaration.
- * tp points to the type of the, tag, fmem to the list of members/enums.
- */
-type_t *
-compltag(type_t *tp, sym_t *fmem)
-{
- tspec_t t;
- str_t *sp;
- int n;
- sym_t *mem;
-
- /* from now a complete type */
- setcompl(tp, 0);
-
- if ((t = tp->t_tspec) != ENUM) {
- align(dcs->d_stralign, 0);
- sp = tp->t_str;
- sp->align = dcs->d_stralign;
- sp->size = dcs->d_offset;
- sp->memb = fmem;
- if (sp->size == 0) {
- /* zero sized %s */
- (void)c99ism(47, ttab[t].tt_name);
- } else {
- n = 0;
- for (mem = fmem; mem != NULL; mem = mem->s_nxt) {
- if (mem->s_name != unnamed)
- n++;
- }
- if (n == 0) {
- /* %s has no named members */
- warning(65,
- t == STRUCT ? "structure" : "union");
- }
- }
- } else {
- tp->t_enum->elem = fmem;
- }
- return (tp);
-}
-
-/*
- * Processes the name of an enumerator in en enum declaration.
- *
- * sym points to the enumerator
- * val is the value of the enumerator
- * impl is 1 if the value of the enumerator was not explicit specified.
- */
-sym_t *
-ename(sym_t *sym, int val, int impl)
-{
-
- if (sym->s_scl) {
- if (sym->s_blklev == blklev) {
- /* no hflag, because this is illegal!!! */
- if (sym->s_arg) {
- /* enumeration constant hides parameter: %s */
- warning(57, sym->s_name);
- } else {
- /* redeclaration of %s */
- error(27, sym->s_name);
- /*
- * inside blocks it should not too complicated
- * to find the position of the previous
- * declaration
- */
- if (blklev == 0)
- prevdecl(-1, sym);
- }
- } else {
- if (hflag)
- /* redefinition hides earlier one: %s */
- warning(43, sym->s_name);
- }
- sym = pushdown(sym);
- }
- sym->s_scl = ENUMCON;
- sym->s_type = dcs->d_tagtyp;
- sym->s_value.v_tspec = INT;
- sym->s_value.v_quad = val;
- if (impl && val - 1 == INT_MAX) {
- /* overflow in enumeration values: %s */
- warning(48, sym->s_name);
- }
- enumval = val + 1;
- return (sym);
-}
-
-/*
- * Process a single external declarator.
- */
-void
-decl1ext(sym_t *dsym, int initflg)
-{
- int warn, rval, redec;
- sym_t *rdsym;
-
- chkfdef(dsym, 1);
-
- chktyp(dsym);
-
- if (initflg && !(initerr = chkinit(dsym)))
- dsym->s_def = DEF;
-
- /*
- * Declarations of functions are marked as "tentative" in dname().
- * This is wrong because there are no tentative function
- * definitions.
- */
- if (dsym->s_type->t_tspec == FUNC && dsym->s_def == TDEF)
- dsym->s_def = DECL;
-
- if (dcs->d_inline) {
- if (dsym->s_type->t_tspec == FUNC) {
- dsym->s_inline = 1;
- } else {
- /* variable declared inline: %s */
- warning(268, dsym->s_name);
- }
- }
-
- /* Write the declaration into the output file */
- if (plibflg && llibflg &&
- dsym->s_type->t_tspec == FUNC && dsym->s_type->t_proto) {
- /*
- * With both LINTLIBRARY and PROTOLIB the prototype is
- * written as a function definition to the output file.
- */
- rval = dsym->s_type->t_subt->t_tspec != VOID;
- outfdef(dsym, &dsym->s_dpos, rval, 0, NULL);
- } else {
- outsym(dsym, dsym->s_scl, dsym->s_def);
- }
-
- if ((rdsym = dcs->d_rdcsym) != NULL) {
-
- /*
- * If the old symbol stems from an old style function definition
- * we have remembered the params in rdsmy->s_args and compare
- * them with the params of the prototype.
- */
- if (rdsym->s_osdef && dsym->s_type->t_proto) {
- redec = chkosdef(rdsym, dsym);
- } else {
- redec = 0;
- }
-
- if (!redec && !isredec(dsym, (warn = 0, &warn))) {
-
- if (warn) {
- /* redeclaration of %s */
- (*(sflag ? error : warning))(27, dsym->s_name);
- prevdecl(-1, rdsym);
- }
-
- /*
- * Overtake the remembered params if the new symbol
- * is not a prototype.
- */
- if (rdsym->s_osdef && !dsym->s_type->t_proto) {
- dsym->s_osdef = rdsym->s_osdef;
- dsym->s_args = rdsym->s_args;
- STRUCT_ASSIGN(dsym->s_dpos, rdsym->s_dpos);
- }
-
- /*
- * Remember the position of the declaration if the
- * old symbol was a prototype and the new is not.
- * Also remember the position if the old symbol
- * was defined and the new is not.
- */
- if (rdsym->s_type->t_proto && !dsym->s_type->t_proto) {
- STRUCT_ASSIGN(dsym->s_dpos, rdsym->s_dpos);
- } else if (rdsym->s_def == DEF && dsym->s_def != DEF) {
- STRUCT_ASSIGN(dsym->s_dpos, rdsym->s_dpos);
- }
-
- /*
- * Copy informations about usage of the name into
- * the new symbol.
- */
- cpuinfo(dsym, rdsym);
-
- /* Once a name is defined, it remains defined. */
- if (rdsym->s_def == DEF)
- dsym->s_def = DEF;
-
- /* once a function is inline, it remains inline */
- if (rdsym->s_inline)
- dsym->s_inline = 1;
-
- compltyp(dsym, rdsym);
-
- }
-
- rmsym(rdsym);
- }
-
- if (dsym->s_scl == TYPEDEF) {
- dsym->s_type = duptyp(dsym->s_type);
- dsym->s_type->t_typedef = 1;
- settdsym(dsym->s_type, dsym);
- }
-
-}
-
-/*
- * Copies informations about usage into a new symbol table entry of
- * the same symbol.
- */
-void
-cpuinfo(sym_t *sym, sym_t *rdsym)
-{
-
- sym->s_spos = rdsym->s_spos;
- sym->s_upos = rdsym->s_upos;
- sym->s_set = rdsym->s_set;
- sym->s_used = rdsym->s_used;
-}
-
-/*
- * Prints an error and returns 1 if a symbol is redeclared/redefined.
- * Otherwise returns 0 and, in some cases of minor problems, prints
- * a warning.
- */
-int
-isredec(sym_t *dsym, int *warn)
-{
- sym_t *rsym;
-
- if ((rsym = dcs->d_rdcsym)->s_scl == ENUMCON) {
- /* redeclaration of %s */
- error(27, dsym->s_name);
- prevdecl(-1, rsym);
- return (1);
- }
- if (rsym->s_scl == TYPEDEF) {
- /* typedef redeclared: %s */
- error(89, dsym->s_name);
- prevdecl(-1, rsym);
- return (1);
- }
- if (dsym->s_scl == TYPEDEF) {
- /* redeclaration of %s */
- error(27, dsym->s_name);
- prevdecl(-1, rsym);
- return (1);
- }
- if (rsym->s_def == DEF && dsym->s_def == DEF) {
- /* redefinition of %s */
- error(28, dsym->s_name);
- prevdecl(-1, rsym);
- return(1);
- }
- if (!eqtype(rsym->s_type, dsym->s_type, 0, 0, warn)) {
- /* redeclaration of %s */
- error(27, dsym->s_name);
- prevdecl(-1, rsym);
- return(1);
- }
- if (rsym->s_scl == EXTERN && dsym->s_scl == EXTERN)
- return(0);
- if (rsym->s_scl == STATIC && dsym->s_scl == STATIC)
- return(0);
- if (rsym->s_scl == STATIC && dsym->s_def == DECL)
- return(0);
- if (rsym->s_scl == EXTERN && rsym->s_def == DEF) {
- /*
- * All cases except "int a = 1; static int a;" are caught
- * above with or without a warning
- */
- /* redeclaration of %s */
- error(27, dsym->s_name);
- prevdecl(-1, rsym);
- return(1);
- }
- if (rsym->s_scl == EXTERN) {
- /* previously declared extern, becomes static: %s */
- warning(29, dsym->s_name);
- prevdecl(-1, rsym);
- return(0);
- }
- /*
- * Now its on of:
- * "static a; int a;", "static a; int a = 1;", "static a = 1; int a;"
- */
- /* redeclaration of %s; ANSI C requires "static" */
- if (sflag) {
- warning(30, dsym->s_name);
- prevdecl(-1, rsym);
- }
- dsym->s_scl = STATIC;
- return (0);
-}
-
-/*
- * Checks if two types are compatible. Returns 0 if not, otherwise 1.
- *
- * ignqual ignore qualifiers of type; used for function params
- * promot promote left type; used for comparison of params of
- * old style function definitions with params of prototypes.
- * *warn set to 1 if an old style function declaration is not
- * compatible with a prototype
- */
-int
-eqtype(type_t *tp1, type_t *tp2, int ignqual, int promot, int *warn)
-{
- tspec_t t;
-
- while (tp1 != NULL && tp2 != NULL) {
-
- t = tp1->t_tspec;
- if (promot) {
- if (t == FLOAT) {
- t = DOUBLE;
- } else if (t == CHAR || t == SCHAR) {
- t = INT;
- } else if (t == UCHAR) {
- t = tflag ? UINT : INT;
- } else if (t == SHORT) {
- t = INT;
- } else if (t == USHORT) {
- /* CONSTCOND */
- t = INT_MAX < USHRT_MAX || tflag ? UINT : INT;
- }
- }
-
- if (t != tp2->t_tspec)
- return (0);
-
- if (tp1->t_const != tp2->t_const && !ignqual && !tflag)
- return (0);
-
- if (tp1->t_volatile != tp2->t_volatile && !ignqual && !tflag)
- return (0);
-
- if (t == STRUCT || t == UNION)
- return (tp1->t_str == tp2->t_str);
-
- if (t == ARRAY && tp1->t_dim != tp2->t_dim) {
- if (tp1->t_dim != 0 && tp2->t_dim != 0)
- return (0);
- }
-
- /* dont check prototypes for traditional */
- if (t == FUNC && !tflag) {
- if (tp1->t_proto && tp2->t_proto) {
- if (!eqargs(tp1, tp2, warn))
- return (0);
- } else if (tp1->t_proto) {
- if (!mnoarg(tp1, warn))
- return (0);
- } else if (tp2->t_proto) {
- if (!mnoarg(tp2, warn))
- return (0);
- }
- }
-
- tp1 = tp1->t_subt;
- tp2 = tp2->t_subt;
- ignqual = promot = 0;
-
- }
-
- return (tp1 == tp2);
-}
-
-/*
- * Compares the parameter types of two prototypes.
- */
-static int
-eqargs(type_t *tp1, type_t *tp2, int *warn)
-{
- sym_t *a1, *a2;
-
- if (tp1->t_vararg != tp2->t_vararg)
- return (0);
-
- a1 = tp1->t_args;
- a2 = tp2->t_args;
-
- while (a1 != NULL && a2 != NULL) {
-
- if (eqtype(a1->s_type, a2->s_type, 1, 0, warn) == 0)
- return (0);
-
- a1 = a1->s_nxt;
- a2 = a2->s_nxt;
-
- }
-
- return (a1 == a2);
-}
-
-/*
- * mnoarg() (matches functions with no argument type information)
- * returns 1 if all parameters of a prototype are compatible with
- * and old style function declaration.
- * This is the case if following conditions are met:
- * 1. the prototype must have a fixed number of parameters
- * 2. no parameter is of type float
- * 3. no parameter is converted to another type if integer promotion
- * is applied on it
- */
-static int
-mnoarg(type_t *tp, int *warn)
-{
- sym_t *arg;
- tspec_t t;
-
- if (tp->t_vararg) {
- if (warn != NULL)
- *warn = 1;
- }
- for (arg = tp->t_args; arg != NULL; arg = arg->s_nxt) {
- if ((t = arg->s_type->t_tspec) == FLOAT ||
- t == CHAR || t == SCHAR || t == UCHAR ||
- t == SHORT || t == USHORT) {
- if (warn != NULL)
- *warn = 1;
- }
- }
- return (1);
-}
-
-/*
- * Compares a prototype declaration with the remembered arguments of
- * a previous old style function definition.
- */
-static int
-chkosdef(sym_t *rdsym, sym_t *dsym)
-{
- sym_t *args, *pargs, *arg, *parg;
- int narg, nparg, n;
- int warn, msg;
-
- args = rdsym->s_args;
- pargs = dsym->s_type->t_args;
-
- msg = 0;
-
- narg = nparg = 0;
- for (arg = args; arg != NULL; arg = arg->s_nxt)
- narg++;
- for (parg = pargs; parg != NULL; parg = parg->s_nxt)
- nparg++;
- if (narg != nparg) {
- /* prototype does not match old-style definition */
- error(63);
- msg = 1;
- goto end;
- }
-
- arg = args;
- parg = pargs;
- n = 1;
- while (narg--) {
- warn = 0;
- /*
- * If it does not match due to promotion and sflag is
- * not set we print only a warning.
- */
- if (!eqtype(arg->s_type, parg->s_type, 1, 1, &warn) || warn) {
- /* prototype does not match old-style def., arg #%d */
- error(299, n);
- msg = 1;
- }
- arg = arg->s_nxt;
- parg = parg->s_nxt;
- n++;
- }
-
- end:
- if (msg)
- /* old style definition */
- prevdecl(300, rdsym);
-
- return (msg);
-}
-
-/*
- * Completes a type by copying the dimension and prototype information
- * from a second compatible type.
- *
- * Following lines are legal:
- * "typedef a[]; a b; a b[10]; a c; a c[20];"
- * "typedef ft(); ft f; f(int); ft g; g(long);"
- * This means that, if a type is completed, the type structure must
- * be duplicated.
- */
-void
-compltyp(sym_t *dsym, sym_t *ssym)
-{
- type_t **dstp, *src;
- type_t *dst;
-
- dstp = &dsym->s_type;
- src = ssym->s_type;
-
- while ((dst = *dstp) != NULL) {
- if (src == NULL || dst->t_tspec != src->t_tspec)
- LERROR("compltyp()");
- if (dst->t_tspec == ARRAY) {
- if (dst->t_dim == 0 && src->t_dim != 0) {
- *dstp = dst = duptyp(dst);
- dst->t_dim = src->t_dim;
- /* now a complete type */
- setcompl(dst, 0);
- }
- } else if (dst->t_tspec == FUNC) {
- if (!dst->t_proto && src->t_proto) {
- *dstp = dst = duptyp(dst);
- dst->t_proto = 1;
- dst->t_args = src->t_args;
- }
- }
- dstp = &dst->t_subt;
- src = src->t_subt;
- }
-}
-
-/*
- * Completes the declaration of a single argument.
- */
-sym_t *
-decl1arg(sym_t *sym, int initflg)
-{
- tspec_t t;
-
- chkfdef(sym, 1);
-
- chktyp(sym);
-
- if (dcs->d_rdcsym != NULL && dcs->d_rdcsym->s_blklev == blklev) {
- /* redeclaration of formal parameter %s */
- error(237, sym->s_name);
- rmsym(dcs->d_rdcsym);
- sym->s_arg = 1;
- }
-
- if (!sym->s_arg) {
- /* declared argument %s is missing */
- error(53, sym->s_name);
- sym->s_arg = 1;
- }
-
- if (initflg) {
- /* cannot initialize parameter: %s */
- error(52, sym->s_name);
- initerr = 1;
- }
-
- if ((t = sym->s_type->t_tspec) == ARRAY) {
- sym->s_type = incref(sym->s_type->t_subt, PTR);
- } else if (t == FUNC) {
- if (tflag)
- /* a function is declared as an argument: %s */
- warning(50, sym->s_name);
- sym->s_type = incref(sym->s_type, PTR);
- } else if (t == FLOAT) {
- if (tflag)
- sym->s_type = gettyp(DOUBLE);
- }
-
- if (dcs->d_inline)
- /* argument declared inline: %s */
- warning(269, sym->s_name);
-
- /*
- * Arguments must have complete types. lengths() prints the needed
- * error messages (null dimension is impossible because arrays are
- * converted to pointers).
- */
- if (sym->s_type->t_tspec != VOID)
- (void)length(sym->s_type, sym->s_name);
-
- setsflg(sym);
-
- return (sym);
-}
-
-/*
- * Does some checks for lint directives which apply to functions.
- * Processes arguments in old style function definitions which default
- * to int.
- * Checks compatibility of old style function definition with previous
- * prototype.
- */
-void
-cluparg(void)
-{
- sym_t *args, *arg, *pargs, *parg;
- int narg, nparg, n, msg;
- tspec_t t;
-
- args = funcsym->s_args;
- pargs = funcsym->s_type->t_args;
-
- /* check for illegal combinations of lint directives */
- if (prflstrg != -1 && scflstrg != -1) {
- /* can't be used together: ** PRINTFLIKE ** ** SCANFLIKE ** */
- warning(289);
- prflstrg = scflstrg = -1;
- }
- if (nvararg != -1 && (prflstrg != -1 || scflstrg != -1)) {
- /* dubious use of ** VARARGS ** with ** %s ** */
- warning(288, prflstrg != -1 ? "PRINTFLIKE" : "SCANFLIKE");
- nvararg = -1;
- }
-
- /*
- * check if the argument of a lint directive is compatible with the
- * number of arguments.
- */
- narg = 0;
- for (arg = dcs->d_fargs; arg != NULL; arg = arg->s_nxt)
- narg++;
- if (nargusg > narg) {
- /* argument number mismatch with directive: ** %s ** */
- warning(283, "ARGSUSED");
- nargusg = 0;
- }
- if (nvararg > narg) {
- /* argument number mismatch with directive: ** %s ** */
- warning(283, "VARARGS");
- nvararg = 0;
- }
- if (prflstrg > narg) {
- /* argument number mismatch with directive: ** %s ** */
- warning(283, "PRINTFLIKE");
- prflstrg = -1;
- } else if (prflstrg == 0) {
- prflstrg = -1;
- }
- if (scflstrg > narg) {
- /* argument number mismatch with directive: ** %s ** */
- warning(283, "SCANFLIKE");
- scflstrg = -1;
- } else if (scflstrg == 0) {
- scflstrg = -1;
- }
- if (prflstrg != -1 || scflstrg != -1) {
- narg = prflstrg != -1 ? prflstrg : scflstrg;
- arg = dcs->d_fargs;
- for (n = 1; n < narg; n++)
- arg = arg->s_nxt;
- if (arg->s_type->t_tspec != PTR ||
- ((t = arg->s_type->t_subt->t_tspec) != CHAR &&
- t != UCHAR && t != SCHAR)) {
- /* arg. %d must be 'char *' for PRINTFLIKE/SCANFLIKE */
- warning(293, narg);
- prflstrg = scflstrg = -1;
- }
- }
-
- /*
- * print a warning for each argument of an old style function
- * definition which defaults to int
- */
- for (arg = args; arg != NULL; arg = arg->s_nxt) {
- if (arg->s_defarg) {
- /* argument type defaults to int: %s */
- warning(32, arg->s_name);
- arg->s_defarg = 0;
- setsflg(arg);
- }
- }
-
- /*
- * If this is an old style function definition and a prototyp
- * exists, compare the types of arguments.
- */
- if (funcsym->s_osdef && funcsym->s_type->t_proto) {
- /*
- * If the number of arguments does not macht, we need not
- * continue.
- */
- narg = nparg = 0;
- msg = 0;
- for (parg = pargs; parg != NULL; parg = parg->s_nxt)
- nparg++;
- for (arg = args; arg != NULL; arg = arg->s_nxt)
- narg++;
- if (narg != nparg) {
- /* parameter mismatch: %d declared, %d defined */
- error(51, nparg, narg);
- msg = 1;
- } else {
- parg = pargs;
- arg = args;
- while (narg--) {
- msg |= chkptdecl(arg, parg);
- parg = parg->s_nxt;
- arg = arg->s_nxt;
- }
- }
- if (msg)
- /* prototype declaration */
- prevdecl(285, dcs->d_rdcsym);
-
- /* from now the prototype is valid */
- funcsym->s_osdef = 0;
- funcsym->s_args = NULL;
-
- }
-
-}
-
-/*
- * Checks compatibility of an old style function definition with a previous
- * prototype declaration.
- * Returns 1 if the position of the previous declaration should be reported.
- */
-static int
-chkptdecl(sym_t *arg, sym_t *parg)
-{
- type_t *tp, *ptp;
- int warn, msg;
-
- tp = arg->s_type;
- ptp = parg->s_type;
-
- msg = 0;
- warn = 0;
-
- if (!eqtype(tp, ptp, 1, 1, &warn)) {
- if (eqtype(tp, ptp, 1, 0, &warn)) {
- /* type does not match prototype: %s */
- msg = gnuism(58, arg->s_name);
- } else {
- /* type does not match prototype: %s */
- error(58, arg->s_name);
- msg = 1;
- }
- } else if (warn) {
- /* type does not match prototype: %s */
- (*(sflag ? error : warning))(58, arg->s_name);
- msg = 1;
- }
-
- return (msg);
-}
-
-/*
- * Completes a single local declaration/definition.
- */
-void
-decl1loc(sym_t *dsym, int initflg)
-{
-
- /* Correct a mistake done in dname(). */
- if (dsym->s_type->t_tspec == FUNC) {
- dsym->s_def = DECL;
- if (dcs->d_scl == NOSCL)
- dsym->s_scl = EXTERN;
- }
-
- if (dsym->s_type->t_tspec == FUNC) {
- if (dsym->s_scl == STATIC) {
- /* dubious static function at block level: %s */
- warning(93, dsym->s_name);
- dsym->s_scl = EXTERN;
- } else if (dsym->s_scl != EXTERN && dsym->s_scl != TYPEDEF) {
- /* function has illegal storage class: %s */
- error(94, dsym->s_name);
- dsym->s_scl = EXTERN;
- }
- }
-
- /*
- * functions may be declared inline at local scope, although
- * this has no effect for a later definition of the same
- * function.
- * XXX it should have an effect if tflag is set. this would
- * also be the way gcc behaves.
- */
- if (dcs->d_inline) {
- if (dsym->s_type->t_tspec == FUNC) {
- dsym->s_inline = 1;
- } else {
- /* variable declared inline: %s */
- warning(268, dsym->s_name);
- }
- }
-
- chkfdef(dsym, 1);
-
- chktyp(dsym);
-
- if (dcs->d_rdcsym != NULL && dsym->s_scl == EXTERN)
- ledecl(dsym);
-
- if (dsym->s_scl == EXTERN) {
- /*
- * XXX wenn die statische Variable auf Ebene 0 erst
- * spaeter definiert wird, haben wir die Brille auf.
- */
- if (dsym->s_xsym == NULL) {
- outsym(dsym, EXTERN, dsym->s_def);
- } else {
- outsym(dsym, dsym->s_xsym->s_scl, dsym->s_def);
- }
- }
-
- if (dcs->d_rdcsym != NULL) {
-
- if (dcs->d_rdcsym->s_blklev == 0) {
-
- switch (dsym->s_scl) {
- case AUTO:
- /* automatic hides external declaration: %s */
- if (hflag)
- warning(86, dsym->s_name);
- break;
- case STATIC:
- /* static hides external declaration: %s */
- if (hflag)
- warning(87, dsym->s_name);
- break;
- case TYPEDEF:
- /* typedef hides external declaration: %s */
- if (hflag)
- warning(88, dsym->s_name);
- break;
- case EXTERN:
- /*
- * Warnings and errors are printed in ledecl()
- */
- break;
- default:
- LERROR("decl1loc()");
- }
-
- } else if (dcs->d_rdcsym->s_blklev == blklev) {
-
- /* no hflag, because its illegal! */
- if (dcs->d_rdcsym->s_arg) {
- /*
- * if !tflag, a "redeclaration of %s" error
- * is produced below
- */
- if (tflag) {
- if (hflag)
- /* decl. hides parameter: %s */
- warning(91, dsym->s_name);
- rmsym(dcs->d_rdcsym);
- }
- }
-
- } else if (dcs->d_rdcsym->s_blklev < blklev) {
-
- if (hflag)
- /* declaration hides earlier one: %s */
- warning(95, dsym->s_name);
-
- }
-
- if (dcs->d_rdcsym->s_blklev == blklev) {
-
- /* redeclaration of %s */
- error(27, dsym->s_name);
- rmsym(dcs->d_rdcsym);
-
- }
-
- }
-
- if (initflg && !(initerr = chkinit(dsym))) {
- dsym->s_def = DEF;
- setsflg(dsym);
- }
-
- if (dsym->s_scl == TYPEDEF) {
- dsym->s_type = duptyp(dsym->s_type);
- dsym->s_type->t_typedef = 1;
- settdsym(dsym->s_type, dsym);
- }
-
- /*
- * Before we can check the size we must wait for an initialisation
- * which may follow.
- */
-}
-
-/*
- * Processes (re)declarations of external Symbols inside blocks.
- */
-static void
-ledecl(sym_t *dsym)
-{
- int eqt, warn;
- sym_t *esym;
-
- /* look for a symbol with the same name */
- esym = dcs->d_rdcsym;
- while (esym != NULL && esym->s_blklev != 0) {
- while ((esym = esym->s_link) != NULL) {
- if (esym->s_kind != FVFT)
- continue;
- if (strcmp(dsym->s_name, esym->s_name) == 0)
- break;
- }
- }
- if (esym == NULL)
- return;
- if (esym->s_scl != EXTERN && esym->s_scl != STATIC) {
- /* gcc accepts this without a warning, pcc prints an error. */
- /* redeclaration of %s */
- warning(27, dsym->s_name);
- prevdecl(-1, esym);
- return;
- }
-
- warn = 0;
- eqt = eqtype(esym->s_type, dsym->s_type, 0, 0, &warn);
-
- if (!eqt || warn) {
- if (esym->s_scl == EXTERN) {
- /* inconsistent redeclaration of extern: %s */
- warning(90, dsym->s_name);
- prevdecl(-1, esym);
- } else {
- /* inconsistent redeclaration of static: %s */
- warning(92, dsym->s_name);
- prevdecl(-1, esym);
- }
- }
-
- if (eqt) {
- /*
- * Remember the external symbol so we can update usage
- * information at the end of the block.
- */
- dsym->s_xsym = esym;
- }
-}
-
-/*
- * Print an error or a warning if the symbol can't be initialized due
- * to type/storage class. Return value is 1 if an error has been
- * detected.
- */
-static int
-chkinit(sym_t *sym)
-{
- int err;
-
- err = 0;
-
- if (sym->s_type->t_tspec == FUNC) {
- /* cannot initialize function: %s */
- error(24, sym->s_name);
- err = 1;
- } else if (sym->s_scl == TYPEDEF) {
- /* cannot initialize typedef: %s */
- error(25, sym->s_name);
- err = 1;
- } else if (sym->s_scl == EXTERN && sym->s_def == DECL) {
- /* cannot initialize "extern" declaration: %s */
- if (dcs->d_ctx == EXTERN) {
- warning(26, sym->s_name);
- } else {
- error(26, sym->s_name);
- err = 1;
- }
- }
-
- return (err);
-}
-
-/*
- * Create a symbol for an abstract declaration.
- */
-sym_t *
-aname(void)
-{
- sym_t *sym;
-
- if (dcs->d_ctx != ABSTRACT && dcs->d_ctx != PARG)
- LERROR("aname()");
-
- sym = getblk(sizeof (sym_t));
-
- sym->s_name = unnamed;
- sym->s_def = DEF;
- sym->s_scl = ABSTRACT;
- sym->s_blklev = -1;
-
- if (dcs->d_ctx == PARG)
- sym->s_arg = 1;
-
- sym->s_type = dcs->d_type;
- dcs->d_rdcsym = NULL;
- dcs->d_vararg = 0;
-
- return (sym);
-}
-
-/*
- * Removes anything which has nothing to do on global level.
- */
-void
-globclup(void)
-{
-
- while (dcs->d_nxt != NULL)
- popdecl();
-
- cleanup();
- blklev = 0;
- mblklev = 0;
-
- /*
- * remove all information about pending lint directives without
- * warnings.
- */
- glclup(1);
-}
-
-/*
- * Process an abstract type declaration
- */
-sym_t *
-decl1abs(sym_t *sym)
-{
-
- chkfdef(sym, 1);
- chktyp(sym);
- return (sym);
-}
-
-/*
- * Checks size after declarations of variables and their initialisation.
- */
-void
-chksz(sym_t *dsym)
-{
-
- /*
- * check size only for symbols which are defined and no function and
- * not typedef name
- */
- if (dsym->s_def != DEF)
- return;
- if (dsym->s_scl == TYPEDEF)
- return;
- if (dsym->s_type->t_tspec == FUNC)
- return;
-
- if (length(dsym->s_type, dsym->s_name) == 0 &&
- dsym->s_type->t_tspec == ARRAY && dsym->s_type->t_dim == 0) {
- /* empty array declaration: %s */
- if (tflag) {
- warning(190, dsym->s_name);
- } else {
- error(190, dsym->s_name);
- }
- }
-}
-
-/*
- * Mark an object as set if it is not already
- */
-void
-setsflg(sym_t *sym)
-{
-
- if (!sym->s_set) {
- sym->s_set = 1;
- UNIQUE_CURR_POS(sym->s_spos);
- }
-}
-
-/*
- * Mark an object as used if it is not already
- */
-void
-setuflg(sym_t *sym, int fcall, int szof)
-{
-
- if (!sym->s_used) {
- sym->s_used = 1;
- UNIQUE_CURR_POS(sym->s_upos);
- }
- /*
- * for function calls another record is written
- *
- * XXX Should symbols used in sizeof() treated as used or not?
- * Probably not, because there is no sense to declare an
- * external variable only to get their size.
- */
- if (!fcall && !szof && sym->s_kind == FVFT && sym->s_scl == EXTERN)
- outusg(sym);
-}
-
-/*
- * Prints warnings for a list of variables and labels (concatenated
- * with s_dlnxt) if these are not used or only set.
- */
-void
-chkusage(dinfo_t *di)
-{
- sym_t *sym;
- int mknowarn;
-
- /* for this warnings LINTED has no effect */
- mknowarn = nowarn;
- nowarn = 0;
-
- for (sym = di->d_dlsyms; sym != NULL; sym = sym->s_dlnxt)
- chkusg1(di->d_asm, sym);
-
- nowarn = mknowarn;
-}
-
-/*
- * Prints a warning for a single variable or label if it is not used or
- * only set.
- */
-void
-chkusg1(int novar, sym_t *sym)
-{
- pos_t cpos;
-
- if (sym->s_blklev == -1)
- return;
-
- STRUCT_ASSIGN(cpos, curr_pos);
-
- if (sym->s_kind == FVFT) {
- if (sym->s_arg) {
- chkausg(novar, sym);
- } else {
- chkvusg(novar, sym);
- }
- } else if (sym->s_kind == FLAB) {
- chklusg(sym);
- } else if (sym->s_kind == FTAG) {
- chktusg(sym);
- }
-
- STRUCT_ASSIGN(curr_pos, cpos);
-}
-
-static void
-chkausg(int novar, sym_t *arg)
-{
-
- if (!arg->s_set)
- LERROR("chkausg()");
-
- if (novar)
- return;
-
- if (!arg->s_used && vflag) {
- STRUCT_ASSIGN(curr_pos, arg->s_dpos);
- /* argument %s unused in function %s */
- warning(231, arg->s_name, funcsym->s_name);
- }
-}
-
-static void
-chkvusg(int novar, sym_t *sym)
-{
- scl_t sc;
- sym_t *xsym;
-
- if (blklev == 0 || sym->s_blklev == 0)
- LERROR("chkvusg()");
-
- /* errors in expressions easily cause lots of these warnings */
- if (nerr != 0)
- return;
-
- /*
- * XXX Only variables are checkd, although types should
- * probably also be checked
- */
- if ((sc = sym->s_scl) != EXTERN && sc != STATIC &&
- sc != AUTO && sc != REG) {
- return;
- }
-
- if (novar)
- return;
-
- if (sc == EXTERN) {
- if (!sym->s_used && !sym->s_set) {
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- /* %s unused in function %s */
- warning(192, sym->s_name, funcsym->s_name);
- }
- } else {
- if (sym->s_set && !sym->s_used) {
- STRUCT_ASSIGN(curr_pos, sym->s_spos);
- /* %s set but not used in function %s */
- warning(191, sym->s_name, funcsym->s_name);
- } else if (!sym->s_used) {
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- /* %s unused in function %s */
- warning(192, sym->s_name, funcsym->s_name);
- }
- }
-
- if (sc == EXTERN) {
- /*
- * information about usage is taken over into the symbol
- * tabel entry at level 0 if the symbol was locally declared
- * as an external symbol.
- *
- * XXX This is wrong for symbols declared static at level 0
- * if the usage information stems from sizeof(). This is
- * because symbols at level 0 only used in sizeof() are
- * considered to not be used.
- */
- if ((xsym = sym->s_xsym) != NULL) {
- if (sym->s_used && !xsym->s_used) {
- xsym->s_used = 1;
- STRUCT_ASSIGN(xsym->s_upos, sym->s_upos);
- }
- if (sym->s_set && !xsym->s_set) {
- xsym->s_set = 1;
- STRUCT_ASSIGN(xsym->s_spos, sym->s_spos);
- }
- }
- }
-}
-
-static void
-chklusg(sym_t *lab)
-{
-
- if (blklev != 1 || lab->s_blklev != 1)
- LERROR("chklusg()");
-
- if (lab->s_set && !lab->s_used) {
- STRUCT_ASSIGN(curr_pos, lab->s_spos);
- /* label %s unused in function %s */
- warning(192, lab->s_name, funcsym->s_name);
- } else if (!lab->s_set) {
- STRUCT_ASSIGN(curr_pos, lab->s_upos);
- /* undefined label %s */
- warning(23, lab->s_name);
- }
-}
-
-static void
-chktusg(sym_t *sym)
-{
-
- if (!incompl(sym->s_type))
- return;
-
- /* complain always about incomplete tags declared inside blocks */
- if (!zflag || dcs->d_ctx != EXTERN)
- return;
-
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- switch (sym->s_type->t_tspec) {
- case STRUCT:
- /* struct %s never defined */
- warning(233, sym->s_name);
- break;
- case UNION:
- /* union %s never defined */
- warning(234, sym->s_name);
- break;
- case ENUM:
- /* enum %s never defined */
- warning(235, sym->s_name);
- break;
- default:
- LERROR("chktusg()");
- }
-}
-
-/*
- * Called after the entire translation unit has been parsed.
- * Changes tentative definitions in definitions.
- * Performs some tests on global Symbols. Detected Problems are:
- * - defined variables of incomplete type
- * - constant variables which are not initialized
- * - static symbols which are never used
- */
-void
-chkglsyms(void)
-{
- sym_t *sym;
- pos_t cpos;
-
- if (blklev != 0 || dcs->d_nxt != NULL)
- norecover();
-
- STRUCT_ASSIGN(cpos, curr_pos);
-
- for (sym = dcs->d_dlsyms; sym != NULL; sym = sym->s_dlnxt) {
- if (sym->s_blklev == -1)
- continue;
- if (sym->s_kind == FVFT) {
- chkglvar(sym);
- } else if (sym->s_kind == FTAG) {
- chktusg(sym);
- } else {
- if (sym->s_kind != FMOS)
- LERROR("chkglsyms()");
- }
- }
-
- STRUCT_ASSIGN(curr_pos, cpos);
-}
-
-static void
-chkglvar(sym_t *sym)
-{
-
- if (sym->s_scl == TYPEDEF || sym->s_scl == ENUMCON)
- return;
-
- if (sym->s_scl != EXTERN && sym->s_scl != STATIC)
- LERROR("chkglvar()");
-
- glchksz(sym);
-
- if (sym->s_scl == STATIC) {
- if (sym->s_type->t_tspec == FUNC) {
- if (sym->s_used && sym->s_def != DEF) {
- STRUCT_ASSIGN(curr_pos, sym->s_upos);
- /* static func. called but not def.. */
- error(225, sym->s_name);
- }
- }
- if (!sym->s_used) {
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- if (sym->s_type->t_tspec == FUNC) {
- if (sym->s_def == DEF) {
- if (!sym->s_inline)
- /* static function %s unused */
- warning(236, sym->s_name);
- } else {
- /* static function %s decl. but ... */
- warning(290, sym->s_name);
- }
- } else if (!sym->s_set) {
- /* static variable %s unused */
- warning(226, sym->s_name);
- } else {
- /* static variable %s set but not used */
- warning(307, sym->s_name);
- }
- }
- if (!tflag && sym->s_def == TDEF && sym->s_type->t_const) {
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- /* const object %s should have initializer */
- warning(227, sym->s_name);
- }
- }
-}
-
-static void
-glchksz(sym_t *sym)
-{
-
- if (sym->s_def == TDEF) {
- if (sym->s_type->t_tspec == FUNC)
- /*
- * this can happen if a syntax error occurred
- * after a function declaration
- */
- return;
- STRUCT_ASSIGN(curr_pos, sym->s_dpos);
- if (length(sym->s_type, sym->s_name) == 0 &&
- sym->s_type->t_tspec == ARRAY && sym->s_type->t_dim == 0) {
- /* empty array declaration: %s */
- if (tflag || (sym->s_scl == EXTERN && !sflag)) {
- warning(190, sym->s_name);
- } else {
- error(190, sym->s_name);
- }
- }
- }
-}
-
-/*
- * Prints information about location of previous definition/declaration.
- */
-void
-prevdecl(int msg, sym_t *psym)
-{
- pos_t cpos;
-
- if (!rflag)
- return;
-
- STRUCT_ASSIGN(cpos, curr_pos);
- STRUCT_ASSIGN(curr_pos, psym->s_dpos);
- if (msg != -1) {
- message(msg, psym->s_name);
- } else if (psym->s_def == DEF || psym->s_def == TDEF) {
- /* previous definition of %s */
- message(261, psym->s_name);
- } else {
- /* previous declaration of %s */
- message(260, psym->s_name);
- }
- STRUCT_ASSIGN(curr_pos, cpos);
-}
Index: usr.bin/xlint/lint1/emit.c
===================================================================
--- usr.bin/xlint/lint1/emit.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/* $NetBSD: emit.c,v 1.2 1995/07/03 21:24:00 cgd Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#ifndef lint
-static char rcsid[] = "$NetBSD: emit.c,v 1.2 1995/07/03 21:24:00 cgd Exp $";
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <err.h>
-
-#include "lint.h"
-
-/* name and handle of output file */
-static const char *loname;
-static FILE *lout;
-
-/* output buffer data */
-ob_t ob;
-
-static void outxbuf(void);
-
-
-/*
- * initialize output
- */
-void
-outopen(name)
- const char *name;
-{
- loname = name;
-
- /* Ausgabedatei oeffnen */
- if ((lout = fopen(name, "w")) == NULL)
- err(1, "cannot open '%s'", name);
-
- /* Ausgabepuffer anlegen */
- ob.o_len = 1024;
- ob.o_end = (ob.o_buf = ob.o_nxt = xmalloc(ob.o_len)) + ob.o_len;
-}
-
-/*
- * flush output buffer and close file
- */
-void
-outclose()
-{
- outclr();
- if (fclose(lout) == EOF)
- err(1, "cannot close '%s'", loname);
-}
-
-/*
- * resize output buffer
- */
-static void
-outxbuf()
-{
- ptrdiff_t coffs;
-
- coffs = ob.o_nxt - ob.o_buf;
- ob.o_len *= 2;
- ob.o_end = (ob.o_buf = xrealloc(ob.o_buf, ob.o_len)) + ob.o_len;
- ob.o_nxt = ob.o_buf + coffs;
-}
-
-/*
- * reset output buffer
- * if it is not empty, it is flushed
- */
-void
-outclr()
-{
- size_t sz;
-
- if (ob.o_buf != ob.o_nxt) {
- outchar('\n');
- sz = ob.o_nxt - ob.o_buf;
- if (sz > ob.o_len)
- errx(1, "internal error: outclr() 1");
- if (fwrite(ob.o_buf, sz, 1, lout) != 1)
- err(1, "cannot write to %s", loname);
- ob.o_nxt = ob.o_buf;
- }
-}
-
-/*
- * write a character to the output buffer
- */
-void
-outchar(c)
- int c;
-{
- if (ob.o_nxt == ob.o_end)
- outxbuf();
- *ob.o_nxt++ = (char)c;
-}
-
-/*
- * write a character to the output buffer, qouted if necessary
- */
-void
-outqchar(c)
- int c;
-{
- if (isprint(c) && c != '\\' && c != '"' && c != '\'') {
- outchar(c);
- } else {
- outchar('\\');
- switch (c) {
- case '\\':
- outchar('\\');
- break;
- case '"':
- outchar('"');
- break;
- case '\'':
- outchar('\'');
- break;
- case '\b':
- outchar('b');
- break;
- case '\t':
- outchar('t');
- break;
- case '\n':
- outchar('n');
- break;
- case '\f':
- outchar('f');
- break;
- case '\r':
- outchar('r');
- break;
-#ifdef __STDC__
- case '\v':
-#else
- case '\013':
-#endif
- outchar('v');
- break;
-#ifdef __STDC__
- case '\a':
-#else
- case '\007':
-#endif
- outchar('a');
- break;
- default:
- outchar((((u_int)c >> 6) & 07) + '0');
- outchar((((u_int)c >> 3) & 07) + '0');
- outchar((c & 07) + '0');
- break;
- }
- }
-}
-
-/*
- * write a strint to the output buffer
- * the string must not contain any characters which
- * should be quoted
- */
-void
-outstrg(s)
- const char *s;
-{
- while (*s != '\0') {
- if (ob.o_nxt == ob.o_end)
- outxbuf();
- *ob.o_nxt++ = *s++;
- }
-}
-
-/*
- * write an integer value to toe output buffer
- */
-void
-outint(i)
- int i;
-{
- if ((ob.o_end - ob.o_nxt) < 3 * sizeof (int))
- outxbuf();
- ob.o_nxt += sprintf(ob.o_nxt, "%d", i);
-}
-
-/*
- * write the name of a symbol to the output buffer
- * the name is preceded by its length
- */
-void
-outname(name)
- const char *name;
-{
- if (name == NULL)
- errx(1, "internal error: outname() 1");
- outint((int)strlen(name));
- outstrg(name);
-}
-
-/*
- * write the name of the .c source
- */
-void
-outsrc(name)
- const char *name;
-{
- outclr();
- outchar('S');
- outstrg(name);
-}
Index: usr.bin/xlint/lint1/emit1.c
===================================================================
--- usr.bin/xlint/lint1/emit1.c
+++ /dev/null
@@ -1,601 +0,0 @@
-/* $NetBSD: emit1.c,v 1.14 2004/06/20 22:20:16 jmc Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: emit1.c,v 1.14 2004/06/20 22:20:16 jmc Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-
-#include "lint1.h"
-
-static void outtt(sym_t *, sym_t *);
-static void outfstrg(strg_t *);
-
-/*
- * Write type into the output buffer.
- * The type is written as a sequence of substrings, each of which describes a
- * node of type type_t
- * a node is coded as follows:
- * char C
- * signed char s C
- * unsigned char u C
- * short S
- * unsigned short u S
- * int I
- * unsigned int u I
- * long L
- * unsigned long u L
- * long long Q
- * unsigned long long u Q
- * float s D
- * double D
- * long double l D
- * void V
- * * P
- * [n] A n
- * () F
- * (void) F 0
- * (n arguments) F n arg1 arg2 ... argn
- * (n arguments, ...) F n arg1 arg2 ... argn-1 E
- * (a, b, c, ...) f n arg1 arg2 ...
- * enum tag e T tag_or_typename
- * struct tag s T tag_or_typename
- * union tag u T tag_or_typename
- *
- * tag_or_typename 0 no tag or type name
- * 1 n tag Tag
- * 2 n typename only type name
- *
- * spaces are only for better readability
- * additionally it is possible to prepend the characters 'c' (for const)
- * and 'v' (for volatile)
- */
-void
-outtype(type_t *tp)
-{
- int t, s, na;
- sym_t *arg;
- tspec_t ts;
-
- while (tp != NULL) {
- if ((ts = tp->t_tspec) == INT && tp->t_isenum)
- ts = ENUM;
- switch (ts) {
- case CHAR: t = 'C'; s = '\0'; break;
- case SCHAR: t = 'C'; s = 's'; break;
- case UCHAR: t = 'C'; s = 'u'; break;
- case SHORT: t = 'S'; s = '\0'; break;
- case USHORT: t = 'S'; s = 'u'; break;
- case INT: t = 'I'; s = '\0'; break;
- case UINT: t = 'I'; s = 'u'; break;
- case LONG: t = 'L'; s = '\0'; break;
- case ULONG: t = 'L'; s = 'u'; break;
- case QUAD: t = 'Q'; s = '\0'; break;
- case UQUAD: t = 'Q'; s = 'u'; break;
- case FLOAT: t = 'D'; s = 's'; break;
- case DOUBLE: t = 'D'; s = '\0'; break;
- case LDOUBLE: t = 'D'; s = 'l'; break;
- case VOID: t = 'V'; s = '\0'; break;
- case PTR: t = 'P'; s = '\0'; break;
- case ARRAY: t = 'A'; s = '\0'; break;
- case FUNC: t = 'F'; s = '\0'; break;
- case ENUM: t = 'T'; s = 'e'; break;
- case STRUCT: t = 'T'; s = 's'; break;
- case UNION: t = 'T'; s = 'u'; break;
- default:
- LERROR("outtyp()");
- }
- if (tp->t_const)
- outchar('c');
- if (tp->t_volatile)
- outchar('v');
- if (s != '\0')
- outchar(s);
- outchar(t);
- if (ts == ARRAY) {
- outint(tp->t_dim);
- } else if (ts == ENUM) {
- outtt(tp->t_enum->etag, tp->t_enum->etdef);
- } else if (ts == STRUCT || ts == UNION) {
- outtt(tp->t_str->stag, tp->t_str->stdef);
- } else if (ts == FUNC && tp->t_proto) {
- na = 0;
- for (arg = tp->t_args; arg != NULL; arg = arg->s_nxt)
- na++;
- if (tp->t_vararg)
- na++;
- outint(na);
- for (arg = tp->t_args; arg != NULL; arg = arg->s_nxt)
- outtype(arg->s_type);
- if (tp->t_vararg)
- outchar('E');
- }
- tp = tp->t_subt;
- }
-}
-
-/*
- * type to string
- * used for debugging output
- *
- * it uses its own output buffer for conversion
- */
-const char *
-ttos(type_t *tp)
-{
- static ob_t tob;
- ob_t tmp;
-
- if (tob.o_buf == NULL) {
- tob.o_len = 64;
- tob.o_buf = tob.o_nxt = xmalloc(tob.o_len);
- tob.o_end = tob.o_buf + tob.o_len;
- }
-
- tmp = ob;
- ob = tob;
- ob.o_nxt = ob.o_buf;
- outtype(tp);
- outchar('\0');
- tob = ob;
- ob = tmp;
-
- return (tob.o_buf);
-}
-
-/*
- * write the name of a tag or typename
- *
- * if the tag is named, the name of the
- * tag is written, otherwise, if a typename exists which
- * refers to this tag, this typename is written
- */
-static void
-outtt(sym_t *tag, sym_t *tdef)
-{
-
- /*
- * 0 is no longer used.
- */
- if (tag->s_name != unnamed) {
- outint(1);
- outname(tag->s_name);
- } else if (tdef != NULL) {
- outint(2);
- outname(tdef->s_name);
- } else {
- outint(3);
- outint(tag->s_dpos.p_line);
- outchar('.');
- outint(getfnid(tag->s_dpos.p_file));
- outchar('.');
- outint(tag->s_dpos.p_uniq);
- }
-}
-
-/*
- * write information about a global declared/defined symbol
- * with storage class extern
- *
- * informations about function definitions are written in outfdef(),
- * not here
- */
-void
-outsym(sym_t *sym, scl_t sc, def_t def)
-{
-
- /*
- * Static function declarations must also be written to the output
- * file. Compatibility of function declarations (for both static
- * and extern functions) must be checked in lint2. Lint1 can't do
- * this, especially not, if functions are declared at block level
- * before their first declaration at level 0.
- */
- if (sc != EXTERN && !(sc == STATIC && sym->s_type->t_tspec == FUNC))
- return;
-
- /* reset buffer */
- outclr();
-
- /*
- * line number of .c source, 'd' for declaration, Id of current
- * source (.c or .h), and line in current source.
- */
- outint(csrc_pos.p_line);
- outchar('d');
- outint(getfnid(sym->s_dpos.p_file));
- outchar('.');
- outint(sym->s_dpos.p_line);
-
- /* flags */
-
- switch (def) {
- case DEF:
- /* defined */
- outchar('d');
- break;
- case TDEF:
- /* tentative defined */
- outchar('t');
- break;
- case DECL:
- /* declared */
- outchar('e');
- break;
- default:
- LERROR("outsym()");
- }
- if (llibflg && def != DECL) {
- /*
- * mark it as used so we get no warnings from lint2 about
- * unused symbols in libraries.
- */
- outchar('u');
- }
-
- if (sc == STATIC)
- outchar('s');
-
- /* name of the symbol */
- outname(sym->s_name);
-
- /* renamed name of symbol, if necessary */
- if (sym->s_rename) {
- outchar('r');
- outname(sym->s_rename);
- }
-
- /* type of the symbol */
- outtype(sym->s_type);
-}
-
-/*
- * write information about function definition
- *
- * this is also done for static functions so we are able to check if
- * they are called with proper argument types
- */
-void
-outfdef(sym_t *fsym, pos_t *posp, int rval, int osdef, sym_t *args)
-{
- int narg;
- sym_t *arg;
-
- /* reset the buffer */
- outclr();
-
- /*
- * line number of .c source, 'd' for declaration, Id of current
- * source (.c or .h), and line in current source
- *
- * we are already at the end of the function. If we are in the
- * .c source, posp->p_line is correct, otherwise csrc_pos.p_line
- * (for functions defined in header files).
- */
- if (posp->p_file == csrc_pos.p_file) {
- outint(posp->p_line);
- } else {
- outint(csrc_pos.p_line);
- }
- outchar('d');
- outint(getfnid(posp->p_file));
- outchar('.');
- outint(posp->p_line);
-
- /* flags */
-
- /* both SCANFLIKE and PRINTFLIKE imply VARARGS */
- if (prflstrg != -1) {
- nvararg = prflstrg;
- } else if (scflstrg != -1) {
- nvararg = scflstrg;
- }
-
- if (nvararg != -1) {
- outchar('v');
- outint(nvararg);
- }
- if (scflstrg != -1) {
- outchar('S');
- outint(scflstrg);
- }
- if (prflstrg != -1) {
- outchar('P');
- outint(prflstrg);
- }
- nvararg = prflstrg = scflstrg = -1;
-
- outchar('d');
-
- if (rval)
- /* has return value */
- outchar('r');
-
- if (llibflg)
- /*
- * mark it as used so lint2 does not complain about
- * unused symbols in libraries
- */
- outchar('u');
-
- if (osdef)
- /* old style function definition */
- outchar('o');
-
- if (fsym->s_scl == STATIC)
- outchar('s');
-
- /* name of function */
- outname(fsym->s_name);
-
- /* renamed name of function, if necessary */
- if (fsym->s_rename) {
- outchar('r');
- outname(fsym->s_rename);
- }
-
- /* argument types and return value */
- if (osdef) {
- narg = 0;
- for (arg = args; arg != NULL; arg = arg->s_nxt)
- narg++;
- outchar('f');
- outint(narg);
- for (arg = args; arg != NULL; arg = arg->s_nxt)
- outtype(arg->s_type);
- outtype(fsym->s_type->t_subt);
- } else {
- outtype(fsym->s_type);
- }
-}
-
-/*
- * write out all information necessary for lint2 to check function
- * calls
- *
- * rvused is set if the return value is used (asigned to a variable)
- * rvdisc is set if the return value is not used and not ignored
- * (casted to void)
- */
-void
-outcall(tnode_t *tn, int rvused, int rvdisc)
-{
- tnode_t *args, *arg;
- int narg, n, i;
- int64_t q;
- tspec_t t;
-
- /* reset buffer */
- outclr();
-
- /*
- * line number of .c source, 'c' for function call, Id of current
- * source (.c or .h), and line in current source
- */
- outint(csrc_pos.p_line);
- outchar('c');
- outint(getfnid(curr_pos.p_file));
- outchar('.');
- outint(curr_pos.p_line);
-
- /*
- * flags; 'u' and 'i' must be last to make sure a letter
- * is between the numeric argument of a flag and the name of
- * the function
- */
- narg = 0;
- args = tn->tn_right;
- for (arg = args; arg != NULL; arg = arg->tn_right)
- narg++;
- /* informations about arguments */
- for (n = 1; n <= narg; n++) {
- /* the last argument is the top one in the tree */
- for (i = narg, arg = args; i > n; i--, arg = arg->tn_right)
- continue;
- arg = arg->tn_left;
- if (arg->tn_op == CON) {
- if (isityp(t = arg->tn_type->t_tspec)) {
- /*
- * XXX it would probably be better to
- * explizitly test the sign
- */
- if ((q = arg->tn_val->v_quad) == 0) {
- /* zero constant */
- outchar('z');
- } else if (msb(q, t, 0) == 0) {
- /* positive if casted to signed */
- outchar('p');
- } else {
- /* negative if casted to signed */
- outchar('n');
- }
- outint(n);
- }
- } else if (arg->tn_op == AMPER &&
- arg->tn_left->tn_op == STRING &&
- arg->tn_left->tn_strg->st_tspec == CHAR) {
- /* constant string, write all format specifiers */
- outchar('s');
- outint(n);
- outfstrg(arg->tn_left->tn_strg);
- }
-
- }
- /* return value discarded/used/ignored */
- outchar(rvdisc ? 'd' : (rvused ? 'u' : 'i'));
-
- /* name of the called function */
- outname(tn->tn_left->tn_left->tn_sym->s_name);
-
- /* types of arguments */
- outchar('f');
- outint(narg);
- for (n = 1; n <= narg; n++) {
- /* the last argument is the top one in the tree */
- for (i = narg, arg = args; i > n; i--, arg = arg->tn_right)
- continue;
- outtype(arg->tn_left->tn_type);
- }
- /* expected type of return value */
- outtype(tn->tn_type);
-}
-
-/*
- * extracts potential format specifiers for printf() and scanf() and
- * writes them, enclosed in "" and qouted if necessary, to the output buffer
- */
-static void
-outfstrg(strg_t *strg)
-{
- int c, oc, first;
- u_char *cp;
-
- if (strg->st_tspec != CHAR)
- LERROR("outfstrg()");
-
- cp = strg->st_cp;
-
- outchar('"');
-
- c = *cp++;
-
- while (c != '\0') {
-
- if (c != '%') {
- c = *cp++;
- continue;
- }
-
- outqchar('%');
- c = *cp++;
-
- /* flags for printf and scanf and *-fieldwidth for printf */
- while (c != '\0' && (c == '-' || c == '+' || c == ' ' ||
- c == '#' || c == '0' || c == '*')) {
- outqchar(c);
- c = *cp++;
- }
-
- /* numeric field width */
- while (c != '\0' && isdigit(c)) {
- outqchar(c);
- c = *cp++;
- }
-
- /* precision for printf */
- if (c == '.') {
- outqchar(c);
- if ((c = *cp++) == '*') {
- outqchar(c);
- c = *cp++;
- } else {
- while (c != '\0' && isdigit(c)) {
- outqchar(c);
- c = *cp++;
- }
- }
- }
-
- /* h, l, L and q flags fpr printf and scanf */
- if (c == 'h' || c == 'l' || c == 'L' || c == 'q') {
- outqchar(c);
- c = *cp++;
- }
-
- /*
- * The last character. It is always written so we can detect
- * invalid format specifiers.
- */
- if (c != '\0') {
- outqchar(c);
- oc = c;
- c = *cp++;
- /*
- * handle [ for scanf. [-] means that a minus sign
- * was found at an undefined position.
- */
- if (oc == '[') {
- if (c == '^')
- c = *cp++;
- if (c == ']')
- c = *cp++;
- first = 1;
- while (c != '\0' && c != ']') {
- if (c == '-') {
- if (!first && *cp != ']')
- outqchar(c);
- }
- first = 0;
- c = *cp++;
- }
- if (c == ']') {
- outqchar(c);
- c = *cp++;
- }
- }
- }
-
- }
-
- outchar('"');
-}
-
-/*
- * writes a record if sym was used
- */
-void
-outusg(sym_t *sym)
-{
- /* reset buffer */
- outclr();
-
- /*
- * line number of .c source, 'u' for used, Id of current
- * source (.c or .h), and line in current source
- */
- outint(csrc_pos.p_line);
- outchar('u');
- outint(getfnid(curr_pos.p_file));
- outchar('.');
- outint(curr_pos.p_line);
-
- /* necessary to delimit both numbers */
- outchar('x');
-
- /* Den Namen des Symbols ausgeben */
- outname(sym->s_name);
-}
Index: usr.bin/xlint/lint1/err.c
===================================================================
--- usr.bin/xlint/lint1/err.c
+++ /dev/null
@@ -1,552 +0,0 @@
-/* $NetBSD: err.c,v 1.40 2009/04/15 01:20:57 christos Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: err.c,v 1.40 2009/04/15 01:20:57 christos Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <stdlib.h>
-#include <stdarg.h>
-
-#include "lint1.h"
-
-/* number of errors found */
-int nerr;
-
-/* number of syntax errors */
-int sytxerr;
-
-
-static const char *lbasename(const char *);
-static void verror(int, va_list);
-static void vwarning(int, va_list);
-
-
-const char *msgs[] = {
- "syntax error: empty declaration", /* 0 */
- "old style declaration; add int", /* 1 */
- "empty declaration", /* 2 */
- "%s declared in argument declaration list", /* 3 */
- "illegal type combination", /* 4 */
- "modifying typedef with '%s'; only qualifiers allowed", /* 5 */
- "use 'double' instead of 'long float'", /* 6 */
- "only one storage class allowed", /* 7 */
- "illegal storage class", /* 8 */
- "only register valid as formal parameter storage class", /* 9 */
- "duplicate '%s'", /* 10 */
- "bit-field initializer out of range", /* 11 */
- "compiler takes size of function", /* 12 */
- "incomplete enum type: %s", /* 13 */
- "compiler takes alignment of function", /* 14 */
- "function returns illegal type", /* 15 */
- "array of function is illegal", /* 16 */
- "null dimension", /* 17 */
- "illegal use of 'void'", /* 18 */
- "void type for %s", /* 19 */
- "negative array dimension (%d)", /* 20 */
- "redeclaration of formal parameter %s", /* 21 */
- "incomplete or misplaced function definition", /* 22 */
- "undefined label %s", /* 23 */
- "cannot initialize function: %s", /* 24 */
- "cannot initialize typedef: %s", /* 25 */
- "cannot initialize extern declaration: %s", /* 26 */
- "redeclaration of %s", /* 27 */
- "redefinition of %s", /* 28 */
- "previously declared extern, becomes static: %s", /* 29 */
- "redeclaration of %s; ANSI C requires static", /* 30 */
- "incomplete structure or union %s: %s", /* 31 */
- "argument type defaults to 'int': %s", /* 32 */
- "duplicate member name: %s", /* 33 */
- "nonportable bit-field type", /* 34 */
- "illegal bit-field type", /* 35 */
- "illegal bit-field size", /* 36 */
- "zero size bit-field", /* 37 */
- "function illegal in structure or union", /* 38 */
- "zero sized array in struct is a C99 extension: %s", /* 39 */
- "unknown size: %s", /* 40 */
- "illegal use of bit-field", /* 41 */
- "forward reference to enum type", /* 42 */
- "redefinition hides earlier one: %s", /* 43 */
- "declaration introduces new type in ANSI C: %s %s", /* 44 */
- "base type is really '%s %s'", /* 45 */
- "(%s) tag redeclared", /* 46 */
- "zero sized %s is a C9X feature", /* 47 */
- "overflow in enumeration values: %s", /* 48 */
- "struct or union member must be named", /* 49 */
- "a function is declared as an argument: %s", /* 50 */
- "parameter mismatch: %d declared, %d defined", /* 51 */
- "cannot initialize parameter: %s", /* 52 */
- "declared argument %s is missing", /* 53 */
- "trailing ',' prohibited in enum declaration", /* 54 */
- "integral constant expression expected", /* 55 */
- "integral constant too large", /* 56 */
- "enumeration constant hides parameter: %s", /* 57 */
- "type does not match prototype: %s", /* 58 */
- "formal parameter lacks name: param #%d", /* 59 */
- "void must be sole parameter", /* 60 */
- "void parameter cannot have name: %s", /* 61 */
- "function prototype parameters must have types", /* 62 */
- "prototype does not match old-style definition", /* 63 */
- "()-less function definition", /* 64 */
- "%s has no named members", /* 65 */
- "syntax requires ';' after last struct/union member", /* 66 */
- "cannot return incomplete type", /* 67 */
- "typedef already qualified with '%s'", /* 68 */
- "inappropriate qualifiers with 'void'", /* 69 */
- "%soperand of '%s' is unsigned in ANSI C", /* 70 */
- "too many characters in character constant", /* 71 */
- "typedef declares no type name", /* 72 */
- "empty character constant", /* 73 */
- "no hex digits follow \\x", /* 74 */
- "overflow in hex escape", /* 75 */
- "character escape does not fit in character", /* 76 */
- "bad octal digit %c", /* 77 */
- "nonportable character escape", /* 78 */
- "dubious escape \\%c", /* 79 */
- "dubious escape \\%o", /* 80 */
- "\\a undefined in traditional C", /* 81 */
- "\\x undefined in traditional C", /* 82 */
- "storage class after type is obsolescent", /* 83 */
- "ANSI C requires formal parameter before '...'", /* 84 */
- "dubious tag declaration: %s %s", /* 85 */
- "automatic hides external declaration: %s", /* 86 */
- "static hides external declaration: %s", /* 87 */
- "typedef hides external declaration: %s", /* 88 */
- "typedef redeclared: %s", /* 89 */
- "inconsistent redeclaration of extern: %s", /* 90 */
- "declaration hides parameter: %s", /* 91 */
- "inconsistent redeclaration of static: %s", /* 92 */
- "dubious static function at block level: %s", /* 93 */
- "function has illegal storage class: %s", /* 94 */
- "declaration hides earlier one: %s", /* 95 */
- "cannot dereference non-pointer type", /* 96 */
- "suffix U is illegal in traditional C", /* 97 */
- "suffixes F and L are illegal in traditional C", /* 98 */
- "%s undefined", /* 99 */
- "unary + is illegal in traditional C", /* 100 */
- "undefined struct/union member: %s", /* 101 */
- "illegal member use: %s", /* 102 */
- "left operand of '.' must be struct/union object", /* 103 */
- "left operand of '->' must be pointer to struct/union", /* 104 */
- "non-unique member requires struct/union %s", /* 105 */
- "left operand of '->' must be pointer", /* 106 */
- "operands of '%s' have incompatible types", /* 107 */
- "operand of '%s' has incompatible type", /* 108 */
- "void type illegal in expression", /* 109 */
- "pointer to function is not allowed here", /* 110 */
- "unacceptable operand of '%s'", /* 111 */
- "cannot take address of bit-field", /* 112 */
- "cannot take address of register %s", /* 113 */
- "%soperand of '%s' must be lvalue", /* 114 */
- "%soperand of '%s' must be modifiable lvalue", /* 115 */
- "illegal pointer subtraction", /* 116 */
- "bitwise operation on signed value possibly nonportable", /* 117 */
- "semantics of '%s' change in ANSI C; use explicit cast", /* 118 */
- "conversion of '%s' to '%s' is out of range", /* 119 */
- "bitwise operation on signed value nonportable", /* 120 */
- "negative shift", /* 121 */
- "shift greater than size of object", /* 122 */
- "illegal combination of pointer and integer, op %s", /* 123 */
- "illegal pointer combination, op %s", /* 124 */
- "ANSI C forbids ordered comparisons of pointers to functions",/* 125 */
- "incompatible types in conditional", /* 126 */
- "'&' before array or function: ignored", /* 127 */
- "operands have incompatible pointer types, op %s", /* 128 */
- "expression has null effect", /* 129 */
- "enum type mismatch, op %s", /* 130 */
- "conversion to '%s' may sign-extend incorrectly", /* 131 */
- "conversion from '%s' to '%s' may lose accuracy", /* 132 */
- "conversion of pointer to '%s' loses bits", /* 133 */
- "conversion of pointer to '%s' may lose bits", /* 134 */
- "possible pointer alignment problem", /* 135 */
- "cannot do pointer arithmetic on operand of unknown size", /* 136 */
- "use of incomplete enum type, op %s", /* 137 */
- "unknown operand size, op %s", /* 138 */
- "division by 0", /* 139 */
- "modulus by 0", /* 140 */
- "integer overflow detected, op %s", /* 141 */
- "floating point overflow detected, op %s", /* 142 */
- "cannot take size of incomplete type", /* 143 */
- "cannot take size of function", /* 144 */
- "cannot take size of bit-field", /* 145 */
- "cannot take size of void", /* 146 */
- "invalid cast expression", /* 147 */
- "improper cast of void expression", /* 148 */
- "illegal function", /* 149 */
- "argument mismatch: %d arg%s passed, %d expected", /* 150 */
- "void expressions may not be arguments, arg #%d", /* 151 */
- "argument cannot have unknown size, arg #%d", /* 152 */
- "argument has incompatible pointer type, arg #%d", /* 153 */
- "illegal combination of pointer and integer, arg #%d", /* 154 */
- "argument is incompatible with prototype, arg #%d", /* 155 */
- "enum type mismatch, arg #%d", /* 156 */
- "ANSI C treats constant as unsigned", /* 157 */
- "%s may be used before set", /* 158 */
- "assignment in conditional context", /* 159 */
- "operator '==' found where '=' was expected", /* 160 */
- "constant in conditional context", /* 161 */
- "comparison of %s with %s, op %s", /* 162 */
- "a cast does not yield an lvalue", /* 163 */
- "assignment of negative constant to unsigned type", /* 164 */
- "constant truncated by assignment", /* 165 */
- "precision lost in bit-field assignment", /* 166 */
- "array subscript cannot be negative: %ld", /* 167 */
- "array subscript cannot be > %d: %ld", /* 168 */
- "precedence confusion possible: parenthesize!", /* 169 */
- "first operand must have scalar type, op ? :", /* 170 */
- "assignment type mismatch", /* 171 */
- "too many struct/union initializers", /* 172 */
- "too many array initializers", /* 173 */
- "too many initializers", /* 174 */
- "initialisation of an incomplete type", /* 175 */
- "invalid initializer type %s", /* 176 */
- "non-constant initializer", /* 177 */
- "initializer does not fit", /* 178 */
- "cannot initialize struct/union with no named member", /* 179 */
- "bit-field initializer does not fit", /* 180 */
- "{}-enclosed initializer required", /* 181 */
- "incompatible pointer types", /* 182 */
- "illegal combination of pointer and integer", /* 183 */
- "illegal pointer combination", /* 184 */
- "initialisation type mismatch", /* 185 */
- "bit-field initialisation is illegal in traditional C", /* 186 */
- "non-null byte ignored in string initializer", /* 187 */
- "no automatic aggregate initialization in traditional C", /* 188 */
- "assignment of struct/union illegal in traditional C", /* 189 */
- "empty array declaration: %s", /* 190 */
- "%s set but not used in function %s", /* 191 */
- "%s unused in function %s", /* 192 */
- "statement not reached", /* 193 */
- "label %s redefined", /* 194 */
- "case not in switch", /* 195 */
- "case label affected by conversion", /* 196 */
- "non-constant case expression", /* 197 */
- "non-integral case expression", /* 198 */
- "duplicate case in switch: %ld", /* 199 */
- "duplicate case in switch: %lu", /* 200 */
- "default outside switch", /* 201 */
- "duplicate default in switch", /* 202 */
- "case label must be of type `int' in traditional C", /* 203 */
- "controlling expressions must have scalar type", /* 204 */
- "switch expression must have integral type", /* 205 */
- "enumeration value(s) not handled in switch", /* 206 */
- "loop not entered at top", /* 207 */
- "break outside loop or switch", /* 208 */
- "continue outside loop", /* 209 */
- "enum type mismatch in initialisation", /* 210 */
- "return value type mismatch", /* 211 */
- "cannot return incomplete type", /* 212 */
- "void function %s cannot return value", /* 213 */
- "function %s expects to return value", /* 214 */
- "function implicitly declared to return int", /* 215 */
- "function %s has return (e); and return;", /* 216 */
- "function %s falls off bottom without returning value", /* 217 */
- "ANSI C treats constant as unsigned, op %s", /* 218 */
- "concatenated strings are illegal in traditional C", /* 219 */
- "fallthrough on case statement", /* 220 */
- "initialisation of unsigned with negative constant", /* 221 */
- "conversion of negative constant to unsigned type", /* 222 */
- "end-of-loop code not reached", /* 223 */
- "cannot recover from previous errors", /* 224 */
- "static function called but not defined: %s()", /* 225 */
- "static variable %s unused", /* 226 */
- "const object %s should have initializer", /* 227 */
- "function cannot return const or volatile object", /* 228 */
- "questionable conversion of function pointer", /* 229 */
- "nonportable character comparison, op %s", /* 230 */
- "argument %s unused in function %s", /* 231 */
- "label %s unused in function %s", /* 232 */
- "struct %s never defined", /* 233 */
- "union %s never defined", /* 234 */
- "enum %s never defined", /* 235 */
- "static function %s unused", /* 236 */
- "redeclaration of formal parameter %s", /* 237 */
- "initialisation of union is illegal in traditional C", /* 238 */
- "constant argument to NOT", /* 239 */
- "assignment of different structures", /* 240 */
- "dubious operation on enum, op %s", /* 241 */
- "combination of '%s' and '%s', op %s", /* 242 */
- "dubious comparison of enums, op %s", /* 243 */
- "illegal structure pointer combination", /* 244 */
- "illegal structure pointer combination, op %s", /* 245 */
- "dubious conversion of enum to '%s'", /* 246 */
- "pointer casts may be troublesome", /* 247 */
- "floating-point constant out of range", /* 248 */
- "syntax error", /* 249 */
- "unknown character \\%o", /* 250 */
- "malformed integer constant", /* 251 */
- "integer constant out of range", /* 252 */
- "unterminated character constant", /* 253 */
- "newline in string or char constant", /* 254 */
- "undefined or invalid # directive", /* 255 */
- "unterminated comment", /* 256 */
- "extra characters in lint comment", /* 257 */
- "unterminated string constant", /* 258 */
- "conversion to '%s' due to prototype, arg #%d", /* 259 */
- "previous declaration of %s", /* 260 */
- "previous definition of %s", /* 261 */
- "\\\" inside character constants undefined in traditional C", /* 262 */
- "\\? undefined in traditional C", /* 263 */
- "\\v undefined in traditional C", /* 264 */
- "%s C does not support 'long long'", /* 265 */
- "'long double' is illegal in traditional C", /* 266 */
- "shift equal to size of object", /* 267 */
- "variable declared inline: %s", /* 268 */
- "argument declared inline: %s", /* 269 */
- "function prototypes are illegal in traditional C", /* 270 */
- "switch expression must be of type `int' in traditional C", /* 271 */
- "empty translation unit", /* 272 */
- "bit-field type '%s' invalid in ANSI C", /* 273 */
- "ANSI C forbids comparison of %s with %s", /* 274 */
- "cast discards 'const' from pointer target type", /* 275 */
- "", /* 276 */
- "initialisation of '%s' with '%s'", /* 277 */
- "combination of '%s' and '%s', arg #%d", /* 278 */
- "combination of '%s' and '%s' in return", /* 279 */
- "must be outside function: /* %s */", /* 280 */
- "duplicate use of /* %s */", /* 281 */
- "must precede function definition: /* %s */", /* 282 */
- "argument number mismatch with directive: /* %s */", /* 283 */
- "fallthrough on default statement", /* 284 */
- "prototype declaration", /* 285 */
- "function definition is not a prototype", /* 286 */
- "function declaration is not a prototype", /* 287 */
- "dubious use of /* VARARGS */ with /* %s */", /* 288 */
- "can't be used together: /* PRINTFLIKE */ /* SCANFLIKE */", /* 289 */
- "static function %s declared but not defined", /* 290 */
- "invalid multibyte character", /* 291 */
- "cannot concatenate wide and regular string literals", /* 292 */
- "argument %d must be 'char *' for PRINTFLIKE/SCANFLIKE", /* 293 */
- "multi-character character constant", /* 294 */
- "conversion of '%s' to '%s' is out of range, arg #%d", /* 295 */
- "conversion of negative constant to unsigned type, arg #%d", /* 296 */
- "conversion to '%s' may sign-extend incorrectly, arg #%d", /* 297 */
- "conversion from '%s' to '%s' may lose accuracy, arg #%d", /* 298 */
- "prototype does not match old style definition, arg #%d", /* 299 */
- "old style definition", /* 300 */
- "array of incomplete type", /* 301 */
- "%s returns pointer to automatic object", /* 302 */
- "ANSI C forbids conversion of %s to %s", /* 303 */
- "ANSI C forbids conversion of %s to %s, arg #%d", /* 304 */
- "ANSI C forbids conversion of %s to %s, op %s", /* 305 */
- "constant truncated by conversion, op %s", /* 306 */
- "static variable %s set but not used", /* 307 */
- "", /* 308 */
- "extra bits set to 0 in conversion of '%s' to '%s', op %s", /* 309 */
- "symbol renaming can't be used on function arguments", /* 310 */
- "symbol renaming can't be used on automatic variables", /* 311 */
- "%s C does not support // comments", /* 312 */
- "struct or union member name in initializer is a C9X feature",/* 313 */
- "%s is not a structure or a union", /* 314 */
- "GCC style struct or union member name in initializer", /* 315 */
- "__FUNCTION__ is a GCC extension", /* 316 */
- "__func__ is a C9X feature", /* 317 */
- "variable array dimension is a C99/GCC extension", /* 318 */
- "compound literals are a C9X/GCC extension", /* 319 */
- "({ }) is a GCC extension", /* 320 */
- "array initializer with designators is a C9X feature", /* 321 */
- "zero sized array is a C99 extension", /* 322 */
-};
-
-/*
- * print a list of the messages with their ids
- */
-void
-msglist(void)
-{
- size_t i;
-
- for (i = 0; i < sizeof(msgs) / sizeof(msgs[0]); i++)
- printf("%zu\t%s\n", i, msgs[i]);
-}
-
-/*
- * If Fflag is not set lbasename() returns a pointer to the last
- * component of the path, otherwise it returns the argument.
- */
-static const char *
-lbasename(const char *path)
-{
- const char *cp, *cp1, *cp2;
-
- if (Fflag)
- return (path);
-
- cp = cp1 = cp2 = path;
- while (*cp != '\0') {
- if (*cp++ == '/') {
- cp2 = cp1;
- cp1 = cp;
- }
- }
- return (*cp1 == '\0' ? cp2 : cp1);
-}
-
-static void
-verror( int n, va_list ap)
-{
- const char *fn;
-
- if (ERR_ISSET(n, &msgset))
- return;
-
- fn = lbasename(curr_pos.p_file);
- (void)printf("%s(%d): ", fn, curr_pos.p_line);
- (void)vprintf(msgs[n], ap);
- (void)printf(" [%d]\n", n);
- nerr++;
-}
-
-static void
-vwarning( int n, va_list ap)
-{
- const char *fn;
-
- if (ERR_ISSET(n, &msgset))
- return;
-
- if (nowarn)
- /* this warning is suppressed by a LINTED comment */
- return;
-
- fn = lbasename(curr_pos.p_file);
- (void)printf("%s(%d): warning: ", fn, curr_pos.p_line);
- (void)vprintf(msgs[n], ap);
- (void)printf(" [%d]\n", n);
- if (wflag)
- nerr++;
-}
-
-void
-error(int n, ...)
-{
- va_list ap;
-
- va_start(ap, n);
- verror(n, ap);
- va_end(ap);
-}
-
-void
-lerror(const char *file, int line, const char *msg, ...)
-{
- va_list ap;
- const char *fn;
-
- va_start(ap, msg);
- fn = lbasename(curr_pos.p_file);
- (void)fprintf(stderr, "%s(%d): lint error: %s, %d", fn, curr_pos.p_line,
- file, line);
- (void)vfprintf(stderr, msg, ap);
- (void)fprintf(stderr, "\n");
- va_end(ap);
- exit(1);
-}
-
-void
-warning(int n, ...)
-{
- va_list ap;
-
- va_start(ap, n);
- vwarning(n, ap);
- va_end(ap);
-}
-
-void
-message(int n, ...)
-{
- va_list ap;
- const char *fn;
-
- if (ERR_ISSET(n, &msgset))
- return;
-
- va_start(ap, n);
- fn = lbasename(curr_pos.p_file);
- (void)printf("%s(%d): ", fn, curr_pos.p_line);
- (void)vprintf(msgs[n], ap);
- (void)printf(" [%d]\n", n);
- va_end(ap);
-}
-
-/*
- * XXX I think the logic is possibly somewhat screwed up here. The
- * question is, how do we want to interpret the -s and -S flags going
- * forward? We need to answer that and then we can fix this to be
- * "right"... [perry, 2 Nov 2002]
-*/
-int
-c99ism(int n, ...)
-{
- va_list ap;
- int msg;
-
- va_start(ap, n);
- if (sflag && !(Sflag || gflag)) {
- verror(n, ap);
- msg = 1;
- } else if (!sflag && (Sflag || gflag)) {
- msg = 0;
- } else {
- vwarning(n, ap);
- msg = 1;
- }
- va_end(ap);
-
- return (msg);
-}
-
-int
-gnuism(int n, ...)
-{
- va_list ap;
- int msg;
-
- va_start(ap, n);
- if (sflag && !gflag) {
- verror(n, ap);
- msg = 1;
- } else if (!sflag && gflag) {
- msg = 0;
- } else {
- vwarning(n, ap);
- msg = 1;
- }
- va_end(ap);
-
- return (msg);
-}
Index: usr.bin/xlint/lint1/externs1.h
===================================================================
--- usr.bin/xlint/lint1/externs1.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/* $NetBSD: externs1.h,v 1.20 2002/11/02 20:09:27 perry Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * main.c
- */
-extern int aflag;
-extern int bflag;
-extern int cflag;
-extern int dflag;
-extern int eflag;
-extern int Fflag;
-extern int gflag;
-extern int hflag;
-extern int rflag;
-extern int sflag;
-extern int tflag;
-extern int uflag;
-extern int vflag;
-extern int yflag;
-extern int wflag;
-extern int zflag;
-extern int Sflag;
-
-extern void norecover(void);
-
-/*
- * cgram.y
- */
-extern int blklev;
-extern int mblklev;
-extern int yydebug;
-
-extern int yyerror(char *);
-extern int yyparse(void);
-
-/*
- * scan.l
- */
-extern pos_t curr_pos;
-extern pos_t csrc_pos;
-extern symt_t symtyp;
-extern FILE *yyin;
-extern uint64_t qbmasks[], qlmasks[], qumasks[];
-
-extern void initscan(void);
-extern int sign(int64_t, tspec_t, int);
-extern int msb(int64_t, tspec_t, int);
-extern int64_t xsign(int64_t, tspec_t, int);
-extern void clrwflgs(void);
-extern sym_t *getsym(sbuf_t *);
-extern void cleanup(void);
-extern sym_t *pushdown(sym_t *);
-extern sym_t *mktempsym(type_t *);
-extern void rmsym(sym_t *);
-extern void rmsyms(sym_t *);
-extern void inssym(int, sym_t *);
-extern void freeyyv(void *, int);
-extern int yylex(void);
-
-/*
- * mem1.c
- */
-extern const char *fnalloc(const char *);
-extern const char *fnnalloc(const char *, size_t);
-extern int getfnid(const char *);
-
-extern void initmem(void);
-
-extern void *getblk(size_t);
-extern void *getlblk(int, size_t);
-extern void freeblk(void);
-extern void freelblk(int);
-
-extern void *tgetblk(size_t);
-extern tnode_t *getnode(void);
-extern void tfreeblk(void);
-extern struct mbl *tsave(void);
-extern void trestor(struct mbl *);
-
-/*
- * err.c
- */
-extern int nerr;
-extern int sytxerr;
-extern const char *msgs[];
-
-extern void msglist(void);
-extern void error(int, ...);
-extern void warning(int, ...);
-extern void message(int, ...);
-extern int gnuism(int, ...);
-extern int c99ism(int, ...);
-extern void lerror(const char *, int, const char *, ...)
- __attribute__((__noreturn__,__format__(__printf__, 3, 4)));
-
-/*
- * decl.c
- */
-extern dinfo_t *dcs;
-extern const char *unnamed;
-extern int enumval;
-
-extern void initdecl(void);
-extern type_t *gettyp(tspec_t);
-extern type_t *duptyp(const type_t *);
-extern type_t *tduptyp(const type_t *);
-extern int incompl(type_t *);
-extern void setcompl(type_t *, int);
-extern void addscl(scl_t);
-extern void addtype(type_t *);
-extern void addqual(tqual_t);
-extern void pushdecl(scl_t);
-extern void popdecl(void);
-extern void setasm(void);
-extern void clrtyp(void);
-extern void deftyp(void);
-extern int length(type_t *, const char *);
-extern int getbound(type_t *);
-extern sym_t *lnklst(sym_t *, sym_t *);
-extern void chktyp(sym_t *);
-extern sym_t *decl1str(sym_t *);
-extern sym_t *bitfield(sym_t *, int);
-extern pqinf_t *mergepq(pqinf_t *, pqinf_t *);
-extern sym_t *addptr(sym_t *, pqinf_t *);
-extern sym_t *addarray(sym_t *, int, int);
-extern sym_t *addfunc(sym_t *, sym_t *);
-extern void chkfdef(sym_t *, int);
-extern sym_t *dname(sym_t *);
-extern sym_t *iname(sym_t *);
-extern type_t *mktag(sym_t *, tspec_t, int, int);
-extern const char *scltoa(scl_t);
-extern type_t *compltag(type_t *, sym_t *);
-extern sym_t *ename(sym_t *, int, int);
-extern void decl1ext(sym_t *, int);
-extern void cpuinfo(sym_t *, sym_t *);
-extern int isredec(sym_t *, int *);
-extern int eqtype(type_t *, type_t *, int, int, int *);
-extern void compltyp(sym_t *, sym_t *);
-extern sym_t *decl1arg(sym_t *, int);
-extern void cluparg(void);
-extern void decl1loc(sym_t *, int);
-extern sym_t *aname(void);
-extern void globclup(void);
-extern sym_t *decl1abs(sym_t *);
-extern void chksz(sym_t *);
-extern void setsflg(sym_t *);
-extern void setuflg(sym_t *, int, int);
-extern void chkusage(dinfo_t *);
-extern void chkusg1(int, sym_t *);
-extern void chkglsyms(void);
-extern void prevdecl(int, sym_t *);
-
-/*
- * tree.c
- */
-extern void initmtab(void);
-extern type_t *incref(type_t *, tspec_t);
-extern type_t *tincref(type_t *, tspec_t);
-extern tnode_t *getcnode(type_t *, val_t *);
-extern tnode_t *getnnode(sym_t *, int);
-extern tnode_t *getsnode(strg_t *);
-extern sym_t *strmemb(tnode_t *, op_t, sym_t *);
-extern tnode_t *build(op_t, tnode_t *, tnode_t *);
-extern tnode_t *cconv(tnode_t *);
-extern int typeok(op_t, int, tnode_t *, tnode_t *);
-extern tnode_t *promote(op_t, int, tnode_t *);
-extern tnode_t *convert(op_t, int, type_t *, tnode_t *);
-extern void cvtcon(op_t, int, type_t *, val_t *, val_t *);
-extern const char *tyname(char *, size_t, type_t *);
-extern const char *basictyname(tspec_t);
-extern tnode_t *bldszof(type_t *);
-extern tnode_t *cast(tnode_t *, type_t *);
-extern tnode_t *funcarg(tnode_t *, tnode_t *);
-extern tnode_t *funccall(tnode_t *, tnode_t *);
-extern val_t *constant(tnode_t *, int);
-extern void expr(tnode_t *, int, int, int);
-extern void chkmisc(tnode_t *, int, int, int, int, int, int);
-extern int conaddr(tnode_t *, sym_t **, ptrdiff_t *);
-extern strg_t *catstrg(strg_t *, strg_t *);
-
-/*
- * func.c
- */
-extern sym_t *funcsym;
-extern int reached;
-extern int rchflg;
-extern int ftflg;
-extern int nargusg;
-extern pos_t aupos;
-extern int nvararg;
-extern pos_t vapos;
-extern int prflstrg;
-extern pos_t prflpos;
-extern int scflstrg;
-extern pos_t scflpos;
-extern int ccflg;
-extern int llibflg;
-extern int nowarn;
-extern int bitfieldtype_ok;
-extern int plibflg;
-extern int quadflg;
-
-extern void pushctrl(int);
-extern void popctrl(int);
-extern void chkreach(void);
-extern void funcdef(sym_t *);
-extern void funcend(void);
-extern void label(int, sym_t *, tnode_t *);
-extern void if1(tnode_t *);
-extern void if2(void);
-extern void if3(int);
-extern void switch1(tnode_t *);
-extern void switch2(void);
-extern void while1(tnode_t *);
-extern void while2(void);
-extern void do1(void);
-extern void do2(tnode_t *);
-extern void for1(tnode_t *, tnode_t *, tnode_t *);
-extern void for2(void);
-extern void dogoto(sym_t *);
-extern void docont(void);
-extern void dobreak(void);
-extern void doreturn(tnode_t *);
-extern void glclup(int);
-extern void argsused(int);
-extern void constcond(int);
-extern void fallthru(int);
-extern void notreach(int);
-extern void lintlib(int);
-extern void linted(int);
-extern void varargs(int);
-extern void printflike(int);
-extern void scanflike(int);
-extern void protolib(int);
-extern void longlong(int);
-extern void bitfieldtype(int);
-
-/*
- * init.c
- */
-extern int initerr;
-extern sym_t *initsym;
-extern int startinit;
-
-extern void prepinit(void);
-extern void initrbr(void);
-extern void initlbr(void);
-extern void mkinit(tnode_t *);
-extern void memberpush(sbuf_t *);
-
-/*
- * emit.c
- */
-extern void outtype(type_t *);
-extern const char *ttos(type_t *);
-extern void outsym(sym_t *, scl_t, def_t);
-extern void outfdef(sym_t *, pos_t *, int, int, sym_t *);
-extern void outcall(tnode_t *, int, int);
-extern void outusg(sym_t *);
Index: usr.bin/xlint/lint1/func.c
===================================================================
--- usr.bin/xlint/lint1/func.c
+++ /dev/null
@@ -1,1288 +0,0 @@
-/* $NetBSD: func.c,v 1.22 2005/09/24 15:30:35 perry Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: func.c,v 1.16 2002/01/03 04:25:15 thorpej Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint1.h"
-#include "cgram.h"
-
-/*
- * Contains a pointer to the symbol table entry of the current function
- * definition.
- */
-sym_t *funcsym;
-
-/* Is set as long as a statement can be reached. Must be set at level 0. */
-int reached = 1;
-
-/*
- * Is set as long as NOTREACHED is in effect.
- * Is reset everywhere where reached can become 0.
- */
-int rchflg;
-
-/*
- * In conjunction with reached controls printing of "fallthrough on ..."
- * warnings.
- * Reset by each statement and set by FALLTHROUGH, switch (switch1())
- * and case (label()).
- *
- * Control statements if, for, while and switch do not reset ftflg because
- * this must be done by the controlled statement. At least for if this is
- * important because ** FALLTHROUGH ** after "if (expr) stmnt" is evaluated
- * before the following token, which causes reduction of above, is read.
- * This means that ** FALLTHROUGH ** after "if ..." would always be ignored.
- */
-int ftflg;
-
-/* Top element of stack for control statements */
-cstk_t *cstk;
-
-/*
- * Number of arguments which will be checked for usage in following
- * function definition. -1 stands for all arguments.
- *
- * The position of the last ARGSUSED comment is stored in aupos.
- */
-int nargusg = -1;
-pos_t aupos;
-
-/*
- * Number of arguments of the following function definition whose types
- * shall be checked by lint2. -1 stands for all arguments.
- *
- * The position of the last VARARGS comment is stored in vapos.
- */
-int nvararg = -1;
-pos_t vapos;
-
-/*
- * Both prflstr and scflstrg contain the number of the argument which
- * shall be used to check the types of remaining arguments (for PRINTFLIKE
- * and SCANFLIKE).
- *
- * prflpos and scflpos are the positions of the last PRINTFLIKE or
- * SCANFLIKE comment.
- */
-int prflstrg = -1;
-int scflstrg = -1;
-pos_t prflpos;
-pos_t scflpos;
-
-/*
- * Are both plibflg and llibflg set, prototypes are written as function
- * definitions to the output file.
- */
-int plibflg;
-
-/*
- * Nonzero means that no warnings about constants in conditional
- * context are printed.
- */
-int ccflg;
-
-/*
- * llibflg is set if a lint library shall be created. The effect of
- * llibflg is that all defined symbols are treated as used.
- * (The LINTLIBRARY comment also resets vflag.)
- */
-int llibflg;
-
-/*
- * Nonzero if warnings are suppressed by a LINTED directive
- */
-int nowarn;
-
-/*
- * Nonzero if bitfield type errors are suppressed by a BITFIELDTYPE
- * directive.
- */
-int bitfieldtype_ok;
-
-/*
- * Nonzero if complaints about use of "long long" are suppressed in
- * the next statement or declaration.
- */
-int quadflg;
-
-/*
- * Puts a new element at the top of the stack used for control statements.
- */
-void
-pushctrl(int env)
-{
- cstk_t *ci;
-
- if ((ci = calloc(1, sizeof (cstk_t))) == NULL)
- nomem();
- ci->c_env = env;
- ci->c_nxt = cstk;
- cstk = ci;
-}
-
-/*
- * Removes the top element of the stack used for control statements.
- */
-void
-popctrl(int env)
-{
- cstk_t *ci;
- clst_t *cl;
-
- if (cstk == NULL || cstk->c_env != env)
- LERROR("popctrl()");
-
- cstk = (ci = cstk)->c_nxt;
-
- while ((cl = ci->c_clst) != NULL) {
- ci->c_clst = cl->cl_nxt;
- free(cl);
- }
-
- if (ci->c_swtype != NULL)
- free(ci->c_swtype);
-
- free(ci);
-}
-
-/*
- * Prints a warning if a statement cannot be reached.
- */
-void
-chkreach(void)
-{
- if (!reached && !rchflg) {
- /* statement not reached */
- warning(193);
- reached = 1;
- }
-}
-
-/*
- * Called after a function declaration which introduces a function definition
- * and before an (optional) old style argument declaration list.
- *
- * Puts all symbols declared in the Prototype or in an old style argument
- * list back to the symbol table.
- *
- * Does the usual checking of storage class, type (return value),
- * redeclaration etc..
- */
-void
-funcdef(sym_t *fsym)
-{
- int n, warn;
- sym_t *arg, *sym, *rdsym;
-
- funcsym = fsym;
-
- /*
- * Put all symbols declared in the argument list back to the
- * symbol table.
- */
- for (sym = dcs->d_fpsyms; sym != NULL; sym = sym->s_dlnxt) {
- if (sym->s_blklev != -1) {
- if (sym->s_blklev != 1)
- LERROR("funcdef()");
- inssym(1, sym);
- }
- }
-
- /*
- * In osfunc() we did not know whether it is an old style function
- * definition or only an old style declaration, if there are no
- * arguments inside the argument list ("f()").
- */
- if (!fsym->s_type->t_proto && fsym->s_args == NULL)
- fsym->s_osdef = 1;
-
- chktyp(fsym);
-
- /*
- * chktyp() checks for almost all possible errors, but not for
- * incomplete return values (these are allowed in declarations)
- */
- if (fsym->s_type->t_subt->t_tspec != VOID &&
- incompl(fsym->s_type->t_subt)) {
- /* cannot return incomplete type */
- error(67);
- }
-
- fsym->s_def = DEF;
-
- if (fsym->s_scl == TYPEDEF) {
- fsym->s_scl = EXTERN;
- /* illegal storage class */
- error(8);
- }
-
- if (dcs->d_inline)
- fsym->s_inline = 1;
-
- /*
- * Arguments in new style function declarations need a name.
- * (void is already removed from the list of arguments)
- */
- n = 1;
- for (arg = fsym->s_type->t_args; arg != NULL; arg = arg->s_nxt) {
- if (arg->s_scl == ABSTRACT) {
- if (arg->s_name != unnamed)
- LERROR("funcdef()");
- /* formal parameter lacks name: param #%d */
- error(59, n);
- } else {
- if (arg->s_name == unnamed)
- LERROR("funcdef()");
- }
- n++;
- }
-
- /*
- * We must also remember the position. s_dpos is overwritten
- * if this is an old style definition and we had already a
- * prototype.
- */
- STRUCT_ASSIGN(dcs->d_fdpos, fsym->s_dpos);
-
- if ((rdsym = dcs->d_rdcsym) != NULL) {
-
- if (!isredec(fsym, (warn = 0, &warn))) {
-
- /*
- * Print nothing if the newly defined function
- * is defined in old style. A better warning will
- * be printed in cluparg().
- */
- if (warn && !fsym->s_osdef) {
- /* redeclaration of %s */
- (*(sflag ? error : warning))(27, fsym->s_name);
- prevdecl(-1, rdsym);
- }
-
- /* copy usage information */
- cpuinfo(fsym, rdsym);
-
- /*
- * If the old symbol was a prototype and the new
- * one is none, overtake the position of the
- * declaration of the prototype.
- */
- if (fsym->s_osdef && rdsym->s_type->t_proto)
- STRUCT_ASSIGN(fsym->s_dpos, rdsym->s_dpos);
-
- /* complete the type */
- compltyp(fsym, rdsym);
-
- /* once a function is inline it remains inline */
- if (rdsym->s_inline)
- fsym->s_inline = 1;
-
- }
-
- /* remove the old symbol from the symbol table */
- rmsym(rdsym);
-
- }
-
- if (fsym->s_osdef && !fsym->s_type->t_proto) {
- if (sflag && hflag && strcmp(fsym->s_name, "main") != 0)
- /* function definition is not a prototype */
- warning(286);
- }
-
- if (dcs->d_notyp)
- /* return value is implicitly declared to be int */
- fsym->s_rimpl = 1;
-
- reached = 1;
-}
-
-/*
- * Called at the end of a function definition.
- */
-void
-funcend(void)
-{
- sym_t *arg;
- int n;
-
- if (reached) {
- cstk->c_noretval = 1;
- if (funcsym->s_type->t_subt->t_tspec != VOID &&
- !funcsym->s_rimpl) {
- /* func. %s falls off bottom without returning value */
- warning(217, funcsym->s_name);
- }
- }
-
- /*
- * This warning is printed only if the return value was implicitly
- * declared to be int. Otherwise the wrong return statement
- * has already printed a warning.
- */
- if (cstk->c_noretval && cstk->c_retval && funcsym->s_rimpl)
- /* function %s has return (e); and return; */
- warning(216, funcsym->s_name);
-
- /* Print warnings for unused arguments */
- arg = dcs->d_fargs;
- n = 0;
- while (arg != NULL && (nargusg == -1 || n < nargusg)) {
- chkusg1(dcs->d_asm, arg);
- arg = arg->s_nxt;
- n++;
- }
- nargusg = -1;
-
- /*
- * write the information about the function definition to the
- * output file
- * inline functions explicitly declared extern are written as
- * declarations only.
- */
- if (dcs->d_scl == EXTERN && funcsym->s_inline) {
- outsym(funcsym, funcsym->s_scl, DECL);
- } else {
- outfdef(funcsym, &dcs->d_fdpos, cstk->c_retval,
- funcsym->s_osdef, dcs->d_fargs);
- }
-
- /*
- * remove all symbols declared during argument declaration from
- * the symbol table
- */
- if (dcs->d_nxt != NULL || dcs->d_ctx != EXTERN)
- LERROR("funcend()");
- rmsyms(dcs->d_fpsyms);
-
- /* must be set on level 0 */
- reached = 1;
-}
-
-/*
- * Process a label.
- *
- * typ type of the label (T_NAME, T_DEFAULT or T_CASE).
- * sym symbol table entry of label if typ == T_NAME
- * tn expression if typ == T_CASE
- */
-void
-label(int typ, sym_t *sym, tnode_t *tn)
-{
- cstk_t *ci;
- clst_t *cl;
- val_t *v;
- val_t nv;
- tspec_t t;
-
- switch (typ) {
-
- case T_NAME:
- if (sym->s_set) {
- /* label %s redefined */
- error(194, sym->s_name);
- } else {
- setsflg(sym);
- }
- break;
-
- case T_CASE:
-
- /* find the stack entry for the innermost switch statement */
- for (ci = cstk; ci != NULL && !ci->c_switch; ci = ci->c_nxt)
- continue;
-
- if (ci == NULL) {
- /* case not in switch */
- error(195);
- tn = NULL;
- } else if (tn != NULL && tn->tn_op != CON) {
- /* non-constant case expression */
- error(197);
- tn = NULL;
- } else if (tn != NULL && !isityp(tn->tn_type->t_tspec)) {
- /* non-integral case expression */
- error(198);
- tn = NULL;
- }
-
- if (tn != NULL) {
-
- if (ci->c_swtype == NULL)
- LERROR("label()");
-
- if (reached && !ftflg) {
- if (hflag)
- /* fallthrough on case statement */
- warning(220);
- }
-
- t = tn->tn_type->t_tspec;
- if (t == LONG || t == ULONG ||
- t == QUAD || t == UQUAD) {
- if (tflag)
- /* case label must be of type ... */
- warning(203);
- }
-
- /*
- * get the value of the expression and convert it
- * to the type of the switch expression
- */
- v = constant(tn, 1);
- (void) memset(&nv, 0, sizeof nv);
- cvtcon(CASE, 0, ci->c_swtype, &nv, v);
- free(v);
-
- /* look if we had this value already */
- for (cl = ci->c_clst; cl != NULL; cl = cl->cl_nxt) {
- if (cl->cl_val.v_quad == nv.v_quad)
- break;
- }
- if (cl != NULL && isutyp(nv.v_tspec)) {
- /* duplicate case in switch, %lu */
- error(200, (u_long)nv.v_quad);
- } else if (cl != NULL) {
- /* duplicate case in switch, %ld */
- error(199, (long)nv.v_quad);
- } else {
- /*
- * append the value to the list of
- * case values
- */
- cl = xcalloc(1, sizeof (clst_t));
- STRUCT_ASSIGN(cl->cl_val, nv);
- cl->cl_nxt = ci->c_clst;
- ci->c_clst = cl;
- }
- }
- tfreeblk();
- break;
-
- case T_DEFAULT:
-
- /* find the stack entry for the innermost switch statement */
- for (ci = cstk; ci != NULL && !ci->c_switch; ci = ci->c_nxt)
- continue;
-
- if (ci == NULL) {
- /* default outside switch */
- error(201);
- } else if (ci->c_default) {
- /* duplicate default in switch */
- error(202);
- } else {
- if (reached && !ftflg) {
- if (hflag)
- /* fallthrough on default statement */
- warning(284);
- }
- ci->c_default = 1;
- }
- break;
- }
- reached = 1;
-}
-
-/*
- * T_IF T_LPARN expr T_RPARN
- */
-void
-if1(tnode_t *tn)
-{
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
- expr(tn, 0, 1, 1);
- pushctrl(T_IF);
-}
-
-/*
- * if_without_else
- * if_without_else T_ELSE
- */
-void
-if2(void)
-{
-
- cstk->c_rchif = reached ? 1 : 0;
- reached = 1;
-}
-
-/*
- * if_without_else
- * if_without_else T_ELSE stmnt
- */
-void
-if3(int els)
-{
-
- if (els) {
- reached |= cstk->c_rchif;
- } else {
- reached = 1;
- }
- popctrl(T_IF);
-}
-
-/*
- * T_SWITCH T_LPARN expr T_RPARN
- */
-void
-switch1(tnode_t *tn)
-{
- tspec_t t;
- type_t *tp;
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
- if (tn != NULL && !isityp(tn->tn_type->t_tspec)) {
- /* switch expression must have integral type */
- error(205);
- tn = NULL;
- }
- if (tn != NULL && tflag) {
- t = tn->tn_type->t_tspec;
- if (t == LONG || t == ULONG || t == QUAD || t == UQUAD) {
- /* switch expr. must be of type `int' in trad. C */
- warning(271);
- }
- }
-
- /*
- * Remember the type of the expression. Because its possible
- * that (*tp) is allocated on tree memory the type must be
- * duplicated. This is not too complicated because it is
- * only an integer type.
- */
- if ((tp = calloc(1, sizeof (type_t))) == NULL)
- nomem();
- if (tn != NULL) {
- tp->t_tspec = tn->tn_type->t_tspec;
- if ((tp->t_isenum = tn->tn_type->t_isenum) != 0)
- tp->t_enum = tn->tn_type->t_enum;
- } else {
- tp->t_tspec = INT;
- }
-
- expr(tn, 1, 0, 1);
-
- pushctrl(T_SWITCH);
- cstk->c_switch = 1;
- cstk->c_swtype = tp;
-
- reached = rchflg = 0;
- ftflg = 1;
-}
-
-/*
- * switch_expr stmnt
- */
-void
-switch2(void)
-{
- int nenum = 0, nclab = 0;
- sym_t *esym;
- clst_t *cl;
-
- if (cstk->c_swtype == NULL)
- LERROR("switch2()");
-
- /*
- * If the switch expression was of type enumeration, count the case
- * labels and the number of enumerators. If both counts are not
- * equal print a warning.
- */
- if (cstk->c_swtype->t_isenum) {
- nenum = nclab = 0;
- if (cstk->c_swtype->t_enum == NULL)
- LERROR("switch2()");
- for (esym = cstk->c_swtype->t_enum->elem;
- esym != NULL; esym = esym->s_nxt) {
- nenum++;
- }
- for (cl = cstk->c_clst; cl != NULL; cl = cl->cl_nxt)
- nclab++;
- if (hflag && eflag && nenum != nclab && !cstk->c_default) {
- /* enumeration value(s) not handled in switch */
- warning(206);
- }
- }
-
- if (cstk->c_break) {
- /*
- * end of switch always reached (c_break is only set if the
- * break statement can be reached).
- */
- reached = 1;
- } else if (!cstk->c_default &&
- (!hflag || !cstk->c_swtype->t_isenum || nenum != nclab)) {
- /*
- * there are possible values which are not handled in
- * switch
- */
- reached = 1;
- } /*
- * otherwise the end of the switch expression is reached
- * if the end of the last statement inside it is reached.
- */
-
- popctrl(T_SWITCH);
-}
-
-/*
- * T_WHILE T_LPARN expr T_RPARN
- */
-void
-while1(tnode_t *tn)
-{
-
- if (!reached) {
- /* loop not entered at top */
- warning(207);
- reached = 1;
- }
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
- if (tn != NULL && !issclt(tn->tn_type->t_tspec)) {
- /* controlling expressions must have scalar type */
- error(204);
- tn = NULL;
- }
-
- pushctrl(T_WHILE);
- cstk->c_loop = 1;
- if (tn != NULL && tn->tn_op == CON) {
- if (isityp(tn->tn_type->t_tspec)) {
- cstk->c_infinite = tn->tn_val->v_quad != 0;
- } else {
- cstk->c_infinite = tn->tn_val->v_ldbl != 0.0;
- }
- }
-
- expr(tn, 0, 1, 1);
-}
-
-/*
- * while_expr stmnt
- * while_expr error
- */
-void
-while2(void)
-{
-
- /*
- * The end of the loop can be reached if it is no endless loop
- * or there was a break statement which was reached.
- */
- reached = !cstk->c_infinite || cstk->c_break;
- rchflg = 0;
-
- popctrl(T_WHILE);
-}
-
-/*
- * T_DO
- */
-void
-do1(void)
-{
-
- if (!reached) {
- /* loop not entered at top */
- warning(207);
- reached = 1;
- }
-
- pushctrl(T_DO);
- cstk->c_loop = 1;
-}
-
-/*
- * do stmnt do_while_expr
- * do error
- */
-void
-do2(tnode_t *tn)
-{
-
- /*
- * If there was a continue statement the expression controlling the
- * loop is reached.
- */
- if (cstk->c_cont)
- reached = 1;
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
- if (tn != NULL && !issclt(tn->tn_type->t_tspec)) {
- /* controlling expressions must have scalar type */
- error(204);
- tn = NULL;
- }
-
- if (tn != NULL && tn->tn_op == CON) {
- if (isityp(tn->tn_type->t_tspec)) {
- cstk->c_infinite = tn->tn_val->v_quad != 0;
- } else {
- cstk->c_infinite = tn->tn_val->v_ldbl != 0.0;
- }
- }
-
- expr(tn, 0, 1, 1);
-
- /*
- * The end of the loop is only reached if it is no endless loop
- * or there was a break statement which could be reached.
- */
- reached = !cstk->c_infinite || cstk->c_break;
- rchflg = 0;
-
- popctrl(T_DO);
-}
-
-/*
- * T_FOR T_LPARN opt_expr T_SEMI opt_expr T_SEMI opt_expr T_RPARN
- */
-void
-for1(tnode_t *tn1, tnode_t *tn2, tnode_t *tn3)
-{
-
- /*
- * If there is no initialisation expression it is possible that
- * it is intended not to enter the loop at top.
- */
- if (tn1 != NULL && !reached) {
- /* loop not entered at top */
- warning(207);
- reached = 1;
- }
-
- pushctrl(T_FOR);
- cstk->c_loop = 1;
-
- /*
- * Store the tree memory for the reinitialisation expression.
- * Also remember this expression itself. We must check it at
- * the end of the loop to get "used but not set" warnings correct.
- */
- cstk->c_fexprm = tsave();
- cstk->c_f3expr = tn3;
- STRUCT_ASSIGN(cstk->c_fpos, curr_pos);
- STRUCT_ASSIGN(cstk->c_cfpos, csrc_pos);
-
- if (tn1 != NULL)
- expr(tn1, 0, 0, 1);
-
- if (tn2 != NULL)
- tn2 = cconv(tn2);
- if (tn2 != NULL)
- tn2 = promote(NOOP, 0, tn2);
- if (tn2 != NULL && !issclt(tn2->tn_type->t_tspec)) {
- /* controlling expressions must have scalar type */
- error(204);
- tn2 = NULL;
- }
- if (tn2 != NULL)
- expr(tn2, 0, 1, 1);
-
- if (tn2 == NULL) {
- cstk->c_infinite = 1;
- } else if (tn2->tn_op == CON) {
- if (isityp(tn2->tn_type->t_tspec)) {
- cstk->c_infinite = tn2->tn_val->v_quad != 0;
- } else {
- cstk->c_infinite = tn2->tn_val->v_ldbl != 0.0;
- }
- }
-
- /* Checking the reinitialisation expression is done in for2() */
-
- reached = 1;
-}
-
-/*
- * for_exprs stmnt
- * for_exprs error
- */
-void
-for2(void)
-{
- pos_t cpos, cspos;
- tnode_t *tn3;
-
- if (cstk->c_cont)
- reached = 1;
-
- STRUCT_ASSIGN(cpos, curr_pos);
- STRUCT_ASSIGN(cspos, csrc_pos);
-
- /* Restore the tree memory for the reinitialisation expression */
- trestor(cstk->c_fexprm);
- tn3 = cstk->c_f3expr;
- STRUCT_ASSIGN(curr_pos, cstk->c_fpos);
- STRUCT_ASSIGN(csrc_pos, cstk->c_cfpos);
-
- /* simply "statement not reached" would be confusing */
- if (!reached && !rchflg) {
- /* end-of-loop code not reached */
- warning(223);
- reached = 1;
- }
-
- if (tn3 != NULL) {
- expr(tn3, 0, 0, 1);
- } else {
- tfreeblk();
- }
-
- STRUCT_ASSIGN(curr_pos, cpos);
- STRUCT_ASSIGN(csrc_pos, cspos);
-
- /* An endless loop without break will never terminate */
- reached = cstk->c_break || !cstk->c_infinite;
- rchflg = 0;
-
- popctrl(T_FOR);
-}
-
-/*
- * T_GOTO identifier T_SEMI
- * T_GOTO error T_SEMI
- */
-void
-dogoto(sym_t *lab)
-{
-
- setuflg(lab, 0, 0);
-
- chkreach();
-
- reached = rchflg = 0;
-}
-
-/*
- * T_BREAK T_SEMI
- */
-void
-dobreak(void)
-{
- cstk_t *ci;
-
- ci = cstk;
- while (ci != NULL && !ci->c_loop && !ci->c_switch)
- ci = ci->c_nxt;
-
- if (ci == NULL) {
- /* break outside loop or switch */
- error(208);
- } else {
- if (reached)
- ci->c_break = 1;
- }
-
- if (bflag)
- chkreach();
-
- reached = rchflg = 0;
-}
-
-/*
- * T_CONTINUE T_SEMI
- */
-void
-docont(void)
-{
- cstk_t *ci;
-
- for (ci = cstk; ci != NULL && !ci->c_loop; ci = ci->c_nxt)
- continue;
-
- if (ci == NULL) {
- /* continue outside loop */
- error(209);
- } else {
- ci->c_cont = 1;
- }
-
- chkreach();
-
- reached = rchflg = 0;
-}
-
-/*
- * T_RETURN T_SEMI
- * T_RETURN expr T_SEMI
- */
-void
-doreturn(tnode_t *tn)
-{
- tnode_t *ln, *rn;
- cstk_t *ci;
- op_t op;
-
- for (ci = cstk; ci->c_nxt != NULL; ci = ci->c_nxt)
- continue;
-
- if (tn != NULL) {
- ci->c_retval = 1;
- } else {
- ci->c_noretval = 1;
- }
-
- if (tn != NULL && funcsym->s_type->t_subt->t_tspec == VOID) {
- /* void function %s cannot return value */
- error(213, funcsym->s_name);
- tfreeblk();
- tn = NULL;
- } else if (tn == NULL && funcsym->s_type->t_subt->t_tspec != VOID) {
- /*
- * Assume that the function has a return value only if it
- * is explicitly declared.
- */
- if (!funcsym->s_rimpl)
- /* function %s expects to return value */
- warning(214, funcsym->s_name);
- }
-
- if (tn != NULL) {
-
- /* Create a temporary node for the left side */
- ln = tgetblk(sizeof (tnode_t));
- ln->tn_op = NAME;
- ln->tn_type = tduptyp(funcsym->s_type->t_subt);
- ln->tn_type->t_const = 0;
- ln->tn_lvalue = 1;
- ln->tn_sym = funcsym; /* better than nothing */
-
- tn = build(RETURN, ln, tn);
-
- if (tn != NULL) {
- rn = tn->tn_right;
- while ((op = rn->tn_op) == CVT || op == PLUS)
- rn = rn->tn_left;
- if (rn->tn_op == AMPER && rn->tn_left->tn_op == NAME &&
- rn->tn_left->tn_sym->s_scl == AUTO) {
- /* %s returns pointer to automatic object */
- warning(302, funcsym->s_name);
- }
- }
-
- expr(tn, 1, 0, 1);
-
- } else {
-
- chkreach();
-
- }
-
- reached = rchflg = 0;
-}
-
-/*
- * Do some cleanup after a global declaration or definition.
- * Especially remove informations about unused lint comments.
- */
-void
-glclup(int silent)
-{
- pos_t cpos;
-
- STRUCT_ASSIGN(cpos, curr_pos);
-
- if (nargusg != -1) {
- if (!silent) {
- STRUCT_ASSIGN(curr_pos, aupos);
- /* must precede function definition: %s */
- warning(282, "ARGSUSED");
- }
- nargusg = -1;
- }
- if (nvararg != -1) {
- if (!silent) {
- STRUCT_ASSIGN(curr_pos, vapos);
- /* must precede function definition: %s */
- warning(282, "VARARGS");
- }
- nvararg = -1;
- }
- if (prflstrg != -1) {
- if (!silent) {
- STRUCT_ASSIGN(curr_pos, prflpos);
- /* must precede function definition: %s */
- warning(282, "PRINTFLIKE");
- }
- prflstrg = -1;
- }
- if (scflstrg != -1) {
- if (!silent) {
- STRUCT_ASSIGN(curr_pos, scflpos);
- /* must precede function definition: %s */
- warning(282, "SCANFLIKE");
- }
- scflstrg = -1;
- }
-
- STRUCT_ASSIGN(curr_pos, cpos);
-
- dcs->d_asm = 0;
-}
-
-/*
- * ARGSUSED comment
- *
- * Only the first n arguments of the following function are checked
- * for usage. A missing argument is taken to be 0.
- */
-void
-argsused(int n)
-{
-
- if (n == -1)
- n = 0;
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "ARGSUSED");
- return;
- }
- if (nargusg != -1) {
- /* duplicate use of ** %s ** */
- warning(281, "ARGSUSED");
- }
- nargusg = n;
- STRUCT_ASSIGN(aupos, curr_pos);
-}
-
-/*
- * VARARGS comment
- *
- * Makes that lint2 checks only the first n arguments for compatibility
- * to the function definition. A missing argument is taken to be 0.
- */
-void
-varargs(int n)
-{
-
- if (n == -1)
- n = 0;
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "VARARGS");
- return;
- }
- if (nvararg != -1) {
- /* duplicate use of ** %s ** */
- warning(281, "VARARGS");
- }
- nvararg = n;
- STRUCT_ASSIGN(vapos, curr_pos);
-}
-
-/*
- * PRINTFLIKE comment
- *
- * Check all arguments until the (n-1)-th as usual. The n-th argument is
- * used the check the types of remaining arguments.
- */
-void
-printflike(int n)
-{
-
- if (n == -1)
- n = 0;
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "PRINTFLIKE");
- return;
- }
- if (prflstrg != -1) {
- /* duplicate use of ** %s ** */
- warning(281, "PRINTFLIKE");
- }
- prflstrg = n;
- STRUCT_ASSIGN(prflpos, curr_pos);
-}
-
-/*
- * SCANFLIKE comment
- *
- * Check all arguments until the (n-1)-th as usual. The n-th argument is
- * used the check the types of remaining arguments.
- */
-void
-scanflike(int n)
-{
-
- if (n == -1)
- n = 0;
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "SCANFLIKE");
- return;
- }
- if (scflstrg != -1) {
- /* duplicate use of ** %s ** */
- warning(281, "SCANFLIKE");
- }
- scflstrg = n;
- STRUCT_ASSIGN(scflpos, curr_pos);
-}
-
-/*
- * Set the linenumber for a CONSTCOND comment. At this and the following
- * line no warnings about constants in conditional contexts are printed.
- */
-/* ARGSUSED */
-void
-constcond(int n)
-{
-
- ccflg = 1;
-}
-
-/*
- * Suppress printing of "fallthrough on ..." warnings until next
- * statement.
- */
-/* ARGSUSED */
-void
-fallthru(int n)
-{
-
- ftflg = 1;
-}
-
-/*
- * Stop warnings about statements which cannot be reached. Also tells lint
- * that the following statements cannot be reached (e.g. after exit()).
- */
-/* ARGSUSED */
-void
-notreach(int n)
-{
-
- reached = 0;
- rchflg = 1;
-}
-
-/* ARGSUSED */
-void
-lintlib(int n)
-{
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "LINTLIBRARY");
- return;
- }
- llibflg = 1;
- vflag = 0;
-}
-
-/*
- * Suppress most warnings at the current and the following line.
- */
-/* ARGSUSED */
-void
-linted(int n)
-{
-
-#ifdef DEBUG
- printf("%s, %d: nowarn = 1\n", curr_pos.p_file, curr_pos.p_line);
-#endif
- nowarn = 1;
-}
-
-/*
- * Suppress bitfield type errors on the current line.
- */
-/* ARGSUSED */
-void
-bitfieldtype(int n)
-{
-
-#ifdef DEBUG
- printf("%s, %d: bitfieldtype_ok = 1\n", curr_pos.p_file,
- curr_pos.p_line);
-#endif
- bitfieldtype_ok = 1;
-}
-
-/*
- * PROTOTLIB in conjunction with LINTLIBRARY can be used to handle
- * prototypes like function definitions. This is done if the argument
- * to PROTOLIB is nonzero. Otherwise prototypes are handled normaly.
- */
-void
-protolib(int n)
-{
-
- if (dcs->d_ctx != EXTERN) {
- /* must be outside function: ** %s ** */
- warning(280, "PROTOLIB");
- return;
- }
- plibflg = n == 0 ? 0 : 1;
-}
-
-/*
- * Set quadflg to nonzero which means that the next statement/declaration
- * may use "long long" without an error or warning.
- */
-/* ARGSUSED */
-void
-longlong(int n)
-{
-
- quadflg = 1;
-}
Index: usr.bin/xlint/lint1/init.c
===================================================================
--- usr.bin/xlint/lint1/init.c
+++ /dev/null
@@ -1,656 +0,0 @@
-/* $NetBSD: init.c,v 1.10 2002/01/31 19:36:54 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: init.c,v 1.10 2002/01/31 19:36:54 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint1.h"
-
-/*
- * initerr is set as soon as a fatal error occurred in an initialisation.
- * The effect is that the rest of the initialisation is ignored (parsed
- * by yacc, expression trees built, but no initialisation takes place).
- */
-int initerr;
-
-/* Pointer to the symbol which is to be initialized. */
-sym_t *initsym;
-
-/* Points to the top element of the initialisation stack. */
-istk_t *initstk;
-
-typedef struct namlist {
- const char *n_name;
- struct namlist *n_prev;
- struct namlist *n_next;
-} namlist_t;
-
-/* Points to a c9x named member; */
-namlist_t *namedmem = NULL;
-
-
-static void popi2(void);
-static void popinit(int);
-static void pushinit(void);
-static void testinit(void);
-static void nextinit(int);
-static int strginit(tnode_t *);
-static void memberpop(void);
-
-#ifndef DEBUG
-#define DPRINTF(a)
-#else
-#define DPRINTF(a) printf a
-#endif
-
-void
-memberpush(sb)
- sbuf_t *sb;
-{
- namlist_t *nam = xcalloc(1, sizeof (namlist_t));
- nam->n_name = sb->sb_name;
- DPRINTF(("memberpush = %s\n", nam->n_name));
- if (namedmem == NULL) {
- nam->n_prev = nam->n_next = nam;
- namedmem = nam;
- } else {
- namedmem->n_prev->n_next = nam;
- nam->n_prev = namedmem->n_prev;
- nam->n_next = namedmem;
- namedmem->n_prev = nam;
- }
-#if 0
- nam->n_next = namedmem;
- namedmem = nam;
-#endif
-}
-
-static void
-memberpop()
-{
- DPRINTF(("memberpop = %s\n", namedmem->n_name));
- if (namedmem->n_next == namedmem) {
- free(namedmem);
- namedmem = NULL;
- } else {
- namlist_t *nam = namedmem;
- namedmem = namedmem->n_next;
- free(nam);
- }
-#if 0
- namedmem = namedmem->n_next;
- free(nam);
-#endif
-}
-
-
-/*
- * Initialize the initialisation stack by putting an entry for the variable
- * which is to be initialized on it.
- */
-void
-prepinit(void)
-{
- istk_t *istk;
-
- if (initerr)
- return;
-
- /* free memory used in last initialisation */
- while ((istk = initstk) != NULL) {
- initstk = istk->i_nxt;
- free(istk);
- }
-
- /*
- * If the type which is to be initialized is an incomplete type,
- * it must be duplicated.
- */
- if (initsym->s_type->t_tspec == ARRAY && incompl(initsym->s_type))
- initsym->s_type = duptyp(initsym->s_type);
-
- istk = initstk = xcalloc(1, sizeof (istk_t));
- istk->i_subt = initsym->s_type;
- istk->i_cnt = 1;
-
-}
-
-static void
-popi2(void)
-{
-#ifdef DEBUG
- char buf[64];
-#endif
- istk_t *istk;
- sym_t *m;
-
- initstk = (istk = initstk)->i_nxt;
- if (initstk == NULL)
- LERROR("popi2()");
- free(istk);
-
- istk = initstk;
-
- istk->i_cnt--;
- if (istk->i_cnt < 0)
- LERROR("popi2()");
-
- DPRINTF(("popi2(): %d %s\n", istk->i_cnt,
- namedmem ? namedmem->n_name : "*null*"));
- if (istk->i_cnt >= 0 && namedmem != NULL) {
- DPRINTF(("popi2(): %d %s %s\n", istk->i_cnt,
- tyname(buf, sizeof(buf), istk->i_type), namedmem->n_name));
- for (m = istk->i_type->t_str->memb; m != NULL; m = m->s_nxt) {
- if (m->s_field && m->s_name == unnamed)
- continue;
- if (strcmp(m->s_name, namedmem->n_name) == 0) {
- istk->i_subt = m->s_type;
- istk->i_cnt++;
- memberpop();
- return;
- }
- }
- error(101, namedmem->n_name);
- memberpop();
- istk->i_namedmem = 1;
- return;
- }
- /*
- * If the removed element was a structure member, we must go
- * to the next structure member.
- */
- if (istk->i_cnt > 0 && istk->i_type->t_tspec == STRUCT &&
- !istk->i_namedmem) {
- do {
- m = istk->i_mem = istk->i_mem->s_nxt;
- if (m == NULL)
- LERROR("popi2()");
- } while (m->s_field && m->s_name == unnamed);
- istk->i_subt = m->s_type;
- }
-}
-
-static void
-popinit(int brace)
-{
- DPRINTF(("popinit(%d)\n", brace));
-
- if (brace) {
- /*
- * Take all entries, including the first which requires
- * a closing brace, from the stack.
- */
- do {
- brace = initstk->i_brace;
- popi2();
- } while (!brace);
- } else {
- /*
- * Take all entries which cannot be used for further
- * initializers from the stack, but do this only if
- * they do not require a closing brace.
- */
- while (!initstk->i_brace &&
- initstk->i_cnt == 0 && !initstk->i_nolimit) {
- popi2();
- }
- }
-}
-
-static void
-pushinit(void)
-{
-#ifdef DEBUG
- char buf[64];
-#endif
- istk_t *istk;
- int cnt;
- sym_t *m;
-
- istk = initstk;
-
- /* Extend an incomplete array type by one element */
- if (istk->i_cnt == 0) {
- DPRINTF(("pushinit(extend) %s\n", tyname(buf, sizeof(buf),
- istk->i_type)));
- /*
- * Inside of other aggregate types must not be an incomplete
- * type.
- */
- if (istk->i_nxt->i_nxt != NULL)
- LERROR("pushinit()");
- istk->i_cnt = 1;
- if (istk->i_type->t_tspec != ARRAY)
- LERROR("pushinit()");
- istk->i_type->t_dim++;
- /* from now its a complete type */
- setcompl(istk->i_type, 0);
- }
-
- if (istk->i_cnt <= 0)
- LERROR("pushinit()");
- if (istk->i_type != NULL && issclt(istk->i_type->t_tspec))
- LERROR("pushinit() 4");
-
- initstk = xcalloc(1, sizeof (istk_t));
- initstk->i_nxt = istk;
- initstk->i_type = istk->i_subt;
- if (initstk->i_type->t_tspec == FUNC)
- LERROR("pushinit()");
-
-again:
- istk = initstk;
-
- DPRINTF(("pushinit(%s)\n", tyname(buf, sizeof(buf), istk->i_type)));
- switch (istk->i_type->t_tspec) {
- case ARRAY:
- if (namedmem) {
- DPRINTF(("pushinit ARRAY %s\n", namedmem->n_name));
- free(istk);
- initstk = initstk->i_nxt;
- goto again;
- }
- if (incompl(istk->i_type) && istk->i_nxt->i_nxt != NULL) {
- /* initialisation of an incomplete type */
- error(175);
- initerr = 1;
- return;
- }
- istk->i_subt = istk->i_type->t_subt;
- istk->i_nolimit = incompl(istk->i_type);
- istk->i_cnt = istk->i_type->t_dim;
- DPRINTF(("elements array %s[%d] %s\n",
- tyname(buf, sizeof(buf), istk->i_subt), istk->i_cnt,
- namedmem ? namedmem->n_name : "*none*"));
- break;
- case UNION:
- if (tflag)
- /* initialisation of union is illegal in trad. C */
- warning(238);
- /* FALLTHROUGH */
- case STRUCT:
- if (incompl(istk->i_type)) {
- /* initialisation of an incomplete type */
- error(175);
- initerr = 1;
- return;
- }
- cnt = 0;
- DPRINTF(("2. member lookup %s %s\n",
- tyname(buf, sizeof(buf), istk->i_type),
- namedmem ? namedmem->n_name : "*none*"));
- for (m = istk->i_type->t_str->memb; m != NULL; m = m->s_nxt) {
- if (m->s_field && m->s_name == unnamed)
- continue;
- if (namedmem != NULL) {
- DPRINTF(("pushinit():[member:%s, looking:%s]\n",
- m->s_name, namedmem->n_name));
- if (strcmp(m->s_name, namedmem->n_name) == 0) {
- cnt++;
- break;
- } else
- continue;
- }
- if (++cnt == 1) {
- istk->i_mem = m;
- istk->i_subt = m->s_type;
- }
- }
- if (namedmem != NULL) {
- istk->i_namedmem = 1;
- if (m == NULL) {
- error(101, namedmem->n_name);
- initerr = 1;
- } else {
- istk->i_mem = m;
- istk->i_subt = m->s_type;
- }
- memberpop();
- cnt = istk->i_type->t_tspec == STRUCT ? 2 : 1;
- }
- if (cnt == 0) {
- /* cannot init. struct/union with no named member */
- error(179);
- initerr = 1;
- return;
- }
- istk->i_cnt = istk->i_type->t_tspec == STRUCT ? cnt : 1;
- break;
- default:
- if (namedmem) {
- DPRINTF(("pushinit(): pop\n"));
- free(istk);
- initstk = initstk->i_nxt;
- goto again;
- }
- istk->i_cnt = 1;
- break;
- }
-}
-
-static void
-testinit(void)
-{
- istk_t *istk;
-
- istk = initstk;
-
- /*
- * If a closing brace is expected we have at least one initializer
- * too much.
- */
- if (istk->i_cnt == 0 && !istk->i_nolimit && !istk->i_namedmem) {
- switch (istk->i_type->t_tspec) {
- case ARRAY:
- /* too many array initializers */
- error(173);
- break;
- case STRUCT:
- case UNION:
- /* too many struct/union initializers */
- error(172);
- break;
- default:
- /* too many initializers */
- error(174);
- break;
- }
- initerr = 1;
- }
-}
-
-static void
-nextinit(int brace)
-{
- char buf[64];
-
- DPRINTF(("nextinit(%d)\n", brace));
- if (!brace) {
- if (initstk->i_type == NULL &&
- !issclt(initstk->i_subt->t_tspec)) {
- /* {}-enclosed initializer required */
- error(181);
- }
- /*
- * Make sure an entry with a scalar type is at the top
- * of the stack.
- */
- if (!initerr)
- testinit();
- while (!initerr && (initstk->i_type == NULL ||
- !issclt(initstk->i_type->t_tspec))) {
- if (!initerr)
- pushinit();
- }
- } else {
- if (initstk->i_type != NULL &&
- issclt(initstk->i_type->t_tspec)) {
- /* invalid initializer */
- error(176);
- initerr = 1;
- }
- if (!initerr)
- testinit();
- if (!initerr)
- pushinit();
- if (!initerr)
- initstk->i_brace = 1;
- }
-}
-
-void
-initlbr(void)
-{
-
- if (initerr)
- return;
-
- if ((initsym->s_scl == AUTO || initsym->s_scl == REG) &&
- initstk->i_nxt == NULL) {
- if (tflag && !issclt(initstk->i_subt->t_tspec))
- /* no automatic aggregate initialization in trad. C*/
- warning(188);
- }
-
- /*
- * Remove all entries which cannot be used for further initializers
- * and do not expect a closing brace.
- */
- popinit(0);
-
- nextinit(1);
-}
-
-void
-initrbr(void)
-{
-
- if (initerr)
- return;
-
- popinit(1);
-}
-
-void
-mkinit(tnode_t *tn)
-{
- ptrdiff_t offs;
- sym_t *sym;
- tspec_t lt, rt;
- tnode_t *ln;
- struct mbl *tmem;
- scl_t sc;
-#ifdef DEBUG
- char buf[64];
-#endif
-
- DPRINTF(("mkinit(%s)\n", tyname(buf, sizeof(buf), tn->tn_type)));
- if (initerr || tn == NULL)
- goto end;
-
- sc = initsym->s_scl;
-
- /*
- * Do not test for automatic aggregate initialisation. If the
- * initializer starts with a brace we have the warning already.
- * If not, an error will be printed that the initializer must
- * be enclosed by braces.
- */
-
- /*
- * Local initialisation of non-array-types with only one expression
- * without braces is done by ASSIGN
- */
- if ((sc == AUTO || sc == REG) &&
- initsym->s_type->t_tspec != ARRAY && initstk->i_nxt == NULL) {
- ln = getnnode(initsym, 0);
- ln->tn_type = tduptyp(ln->tn_type);
- ln->tn_type->t_const = 0;
- tn = build(ASSIGN, ln, tn);
- expr(tn, 0, 0, 1);
- goto end;
- }
-
- /*
- * Remove all entries which cannot be used for further initializers
- * and do not require a closing brace.
- */
- popinit(0);
-
- /* Initialisations by strings are done in strginit(). */
- if (strginit(tn))
- goto end;
-
- nextinit(0);
- if (initerr || tn == NULL)
- goto end;
-
- initstk->i_cnt--;
- DPRINTF(("mkinit() cnt=%d tn=%p\n", initstk->i_cnt, tn));
- /* Create a temporary node for the left side. */
- ln = tgetblk(sizeof (tnode_t));
- ln->tn_op = NAME;
- ln->tn_type = tduptyp(initstk->i_type);
- ln->tn_type->t_const = 0;
- ln->tn_lvalue = 1;
- ln->tn_sym = initsym; /* better than nothing */
-
- tn = cconv(tn);
-
- lt = ln->tn_type->t_tspec;
- rt = tn->tn_type->t_tspec;
-
- if (!issclt(lt))
- LERROR("mkinit()");
-
- if (!typeok(INIT, 0, ln, tn))
- goto end;
-
- /*
- * Store the tree memory. This is necessary because otherwise
- * expr() would free it.
- */
- tmem = tsave();
- expr(tn, 1, 0, 1);
- trestor(tmem);
-
- if (isityp(lt) && ln->tn_type->t_isfield && !isityp(rt)) {
- /*
- * Bit-fields can be initialized in trad. C only by integer
- * constants.
- */
- if (tflag)
- /* bit-field initialisation is illegal in trad. C */
- warning(186);
- }
-
- if (lt != rt || (initstk->i_type->t_isfield && tn->tn_op == CON))
- tn = convert(INIT, 0, initstk->i_type, tn);
-
- if (tn != NULL && tn->tn_op != CON) {
- sym = NULL;
- offs = 0;
- if (conaddr(tn, &sym, &offs) == -1) {
- if (sc == AUTO || sc == REG) {
- /* non-constant initializer */
- (void)gnuism(177);
- } else {
- /* non-constant initializer */
- error(177);
- }
- }
- }
-
- end:
- /*
- * We only free the block, if we are not a compound declaration
- * We know that the only symbols that start with a digit are the
- * ones we allocate with mktempsym() for compound declarations
- */
- if (!isdigit((unsigned char)initsym->s_name[0]))
- tfreeblk();
-}
-
-
-static int
-strginit(tnode_t *tn)
-{
- tspec_t t;
- istk_t *istk;
- int len;
- strg_t *strg;
-
- if (tn->tn_op != STRING)
- return (0);
-
- istk = initstk;
- strg = tn->tn_strg;
-
- /*
- * Check if we have an array type which can be initialized by
- * the string.
- */
- if (istk->i_subt != NULL && istk->i_subt->t_tspec == ARRAY) {
- t = istk->i_subt->t_subt->t_tspec;
- if (!((strg->st_tspec == CHAR &&
- (t == CHAR || t == UCHAR || t == SCHAR)) ||
- (strg->st_tspec == WCHAR && t == WCHAR))) {
- return (0);
- }
- /* Put the array at top of stack */
- pushinit();
- istk = initstk;
- } else if (istk->i_type != NULL && istk->i_type->t_tspec == ARRAY) {
- t = istk->i_type->t_subt->t_tspec;
- if (!((strg->st_tspec == CHAR &&
- (t == CHAR || t == UCHAR || t == SCHAR)) ||
- (strg->st_tspec == WCHAR && t == WCHAR))) {
- return (0);
- }
- /*
- * If the array is already partly initialized, we are
- * wrong here.
- */
- if (istk->i_cnt != istk->i_type->t_dim)
- return (0);
- } else {
- return (0);
- }
-
- /* Get length without trailing NUL character. */
- len = strg->st_len;
-
- if (istk->i_nolimit) {
- istk->i_nolimit = 0;
- istk->i_type->t_dim = len + 1;
- /* from now complete type */
- setcompl(istk->i_type, 0);
- } else {
- if (istk->i_type->t_dim < len) {
- /* non-null byte ignored in string initializer */
- warning(187);
- }
- }
-
- /* In every case the array is initialized completely. */
- istk->i_cnt = 0;
-
- return (1);
-}
Index: usr.bin/xlint/lint1/lint.h
===================================================================
--- usr.bin/xlint/lint1/lint.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* $NetBSD: lint.h,v 1.2 1995/07/03 21:24:18 cgd Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <stddef.h>
-
-#include "param.h"
-
-/*
- * Type specifiers, used in type structures (type_t) and otherwere.
- */
-typedef enum {
- NOTSPEC,
- SIGNED, /* keyword "signed", only used in the parser */
- UNSIGN, /* keyword "unsigned", only used in the parser */
- CHAR, /* char */
- SCHAR, /* signed char */
- UCHAR, /* unsigned char */
- SHORT, /* (signed) short */
- USHORT, /* unsigned short */
- INT, /* (signed) int */
- UINT, /* unsigned int */
- LONG, /* (signed) long */
- ULONG, /* unsigned long */
- QUAD, /* (signed) long long */
- UQUAD, /* unsigned long long */
- FLOAT, /* float */
- DOUBLE, /* double or, with tflag, long float */
- LDOUBLE, /* long double */
- VOID, /* void */
- STRUCT, /* structure tag */
- UNION, /* union tag */
- ENUM, /* enum tag */
- PTR, /* pointer */
- ARRAY, /* array */
- FUNC /* function */
-#define NTSPEC ((int)FUNC + 1)
-} tspec_t;
-
-/*
- * size of types, name and classification
- */
-typedef struct {
- int tt_sz; /* size in bits */
- int tt_psz; /* size, different from tt_sz
- if pflag is set */
- tspec_t tt_styp; /* signed counterpart */
- tspec_t tt_utyp; /* unsigned counterpart */
- u_int tt_isityp : 1; /* 1 if integer type */
- u_int tt_isutyp : 1; /* 1 if unsigned integer type */
- u_int tt_isftyp : 1; /* 1 if floating point type */
- u_int tt_isatyp : 1; /* 1 if arithmetic type */
- u_int tt_issclt : 1; /* 1 if scalar type */
- char *tt_name; /* type name */
-} ttab_t;
-
-#define size(t) (ttab[t].tt_sz)
-#define psize(t) (ttab[t].tt_psz)
-#define styp(t) (ttab[t].tt_styp)
-#define utyp(t) (ttab[t].tt_utyp)
-#define isityp(t) (ttab[t].tt_isityp)
-#define isutyp(t) (ttab[t].tt_isutyp)
-#define isftyp(t) (ttab[t].tt_isftyp)
-#define isatyp(t) (ttab[t].tt_isatyp)
-#define issclt(t) (ttab[t].tt_issclt)
-
-extern ttab_t ttab[];
-
-
-typedef enum {
- NODECL, /* until now not declared */
- DECL, /* declared */
- TDEF, /* tentative defined */
- DEF /* defined */
-} def_t;
-
-/*
- * Following structure contains some data used for the output buffer.
- */
-typedef struct ob {
- char *o_buf; /* buffer */
- char *o_end; /* first byte after buffer */
- size_t o_len; /* length of buffer */
- char *o_nxt; /* next free byte in buffer */
-} ob_t;
-
-#include "externs.h"
Index: usr.bin/xlint/lint1/lint1.h
===================================================================
--- usr.bin/xlint/lint1/lint1.h
+++ /dev/null
@@ -1,424 +0,0 @@
-/* $NetBSD: lint1.h,v 1.16 2002/10/21 22:44:08 christos Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include "lint.h"
-#include "op.h"
-
-/* XXX - works for most systems, but the whole ALIGN thing needs to go away */
-#ifndef LINT_ALIGN
-#define LINT_ALIGN(x) (((x) + 15) & ~15)
-#endif
-
-/*
- * Describes the position of a declaration or anything else.
- */
-typedef struct {
- int p_line;
- const char *p_file;
- int p_uniq; /* uniquifier */
-} pos_t;
-
-/* Copies curr_pos, keeping things unique. */
-#define UNIQUE_CURR_POS(pos) \
- do { \
- STRUCT_ASSIGN((pos), curr_pos); \
- curr_pos.p_uniq++; \
- if (curr_pos.p_file == csrc_pos.p_file) \
- csrc_pos.p_uniq++; \
- } while (0)
-
-/*
- * Strings cannot be referenced to simply by a pointer to its first
- * char. This is because strings can contain NUL characters other than the
- * trailing NUL.
- *
- * Strings are stored with a trailing NUL.
- */
-typedef struct strg {
- tspec_t st_tspec; /* CHAR or WCHAR */
- size_t st_len; /* length without trailing NUL */
- union {
- u_char *_st_cp;
- wchar_t *_st_wcp;
- } st_u;
-} strg_t;
-
-#define st_cp st_u._st_cp
-#define st_wcp st_u._st_wcp
-
-/*
- * qualifiers (only for lex/yacc interface)
- */
-typedef enum {
- CONST, VOLATILE
-} tqual_t;
-
-/*
- * Integer and floating point values are stored in this structure
- */
-typedef struct {
- tspec_t v_tspec;
- int v_ansiu; /* set if an integer constant is
- unsigned in ANSI C */
- union {
- int64_t _v_quad; /* integers */
- ldbl_t _v_ldbl; /* floats */
- } v_u;
-} val_t;
-
-#define v_quad v_u._v_quad
-#define v_ldbl v_u._v_ldbl
-
-/*
- * Structures of type str_t uniqely identify structures. This can't
- * be done in structures of type type_t, because these are copied
- * if they must be modified. So it would not be possible to check
- * if two structures are identical by comparing the pointers to
- * the type structures.
- *
- * The typename is used if the structure is unnamed to identify
- * the structure type in pass 2.
- */
-typedef struct {
- u_int size; /* size in bit */
- u_int align : 15; /* alignment in bit */
- u_int sincompl : 1; /* set if incomplete type */
- struct sym *memb; /* list of members */
- struct sym *stag; /* symbol table entry of tag */
- struct sym *stdef; /* symbol table entry of first typename */
-} str_t;
-
-/*
- * same as above for enums
- */
-typedef struct {
- u_int eincompl : 1; /* incomplete enum type */
- struct sym *elem; /* list of enumerators */
- struct sym *etag; /* symbol table entry of tag */
- struct sym *etdef; /* symbol table entry of first typename */
-} enum_t;
-
-/*
- * Types are represented by concatenation of structures of type type_t
- * via t_subt.
- */
-typedef struct type {
- tspec_t t_tspec; /* type specifier */
- u_int t_aincompl : 1; /* incomplete array type */
- u_int t_const : 1; /* const modifier */
- u_int t_volatile : 1; /* volatile modifier */
- u_int t_proto : 1; /* function prototype (t_args valid) */
- u_int t_vararg : 1; /* prototype with ... */
- u_int t_typedef : 1; /* type defined with typedef */
- u_int t_isfield : 1; /* type is bitfield */
- u_int t_isenum : 1; /* type is (or was) enum (t_enum valid) */
- union {
- int _t_dim; /* dimension */
- str_t *_t_str; /* struct/union tag */
- enum_t *_t_enum; /* enum tag */
- struct sym *_t_args; /* arguments (if t_proto) */
- } t_u;
- struct {
- u_int _t_flen : 8; /* length of bit-field */
- u_int _t_foffs : 24; /* offset of bit-field */
- } t_b;
- struct type *t_subt; /* element type (arrays), return value
- (functions), or type pointer points to */
-} type_t;
-
-#define t_dim t_u._t_dim
-#define t_str t_u._t_str
-#define t_field t_u._t_field
-#define t_enum t_u._t_enum
-#define t_args t_u._t_args
-#define t_flen t_b._t_flen
-#define t_foffs t_b._t_foffs
-
-/*
- * types of symbols
- */
-typedef enum {
- FVFT, /* variables, functions, type names, enums */
- FMOS, /* members of structs or unions */
- FTAG, /* tags */
- FLAB /* labels */
-} symt_t;
-
-/*
- * storage classes
- */
-typedef enum {
- NOSCL,
- EXTERN, /* external symbols (indep. of decl_t) */
- STATIC, /* static symbols (local and global) */
- AUTO, /* automatic symbols (except register) */
- REG, /* register */
- TYPEDEF, /* typedef */
- STRTAG,
- UNIONTAG,
- ENUMTAG,
- MOS, /* member of struct */
- MOU, /* member of union */
- ENUMCON, /* enumerator */
- ABSTRACT, /* abstract symbol (sizeof, casts, unnamed argument) */
- ARG, /* argument */
- PARG, /* used in declaration stack during prototype
- declaration */
- INLINE /* only used by the parser */
-} scl_t;
-
-/*
- * symbol table entry
- */
-typedef struct sym {
- const char *s_name; /* name */
- const char *s_rename; /* renamed symbol's given name */
- pos_t s_dpos; /* position of last (prototype)definition,
- prototypedeclaration, no-prototype-def.,
- tentative definition or declaration,
- in this order */
- pos_t s_spos; /* position of first initialisation */
- pos_t s_upos; /* position of first use */
- symt_t s_kind; /* type of symbol */
- u_int s_keyw : 1; /* keyword */
- u_int s_field : 1; /* bit-field */
- u_int s_set : 1; /* variable set, label defined */
- u_int s_used : 1; /* variable/label used */
- u_int s_arg : 1; /* symbol is function argument */
- u_int s_reg : 1; /* symbol is register variable */
- u_int s_defarg : 1; /* undefined symbol in old style function
- definition */
- u_int s_rimpl : 1; /* return value of function implicit decl. */
- u_int s_osdef : 1; /* symbol stems from old style function def. */
- u_int s_inline : 1; /* true if this is an inline function */
- struct sym *s_xsym; /* for local declared external symbols pointer
- to external symbol with same name */
- def_t s_def; /* declared, tentative defined, defined */
- scl_t s_scl; /* storage class */
- int s_blklev; /* level of declaration, -1 if not in symbol
- table */
- type_t *s_type; /* type */
- val_t s_value; /* value (if enumcon) */
- union {
- str_t *_s_st; /* tag, if it is a struct/union member */
- enum_t *_s_et; /* tag, if it is an enumerator */
- tspec_t _s_tsp; /* type (only for keywords) */
- tqual_t _s_tqu; /* qualifier (only for keywords) */
- struct sym *_s_args; /* arguments in old style function
- definitions */
- } u;
- struct sym *s_link; /* next symbol with same hash value */
- struct sym **s_rlink; /* pointer to s_link of prev. symbol */
- struct sym *s_nxt; /* next struct/union member, enumerator,
- argument */
- struct sym *s_dlnxt; /* next symbol declared on same level */
-} sym_t;
-
-#define s_styp u._s_st
-#define s_etyp u._s_et
-#define s_tspec u._s_tsp
-#define s_tqual u._s_tqu
-#define s_args u._s_args
-
-/*
- * Used to keep some informations about symbols before they are entered
- * into the symbol table.
- */
-typedef struct sbuf {
- const char *sb_name; /* name of symbol */
- size_t sb_len; /* length (without '\0') */
- int sb_hash; /* hash value */
- sym_t *sb_sym; /* symbol table entry */
- struct sbuf *sb_nxt; /* for freelist */
-} sbuf_t;
-
-
-/*
- * tree node
- */
-typedef struct tnode {
- op_t tn_op; /* operator */
- type_t *tn_type; /* type */
- u_int tn_lvalue : 1; /* node is lvalue */
- u_int tn_cast : 1; /* if tn_op == CVT its an explicit cast */
- u_int tn_parn : 1; /* node parenthesized */
- union {
- struct {
- struct tnode *_tn_left; /* (left) operand */
- struct tnode *_tn_right; /* right operand */
- } tn_s;
- sym_t *_tn_sym; /* symbol if op == NAME */
- val_t *_tn_val; /* value if op == CON */
- strg_t *_tn_strg; /* string if op == STRING */
- } tn_u;
-} tnode_t;
-
-#define tn_left tn_u.tn_s._tn_left
-#define tn_right tn_u.tn_s._tn_right
-#define tn_sym tn_u._tn_sym
-#define tn_val tn_u._tn_val
-#define tn_strg tn_u._tn_strg
-
-/*
- * For nested declarations a stack exists, which holds all information
- * needed for the current level. dcs points to the top element of this
- * stack.
- *
- * ctx describes the context of the current declaration. Its value is
- * one of
- * EXTERN global declarations
- * MOS oder MOU declarations of struct or union members
- * ENUMCON declarations of enums
- * ARG declaration of arguments in old style function definitions
- * PARG declaration of arguments in function prototypes
- * AUTO declaration of local symbols
- * ABSTRACT abstract declarations (sizeof, casts)
- *
- */
-typedef struct dinfo {
- tspec_t d_atyp; /* VOID, CHAR, INT, FLOAT or DOUBLE */
- tspec_t d_smod; /* SIGNED or UNSIGN */
- tspec_t d_lmod; /* SHORT, LONG or QUAD */
- scl_t d_scl; /* storage class */
- type_t *d_type; /* after deftyp() pointer to the type used
- for all declarators */
- sym_t *d_rdcsym; /* redeclared symbol */
- int d_offset; /* offset of next structure member */
- int d_stralign; /* alignment required for current structure */
- scl_t d_ctx; /* context of declaration */
- u_int d_const : 1; /* const in declaration specifiers */
- u_int d_volatile : 1; /* volatile in declaration specifiers */
- u_int d_inline : 1; /* inline in declaration specifiers */
- u_int d_mscl : 1; /* multiple storage classes */
- u_int d_terr : 1; /* invalid type combination */
- u_int d_nedecl : 1; /* 1 if at least a tag is declared */
- u_int d_vararg : 1; /* ... in current function decl. */
- u_int d_proto : 1; /* current funct. decl. is prototype */
- u_int d_notyp : 1; /* set if no type specifier was present */
- u_int d_asm : 1; /* set if d_ctx == AUTO and asm() present */
- type_t *d_tagtyp; /* tag during member declaration */
- sym_t *d_fargs; /* list of arguments during function def. */
- pos_t d_fdpos; /* position of function definition */
- sym_t *d_dlsyms; /* first symbol declared at this level */
- sym_t **d_ldlsym; /* points to s_dlnxt in last symbol decl.
- at this level */
- sym_t *d_fpsyms; /* symbols defined in prototype */
- struct dinfo *d_nxt; /* next level */
-} dinfo_t;
-
-/*
- * Type of stack which is used for initialisation of aggregate types.
- */
-typedef struct istk {
- type_t *i_type; /* type of initialisation */
- type_t *i_subt; /* type of next level */
- u_int i_brace : 1; /* need } for pop */
- u_int i_nolimit : 1; /* incomplete array type */
- u_int i_namedmem : 1; /* has c9x named members */
- sym_t *i_mem; /* next structure member */
- int i_cnt; /* # of remaining elements */
- struct istk *i_nxt; /* previous level */
-} istk_t;
-
-/*
- * Used to collect information about pointers and qualifiers in
- * declarators.
- */
-typedef struct pqinf {
- int p_pcnt; /* number of asterisks */
- u_int p_const : 1;
- u_int p_volatile : 1;
- struct pqinf *p_nxt;
-} pqinf_t;
-
-/*
- * Case values are stored in a list of type clst_t.
- */
-typedef struct clst {
- val_t cl_val;
- struct clst *cl_nxt;
-} clst_t;
-
-/*
- * Used to keep informations about nested control statements.
- */
-typedef struct cstk {
- int c_env; /* type of statement (T_IF, ...) */
- u_int c_loop : 1; /* continue && break are valid */
- u_int c_switch : 1; /* case && break are valid */
- u_int c_break : 1; /* loop/switch has break */
- u_int c_cont : 1; /* loop has continue */
- u_int c_default : 1; /* switch has default */
- u_int c_infinite : 1; /* break condition always false
- (for (;;), while (1)) */
- u_int c_rchif : 1; /* end of if-branch reached */
- u_int c_noretval : 1; /* had "return;" */
- u_int c_retval : 1; /* had "return (e);" */
- type_t *c_swtype; /* type of switch expression */
- clst_t *c_clst; /* list of case values */
- struct mbl *c_fexprm; /* saved memory for end of loop
- expression in for() */
- tnode_t *c_f3expr; /* end of loop expr in for() */
- pos_t c_fpos; /* position of end of loop expr */
- pos_t c_cfpos; /* same for csrc_pos */
- struct cstk *c_nxt; /* outer control statement */
-} cstk_t;
-
-typedef struct {
- size_t lo;
- size_t hi;
-} range_t;
-
-#include "externs1.h"
-
-#define ERR_SETSIZE 1024
-#define __NERRBITS (sizeof(unsigned int))
-
-typedef struct err_set {
- unsigned int errs_bits[(ERR_SETSIZE + __NERRBITS-1) / __NERRBITS];
-} err_set;
-
-#define ERR_SET(n, p) \
- ((p)->errs_bits[(n)/__NERRBITS] |= (1 << ((n) % __NERRBITS)))
-#define ERR_CLR(n, p) \
- ((p)->errs_bits[(n)/__NERRBITS] &= ~(1 << ((n) % __NERRBITS)))
-#define ERR_ISSET(n, p) \
- ((p)->errs_bits[(n)/__NERRBITS] & (1 << ((n) % __NERRBITS)))
-#define ERR_ZERO(p) (void)memset((p), 0, sizeof(*(p)))
-
-#define LERROR(fmt, args...) lerror(__FILE__, __LINE__, fmt, ##args)
-
-extern err_set msgset;
Index: usr.bin/xlint/lint1/main1.c
===================================================================
--- usr.bin/xlint/lint1/main1.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/* $NetBSD: main1.c,v 1.17 2006/11/08 18:31:15 christos Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: main1.c,v 1.17 2006/11/08 18:31:15 christos Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <err.h>
-#include <errno.h>
-#include <limits.h>
-
-#include "lint1.h"
-
-/* set yydebug to 1*/
-int yflag;
-
-/*
- * Print warnings if an assignment of an integertype to another integertype
- * causes an implicit narrowing conversion. If aflag is 1, these warnings
- * are printed only if the source type is at least as wide as long. If aflag
- * is greater than 1, they are always printed.
- */
-int aflag;
-
-/* Print a warning if a break statement cannot be reached. */
-int bflag;
-
-/* Print warnings for pointer casts. */
-int cflag;
-
-/* Print various debug information. */
-int dflag;
-
-/* Perform stricter checking of enum types and operations on enum types. */
-int eflag;
-
-/* Print complete pathnames, not only the basename. */
-int Fflag;
-
-/* Enable some extensions of gcc */
-int gflag;
-
-/* Treat warnings as errors */
-int wflag;
-
-/*
- * Apply a number of heuristic tests to attempt to intuit bugs, improve
- * style, and reduce waste.
- */
-int hflag;
-
-/* Attempt to check portability to other dialects of C. */
-int pflag;
-
-/*
- * In case of redeclarations/redefinitions print the location of the
- * previous declaration/definition.
- */
-int rflag;
-
-/* Strict ANSI C mode. */
-int sflag;
-
-/* Traditional C mode. */
-int tflag;
-
-/* Enable C9X extensions */
-int Sflag;
-/*
- * Complain about functions and external variables used and not defined,
- * or defined and not used.
- */
-int uflag = 1;
-
-/* Complain about unused function arguments. */
-int vflag = 1;
-
-/* Complain about structures which are never defined. */
-int zflag = 1;
-
-err_set msgset;
-
-static void usage(void);
-
-int main(int, char *[]);
-
-int
-main(int argc, char *argv[])
-{
- int c;
- char *ptr;
-
- ERR_ZERO(&msgset);
- while ((c = getopt(argc, argv, "abcdeghmprstuvwyzFSX:")) != -1) {
- switch (c) {
- case 'a': aflag++; break;
- case 'b': bflag = 1; break;
- case 'c': cflag = 1; break;
- case 'd': dflag = 1; break;
- case 'e': eflag = 1; break;
- case 'F': Fflag = 1; break;
- case 'g': gflag = 1; break;
- case 'h': hflag = 1; break;
- case 'p': pflag = 1; break;
- case 'r': rflag = 1; break;
- case 's': sflag = 1; break;
- case 'S': Sflag = 1; break;
- case 't': tflag = 1; break;
- case 'u': uflag = 0; break;
- case 'w': wflag = 1; break;
- case 'v': vflag = 0; break;
- case 'y': yflag = 1; break;
- case 'z': zflag = 0; break;
-
- case 'm':
- msglist();
- return(0);
-
- case 'X':
- for (ptr = strtok(optarg, ","); ptr;
- ptr = strtok(NULL, ",")) {
- char *eptr;
- long msg;
-
- errno = 0;
- msg = strtol(ptr, &eptr, 0);
- if ((msg == LONG_MIN || msg == LONG_MAX) &&
- errno == ERANGE)
- err(1, "invalid error message id '%s'",
- ptr);
- if (*eptr || ptr == eptr || msg < 0 ||
- msg >= ERR_SETSIZE)
- errx(1, "invalid error message id '%s'",
- ptr);
- ERR_SET(msg, &msgset);
- }
- break;
- case '?':
- default:
- usage();
- break;
- }
- }
- argc -= optind;
- argv += optind;
-
- if (argc != 2)
- usage();
-
- /* open the input file */
- if ((yyin = fopen(argv[0], "r")) == NULL)
- err(1, "cannot open '%s'", argv[0]);
-
- /* initialize output */
- outopen(argv[1]);
-
- if (yflag)
- yydebug = 1;
-
- initmem();
- initdecl();
- initscan();
- initmtab();
-
- yyparse();
-
- /* Following warnings cannot be suppressed by LINTED */
- nowarn = 0;
-#ifdef DEBUG
- printf("%s, %d: nowarn = 0\n", curr_pos.p_file, curr_pos.p_line);
-#endif
- chkglsyms();
-
- outclose();
-
- return (nerr != 0);
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: lint1 [-abcdeghmprstuvwyzFS] [-X <id>[,<id>]... src dest\n");
- exit(1);
-}
-
-void
-norecover(void)
-{
- /* cannot recover from previous errors */
- error(224);
- exit(1);
-}
Index: usr.bin/xlint/lint1/makeman
===================================================================
--- usr.bin/xlint/lint1/makeman
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/sh
-# $NetBSD$
-#
-# Copyright (c) 2000 The NetBSD Foundation, Inc.
-# All rights reserved.
-#
-# This code is derived from software contributed to The NetBSD Foundation
-# by Christos Zoulas.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
-
-
-cat << \__EOF
-.\" $NetBSD$
-.\"
-.\" Copyright (c) 2000 The NetBSD Foundation, Inc.
-.\" All rights reserved.
-.\"
-.\" This code is derived from software contributed to The NetBSD Foundation
-.\" by Christos Zoulas.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-.\" POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd July 5, 2000
-.Dt LINT 7
-.Os
-.Sh NAME
-.Nm lint
-.Nd Lint error message list
-.Sh DESCRIPTION
-The following is a list of message IDs and messages produced by
-.Xr lint 1 .
-It is intended to be used with
-.Fl X
-flag of
-.Xr lint 1 .
-.Bl -column -offset indent "XXXX"
-__EOF
-"$@" | sed -e 's/\\/\\e/g' -e "s/'/\\'/"
-echo ".El"
Index: usr.bin/xlint/lint1/mem1.c
===================================================================
--- usr.bin/xlint/lint1/mem1.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/* $NetBSD: mem1.c,v 1.7 2002/01/31 19:36:54 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: mem1.c,v 1.7 2002/01/31 19:36:54 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <sys/param.h>
-#include <err.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "lint1.h"
-
-/*
- * Filenames allocated by fnalloc() and fnnalloc() are shared.
- */
-typedef struct fn {
- char *fn_name;
- size_t fn_len;
- int fn_id;
- struct fn *fn_nxt;
-} fn_t;
-
-static fn_t *fnames;
-
-static fn_t *srchfn(const char *, size_t);
-
-/*
- * Look for a Filename of length l.
- */
-static fn_t *
-srchfn(const char *s, size_t len)
-{
- fn_t *fn;
-
- for (fn = fnames; fn != NULL; fn = fn->fn_nxt) {
- if (fn->fn_len == len && memcmp(fn->fn_name, s, len) == 0)
- break;
- }
- return (fn);
-}
-
-/*
- * Return a shared string for filename s.
- */
-const char *
-fnalloc(const char *s)
-{
-
- return (s != NULL ? fnnalloc(s, strlen(s)) : NULL);
-}
-
-const char *
-fnnalloc(const char *s, size_t len)
-{
- fn_t *fn;
-
- static int nxt_id = 0;
-
- if (s == NULL)
- return (NULL);
-
- if ((fn = srchfn(s, len)) == NULL) {
- if ((fn = malloc(sizeof (fn_t))) == NULL)
- nomem();
- /* Do not used strdup() because string is not NUL-terminated.*/
- if ((fn->fn_name = malloc(len + 1)) == NULL)
- nomem();
- (void)memcpy(fn->fn_name, s, len);
- fn->fn_name[len] = '\0';
- fn->fn_len = len;
- fn->fn_id = nxt_id++;
- fn->fn_nxt = fnames;
- fnames = fn;
- /* Write id of this filename to the output file. */
- outclr();
- outint(fn->fn_id);
- outchar('s');
- outstrg(fn->fn_name);
- }
- return (fn->fn_name);
-}
-
-/*
- * Get id of a filename.
- */
-int
-getfnid(const char *s)
-{
- fn_t *fn;
-
- if (s == NULL || (fn = srchfn(s, strlen(s))) == NULL)
- return (-1);
- return (fn->fn_id);
-}
-
-/*
- * Memory for declarations and other things which must be available
- * until the end of a block (or the end of the translation unit)
- * are associated with the level (mblklev) of the block (or with 0).
- * Because these memory is allocated in large blocks associated with
- * a given level it can be freed easily at the end of a block.
- */
-#define ML_INC ((size_t)32) /* Increment for length of *mblks */
-
-typedef struct mbl {
- void *blk; /* beginning of memory block */
- void *ffree; /* first free byte */
- size_t nfree; /* # of free bytes */
- size_t size; /* total size of memory block */
- struct mbl *nxt; /* next block */
-} mbl_t;
-
-/*
- * Array of pointers to lists of memory blocks. mblklev is used as
- * index into this array.
- */
-static mbl_t **mblks;
-
-/* number of elements in *mblks */
-static size_t nmblks;
-
-/* free list for memory blocks */
-static mbl_t *frmblks;
-
-/* length of new allocated memory blocks */
-static size_t mblklen;
-
-static void *xgetblk(mbl_t **, size_t);
-static void xfreeblk(mbl_t **);
-static mbl_t *xnewblk(void);
-
-static mbl_t *
-xnewblk(void)
-{
- mbl_t *mb;
- int prot, flags;
-
- if ((mb = malloc(sizeof (mbl_t))) == NULL)
- nomem();
-
- /* use mmap instead of malloc to avoid malloc's size overhead */
-
- prot = PROT_READ | PROT_WRITE;
- flags = MAP_ANON | MAP_PRIVATE;
- mb->blk = mmap(NULL, mblklen, prot, flags, -1, (off_t)0);
- if (mb->blk == (void *)MAP_FAILED)
- err(1, "can't map memory");
-
- mb->size = mblklen;
-
- return (mb);
-}
-
-/*
- * Allocate new memory. If the first block of the list has not enough
- * free space, or there is no first block, get a new block. The new
- * block is taken from the free list or, if there is no block on the
- * free list, is allocated using xnewblk(). If a new block is allocated
- * it is initialized with zero. Blocks taken from the free list are
- * zero'd in xfreeblk().
- */
-static void *
-xgetblk(mbl_t **mbp, size_t s)
-{
- mbl_t *mb;
- void *p;
- size_t t = 0;
-
- s = LINT_ALIGN(s);
- if ((mb = *mbp) == NULL || mb->nfree < s) {
- if ((mb = frmblks) == NULL) {
- if (s > mblklen) {
- t = mblklen;
- mblklen = s;
- }
- mb = xnewblk();
- if (t)
- mblklen = t;
- (void)memset(mb->blk, 0, mb->size);
- } else {
- frmblks = mb->nxt;
- }
- mb->ffree = mb->blk;
- mb->nfree = mb->size;
- mb->nxt = *mbp;
- *mbp = mb;
- }
- p = mb->ffree;
- mb->ffree = (char *)mb->ffree + s;
- mb->nfree -= s;
- return (p);
-}
-
-/*
- * Move all blocks from list *fmbp to free list. For each block, set all
- * used memory to zero.
- */
-static void
-xfreeblk(mbl_t **fmbp)
-{
- mbl_t *mb;
-
- while ((mb = *fmbp) != NULL) {
- *fmbp = mb->nxt;
- mb->nxt = frmblks;
- frmblks = mb;
- (void)memset(mb->blk, 0, mb->size - mb->nfree);
- }
-}
-
-void
-initmem(void)
-{
- int pgsz;
-
- pgsz = getpagesize();
- mblklen = ((MBLKSIZ + pgsz - 1) / pgsz) * pgsz;
-
- if ((mblks = calloc(nmblks = ML_INC, sizeof (mbl_t *))) == NULL)
- nomem();
-}
-
-
-/*
- * Allocate memory associated with level l.
- */
-void *
-getlblk(int l, size_t s)
-{
-
- while (l >= nmblks) {
- if ((mblks = realloc(mblks, (nmblks + ML_INC) *
- sizeof (mbl_t *))) == NULL)
- nomem();
- (void)memset(&mblks[nmblks], 0, ML_INC * sizeof (mbl_t *));
- nmblks += ML_INC;
- }
- return (xgetblk(&mblks[l], s));
-}
-
-void *
-getblk(size_t s)
-{
-
- return (getlblk(mblklev, s));
-}
-
-/*
- * Free all memory associated with level l.
- */
-void
-freelblk(int l)
-{
-
- xfreeblk(&mblks[l]);
-}
-
-void
-freeblk(void)
-{
-
- freelblk(mblklev);
-}
-
-/*
- * tgetblk() returns memory which is associated with the current
- * expression.
- */
-static mbl_t *tmblk;
-
-void *
-tgetblk(size_t s)
-{
-
- return (xgetblk(&tmblk, s));
-}
-
-/*
- * Get memory for a new tree node.
- */
-tnode_t *
-getnode(void)
-{
-
- return (tgetblk(sizeof (tnode_t)));
-}
-
-/*
- * Free all memory which is allocated by the current expression.
- */
-void
-tfreeblk(void)
-{
-
- xfreeblk(&tmblk);
-}
-
-/*
- * Save the memory which is used by the current expression. This memory
- * is not freed by the next tfreeblk() call. The pointer returned can be
- * used to restore the memory.
- */
-mbl_t *
-tsave(void)
-{
- mbl_t *tmem;
-
- tmem = tmblk;
- tmblk = NULL;
- return (tmem);
-}
-
-/*
- * Free all memory used for the current expression and the memory used
- * be a previous expression and saved by tsave(). The next call to
- * tfreeblk() frees the restored memory.
- */
-void
-trestor(mbl_t *tmem)
-{
-
- tfreeblk();
- if (tmblk != NULL) {
- free(tmblk->blk);
- free(tmblk);
- }
- tmblk = tmem;
-}
Index: usr.bin/xlint/lint1/op.h
===================================================================
--- usr.bin/xlint/lint1/op.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/* $NetBSD: op.h,v 1.2 1995/07/03 21:24:27 cgd Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * Various information about operators
- */
-typedef struct {
- u_int m_binary : 1; /* binary op. */
- u_int m_logop : 1; /* logical op., result is int */
- u_int m_rqint : 1; /* operands must have integer type */
- u_int m_rqsclt : 1; /* operands must have scalar type */
- u_int m_rqatyp : 1; /* operands must have arithmetic type */
- u_int m_fold : 1; /* operands should be folded */
- u_int m_vctx : 1; /* value context for left operand */
- u_int m_tctx : 1; /* test context for left operand */
- u_int m_balance : 1; /* op. requires balancing */
- u_int m_sideeff : 1; /* op. has side effect */
- u_int m_tlansiu : 1; /* warning if left op. is unsign. in ANSI C */
- u_int m_transiu : 1; /* warning if right op. is unsign. in ANSI C */
- u_int m_tpconf : 1; /* test possible precedence confusion */
- u_int m_comp : 1; /* op. performs comparison */
- u_int m_enumop : 1; /* valid operation on enums */
- u_int m_badeop : 1; /* dubious operation on enums */
- u_int m_eqwarn : 1; /* warning if on operand stems from == */
- const char *m_name; /* name of op. */
-} mod_t;
-
-typedef enum {
- NOOP = 0,
- ARROW,
- POINT,
- NOT,
- COMPL,
- INC,
- DEC,
- INCBEF,
- DECBEF,
- INCAFT,
- DECAFT,
- UPLUS,
- UMINUS,
- STAR,
- AMPER,
- MULT,
- DIV,
- MOD,
- PLUS,
- MINUS,
- SHL,
- SHR,
- LT,
- LE,
- GT,
- GE,
- EQ,
- NE,
- AND,
- XOR,
- OR,
- LOGAND,
- LOGOR,
- QUEST,
- COLON,
- ASSIGN,
- MULASS,
- DIVASS,
- MODASS,
- ADDASS,
- SUBASS,
- SHLASS,
- SHRASS,
- ANDASS,
- XORASS,
- ORASS,
- NAME,
- CON,
- STRING,
- FSEL,
- CALL,
- COMMA,
- CVT,
- ICALL,
- LOAD,
- PUSH,
- RETURN,
- INIT, /* pseudo op, not used in trees */
- CASE, /* pseudo op, not used in trees */
- FARG /* pseudo op, not used in trees */
-#define NOPS ((int)FARG + 1)
-} op_t;
Index: usr.bin/xlint/lint1/param.h
===================================================================
--- usr.bin/xlint/lint1/param.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/* $NetBSD: param.h,v 1.4 1995/07/23 18:14:41 ragge Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/*
- * Minimun size of string buffer. If this is not enough, the buffer
- * is enlarged in steps of STRBLEN bytes.
- */
-#define STRBLEN 256
-
-/*
- * This defines the size of memory blocks which are used to allocate
- * memory in larger chunks.
- */
-#define MBLKSIZ ((size_t)0x4000)
-
-/*
- * Sizes of hash tables
- * Should be a prime. Possible primes are
- * 307, 401, 503, 601, 701, 809, 907, 1009, 1103, 1201, 1301, 1409, 1511.
- *
- * HSHSIZ1 symbol table 1st pass
- * HSHSIZ2 symbol table 2nd pass
- * THSHSIZ2 type table 2nd pass
- */
-#define HSHSIZ1 503
-#define HSHSIZ2 1009
-#define THSHSIZ2 1009
-
-/*
- * Should be set to 1 if the difference of two pointers is of type long
- * or the value of sizeof is of type unsigned long.
- */
-#if __amd64__
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#elif __alpha__
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#elif __i386__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __m68k__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __ns32k__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __powerpc__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __riscv
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#elif __sparc__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __sparc64__
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#elif __vax__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __arm__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __mips__
-#define PTRDIFF_IS_LONG 0
-#define SIZEOF_IS_ULONG 0
-#elif __aarch64__
-#define PTRDIFF_IS_LONG 1
-#define SIZEOF_IS_ULONG 1
-#else
-#error unknown machine type
-#endif
-
-/*
- * Make sure this matches wchar_t.
- */
-#define WCHAR SHORT
-
-#ifndef __GNUC__
-#ifndef lint
-#ifndef QUAD_MAX /* necessary for mkdep */
-#define QUAD_MAX LONG_MAX
-#define QUAD_MIN LONG_MIN
-#define UQUAD_MAX ULONG_MAX
-#endif
-typedef long quad_t;
-typedef u_long u_quad_t;
-#endif
-#endif
-
-
-/*
- * long double only in ANSI C.
- */
-#ifdef __STDC__
-typedef long double ldbl_t;
-#else
-typedef double ldbl_t;
-#endif
-
-/*
- * Some traditional compilers are not able to assign structures.
- */
-#ifdef __STDC__
-#define STRUCT_ASSIGN(dest, src) (dest) = (src)
-#else
-#define STRUCT_ASSIGN(dest, src) (void)memcpy(&(dest), &(src), \
- sizeof (dest));
-#endif
Index: usr.bin/xlint/lint1/scan.l
===================================================================
--- usr.bin/xlint/lint1/scan.l
+++ /dev/null
@@ -1,1531 +0,0 @@
-%{
-/* $NetBSD: scan.l,v 1.37 2007/02/06 00:08:31 he Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: scan.l,v 1.37 2007/02/06 00:08:31 he Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <float.h>
-#include <ctype.h>
-#include <errno.h>
-#include <err.h>
-#include <math.h>
-
-#include "lint1.h"
-#include "cgram.h"
-
-#define CHAR_MASK (~(~0 << CHAR_BIT))
-
-/* Current position (its also updated when an included file is parsed) */
-pos_t curr_pos = { 1, "", 0 };
-
-/*
- * Current position in C source (not updated when an included file is
- * parsed).
- */
-pos_t csrc_pos = { 1, "", 0 };
-
-static void incline(void);
-static void badchar(int);
-static sbuf_t *allocsb(void);
-static void freesb(sbuf_t *);
-static int inpc(void);
-static int hash(const char *);
-static sym_t *search(sbuf_t *);
-static int name(void);
-static int keyw(sym_t *);
-static int icon(int);
-static int fcon(void);
-static int operator(int, op_t);
-static int ccon(void);
-static int wccon(void);
-static int getescc(int);
-static void directive(void);
-static void comment(void);
-static void slashslashcomment(void);
-static int string(void);
-static int wcstrg(void);
-
-%}
-
-%option nounput
-
-L [_A-Za-z]
-D [0-9]
-NZD [1-9]
-OD [0-7]
-HD [0-9A-Fa-f]
-EX ([eE][+-]?[0-9]+)
-
-%%
-
-{L}({L}|{D})* return (name());
-0{OD}*[lLuU]* return (icon(8));
-{NZD}{D}*[lLuU]* return (icon(10));
-0[xX]{HD}+[lLuU]* return (icon(16));
-{D}+\.{D}*{EX}?[fFlL]? |
-{D}+{EX}[fFlL]? |
-0[xX]{HD}+p{HD}+[fFlL]? |
-\.{D}+{EX}?[fFlL]? return (fcon());
-"=" return (operator(T_ASSIGN, ASSIGN));
-"*=" return (operator(T_OPASS, MULASS));
-"/=" return (operator(T_OPASS, DIVASS));
-"%=" return (operator(T_OPASS, MODASS));
-"+=" return (operator(T_OPASS, ADDASS));
-"-=" return (operator(T_OPASS, SUBASS));
-"<<=" return (operator(T_OPASS, SHLASS));
-">>=" return (operator(T_OPASS, SHRASS));
-"&=" return (operator(T_OPASS, ANDASS));
-"^=" return (operator(T_OPASS, XORASS));
-"|=" return (operator(T_OPASS, ORASS));
-"||" return (operator(T_LOGOR, LOGOR));
-"&&" return (operator(T_LOGAND, LOGAND));
-"|" return (operator(T_OR, OR));
-"&" return (operator(T_AND, AND));
-"^" return (operator(T_XOR, XOR));
-"==" return (operator(T_EQOP, EQ));
-"!=" return (operator(T_EQOP, NE));
-"<" return (operator(T_RELOP, LT));
-">" return (operator(T_RELOP, GT));
-"<=" return (operator(T_RELOP, LE));
-">=" return (operator(T_RELOP, GE));
-"<<" return (operator(T_SHFTOP, SHL));
-">>" return (operator(T_SHFTOP, SHR));
-"++" return (operator(T_INCDEC, INC));
-"--" return (operator(T_INCDEC, DEC));
-"->" return (operator(T_STROP, ARROW));
-"." return (operator(T_STROP, POINT));
-"+" return (operator(T_ADDOP, PLUS));
-"-" return (operator(T_ADDOP, MINUS));
-"*" return (operator(T_MULT, MULT));
-"/" return (operator(T_DIVOP, DIV));
-"%" return (operator(T_DIVOP, MOD));
-"!" return (operator(T_UNOP, NOT));
-"~" return (operator(T_UNOP, COMPL));
-"\"" return (string());
-"L\"" return (wcstrg());
-";" return (T_SEMI);
-"{" return (T_LBRACE);
-"}" return (T_RBRACE);
-"," return (T_COMMA);
-":" return (T_COLON);
-"?" return (T_QUEST);
-"[" return (T_LBRACK);
-"]" return (T_RBRACK);
-"(" return (T_LPARN);
-")" return (T_RPARN);
-"..." return (T_ELLIPSE);
-"'" return (ccon());
-"L'" return (wccon());
-^#.*$ directive();
-\n incline();
-\t|" "|\f|\v ;
-"/*" comment();
-"//" slashslashcomment();
-. badchar(yytext[0]);
-
-%%
-
-static void
-incline(void)
-{
- curr_pos.p_line++;
- curr_pos.p_uniq = 0;
- if (curr_pos.p_file == csrc_pos.p_file) {
- csrc_pos.p_line++;
- csrc_pos.p_uniq = 0;
- }
-}
-
-static void
-badchar(int c)
-{
-
- /* unknown character \%o */
- error(250, c);
-}
-
-/*
- * Keywords.
- * During initialisation they are written to the symbol table.
- */
-static struct kwtab {
- const char *kw_name; /* keyword */
- int kw_token; /* token returned by yylex() */
- scl_t kw_scl; /* storage class if kw_token T_SCLASS */
- tspec_t kw_tspec; /* type spec. if kw_token T_TYPE or T_SOU */
- tqual_t kw_tqual; /* type qual. fi kw_token T_QUAL */
- u_int kw_c89; /* c89 keyword */
- u_int kw_c99; /* c99 keyword */
- u_int kw_gcc; /* GCC keyword */
-} kwtab[] = {
- { "asm", T_ASM, 0, 0, 0, 0, 0, 1 },
- { "__asm", T_ASM, 0, 0, 0, 0, 0, 0 },
- { "__asm__", T_ASM, 0, 0, 0, 0, 0, 0 },
- { "auto", T_SCLASS, AUTO, 0, 0, 0, 0, 0 },
- { "break", T_BREAK, 0, 0, 0, 0, 0, 0 },
- { "case", T_CASE, 0, 0, 0, 0, 0, 0 },
- { "char", T_TYPE, 0, CHAR, 0, 0, 0, 0 },
- { "const", T_QUAL, 0, 0, CONST, 1, 0, 0 },
- { "__const__", T_QUAL, 0, 0, CONST, 0, 0, 0 },
- { "__const", T_QUAL, 0, 0, CONST, 0, 0, 0 },
- { "continue", T_CONTINUE, 0, 0, 0, 0, 0, 0 },
- { "default", T_DEFAULT, 0, 0, 0, 0, 0, 0 },
- { "do", T_DO, 0, 0, 0, 0, 0, 0 },
- { "double", T_TYPE, 0, DOUBLE, 0, 0, 0, 0 },
- { "else", T_ELSE, 0, 0, 0, 0, 0, 0 },
- { "enum", T_ENUM, 0, 0, 0, 0, 0, 0 },
- { "extern", T_SCLASS, EXTERN, 0, 0, 0, 0, 0 },
- { "float", T_TYPE, 0, FLOAT, 0, 0, 0, 0 },
- { "for", T_FOR, 0, 0, 0, 0, 0, 0 },
- { "goto", T_GOTO, 0, 0, 0, 0, 0, 0 },
- { "if", T_IF, 0, 0, 0, 0, 0, 0 },
- { "inline", T_SCLASS, INLINE, 0, 0, 0, 1, 0 },
- { "__inline__", T_SCLASS, INLINE, 0, 0, 0, 0, 0 },
- { "__inline", T_SCLASS, INLINE, 0, 0, 0, 0, 0 },
- { "int", T_TYPE, 0, INT, 0, 0, 0, 0 },
- { "__symbolrename", T_SYMBOLRENAME, 0, 0, 0, 0, 0, 0 },
- { "long", T_TYPE, 0, LONG, 0, 0, 0, 0 },
- { "register", T_SCLASS, REG, 0, 0, 0, 0, 0 },
- { "return", T_RETURN, 0, 0, 0, 0, 0, 0 },
- { "short", T_TYPE, 0, SHORT, 0, 0, 0, 0 },
- { "signed", T_TYPE, 0, SIGNED, 0, 1, 0, 0 },
- { "__signed__", T_TYPE, 0, SIGNED, 0, 0, 0, 0 },
- { "__signed", T_TYPE, 0, SIGNED, 0, 0, 0, 0 },
- { "sizeof", T_SIZEOF, 0, 0, 0, 0, 0, 0 },
- { "static", T_SCLASS, STATIC, 0, 0, 0, 0, 0 },
- { "struct", T_SOU, 0, STRUCT, 0, 0, 0, 0 },
- { "switch", T_SWITCH, 0, 0, 0, 0, 0, 0 },
- { "typedef", T_SCLASS, TYPEDEF, 0, 0, 0, 0, 0 },
- { "union", T_SOU, 0, UNION, 0, 0, 0, 0 },
- { "unsigned", T_TYPE, 0, UNSIGN, 0, 0, 0, 0 },
- { "void", T_TYPE, 0, VOID, 0, 0, 0, 0 },
- { "volatile", T_QUAL, 0, 0, VOLATILE, 1, 0, 0 },
- { "__volatile__", T_QUAL, 0, 0, VOLATILE, 0, 0, 0 },
- { "__volatile", T_QUAL, 0, 0, VOLATILE, 0, 0, 0 },
- { "while", T_WHILE, 0, 0, 0, 0, 0, 0 },
- { NULL, 0, 0, 0, 0, 0, 0, 0 }
-};
-
-/* Symbol table */
-static sym_t *symtab[HSHSIZ1];
-
-/* bit i of the entry with index i is set */
-uint64_t qbmasks[sizeof(uint64_t) * CHAR_BIT];
-
-/* least significant i bits are set in the entry with index i */
-uint64_t qlmasks[sizeof(uint64_t) * CHAR_BIT + 1];
-
-/* least significant i bits are not set in the entry with index i */
-uint64_t qumasks[sizeof(uint64_t) * CHAR_BIT + 1];
-
-/* free list for sbuf structures */
-static sbuf_t *sbfrlst;
-
-/* type of next expected symbol */
-symt_t symtyp;
-
-
-/*
- * All keywords are written to the symbol table. This saves us looking
- * in an extra table for each name we found.
- */
-void
-initscan(void)
-{
- struct kwtab *kw;
- sym_t *sym;
- int h, i;
- uint64_t uq;
-
- for (kw = kwtab; kw->kw_name != NULL; kw++) {
- if ((kw->kw_c89 || kw->kw_c99) && tflag)
- continue;
- if (kw->kw_c99 && !(Sflag || gflag))
- continue;
- if (kw->kw_gcc && !gflag)
- continue;
- sym = getblk(sizeof (sym_t));
- sym->s_name = kw->kw_name;
- sym->s_keyw = 1;
- sym->s_value.v_quad = kw->kw_token;
- if (kw->kw_token == T_TYPE || kw->kw_token == T_SOU) {
- sym->s_tspec = kw->kw_tspec;
- } else if (kw->kw_token == T_SCLASS) {
- sym->s_scl = kw->kw_scl;
- } else if (kw->kw_token == T_QUAL) {
- sym->s_tqual = kw->kw_tqual;
- }
- h = hash(sym->s_name);
- if ((sym->s_link = symtab[h]) != NULL)
- symtab[h]->s_rlink = &sym->s_link;
- (symtab[h] = sym)->s_rlink = &symtab[h];
- }
-
- /* initialize bit-masks for quads */
- for (i = 0; i < sizeof (uint64_t) * CHAR_BIT; i++) {
- qbmasks[i] = (uint64_t)1 << i;
- uq = ~(uint64_t)0 << i;
- qumasks[i] = uq;
- qlmasks[i] = ~uq;
- }
- qumasks[i] = 0;
- qlmasks[i] = ~(uint64_t)0;
-}
-
-/*
- * Get a free sbuf structure, if possible from the free list
- */
-static sbuf_t *
-allocsb(void)
-{
- sbuf_t *sb;
-
- if ((sb = sbfrlst) != NULL) {
- sbfrlst = sb->sb_nxt;
- } else {
- if ((sb = malloc(sizeof (sbuf_t))) == NULL)
- nomem();
- }
- (void)memset(sb, 0, sizeof (*sb));
- return (sb);
-}
-
-/*
- * Put a sbuf structure to the free list
- */
-static void
-freesb(sbuf_t *sb)
-{
-
- sb->sb_nxt = sbfrlst;
- sbfrlst = sb;
-}
-
-/*
- * Read a character and ensure that it is positive (except EOF).
- * Increment line count(s) if necessary.
- */
-static int
-inpc(void)
-{
- int c;
-
- if ((c = input()) != EOF && (c &= CHAR_MASK) == '\n')
- incline();
- return (c);
-}
-
-static int
-hash(const char *s)
-{
- u_int v;
- const u_char *us;
-
- v = 0;
- for (us = (const u_char *)s; *us != '\0'; us++) {
- v = (v << sizeof (v)) + *us;
- v ^= v >> (sizeof (v) * CHAR_BIT - sizeof (v));
- }
- return (v % HSHSIZ1);
-}
-
-/*
- * Lex has found a letter followed by zero or more letters or digits.
- * It looks for a symbol in the symbol table with the same name. This
- * symbol must either be a keyword or a symbol of the type required by
- * symtyp (label, member, tag, ...).
- *
- * If it is a keyword, the token is returned. In some cases it is described
- * more deeply by data written to yylval.
- *
- * If it is a symbol, T_NAME is returned and the pointer to a sbuf struct
- * is stored in yylval. This struct contains the name of the symbol, it's
- * length and hash value. If there is already a symbol of the same name
- * and type in the symbol table, the sbuf struct also contains a pointer
- * to the symbol table entry.
- */
-static int
-name(void)
-{
- char *s;
- sbuf_t *sb;
- sym_t *sym;
- int tok;
-
- sb = allocsb();
- sb->sb_name = yytext;
- sb->sb_len = yyleng;
- sb->sb_hash = hash(yytext);
-
- if ((sym = search(sb)) != NULL && sym->s_keyw) {
- freesb(sb);
- return (keyw(sym));
- }
-
- sb->sb_sym = sym;
-
- if (sym != NULL) {
- if (blklev < sym->s_blklev)
- LERROR("name()");
- sb->sb_name = sym->s_name;
- sb->sb_len = strlen(sym->s_name);
- tok = sym->s_scl == TYPEDEF ? T_TYPENAME : T_NAME;
- } else {
- s = getblk(yyleng + 1);
- (void)memcpy(s, yytext, yyleng + 1);
- sb->sb_name = s;
- sb->sb_len = yyleng;
- tok = T_NAME;
- }
-
- yylval.y_sb = sb;
- return (tok);
-}
-
-static sym_t *
-search(sbuf_t *sb)
-{
- sym_t *sym;
-
- for (sym = symtab[sb->sb_hash]; sym != NULL; sym = sym->s_link) {
- if (strcmp(sym->s_name, sb->sb_name) == 0) {
- if (sym->s_keyw || sym->s_kind == symtyp)
- return (sym);
- }
- }
-
- return (NULL);
-}
-
-static int
-keyw(sym_t *sym)
-{
- int t;
-
- if ((t = (int)sym->s_value.v_quad) == T_SCLASS) {
- yylval.y_scl = sym->s_scl;
- } else if (t == T_TYPE || t == T_SOU) {
- yylval.y_tspec = sym->s_tspec;
- } else if (t == T_QUAL) {
- yylval.y_tqual = sym->s_tqual;
- }
- return (t);
-}
-
-/*
- * Convert a string representing an integer into internal representation.
- * The value is returned in yylval. icon() (and yylex()) returns T_CON.
- */
-static int
-icon(int base)
-{
- int l_suffix, u_suffix;
- int len;
- const char *cp;
- char c, *eptr;
- tspec_t typ;
- u_long ul = 0;
- uint64_t uq = 0;
- int ansiu;
- static tspec_t contypes[2][3] = {
- { INT, LONG, QUAD },
- { UINT, ULONG, UQUAD }
- };
-
- cp = yytext;
- len = yyleng;
-
- /* skip 0x */
- if (base == 16) {
- cp += 2;
- len -= 2;
- }
-
- /* read suffixes */
- l_suffix = u_suffix = 0;
- for ( ; ; ) {
- if ((c = cp[len - 1]) == 'l' || c == 'L') {
- l_suffix++;
- } else if (c == 'u' || c == 'U') {
- u_suffix++;
- } else {
- break;
- }
- len--;
- }
- if (l_suffix > 2 || u_suffix > 1) {
- /* malformed integer constant */
- warning(251);
- if (l_suffix > 2)
- l_suffix = 2;
- if (u_suffix > 1)
- u_suffix = 1;
- }
- if (tflag && u_suffix != 0) {
- /* suffix U is illegal in traditional C */
- warning(97);
- }
- typ = contypes[u_suffix][l_suffix];
-
- errno = 0;
- if (l_suffix < 2) {
- ul = strtoul(cp, &eptr, base);
- } else {
- uq = strtouq(cp, &eptr, base);
- }
- if (eptr != cp + len)
- LERROR("icon()");
- if (errno != 0)
- /* integer constant out of range */
- warning(252);
-
- /*
- * If the value is too big for the current type, we must choose
- * another type.
- */
- ansiu = 0;
- switch (typ) {
- case INT:
- if (ul <= INT_MAX) {
- /* ok */
- } else if (ul <= (unsigned)UINT_MAX && base != 10) {
- typ = UINT;
-#if INT_MAX != LONG_MAX
- } else if (ul <= LONG_MAX) {
- typ = LONG;
-#endif
- } else {
- typ = ULONG;
- }
- if (typ == UINT || typ == ULONG) {
- if (tflag) {
- typ = LONG;
- } else if (!sflag) {
- /*
- * Remember that the constant is unsigned
- * only in ANSI C
- */
- ansiu = 1;
- }
- }
- break;
- case UINT:
- if (ul > (u_int)UINT_MAX)
- typ = ULONG;
- break;
- case LONG:
- if (ul > LONG_MAX && !tflag) {
- typ = ULONG;
- if (!sflag)
- ansiu = 1;
- }
- break;
- case QUAD:
- if (uq > QUAD_MAX && !tflag) {
- typ = UQUAD;
- if (!sflag)
- ansiu = 1;
- }
- break;
- /* LINTED (enumeration values not handled in switch) */
- case STRUCT:
- case VOID:
- case LDOUBLE:
- case FUNC:
- case ARRAY:
- case PTR:
- case ENUM:
- case UNION:
- case SIGNED:
- case NOTSPEC:
- case DOUBLE:
- case FLOAT:
- case UQUAD:
- case ULONG:
- case USHORT:
- case SHORT:
- case UCHAR:
- case SCHAR:
- case CHAR:
- case UNSIGN:
- break;
- }
-
- if (typ != QUAD && typ != UQUAD) {
- if (isutyp(typ)) {
- uq = ul;
- } else {
- uq = (int64_t)(long)ul;
- }
- }
-
- uq = (uint64_t)xsign((int64_t)uq, typ, -1);
-
- if ((yylval.y_val = calloc(1, sizeof(val_t))) == NULL)
- nomem();
- yylval.y_val->v_tspec = typ;
- yylval.y_val->v_ansiu = ansiu;
- yylval.y_val->v_quad = (int64_t)uq;
-
- return (T_CON);
-}
-
-/*
- * Returns 1 if t is a signed type and the value is negative.
- *
- * len is the number of significant bits. If len is -1, len is set
- * to the width of type t.
- */
-int
-sign(int64_t q, tspec_t t, int len)
-{
-
- if (t == PTR || isutyp(t))
- return (0);
- return (msb(q, t, len));
-}
-
-int
-msb(int64_t q, tspec_t t, int len)
-{
-
- if (len <= 0)
- len = size(t);
- return ((q & qbmasks[len - 1]) != 0);
-}
-
-/*
- * Extends the sign of q.
- */
-int64_t
-xsign(int64_t q, tspec_t t, int len)
-{
-
- if (len <= 0)
- len = size(t);
-
- if (t == PTR || isutyp(t) || !sign(q, t, len)) {
- q &= qlmasks[len];
- } else {
- q |= qumasks[len];
- }
- return (q);
-}
-
-/*
- * Convert a string representing a floating point value into its interal
- * representation. Type and value are returned in yylval. fcon()
- * (and yylex()) returns T_CON.
- * XXX Currently it is not possible to convert constants of type
- * long double which are greater than DBL_MAX.
- */
-static int
-fcon(void)
-{
- const char *cp;
- int len;
- tspec_t typ;
- char c, *eptr;
- double d;
- float f = 0;
-
- cp = yytext;
- len = yyleng;
-
- if ((c = cp[len - 1]) == 'f' || c == 'F') {
- typ = FLOAT;
- len--;
- } else if (c == 'l' || c == 'L') {
- typ = LDOUBLE;
- len--;
- } else {
- typ = DOUBLE;
- }
-
- if (tflag && typ != DOUBLE) {
- /* suffixes F and L are illegal in traditional C */
- warning(98);
- }
-
- errno = 0;
- d = strtod(cp, &eptr);
- if (eptr != cp + len) {
- switch (*eptr) {
- /*
- * XXX: non-native non-current strtod() may not handle hex
- * floats, ignore the rest if we find traces of hex float
- * syntax...
- */
- case 'p':
- case 'P':
- case 'x':
- case 'X':
- d = 0;
- errno = 0;
- break;
- default:
- LERROR("fcon()");
- }
- }
- if (errno != 0)
- /* floating-point constant out of range */
- warning(248);
-
- if (typ == FLOAT) {
- f = (float)d;
- if (!finite(f)) {
- /* floating-point constant out of range */
- warning(248);
- f = f > 0 ? FLT_MAX : -FLT_MAX;
- }
- }
-
- if ((yylval.y_val = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- yylval.y_val->v_tspec = typ;
- if (typ == FLOAT) {
- yylval.y_val->v_ldbl = f;
- } else {
- yylval.y_val->v_ldbl = d;
- }
-
- return (T_CON);
-}
-
-static int
-operator(int t, op_t o)
-{
-
- yylval.y_op = o;
- return (t);
-}
-
-/*
- * Called if lex found a leading \'.
- */
-static int
-ccon(void)
-{
- int n, val, c;
- char cv;
-
- n = 0;
- val = 0;
- while ((c = getescc('\'')) >= 0) {
- val = (val << CHAR_BIT) + c;
- n++;
- }
- if (c == -2) {
- /* unterminated character constant */
- error(253);
- } else {
- if (n > sizeof (int) || (n > 1 && (pflag || hflag))) {
- /* too many characters in character constant */
- error(71);
- } else if (n > 1) {
- /* multi-character character constant */
- warning(294);
- } else if (n == 0) {
- /* empty character constant */
- error(73);
- }
- }
- if (n == 1) {
- cv = (char)val;
- val = cv;
- }
-
- yylval.y_val = xcalloc(1, sizeof (val_t));
- yylval.y_val->v_tspec = INT;
- yylval.y_val->v_quad = val;
-
- return (T_CON);
-}
-
-/*
- * Called if lex found a leading L\'
- */
-static int
-wccon(void)
-{
- static char buf[MB_LEN_MAX + 1];
- int i, c;
- wchar_t wc;
-
- i = 0;
- while ((c = getescc('\'')) >= 0) {
- if (i < MB_CUR_MAX)
- buf[i] = (char)c;
- i++;
- }
-
- wc = 0;
-
- if (c == -2) {
- /* unterminated character constant */
- error(253);
- } else if (c == 0) {
- /* empty character constant */
- error(73);
- } else {
- if (i > MB_CUR_MAX) {
- i = MB_CUR_MAX;
- /* too many characters in character constant */
- error(71);
- } else {
- buf[i] = '\0';
- (void)mbtowc(NULL, NULL, 0);
- if (mbtowc(&wc, buf, MB_CUR_MAX) < 0)
- /* invalid multibyte character */
- error(291);
- }
- }
-
- if ((yylval.y_val = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- yylval.y_val->v_tspec = WCHAR;
- yylval.y_val->v_quad = wc;
-
- return (T_CON);
-}
-
-/*
- * Read a character which is part of a character constant or of a string
- * and handle escapes.
- *
- * The Argument is the character which delimits the character constant or
- * string.
- *
- * Returns -1 if the end of the character constant or string is reached,
- * -2 if the EOF is reached, and the character otherwise.
- */
-static int
-getescc(int d)
-{
- static int pbc = -1;
- int n, c, v;
-
- if (pbc == -1) {
- c = inpc();
- } else {
- c = pbc;
- pbc = -1;
- }
- if (c == d)
- return (-1);
- switch (c) {
- case '\n':
- if (tflag) {
- /* newline in string or char constant */
- error(254);
- return (-2);
- }
- return (c);
- case EOF:
- return (-2);
- case '\\':
- switch (c = inpc()) {
- case '"':
- if (tflag && d == '\'')
- /* \" inside character constant undef. ... */
- warning(262);
- return ('"');
- case '\'':
- return ('\'');
- case '?':
- if (tflag)
- /* \? undefined in traditional C */
- warning(263);
- return ('?');
- case '\\':
- return ('\\');
- case 'a':
- if (tflag)
- /* \a undefined in traditional C */
- warning(81);
- return ('\a');
- case 'b':
- return ('\b');
- case 'f':
- return ('\f');
- case 'n':
- return ('\n');
- case 'r':
- return ('\r');
- case 't':
- return ('\t');
- case 'v':
- if (tflag)
- /* \v undefined in traditional C */
- warning(264);
- return ('\v');
- case '8': case '9':
- /* bad octal digit %c */
- warning(77, c);
- /* FALLTHROUGH */
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- n = 3;
- v = 0;
- do {
- v = (v << 3) + (c - '0');
- c = inpc();
- } while (--n && isdigit(c) && (tflag || c <= '7'));
- if (tflag && n > 0 && isdigit(c))
- /* bad octal digit %c */
- warning(77, c);
- pbc = c;
- if (v > UCHAR_MAX) {
- /* character escape does not fit in char. */
- warning(76);
- v &= CHAR_MASK;
- }
- return (v);
- case 'x':
- if (tflag)
- /* \x undefined in traditional C */
- warning(82);
- v = 0;
- n = 0;
- while ((c = inpc()) >= 0 && isxdigit(c)) {
- c = isdigit(c) ?
- c - '0' : toupper(c) - 'A' + 10;
- v = (v << 4) + c;
- if (n >= 0) {
- if ((v & ~CHAR_MASK) != 0) {
- /* overflow in hex escape */
- warning(75);
- n = -1;
- } else {
- n++;
- }
- }
- }
- pbc = c;
- if (n == 0) {
- /* no hex digits follow \x */
- error(74);
- } if (n == -1) {
- v &= CHAR_MASK;
- }
- return (v);
- case '\n':
- return (getescc(d));
- case EOF:
- return (-2);
- default:
- if (isprint(c)) {
- /* dubious escape \%c */
- warning(79, c);
- } else {
- /* dubious escape \%o */
- warning(80, c);
- }
- }
- }
- return (c);
-}
-
-/*
- * Called for preprocessor directives. Currently implemented are:
- * # lineno
- * # lineno "filename"
- */
-static void
-directive(void)
-{
- const char *cp, *fn;
- char c, *eptr;
- size_t fnl;
- long ln;
- static int first = 1;
-
- /* Go to first non-whitespace after # */
- for (cp = yytext + 1; (c = *cp) == ' ' || c == '\t'; cp++)
- continue;
-
- if (!isdigit((unsigned char)c)) {
- error:
- /* undefined or invalid # directive */
- warning(255);
- return;
- }
- ln = strtol(--cp, &eptr, 10);
- if (cp == eptr)
- goto error;
- if ((c = *(cp = eptr)) != ' ' && c != '\t' && c != '\0')
- goto error;
- while ((c = *cp++) == ' ' || c == '\t')
- continue;
- if (c != '\0') {
- if (c != '"')
- goto error;
- fn = cp;
- while ((c = *cp) != '"' && c != '\0')
- cp++;
- if (c != '"')
- goto error;
- if ((fnl = cp++ - fn) > PATH_MAX)
- goto error;
- while ((c = *cp++) == ' ' || c == '\t')
- continue;
-#if 0
- if (c != '\0')
- warning("extra character(s) after directive");
-#endif
-
- /* empty string means stdin */
- if (fnl == 0) {
- fn = "{standard input}";
- fnl = 16; /* strlen (fn) */
- }
- curr_pos.p_file = fnnalloc(fn, fnl);
- /*
- * If this is the first directive, the name is the name
- * of the C source file as specified at the command line.
- * It is written to the output file.
- */
- if (first) {
- csrc_pos.p_file = curr_pos.p_file;
- outsrc(curr_pos.p_file);
- first = 0;
- }
- }
- curr_pos.p_line = (int)ln - 1;
- curr_pos.p_uniq = 0;
- if (curr_pos.p_file == csrc_pos.p_file) {
- csrc_pos.p_line = (int)ln - 1;
- csrc_pos.p_uniq = 0;
- }
-}
-
-/*
- * Handle lint comments. Following comments are currently understood:
- * ARGSUSEDn
- * BITFIELDTYPE
- * CONSTCOND CONSTANTCOND CONSTANTCONDITION
- * FALLTHRU FALLTHROUGH
- * LINTLIBRARY
- * LINTED NOSTRICT
- * LONGLONG
- * NOTREACHED
- * PRINTFLIKEn
- * PROTOLIB
- * SCANFLIKEn
- * VARARGSn
- * If one of this comments is recognized, the arguments, if any, are
- * parsed and a function which handles this comment is called.
- */
-static void
-comment(void)
-{
- int c, lc;
- static struct {
- const char *keywd;
- int arg;
- void (*func)(int);
- } keywtab[] = {
- { "ARGSUSED", 1, argsused },
- { "BITFIELDTYPE", 0, bitfieldtype },
- { "CONSTCOND", 0, constcond },
- { "CONSTANTCOND", 0, constcond },
- { "CONSTANTCONDITION", 0, constcond },
- { "FALLTHRU", 0, fallthru },
- { "FALLTHROUGH", 0, fallthru },
- { "LINTLIBRARY", 0, lintlib },
- { "LINTED", 0, linted },
- { "LONGLONG", 0, longlong },
- { "NOSTRICT", 0, linted },
- { "NOTREACHED", 0, notreach },
- { "PRINTFLIKE", 1, printflike },
- { "PROTOLIB", 1, protolib },
- { "SCANFLIKE", 1, scanflike },
- { "VARARGS", 1, varargs },
- };
- char keywd[32];
- char arg[32];
- int l, i, a;
- int eoc;
-
- eoc = 0;
-
- /* Skip white spaces after the start of the comment */
- while ((c = inpc()) != EOF && isspace(c))
- continue;
-
- /* Read the potential keyword to keywd */
- l = 0;
- while (c != EOF && isupper(c) && l < sizeof (keywd) - 1) {
- keywd[l++] = (char)c;
- c = inpc();
- }
- keywd[l] = '\0';
-
- /* look for the keyword */
- for (i = 0; i < sizeof (keywtab) / sizeof (keywtab[0]); i++) {
- if (strcmp(keywtab[i].keywd, keywd) == 0)
- break;
- }
- if (i == sizeof (keywtab) / sizeof (keywtab[0]))
- goto skip_rest;
-
- /* skip white spaces after the keyword */
- while (c != EOF && isspace(c))
- c = inpc();
-
- /* read the argument, if the keyword accepts one and there is one */
- l = 0;
- if (keywtab[i].arg) {
- while (c != EOF && isdigit(c) && l < sizeof (arg) - 1) {
- arg[l++] = (char)c;
- c = inpc();
- }
- }
- arg[l] = '\0';
- a = l != 0 ? atoi(arg) : -1;
-
- /* skip white spaces after the argument */
- while (c != EOF && isspace(c))
- c = inpc();
-
- if (c != '*' || (c = inpc()) != '/') {
- if (keywtab[i].func != linted)
- /* extra characters in lint comment */
- warning(257);
- } else {
- /*
- * remember that we have already found the end of the
- * comment
- */
- eoc = 1;
- }
-
- if (keywtab[i].func != NULL)
- (*keywtab[i].func)(a);
-
- skip_rest:
- while (!eoc) {
- lc = c;
- if ((c = inpc()) == EOF) {
- /* unterminated comment */
- error(256);
- break;
- }
- if (lc == '*' && c == '/')
- eoc = 1;
- }
-}
-
-/*
- * Handle // style comments
- */
-static void
-slashslashcomment(void)
-{
- int c;
-
- if (!Sflag && !gflag)
- /* // comments only supported in C99 */
- (void)gnuism(312, tflag ? "traditional" : "ANSI");
-
- while ((c = inpc()) != EOF && c != '\n')
- continue;
-}
-
-/*
- * Clear flags for lint comments LINTED, LONGLONG and CONSTCOND.
- * clrwflgs() is called after function definitions and global and
- * local declarations and definitions. It is also called between
- * the controlling expression and the body of control statements
- * (if, switch, for, while).
- */
-void
-clrwflgs(void)
-{
-
- nowarn = 0;
- quadflg = 0;
- ccflg = 0;
-}
-
-/*
- * Strings are stored in a dynamically alloceted buffer and passed
- * in yylval.y_xstrg to the parser. The parser or the routines called
- * by the parser are responsible for freeing this buffer.
- */
-static int
-string(void)
-{
- u_char *s;
- int c;
- size_t len, max;
- strg_t *strg;
-
- if ((s = malloc(max = 64)) == NULL)
- nomem();
-
- len = 0;
- while ((c = getescc('"')) >= 0) {
- /* +1 to reserve space for a trailing NUL character */
- if (len + 1 == max)
- if ((s = realloc(s, max *= 2)) == NULL)
- nomem();
- s[len++] = (char)c;
- }
- s[len] = '\0';
- if (c == -2)
- /* unterminated string constant */
- error(258);
-
- if ((strg = calloc(1, sizeof (strg_t))) == NULL)
- nomem();
- strg->st_tspec = CHAR;
- strg->st_len = len;
- strg->st_cp = s;
-
- yylval.y_strg = strg;
- return (T_STRING);
-}
-
-static int
-wcstrg(void)
-{
- char *s;
- int c, i, n, wi;
- size_t len, max, wlen;
- wchar_t *ws;
- strg_t *strg;
-
- if ((s = malloc(max = 64)) == NULL)
- nomem();
- len = 0;
- while ((c = getescc('"')) >= 0) {
- /* +1 to save space for a trailing NUL character */
- if (len + 1 >= max)
- if ((s = realloc(s, max *= 2)) == NULL)
- nomem();
- s[len++] = (char)c;
- }
- s[len] = '\0';
- if (c == -2)
- /* unterminated string constant */
- error(258);
-
- /* get length of wide character string */
- (void)mblen(NULL, 0);
- for (i = 0, wlen = 0; i < len; i += n, wlen++) {
- if ((n = mblen(&s[i], MB_CUR_MAX)) == -1) {
- /* invalid multibyte character */
- error(291);
- break;
- }
- if (n == 0)
- n = 1;
- }
-
- if ((ws = malloc((wlen + 1) * sizeof (wchar_t))) == NULL)
- nomem();
-
- /* convert from multibyte to wide char */
- (void)mbtowc(NULL, NULL, 0);
- for (i = 0, wi = 0; i < len; i += n, wi++) {
- if ((n = mbtowc(&ws[wi], &s[i], MB_CUR_MAX)) == -1)
- break;
- if (n == 0)
- n = 1;
- }
- ws[wi] = 0;
- free(s);
-
- if ((strg = calloc(1, sizeof (strg_t))) == NULL)
- nomem();
- strg->st_tspec = WCHAR;
- strg->st_len = wlen;
- strg->st_wcp = ws;
-
- yylval.y_strg = strg;
- return (T_STRING);
-}
-
-/*
- * As noted above the scanner does not create new symbol table entries
- * for symbols it cannot find in the symbol table. This is to avoid
- * putting undeclared symbols into the symbol table if a syntax error
- * occurs.
- *
- * getsym() is called as soon as it is probably ok to put the symbol to
- * the symbol table. This does not mean that it is not possible that
- * symbols are put to the symbol table which are than not completely
- * declared due to syntax errors. To avoid too many problems in this
- * case symbols get type int in getsym().
- *
- * XXX calls to getsym() should be delayed until decl1*() is called
- */
-sym_t *
-getsym(sbuf_t *sb)
-{
- dinfo_t *di;
- char *s;
- sym_t *sym;
-
- sym = sb->sb_sym;
-
- /*
- * During member declaration it is possible that name() looked
- * for symbols of type FVFT, although it should have looked for
- * symbols of type FTAG. Same can happen for labels. Both cases
- * are compensated here.
- */
- if (symtyp == FMOS || symtyp == FLAB) {
- if (sym == NULL || sym->s_kind == FVFT)
- sym = search(sb);
- }
-
- if (sym != NULL) {
- if (sym->s_kind != symtyp)
- LERROR("storesym()");
- symtyp = FVFT;
- freesb(sb);
- return (sym);
- }
-
- /* create a new symbol table entry */
-
- /* labels must always be allocated at level 1 (outhermost block) */
- if (symtyp == FLAB) {
- sym = getlblk(1, sizeof (sym_t));
- s = getlblk(1, sb->sb_len + 1);
- (void)memcpy(s, sb->sb_name, sb->sb_len + 1);
- sym->s_name = s;
- sym->s_blklev = 1;
- di = dcs;
- while (di->d_nxt != NULL && di->d_nxt->d_nxt != NULL)
- di = di->d_nxt;
- if (di->d_ctx != AUTO)
- LERROR("storesym()");
- } else {
- sym = getblk(sizeof (sym_t));
- sym->s_name = sb->sb_name;
- sym->s_blklev = blklev;
- di = dcs;
- }
-
- UNIQUE_CURR_POS(sym->s_dpos);
- if ((sym->s_kind = symtyp) != FLAB)
- sym->s_type = gettyp(INT);
-
- symtyp = FVFT;
-
- if ((sym->s_link = symtab[sb->sb_hash]) != NULL)
- symtab[sb->sb_hash]->s_rlink = &sym->s_link;
- (symtab[sb->sb_hash] = sym)->s_rlink = &symtab[sb->sb_hash];
-
- *di->d_ldlsym = sym;
- di->d_ldlsym = &sym->s_dlnxt;
-
- freesb(sb);
- return (sym);
-}
-
-/*
- * Construct a temporary symbol. The symbol starts with a digit, so that
- * it is illegal.
- */
-sym_t *
-mktempsym(type_t *t)
-{
- static int n = 0;
- int h;
- char *s = getlblk(blklev, 64);
- sym_t *sym = getblk(sizeof (sym_t));
-
- (void)snprintf(s, 64, "%.8d_tmp", n++);
- h = hash(s);
-
- sym->s_name = s;
- sym->s_type = t;
- sym->s_blklev = blklev;
- sym->s_scl = AUTO;
- sym->s_kind = FVFT;
- sym->s_used = 1;
- sym->s_set = 1;
-
- if ((sym->s_link = symtab[h]) != NULL)
- symtab[h]->s_rlink = &sym->s_link;
- (symtab[h] = sym)->s_rlink = &symtab[h];
-
- *dcs->d_ldlsym = sym;
- dcs->d_ldlsym = &sym->s_dlnxt;
-
- return sym;
-}
-
-/*
- * Remove a symbol forever from the symbol table. s_blklev
- * is set to -1 to avoid that the symbol will later be put
- * back to the symbol table.
- */
-void
-rmsym(sym_t *sym)
-{
-
- if ((*sym->s_rlink = sym->s_link) != NULL)
- sym->s_link->s_rlink = sym->s_rlink;
- sym->s_blklev = -1;
- sym->s_link = NULL;
-}
-
-/*
- * Remove a list of symbols declared at one level from the symbol
- * table.
- */
-void
-rmsyms(sym_t *syms)
-{
- sym_t *sym;
-
- for (sym = syms; sym != NULL; sym = sym->s_dlnxt) {
- if (sym->s_blklev != -1) {
- if ((*sym->s_rlink = sym->s_link) != NULL)
- sym->s_link->s_rlink = sym->s_rlink;
- sym->s_link = NULL;
- sym->s_rlink = NULL;
- }
- }
-}
-
-/*
- * Put a symbol into the symbol table
- */
-void
-inssym(int bl, sym_t *sym)
-{
- int h;
-
- h = hash(sym->s_name);
- if ((sym->s_link = symtab[h]) != NULL)
- symtab[h]->s_rlink = &sym->s_link;
- (symtab[h] = sym)->s_rlink = &symtab[h];
- sym->s_blklev = bl;
- if (sym->s_link != NULL && sym->s_blklev < sym->s_link->s_blklev)
- LERROR("inssym()");
-}
-
-/*
- * Called at level 0 after syntax errors
- * Removes all symbols which are not declared at level 0 from the
- * symbol table. Also frees all memory which is not associated with
- * level 0.
- */
-void
-cleanup(void)
-{
- sym_t *sym, *nsym;
- int i;
-
- for (i = 0; i < HSHSIZ1; i++) {
- for (sym = symtab[i]; sym != NULL; sym = nsym) {
- nsym = sym->s_link;
- if (sym->s_blklev >= 1) {
- if ((*sym->s_rlink = nsym) != NULL)
- nsym->s_rlink = sym->s_rlink;
- }
- }
- }
-
- for (i = mblklev; i > 0; i--)
- freelblk(i);
-}
-
-/*
- * Create a new symbol with the name of an existing symbol.
- */
-sym_t *
-pushdown(sym_t *sym)
-{
- int h;
- sym_t *nsym;
-
- h = hash(sym->s_name);
- nsym = getblk(sizeof (sym_t));
- if (sym->s_blklev > blklev)
- LERROR("pushdown()");
- nsym->s_name = sym->s_name;
- UNIQUE_CURR_POS(nsym->s_dpos);
- nsym->s_kind = sym->s_kind;
- nsym->s_blklev = blklev;
-
- if ((nsym->s_link = symtab[h]) != NULL)
- symtab[h]->s_rlink = &nsym->s_link;
- (symtab[h] = nsym)->s_rlink = &symtab[h];
-
- *dcs->d_ldlsym = nsym;
- dcs->d_ldlsym = &nsym->s_dlnxt;
-
- return (nsym);
-}
-
-/*
- * Free any dynamically allocated memory referenced by
- * the value stack or yylval.
- * The type of information in yylval is described by tok.
- */
-void
-freeyyv(void *sp, int tok)
-{
- if (tok == T_NAME || tok == T_TYPENAME) {
- sbuf_t *sb = *(sbuf_t **)sp;
- freesb(sb);
- } else if (tok == T_CON) {
- val_t *val = *(val_t **)sp;
- free(val);
- } else if (tok == T_STRING) {
- strg_t *strg = *(strg_t **)sp;
- if (strg->st_tspec == CHAR) {
- free(strg->st_cp);
- } else if (strg->st_tspec == WCHAR) {
- free(strg->st_wcp);
- } else {
- LERROR("fryylv()");
- }
- free(strg);
- }
-}
Index: usr.bin/xlint/lint1/tree.c
===================================================================
--- usr.bin/xlint/lint1/tree.c
+++ /dev/null
@@ -1,4040 +0,0 @@
-/* $NetBSD: tree.c,v 1.45 2008/03/04 02:41:46 christos Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.45 2008/03/04 02:41:46 christos Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdlib.h>
-#include <string.h>
-#include <float.h>
-#include <limits.h>
-#include <math.h>
-
-#include "lint1.h"
-#include "cgram.h"
-
-/* Various flags for each operator. */
-static mod_t modtab[NOPS];
-
-static tnode_t *getinode(tspec_t, int64_t);
-static void ptrcmpok(op_t, tnode_t *, tnode_t *);
-static int asgntypok(op_t, int, tnode_t *, tnode_t *);
-static void chkbeop(op_t, tnode_t *, tnode_t *);
-static void chkeop2(op_t, int, tnode_t *, tnode_t *);
-static void chkeop1(op_t, int, tnode_t *, tnode_t *);
-static tnode_t *mktnode(op_t, type_t *, tnode_t *, tnode_t *);
-static void balance(op_t, tnode_t **, tnode_t **);
-static void incompat(op_t, tspec_t, tspec_t);
-static void illptrc(mod_t *, type_t *, type_t *);
-static void mrgqual(type_t **, type_t *, type_t *);
-static int conmemb(type_t *);
-static void ptconv(int, tspec_t, tspec_t, type_t *, tnode_t *);
-static void iiconv(op_t, int, tspec_t, tspec_t, type_t *, tnode_t *);
-static void piconv(op_t, tspec_t, type_t *, tnode_t *);
-static void ppconv(op_t, tnode_t *, type_t *);
-static tnode_t *bldstr(op_t, tnode_t *, tnode_t *);
-static tnode_t *bldincdec(op_t, tnode_t *);
-static tnode_t *bldamper(tnode_t *, int);
-static tnode_t *bldplmi(op_t, tnode_t *, tnode_t *);
-static tnode_t *bldshft(op_t, tnode_t *, tnode_t *);
-static tnode_t *bldcol(tnode_t *, tnode_t *);
-static tnode_t *bldasgn(op_t, tnode_t *, tnode_t *);
-static tnode_t *plength(type_t *);
-static tnode_t *fold(tnode_t *);
-static tnode_t *foldtst(tnode_t *);
-static tnode_t *foldflt(tnode_t *);
-static tnode_t *chkfarg(type_t *, tnode_t *);
-static tnode_t *parg(int, type_t *, tnode_t *);
-static void nulleff(tnode_t *);
-static void displexpr(tnode_t *, int);
-static void chkaidx(tnode_t *, int);
-static void chkcomp(op_t, tnode_t *, tnode_t *);
-static void precconf(tnode_t *);
-
-/*
- * Initialize mods of operators.
- */
-void
-initmtab(void)
-{
- static struct {
- op_t op;
- mod_t m;
- } imods[] = {
- { ARROW, { 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
- "->" } },
- { POINT, { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "." } },
- { NOT, { 0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,
- "!" } },
- { COMPL, { 0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,
- "~" } },
- { INCBEF, { 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "prefix++" } },
- { DECBEF, { 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "prefix--" } },
- { INCAFT, { 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "postfix++" } },
- { DECAFT, { 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "postfix--" } },
- { UPLUS, { 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,
- "unary +" } },
- { UMINUS, { 0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,1,
- "unary -" } },
- { STAR, { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
- "unary *" } },
- { AMPER, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "unary &" } },
- { MULT, { 1,0,0,0,1,1,1,0,1,0,0,1,0,0,0,1,1,
- "*" } },
- { DIV, { 1,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,1,
- "/" } },
- { MOD, { 1,0,1,0,0,1,1,0,1,0,1,1,0,0,0,1,1,
- "%" } },
- { PLUS, { 1,0,0,1,0,1,1,0,1,0,0,0,0,0,0,1,0,
- "+" } },
- { MINUS, { 1,0,0,1,0,1,1,0,1,0,0,0,0,0,0,1,0,
- "-" } },
- { SHL, { 1,0,1,0,0,1,1,0,0,0,0,0,1,0,0,1,1,
- "<<" } },
- { SHR, { 1,0,1,0,0,1,1,0,0,0,1,0,1,0,0,1,1,
- ">>" } },
- { LT, { 1,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,
- "<" } },
- { LE, { 1,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,
- "<=" } },
- { GT, { 1,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,
- ">" } },
- { GE, { 1,1,0,1,0,1,1,0,1,0,1,1,0,1,1,0,1,
- ">=" } },
- { EQ, { 1,1,0,1,0,1,1,0,1,0,0,0,0,1,1,0,1,
- "==" } },
- { NE, { 1,1,0,1,0,1,1,0,1,0,0,0,0,1,1,0,1,
- "!=" } },
- { AND, { 1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,
- "&" } },
- { XOR, { 1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,
- "^" } },
- { OR, { 1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,
- "|" } },
- { LOGAND, { 1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,
- "&&" } },
- { LOGOR, { 1,1,0,1,0,1,0,1,0,0,0,0,1,0,0,1,0,
- "||" } },
- { QUEST, { 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,
- "?" } },
- { COLON, { 1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,
- ":" } },
- { ASSIGN, { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,
- "=" } },
- { MULASS, { 1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,
- "*=" } },
- { DIVASS, { 1,0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,
- "/=" } },
- { MODASS, { 1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1,0,
- "%=" } },
- { ADDASS, { 1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "+=" } },
- { SUBASS, { 1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "-=" } },
- { SHLASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "<<=" } },
- { SHRASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- ">>=" } },
- { ANDASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "&=" } },
- { XORASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "^=" } },
- { ORASS, { 1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,
- "|=" } },
- { NAME, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "NAME" } },
- { CON, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "CON" } },
- { STRING, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "STRING" } },
- { FSEL, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "FSEL" } },
- { CALL, { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
- "CALL" } },
- { COMMA, { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
- "," } },
- { CVT, { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
- "CVT" } },
- { ICALL, { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
- "ICALL" } },
- { LOAD, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
- "LOAD" } },
- { PUSH, { 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
- "PUSH" } },
- { RETURN, { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,
- "RETURN" } },
- { INIT, { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
- "INIT" } },
- { FARG, { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,
- "FARG" } },
- { NOOP }
- };
- int i;
-
- for (i = 0; imods[i].op != NOOP; i++)
- STRUCT_ASSIGN(modtab[imods[i].op], imods[i].m);
-}
-
-/*
- * Increase degree of reference.
- * This is most often used to change type "T" in type "pointer to T".
- */
-type_t *
-incref(type_t *tp, tspec_t t)
-{
- type_t *tp2;
-
- tp2 = getblk(sizeof (type_t));
- tp2->t_tspec = t;
- tp2->t_subt = tp;
- return (tp2);
-}
-
-/*
- * same for use in expressions
- */
-type_t *
-tincref(type_t *tp, tspec_t t)
-{
- type_t *tp2;
-
- tp2 = tgetblk(sizeof (type_t));
- tp2->t_tspec = t;
- tp2->t_subt = tp;
- return (tp2);
-}
-
-/*
- * Create a node for a constant.
- */
-tnode_t *
-getcnode(type_t *tp, val_t *v)
-{
- tnode_t *n;
-
- n = getnode();
- n->tn_op = CON;
- n->tn_type = tp;
- n->tn_val = tgetblk(sizeof (val_t));
- n->tn_val->v_tspec = tp->t_tspec;
- n->tn_val->v_ansiu = v->v_ansiu;
- n->tn_val->v_u = v->v_u;
- free(v);
- return (n);
-}
-
-/*
- * Create a node for an integer constant.
- */
-static tnode_t *
-getinode(tspec_t t, int64_t q)
-{
- tnode_t *n;
-
- n = getnode();
- n->tn_op = CON;
- n->tn_type = gettyp(t);
- n->tn_val = tgetblk(sizeof (val_t));
- n->tn_val->v_tspec = t;
- n->tn_val->v_quad = q;
- return (n);
-}
-
-/*
- * Create a node for a name (symbol table entry).
- * ntok is the token which follows the name.
- */
-tnode_t *
-getnnode(sym_t *sym, int ntok)
-{
- tnode_t *n;
-
- if (sym->s_scl == NOSCL) {
- sym->s_scl = EXTERN;
- sym->s_def = DECL;
- if (ntok == T_LPARN) {
- if (sflag) {
- /* function implicitly declared to ... */
- warning(215);
- }
- /*
- * XXX if tflag is set the symbol should be
- * exported to level 0
- */
- sym->s_type = incref(sym->s_type, FUNC);
- } else {
- if (!blklev) {
- /* %s undefined */
- error(99, sym->s_name);
- } else {
- int fixtype;
- if (strcmp(sym->s_name, "__FUNCTION__") == 0) {
- gnuism(316);
- fixtype = 1;
- } else if (strcmp(sym->s_name, "__func__") == 0) {
- if (!Sflag)
- warning(317);
- fixtype = 1;
- } else {
- error(99, sym->s_name);
- fixtype = 0;
- }
- if (fixtype) {
- sym->s_type = incref(gettyp(CHAR), PTR);
- sym->s_type->t_const = 1;
- }
- }
- }
- }
-
- if (sym->s_kind != FVFT && sym->s_kind != FMOS)
- LERROR("getnnode()");
-
- n = getnode();
- n->tn_type = sym->s_type;
- if (sym->s_scl != ENUMCON) {
- n->tn_op = NAME;
- n->tn_sym = sym;
- if (sym->s_kind == FVFT && sym->s_type->t_tspec != FUNC)
- n->tn_lvalue = 1;
- } else {
- n->tn_op = CON;
- n->tn_val = tgetblk(sizeof (val_t));
- *n->tn_val = sym->s_value;
- }
-
- return (n);
-}
-
-/*
- * Create a node for a string.
- */
-tnode_t *
-getsnode(strg_t *strg)
-{
- size_t len;
- tnode_t *n;
-
- len = strg->st_len;
-
- n = getnode();
-
- n->tn_op = STRING;
- n->tn_type = tincref(gettyp(strg->st_tspec), ARRAY);
- n->tn_type->t_dim = len + 1;
- n->tn_lvalue = 1;
-
- n->tn_strg = tgetblk(sizeof (strg_t));
- n->tn_strg->st_tspec = strg->st_tspec;
- n->tn_strg->st_len = len;
-
- if (strg->st_tspec == CHAR) {
- n->tn_strg->st_cp = tgetblk(len + 1);
- (void)memcpy(n->tn_strg->st_cp, strg->st_cp, len + 1);
- free(strg->st_cp);
- } else {
- n->tn_strg->st_wcp = tgetblk((len + 1) * sizeof (wchar_t));
- (void)memcpy(n->tn_strg->st_wcp, strg->st_wcp,
- (len + 1) * sizeof (wchar_t));
- free(strg->st_wcp);
- }
- free(strg);
-
- return (n);
-}
-
-/*
- * Returns a symbol which has the same name as the msym argument and is a
- * member of the struct or union specified by the tn argument.
- */
-sym_t *
-strmemb(tnode_t *tn, op_t op, sym_t *msym)
-{
- str_t *str;
- type_t *tp;
- sym_t *sym, *csym;
- int eq;
- tspec_t t;
-
- /*
- * Remove the member if it was unknown until now (Which means
- * that no defined struct or union has a member with the same name).
- */
- if (msym->s_scl == NOSCL) {
- /* undefined struct/union member: %s */
- fprintf(stderr, "3. %s\n", msym->s_name);
- error(101, msym->s_name);
- rmsym(msym);
- msym->s_kind = FMOS;
- msym->s_scl = MOS;
- msym->s_styp = tgetblk(sizeof (str_t));
- msym->s_styp->stag = tgetblk(sizeof (sym_t));
- msym->s_styp->stag->s_name = unnamed;
- msym->s_value.v_tspec = INT;
- return (msym);
- }
-
- /* Set str to the tag of which msym is expected to be a member. */
- str = NULL;
- t = (tp = tn->tn_type)->t_tspec;
- if (op == POINT) {
- if (t == STRUCT || t == UNION)
- str = tp->t_str;
- } else if (op == ARROW && t == PTR) {
- t = (tp = tp->t_subt)->t_tspec;
- if (t == STRUCT || t == UNION)
- str = tp->t_str;
- }
-
- /*
- * If this struct/union has a member with the name of msym, return
- * return this it.
- */
- if (str != NULL) {
- for (sym = msym; sym != NULL; sym = sym->s_link) {
- if (sym->s_scl != MOS && sym->s_scl != MOU)
- continue;
- if (sym->s_styp != str)
- continue;
- if (strcmp(sym->s_name, msym->s_name) != 0)
- continue;
- return (sym);
- }
- }
-
- /*
- * Set eq to 0 if there are struct/union members with the same name
- * and different types and/or offsets.
- */
- eq = 1;
- for (csym = msym; csym != NULL; csym = csym->s_link) {
- if (csym->s_scl != MOS && csym->s_scl != MOU)
- continue;
- if (strcmp(msym->s_name, csym->s_name) != 0)
- continue;
- for (sym = csym->s_link ; sym != NULL; sym = sym->s_link) {
- int w;
-
- if (sym->s_scl != MOS && sym->s_scl != MOU)
- continue;
- if (strcmp(csym->s_name, sym->s_name) != 0)
- continue;
- if (csym->s_value.v_quad != sym->s_value.v_quad) {
- eq = 0;
- break;
- }
- w = 0;
- eq = eqtype(csym->s_type, sym->s_type, 0, 0, &w) && !w;
- if (!eq)
- break;
- if (csym->s_field != sym->s_field) {
- eq = 0;
- break;
- }
- if (csym->s_field) {
- type_t *tp1, *tp2;
-
- tp1 = csym->s_type;
- tp2 = sym->s_type;
- if (tp1->t_flen != tp2->t_flen) {
- eq = 0;
- break;
- }
- if (tp1->t_foffs != tp2->t_foffs) {
- eq = 0;
- break;
- }
- }
- }
- if (!eq)
- break;
- }
-
- /*
- * Now handle the case in which the left operand refers really
- * to a struct/union, but the right operand is not member of it.
- */
- if (str != NULL) {
- /* illegal member use: %s */
- if (eq && tflag) {
- warning(102, msym->s_name);
- } else {
- error(102, msym->s_name);
- }
- return (msym);
- }
-
- /*
- * Now the left operand of ARROW does not point to a struct/union
- * or the left operand of POINT is no struct/union.
- */
- if (eq) {
- if (op == POINT) {
- /* left operand of "." must be struct/union object */
- if (tflag) {
- warning(103);
- } else {
- error(103);
- }
- } else {
- /* left operand of "->" must be pointer to ... */
- if (tflag && tn->tn_type->t_tspec == PTR) {
- warning(104);
- } else {
- error(104);
- }
- }
- } else {
- if (tflag) {
- /* non-unique member requires struct/union %s */
- error(105, op == POINT ? "object" : "pointer");
- } else {
- /* unacceptable operand of %s */
- error(111, modtab[op].m_name);
- }
- }
-
- return (msym);
-}
-
-/*
- * Create a tree node. Called for most operands except function calls,
- * sizeof and casts.
- *
- * op operator
- * ln left operand
- * rn if not NULL, right operand
- */
-tnode_t *
-build(op_t op, tnode_t *ln, tnode_t *rn)
-{
- mod_t *mp;
- tnode_t *ntn;
- type_t *rtp;
-
- mp = &modtab[op];
-
- /* If there was an error in one of the operands, return. */
- if (ln == NULL || (mp->m_binary && rn == NULL))
- return (NULL);
-
- /*
- * Apply class conversions to the left operand, but only if its
- * value is needed or it is compared with null.
- */
- if (mp->m_vctx || mp->m_tctx)
- ln = cconv(ln);
- /*
- * The right operand is almost always in a test or value context,
- * except if it is a struct or union member.
- */
- if (mp->m_binary && op != ARROW && op != POINT)
- rn = cconv(rn);
-
- /*
- * Print some warnings for comparisons of unsigned values with
- * constants lower than or equal to null. This must be done
- * before promote() because otherwise unsigned char and unsigned
- * short would be promoted to int. Also types are tested to be
- * CHAR, which would also become int.
- */
- if (mp->m_comp)
- chkcomp(op, ln, rn);
-
- /*
- * Promote the left operand if it is in a test or value context
- */
- if (mp->m_vctx || mp->m_tctx)
- ln = promote(op, 0, ln);
- /*
- * Promote the right operand, but only if it is no struct or
- * union member, or if it is not to be assigned to the left operand
- */
- if (mp->m_binary && op != ARROW && op != POINT &&
- op != ASSIGN && op != RETURN) {
- rn = promote(op, 0, rn);
- }
-
- /*
- * If the result of the operation is different for signed or
- * unsigned operands and one of the operands is signed only in
- * ANSI C, print a warning.
- */
- if (mp->m_tlansiu && ln->tn_op == CON && ln->tn_val->v_ansiu) {
- /* ANSI C treats constant as unsigned, op %s */
- warning(218, mp->m_name);
- ln->tn_val->v_ansiu = 0;
- }
- if (mp->m_transiu && rn->tn_op == CON && rn->tn_val->v_ansiu) {
- /* ANSI C treats constant as unsigned, op %s */
- warning(218, mp->m_name);
- rn->tn_val->v_ansiu = 0;
- }
-
- /* Make sure both operands are of the same type */
- if (mp->m_balance || (tflag && (op == SHL || op == SHR)))
- balance(op, &ln, &rn);
-
- /*
- * Check types for compatibility with the operation and mutual
- * compatibility. Return if there are serious problems.
- */
- if (!typeok(op, 0, ln, rn))
- return (NULL);
-
- /* And now create the node. */
- switch (op) {
- case POINT:
- case ARROW:
- ntn = bldstr(op, ln, rn);
- break;
- case INCAFT:
- case DECAFT:
- case INCBEF:
- case DECBEF:
- ntn = bldincdec(op, ln);
- break;
- case AMPER:
- ntn = bldamper(ln, 0);
- break;
- case STAR:
- ntn = mktnode(STAR, ln->tn_type->t_subt, ln, NULL);
- break;
- case PLUS:
- case MINUS:
- ntn = bldplmi(op, ln, rn);
- break;
- case SHL:
- case SHR:
- ntn = bldshft(op, ln, rn);
- break;
- case COLON:
- ntn = bldcol(ln, rn);
- break;
- case ASSIGN:
- case MULASS:
- case DIVASS:
- case MODASS:
- case ADDASS:
- case SUBASS:
- case SHLASS:
- case SHRASS:
- case ANDASS:
- case XORASS:
- case ORASS:
- case RETURN:
- ntn = bldasgn(op, ln, rn);
- break;
- case COMMA:
- case QUEST:
- ntn = mktnode(op, rn->tn_type, ln, rn);
- break;
- default:
- rtp = mp->m_logop ? gettyp(INT) : ln->tn_type;
- if (!mp->m_binary && rn != NULL)
- LERROR("build()");
- ntn = mktnode(op, rtp, ln, rn);
- break;
- }
-
- /* Return if an error occurred. */
- if (ntn == NULL)
- return (NULL);
-
- /* Print a warning if precedence confusion is possible */
- if (mp->m_tpconf)
- precconf(ntn);
-
- /*
- * Print a warning if one of the operands is in a context where
- * it is compared with null and if this operand is a constant.
- */
- if (mp->m_tctx) {
- if (ln->tn_op == CON ||
- ((mp->m_binary && op != QUEST) && rn->tn_op == CON)) {
- if (hflag && !ccflg)
- /* constant in conditional context */
- warning(161);
- }
- }
-
- /* Fold if the operator requires it */
- if (mp->m_fold) {
- if (ln->tn_op == CON && (!mp->m_binary || rn->tn_op == CON)) {
- if (mp->m_tctx) {
- ntn = foldtst(ntn);
- } else if (isftyp(ntn->tn_type->t_tspec)) {
- ntn = foldflt(ntn);
- } else {
- ntn = fold(ntn);
- }
- } else if (op == QUEST && ln->tn_op == CON) {
- ntn = ln->tn_val->v_quad ? rn->tn_left : rn->tn_right;
- }
- }
-
- return (ntn);
-}
-
-/*
- * Perform class conversions.
- *
- * Arrays of type T are converted into pointers to type T.
- * Functions are converted to pointers to functions.
- * Lvalues are converted to rvalues.
- */
-tnode_t *
-cconv(tnode_t *tn)
-{
- type_t *tp;
-
- /*
- * Array-lvalue (array of type T) is converted into rvalue
- * (pointer to type T)
- */
- if (tn->tn_type->t_tspec == ARRAY) {
- if (!tn->tn_lvalue) {
- /* operand of '%s' must be lvalue */
- /* XXX print correct operator */
- (void)gnuism(114, "", modtab[AMPER].m_name);
- }
- tn = mktnode(AMPER, tincref(tn->tn_type->t_subt, PTR),
- tn, NULL);
- }
-
- /*
- * Expression of type function (function with return value of type T)
- * in rvalue-expression (pointer to function with return value
- * of type T)
- */
- if (tn->tn_type->t_tspec == FUNC)
- tn = bldamper(tn, 1);
-
- /* lvalue to rvalue */
- if (tn->tn_lvalue) {
- tp = tduptyp(tn->tn_type);
- tp->t_const = tp->t_volatile = 0;
- tn = mktnode(LOAD, tp, tn, NULL);
- }
-
- return (tn);
-}
-
-/*
- * Perform most type checks. First the types are checked using
- * information from modtab[]. After that it is done by hand for
- * more complicated operators and type combinations.
- *
- * If the types are ok, typeok() returns 1, otherwise 0.
- */
-int
-typeok(op_t op, int arg, tnode_t *ln, tnode_t *rn)
-{
- mod_t *mp;
- tspec_t lt, rt = NOTSPEC, lst = NOTSPEC, rst = NOTSPEC, olt = NOTSPEC,
- ort = NOTSPEC;
- type_t *ltp, *rtp = NULL, *lstp = NULL, *rstp = NULL;
- tnode_t *tn;
-
- mp = &modtab[op];
-
- if ((ltp = ln->tn_type) == NULL)
- LERROR("typeok()");
-
- if ((lt = ltp->t_tspec) == PTR)
- lst = (lstp = ltp->t_subt)->t_tspec;
- if (mp->m_binary) {
- if ((rtp = rn->tn_type) == NULL)
- LERROR("typeok()");
- if ((rt = rtp->t_tspec) == PTR)
- rst = (rstp = rtp->t_subt)->t_tspec;
- }
-
- if (mp->m_rqint) {
- /* integer types required */
- if (!isityp(lt) || (mp->m_binary && !isityp(rt))) {
- incompat(op, lt, rt);
- return (0);
- }
- } else if (mp->m_rqsclt) {
- /* scalar types required */
- if (!issclt(lt) || (mp->m_binary && !issclt(rt))) {
- incompat(op, lt, rt);
- return (0);
- }
- } else if (mp->m_rqatyp) {
- /* arithmetic types required */
- if (!isatyp(lt) || (mp->m_binary && !isatyp(rt))) {
- incompat(op, lt, rt);
- return (0);
- }
- }
-
- if (op == SHL || op == SHR || op == SHLASS || op == SHRASS) {
- /*
- * For these operations we need the types before promotion
- * and balancing.
- */
- for (tn=ln; tn->tn_op==CVT && !tn->tn_cast; tn=tn->tn_left)
- continue;
- olt = tn->tn_type->t_tspec;
- for (tn=rn; tn->tn_op==CVT && !tn->tn_cast; tn=tn->tn_left)
- continue;
- ort = tn->tn_type->t_tspec;
- }
-
- switch (op) {
- case POINT:
- /*
- * Most errors required by ANSI C are reported in strmemb().
- * Here we only must check for totally wrong things.
- */
- if (lt == FUNC || lt == VOID || ltp->t_isfield ||
- ((lt != STRUCT && lt != UNION) && !ln->tn_lvalue)) {
- /* Without tflag we already got an error */
- if (tflag)
- /* unacceptable operand of %s */
- error(111, mp->m_name);
- return (0);
- }
- /* Now we have an object we can create a pointer to */
- break;
- case ARROW:
- if (lt != PTR && !(tflag && isityp(lt))) {
- /* Without tflag we got already an error */
- if (tflag)
- /* unacceptable operand of %s */
- error(111, mp->m_name);
- return (0);
- }
- break;
- case INCAFT:
- case DECAFT:
- case INCBEF:
- case DECBEF:
- /* operands have scalar types (checked above) */
- if (!ln->tn_lvalue) {
- if (ln->tn_op == CVT && ln->tn_cast &&
- ln->tn_left->tn_op == LOAD) {
- /* a cast does not yield an lvalue */
- error(163);
- }
- /* operand of %s must be lvalue */
- error(114, "", mp->m_name);
- return (0);
- } else if (ltp->t_const) {
- /* operand of %s must be modifiable lvalue */
- if (!tflag)
- warning(115, "", mp->m_name);
- }
- break;
- case AMPER:
- if (lt == ARRAY || lt == FUNC) {
- /* ok, a warning comes later (in bldamper()) */
- } else if (!ln->tn_lvalue) {
- if (ln->tn_op == CVT && ln->tn_cast &&
- ln->tn_left->tn_op == LOAD) {
- /* a cast does not yield an lvalue */
- error(163);
- }
- /* %soperand of %s must be lvalue */
- error(114, "", mp->m_name);
- return (0);
- } else if (issclt(lt)) {
- if (ltp->t_isfield) {
- /* cannot take address of bit-field */
- error(112);
- return (0);
- }
- } else if (lt != STRUCT && lt != UNION) {
- /* unacceptable operand of %s */
- error(111, mp->m_name);
- return (0);
- }
- if (ln->tn_op == NAME && ln->tn_sym->s_reg) {
- /* cannot take address of register %s */
- error(113, ln->tn_sym->s_name);
- return (0);
- }
- break;
- case STAR:
- /* until now there were no type checks for this operator */
- if (lt != PTR) {
- /* cannot dereference non-pointer type */
- error(96);
- return (0);
- }
- break;
- case PLUS:
- /* operands have scalar types (checked above) */
- if ((lt == PTR && !isityp(rt)) || (rt == PTR && !isityp(lt))) {
- incompat(op, lt, rt);
- return (0);
- }
- break;
- case MINUS:
- /* operands have scalar types (checked above) */
- if (lt == PTR && (!isityp(rt) && rt != PTR)) {
- incompat(op, lt, rt);
- return (0);
- } else if (rt == PTR && lt != PTR) {
- incompat(op, lt, rt);
- return (0);
- }
- if (lt == PTR && rt == PTR) {
- if (!eqtype(lstp, rstp, 1, 0, NULL)) {
- /* illegal pointer subtraction */
- error(116);
- }
- }
- break;
- case SHR:
- /* operands have integer types (checked above) */
- if (pflag && !isutyp(lt)) {
- /*
- * The left operand is signed. This means that
- * the operation is (possibly) nonportable.
- */
- /* bitwise operation on signed value nonportable */
- if (ln->tn_op != CON) {
- /* possibly nonportable */
- warning(117);
- } else if (ln->tn_val->v_quad < 0) {
- warning(120);
- }
- } else if (!tflag && !sflag && !isutyp(olt) && isutyp(ort)) {
- /*
- * The left operand would become unsigned in
- * traditional C.
- */
- if (hflag &&
- (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
- /* semantics of %s change in ANSI C; use ... */
- warning(118, mp->m_name);
- }
- } else if (!tflag && !sflag && !isutyp(olt) && !isutyp(ort) &&
- psize(lt) < psize(rt)) {
- /*
- * In traditional C the left operand would be extended,
- * possibly with 1, and then shifted.
- */
- if (hflag &&
- (ln->tn_op != CON || ln->tn_val->v_quad < 0)) {
- /* semantics of %s change in ANSI C; use ... */
- warning(118, mp->m_name);
- }
- }
- goto shift;
- case SHL:
- /*
- * ANSI C does not perform balancing for shift operations,
- * but traditional C does. If the width of the right operand
- * is greather than the width of the left operand, than in
- * traditional C the left operand would be extendet to the
- * width of the right operand. For SHL this may result in
- * different results.
- */
- if (psize(lt) < psize(rt)) {
- /*
- * XXX If both operands are constant make sure
- * that there is really a differencs between
- * ANSI C and traditional C.
- */
- if (hflag)
- /* semantics of %s change in ANSI C; use ... */
- warning(118, mp->m_name);
- }
- shift:
- if (rn->tn_op == CON) {
- if (!isutyp(rt) && rn->tn_val->v_quad < 0) {
- /* negative shift */
- warning(121);
- } else if ((uint64_t)rn->tn_val->v_quad == size(lt)) {
- /* shift equal to size fo object */
- warning(267);
- } else if ((uint64_t)rn->tn_val->v_quad > size(lt)) {
- /* shift greater than size of object */
- warning(122);
- }
- }
- break;
- case EQ:
- case NE:
- /*
- * Accept some things which are allowed with EQ and NE,
- * but not with ordered comparisons.
- */
- if (lt == PTR && ((rt == PTR && rst == VOID) || isityp(rt))) {
- if (rn->tn_op == CON && rn->tn_val->v_quad == 0)
- break;
- }
- if (rt == PTR && ((lt == PTR && lst == VOID) || isityp(lt))) {
- if (ln->tn_op == CON && ln->tn_val->v_quad == 0)
- break;
- }
- /* FALLTHROUGH */
- case LT:
- case GT:
- case LE:
- case GE:
- if ((lt == PTR || rt == PTR) && lt != rt) {
- if (isityp(lt) || isityp(rt)) {
- /* illegal comb. of pointer and int., op %s */
- warning(123, mp->m_name);
- } else {
- incompat(op, lt, rt);
- return (0);
- }
- } else if (lt == PTR && rt == PTR) {
- ptrcmpok(op, ln, rn);
- }
- break;
- case QUEST:
- if (!issclt(lt)) {
- /* first operand must have scalar type, op ? : */
- error(170);
- return (0);
- }
- while (rn->tn_op == CVT)
- rn = rn->tn_left;
- if (rn->tn_op != COLON)
- LERROR("typeok()");
- break;
- case COLON:
-
- if (isatyp(lt) && isatyp(rt))
- break;
-
- if (lt == STRUCT && rt == STRUCT && ltp->t_str == rtp->t_str)
- break;
- if (lt == UNION && rt == UNION && ltp->t_str == rtp->t_str)
- break;
-
- /* combination of any pointer and 0, 0L or (void *)0 is ok */
- if (lt == PTR && ((rt == PTR && rst == VOID) || isityp(rt))) {
- if (rn->tn_op == CON && rn->tn_val->v_quad == 0)
- break;
- }
- if (rt == PTR && ((lt == PTR && lst == VOID) || isityp(lt))) {
- if (ln->tn_op == CON && ln->tn_val->v_quad == 0)
- break;
- }
-
- if ((lt == PTR && isityp(rt)) || (isityp(lt) && rt == PTR)) {
- /* illegal comb. of ptr. and int., op %s */
- warning(123, mp->m_name);
- break;
- }
-
- if (lt == VOID || rt == VOID) {
- if (lt != VOID || rt != VOID)
- /* incompatible types in conditional */
- warning(126);
- break;
- }
-
- if (lt == PTR && rt == PTR && ((lst == VOID && rst == FUNC) ||
- (lst == FUNC && rst == VOID))) {
- /* (void *)0 handled above */
- if (sflag)
- /* ANSI C forbids conv. of %s to %s, op %s */
- warning(305, "function pointer", "'void *'",
- mp->m_name);
- break;
- }
-
- if (rt == PTR && lt == PTR) {
- if (!eqtype(lstp, rstp, 1, 0, NULL))
- illptrc(mp, ltp, rtp);
- break;
- }
-
- /* incompatible types in conditional */
- error(126);
- return (0);
-
- case ASSIGN:
- case INIT:
- case FARG:
- case RETURN:
- if (!asgntypok(op, arg, ln, rn))
- return (0);
- goto assign;
- case MULASS:
- case DIVASS:
- case MODASS:
- goto assign;
- case ADDASS:
- case SUBASS:
- /* operands have scalar types (checked above) */
- if ((lt == PTR && !isityp(rt)) || rt == PTR) {
- incompat(op, lt, rt);
- return (0);
- }
- goto assign;
- case SHLASS:
- goto assign;
- case SHRASS:
- if (pflag && !isutyp(lt) && !(tflag && isutyp(rt))) {
- /* bitwise operation on s.v. possibly nonportabel */
- warning(117);
- }
- goto assign;
- case ANDASS:
- case XORASS:
- case ORASS:
- goto assign;
- assign:
- if (!ln->tn_lvalue) {
- if (ln->tn_op == CVT && ln->tn_cast &&
- ln->tn_left->tn_op == LOAD) {
- /* a cast does not yield an lvalue */
- error(163);
- }
- /* %soperand of %s must be lvalue */
- error(114, "left ", mp->m_name);
- return (0);
- } else if (ltp->t_const || ((lt == STRUCT || lt == UNION) &&
- conmemb(ltp))) {
- /* %soperand of %s must be modifiable lvalue */
- if (!tflag)
- warning(115, "left ", mp->m_name);
- }
- break;
- case COMMA:
- if (!modtab[ln->tn_op].m_sideeff)
- nulleff(ln);
- break;
- /* LINTED (enumeration values not handled in switch) */
- case CON:
- case CASE:
- case PUSH:
- case LOAD:
- case ICALL:
- case CVT:
- case CALL:
- case FSEL:
- case STRING:
- case NAME:
- case LOGOR:
- case LOGAND:
- case OR:
- case XOR:
- case AND:
- case MOD:
- case DIV:
- case MULT:
- case UMINUS:
- case UPLUS:
- case DEC:
- case INC:
- case COMPL:
- case NOT:
- case NOOP:
- break;
- }
-
- if (mp->m_badeop &&
- (ltp->t_isenum || (mp->m_binary && rtp->t_isenum))) {
- chkbeop(op, ln, rn);
- } else if (mp->m_enumop && (ltp->t_isenum && rtp && rtp->t_isenum)) {
- chkeop2(op, arg, ln, rn);
- } else if (mp->m_enumop && (ltp->t_isenum || (rtp &&rtp->t_isenum))) {
- chkeop1(op, arg, ln, rn);
- }
-
- return (1);
-}
-
-static void
-ptrcmpok(op_t op, tnode_t *ln, tnode_t *rn)
-{
- type_t *ltp, *rtp;
- tspec_t lt, rt;
- const char *lts, *rts;
-
- lt = (ltp = ln->tn_type)->t_subt->t_tspec;
- rt = (rtp = rn->tn_type)->t_subt->t_tspec;
-
- if (lt == VOID || rt == VOID) {
- if (sflag && (lt == FUNC || rt == FUNC)) {
- /* (void *)0 already handled in typeok() */
- *(lt == FUNC ? &lts : &rts) = "function pointer";
- *(lt == VOID ? &lts : &rts) = "'void *'";
- /* ANSI C forbids comparison of %s with %s */
- warning(274, lts, rts);
- }
- return;
- }
-
- if (!eqtype(ltp->t_subt, rtp->t_subt, 1, 0, NULL)) {
- illptrc(&modtab[op], ltp, rtp);
- return;
- }
-
- if (lt == FUNC && rt == FUNC) {
- if (sflag && op != EQ && op != NE)
- /* ANSI C forbids ordered comp. of func ptr */
- warning(125);
- }
-}
-
-/*
- * Checks type compatibility for ASSIGN, INIT, FARG and RETURN
- * and prints warnings/errors if necessary.
- * If the types are (almost) compatible, 1 is returned, otherwise 0.
- */
-static int
-asgntypok(op_t op, int arg, tnode_t *ln, tnode_t *rn)
-{
- tspec_t lt, rt, lst = NOTSPEC, rst = NOTSPEC;
- type_t *ltp, *rtp, *lstp = NULL, *rstp = NULL;
- mod_t *mp;
- const char *lts, *rts;
-
- if ((lt = (ltp = ln->tn_type)->t_tspec) == PTR)
- lst = (lstp = ltp->t_subt)->t_tspec;
- if ((rt = (rtp = rn->tn_type)->t_tspec) == PTR)
- rst = (rstp = rtp->t_subt)->t_tspec;
- mp = &modtab[op];
-
- if (isatyp(lt) && isatyp(rt))
- return (1);
-
- if ((lt == STRUCT || lt == UNION) && (rt == STRUCT || rt == UNION))
- /* both are struct or union */
- return (ltp->t_str == rtp->t_str);
-
- /* 0, 0L and (void *)0 may be assigned to any pointer */
- if (lt == PTR && ((rt == PTR && rst == VOID) || isityp(rt))) {
- if (rn->tn_op == CON && rn->tn_val->v_quad == 0)
- return (1);
- }
-
- if (lt == PTR && rt == PTR && (lst == VOID || rst == VOID)) {
- /* two pointers, at least one pointer to void */
- if (sflag && (lst == FUNC || rst == FUNC)) {
- /* comb. of ptr to func and ptr to void */
- *(lst == FUNC ? &lts : &rts) = "function pointer";
- *(lst == VOID ? &lts : &rts) = "'void *'";
- switch (op) {
- case INIT:
- case RETURN:
- /* ANSI C forbids conversion of %s to %s */
- warning(303, rts, lts);
- break;
- case FARG:
- /* ANSI C forbids conv. of %s to %s, arg #%d */
- warning(304, rts, lts, arg);
- break;
- default:
- /* ANSI C forbids conv. of %s to %s, op %s */
- warning(305, rts, lts, mp->m_name);
- break;
- }
- }
- }
-
- if (lt == PTR && rt == PTR && (lst == VOID || rst == VOID ||
- eqtype(lstp, rstp, 1, 0, NULL))) {
- /* compatible pointer types (qualifiers ignored) */
- if (!tflag &&
- ((!lstp->t_const && rstp->t_const) ||
- (!lstp->t_volatile && rstp->t_volatile))) {
- /* left side has not all qualifiers of right */
- switch (op) {
- case INIT:
- case RETURN:
- /* incompatible pointer types */
- warning(182);
- break;
- case FARG:
- /* argument has incompat. ptr. type, arg #%d */
- warning(153, arg);
- break;
- default:
- /* operands have incompat. ptr. types, op %s */
- warning(128, mp->m_name);
- break;
- }
- }
- return (1);
- }
-
- if ((lt == PTR && isityp(rt)) || (isityp(lt) && rt == PTR)) {
- switch (op) {
- case INIT:
- case RETURN:
- /* illegal combination of pointer and integer */
- warning(183);
- break;
- case FARG:
- /* illegal comb. of ptr. and int., arg #%d */
- warning(154, arg);
- break;
- default:
- /* illegal comb. of ptr. and int., op %s */
- warning(123, mp->m_name);
- break;
- }
- return (1);
- }
-
- if (lt == PTR && rt == PTR) {
- switch (op) {
- case INIT:
- case RETURN:
- illptrc(NULL, ltp, rtp);
- break;
- case FARG:
- /* argument has incompatible pointer type, arg #%d */
- warning(153, arg);
- break;
- default:
- illptrc(mp, ltp, rtp);
- break;
- }
- return (1);
- }
-
- switch (op) {
- case INIT:
- /* initialisation type mismatch */
- error(185);
- break;
- case RETURN:
- /* return value type mismatch */
- error(211);
- break;
- case FARG:
- /* argument is incompatible with prototype, arg #%d */
- warning(155, arg);
- break;
- default:
- incompat(op, lt, rt);
- break;
- }
-
- return (0);
-}
-
-/*
- * Prints a warning if an operator, which should be senseless for an
- * enum type, is applied to an enum type.
- */
-static void
-chkbeop(op_t op, tnode_t *ln, tnode_t *rn)
-{
- mod_t *mp;
-
- if (!eflag)
- return;
-
- mp = &modtab[op];
-
- if (!(ln->tn_type->t_isenum ||
- (mp->m_binary && rn->tn_type->t_isenum))) {
- return;
- }
-
- /*
- * Enum as offset to a pointer is an exception (otherwise enums
- * could not be used as array indizes).
- */
- if (op == PLUS &&
- ((ln->tn_type->t_isenum && rn->tn_type->t_tspec == PTR) ||
- (rn->tn_type->t_isenum && ln->tn_type->t_tspec == PTR))) {
- return;
- }
-
- /* dubious operation on enum, op %s */
- warning(241, mp->m_name);
-
-}
-
-/*
- * Prints a warning if an operator is applied to two different enum types.
- */
-static void
-chkeop2(op_t op, int arg, tnode_t *ln, tnode_t *rn)
-{
- mod_t *mp;
-
- mp = &modtab[op];
-
- if (ln->tn_type->t_enum != rn->tn_type->t_enum) {
- switch (op) {
- case INIT:
- /* enum type mismatch in initialisation */
- warning(210);
- break;
- case FARG:
- /* enum type mismatch, arg #%d */
- warning(156, arg);
- break;
- case RETURN:
- /* return value type mismatch */
- warning(211);
- break;
- default:
- /* enum type mismatch, op %s */
- warning(130, mp->m_name);
- break;
- }
-#if 0
- } else if (mp->m_comp && op != EQ && op != NE) {
- if (eflag)
- /* dubious comparisons of enums */
- warning(243, mp->m_name);
-#endif
- }
-}
-
-/*
- * Prints a warning if an operator has both enum end other integer
- * types.
- */
-static void
-chkeop1(op_t op, int arg, tnode_t *ln, tnode_t *rn)
-{
- char lbuf[64], rbuf[64];
-
- if (!eflag)
- return;
-
- switch (op) {
- case INIT:
- /*
- * Initializations with 0 should be allowed. Otherwise,
- * we should complain about all uninitialized enums,
- * consequently.
- */
- if (!rn->tn_type->t_isenum && rn->tn_op == CON &&
- isityp(rn->tn_type->t_tspec) && rn->tn_val->v_quad == 0) {
- return;
- }
- /* initialisation of '%s' with '%s' */
- warning(277, tyname(lbuf, sizeof(lbuf), ln->tn_type),
- tyname(rbuf, sizeof(rbuf), rn->tn_type));
- break;
- case FARG:
- /* combination of '%s' and '%s', arg #%d */
- warning(278, tyname(lbuf, sizeof(lbuf), ln->tn_type),
- tyname(rbuf, sizeof(rbuf), rn->tn_type), arg);
- break;
- case RETURN:
- /* combination of '%s' and '%s' in return */
- warning(279, tyname(lbuf, sizeof(lbuf), ln->tn_type),
- tyname(rbuf, sizeof(rbuf), rn->tn_type));
- break;
- default:
- /* combination of '%s' and %s, op %s */
- warning(242, tyname(lbuf, sizeof(lbuf), ln->tn_type),
- tyname(rbuf, sizeof(rbuf), rn->tn_type),
- modtab[op].m_name);
- break;
- }
-}
-
-/*
- * Build and initialize a new node.
- */
-static tnode_t *
-mktnode(op_t op, type_t *type, tnode_t *ln, tnode_t *rn)
-{
- tnode_t *ntn;
- tspec_t t;
-
- ntn = getnode();
-
- ntn->tn_op = op;
- ntn->tn_type = type;
- ntn->tn_left = ln;
- ntn->tn_right = rn;
-
- if (op == STAR || op == FSEL) {
- if (ln->tn_type->t_tspec == PTR) {
- t = ln->tn_type->t_subt->t_tspec;
- if (t != FUNC && t != VOID)
- ntn->tn_lvalue = 1;
- } else {
- LERROR("mktnode()");
- }
- }
-
- return (ntn);
-}
-
-/*
- * Performs usual conversion of operands to (unsigned) int.
- *
- * If tflag is set or the operand is a function argument with no
- * type information (no prototype or variable # of args), convert
- * float to double.
- */
-tnode_t *
-promote(op_t op, int farg, tnode_t *tn)
-{
- tspec_t t;
- type_t *ntp;
- int len;
-
- t = tn->tn_type->t_tspec;
-
- if (!isatyp(t))
- return (tn);
-
- if (!tflag) {
- /*
- * ANSI C requires that the result is always of type INT
- * if INT can represent all possible values of the previous
- * type.
- */
- if (tn->tn_type->t_isfield) {
- len = tn->tn_type->t_flen;
- if (size(INT) > len) {
- t = INT;
- } else {
- if (size(INT) != len)
- LERROR("promote()");
- if (isutyp(t)) {
- t = UINT;
- } else {
- t = INT;
- }
- }
- } else if (t == CHAR || t == UCHAR || t == SCHAR) {
- t = (size(CHAR) < size(INT) || t != UCHAR) ?
- INT : UINT;
- } else if (t == SHORT || t == USHORT) {
- t = (size(SHORT) < size(INT) || t == SHORT) ?
- INT : UINT;
- } else if (t == ENUM) {
- t = INT;
- } else if (farg && t == FLOAT) {
- t = DOUBLE;
- }
- } else {
- /*
- * In traditional C, keep unsigned and promote FLOAT
- * to DOUBLE.
- */
- if (t == UCHAR || t == USHORT) {
- t = UINT;
- } else if (t == CHAR || t == SCHAR || t == SHORT) {
- t = INT;
- } else if (t == FLOAT) {
- t = DOUBLE;
- } else if (t == ENUM) {
- t = INT;
- }
- }
-
- if (t != tn->tn_type->t_tspec) {
- ntp = tduptyp(tn->tn_type);
- ntp->t_tspec = t;
- /*
- * Keep t_isenum so we are later able to check compatibility
- * of enum types.
- */
- tn = convert(op, 0, ntp, tn);
- }
-
- return (tn);
-}
-
-/*
- * Insert conversions which are necessary to give both operands the same
- * type. This is done in different ways for traditional C and ANSI C.
- */
-static void
-balance(op_t op, tnode_t **lnp, tnode_t **rnp)
-{
- tspec_t lt, rt, t;
- int i, u;
- type_t *ntp;
- static tspec_t tl[] = {
- LDOUBLE, DOUBLE, FLOAT, UQUAD, QUAD, ULONG, LONG, UINT, INT,
- };
-
- lt = (*lnp)->tn_type->t_tspec;
- rt = (*rnp)->tn_type->t_tspec;
-
- if (!isatyp(lt) || !isatyp(rt))
- return;
-
- if (!tflag) {
- if (lt == rt) {
- t = lt;
- } else if (lt == LDOUBLE || rt == LDOUBLE) {
- t = LDOUBLE;
- } else if (lt == DOUBLE || rt == DOUBLE) {
- t = DOUBLE;
- } else if (lt == FLOAT || rt == FLOAT) {
- t = FLOAT;
- } else {
- /*
- * If type A has more bits than type B it should
- * be able to hold all possible values of type B.
- */
- if (size(lt) > size(rt)) {
- t = lt;
- } else if (size(lt) < size(rt)) {
- t = rt;
- } else {
- for (i = 3; tl[i] != INT; i++) {
- if (tl[i] == lt || tl[i] == rt)
- break;
- }
- if ((isutyp(lt) || isutyp(rt)) &&
- !isutyp(tl[i])) {
- i--;
- }
- t = tl[i];
- }
- }
- } else {
- /* Keep unsigned in traditional C */
- u = isutyp(lt) || isutyp(rt);
- for (i = 0; tl[i] != INT; i++) {
- if (lt == tl[i] || rt == tl[i])
- break;
- }
- t = tl[i];
- if (u && isityp(t) && !isutyp(t))
- t = utyp(t);
- }
-
- if (t != lt) {
- ntp = tduptyp((*lnp)->tn_type);
- ntp->t_tspec = t;
- *lnp = convert(op, 0, ntp, *lnp);
- }
- if (t != rt) {
- ntp = tduptyp((*rnp)->tn_type);
- ntp->t_tspec = t;
- *rnp = convert(op, 0, ntp, *rnp);
- }
-}
-
-/*
- * Insert a conversion operator, which converts the type of the node
- * to another given type.
- * If op is FARG, arg is the number of the argument (used for warnings).
- */
-tnode_t *
-convert(op_t op, int arg, type_t *tp, tnode_t *tn)
-{
- tnode_t *ntn;
- tspec_t nt, ot, ost = NOTSPEC;
-
- if (tn->tn_lvalue)
- LERROR("convert()");
-
- nt = tp->t_tspec;
- if ((ot = tn->tn_type->t_tspec) == PTR)
- ost = tn->tn_type->t_subt->t_tspec;
-
- if (!tflag && !sflag && op == FARG)
- ptconv(arg, nt, ot, tp, tn);
- if (isityp(nt) && isityp(ot)) {
- iiconv(op, arg, nt, ot, tp, tn);
- } else if (nt == PTR && ((ot == PTR && ost == VOID) || isityp(ot)) &&
- tn->tn_op == CON && tn->tn_val->v_quad == 0) {
- /* 0, 0L and (void *)0 may be assigned to any pointer. */
- } else if (isityp(nt) && ot == PTR) {
- piconv(op, nt, tp, tn);
- } else if (nt == PTR && ot == PTR) {
- ppconv(op, tn, tp);
- }
-
- ntn = getnode();
- ntn->tn_op = CVT;
- ntn->tn_type = tp;
- ntn->tn_cast = op == CVT;
- if (tn->tn_op != CON || nt == VOID) {
- ntn->tn_left = tn;
- } else {
- ntn->tn_op = CON;
- ntn->tn_val = tgetblk(sizeof (val_t));
- cvtcon(op, arg, ntn->tn_type, ntn->tn_val, tn->tn_val);
- }
-
- return (ntn);
-}
-
-/*
- * Print a warning if a prototype causes a type conversion that is
- * different from what would happen to the same argument in the
- * absence of a prototype.
- *
- * Errors/Warnings about illegal type combinations are already printed
- * in asgntypok().
- */
-static void
-ptconv(int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
-{
- tnode_t *ptn;
- char buf[64];
-
- if (!isatyp(nt) || !isatyp(ot))
- return;
-
- /*
- * If the type of the formal parameter is char/short, a warning
- * would be useless, because functions declared the old style
- * can't expect char/short arguments.
- */
- if (nt == CHAR || nt == UCHAR || nt == SHORT || nt == USHORT)
- return;
-
- /* get default promotion */
- ptn = promote(NOOP, 1, tn);
- ot = ptn->tn_type->t_tspec;
-
- /* return if types are the same with and without prototype */
- if (nt == ot || (nt == ENUM && ot == INT))
- return;
-
- if (isftyp(nt) != isftyp(ot) || psize(nt) != psize(ot)) {
- /* representation and/or width change */
- if (!isityp(ot) || psize(ot) > psize(INT)) {
- /* conversion to '%s' due to prototype, arg #%d */
- warning(259, tyname(buf, sizeof(buf), tp), arg);
- }
- } else if (hflag) {
- /*
- * they differ in sign or base type (char, short, int,
- * long, long long, float, double, long double)
- *
- * if they differ only in sign and the argument is a constant
- * and the msb of the argument is not set, print no warning
- */
- if (ptn->tn_op == CON && isityp(nt) && styp(nt) == styp(ot) &&
- msb(ptn->tn_val->v_quad, ot, -1) == 0) {
- /* ok */
- } else {
- /* conversion to '%s' due to prototype, arg #%d */
- warning(259, tyname(buf, sizeof(buf), tp), arg);
- }
- }
-}
-
-/*
- * Print warnings for conversions of integer types which may cause
- * problems.
- */
-/* ARGSUSED */
-static void
-iiconv(op_t op, int arg, tspec_t nt, tspec_t ot, type_t *tp, tnode_t *tn)
-{
- char lbuf[64], rbuf[64];
- if (tn->tn_op == CON)
- return;
-
- if (op == CVT)
- return;
-
-#if 0
- if (psize(nt) > psize(ot) && isutyp(nt) != isutyp(ot)) {
- /* conversion to %s may sign-extend incorrectly (, arg #%d) */
- if (aflag && pflag) {
- if (op == FARG) {
- warning(297, tyname(lbuf, sizeof(lbuf), tp),
- arg);
- } else {
- warning(131, tyname(lbuf, sizeof(lbuf), tp));
- }
- }
- }
-#endif
-
- if (psize(nt) < psize(ot) &&
- (ot == LONG || ot == ULONG || ot == QUAD || ot == UQUAD ||
- aflag > 1)) {
- /* conversion from '%s' may lose accuracy */
- if (aflag) {
- if (op == FARG) {
- warning(298,
- tyname(rbuf, sizeof(rbuf), tn->tn_type),
- tyname(lbuf, sizeof(lbuf), tp),
- arg);
- } else {
- warning(132,
- tyname(rbuf, sizeof(rbuf), tn->tn_type),
- tyname(lbuf, sizeof(lbuf), tp));
- }
- }
- }
-}
-
-/*
- * Print warnings for dubious conversions of pointer to integer.
- */
-static void
-piconv(op_t op, tspec_t nt, type_t *tp, tnode_t *tn)
-{
- char buf[64];
-
- if (tn->tn_op == CON)
- return;
-
- if (op != CVT) {
- /* We already got an error. */
- return;
- }
-
- if (psize(nt) < psize(PTR)) {
- if (pflag && size(nt) >= size(PTR)) {
- /* conv. of pointer to %s may lose bits */
- warning(134, tyname(buf, sizeof(buf), tp));
- } else {
- /* conv. of pointer to %s loses bits */
- warning(133, tyname(buf, sizeof(buf), tp));
- }
- }
-}
-
-/*
- * Print warnings for questionable pointer conversions.
- */
-static void
-ppconv(op_t op, tnode_t *tn, type_t *tp)
-{
- tspec_t nt, ot;
- const char *nts, *ots;
-
- /*
- * We already got an error (pointers of different types
- * without a cast) or we will not get a warning.
- */
- if (op != CVT)
- return;
-
- nt = tp->t_subt->t_tspec;
- ot = tn->tn_type->t_subt->t_tspec;
-
- if (nt == VOID || ot == VOID) {
- if (sflag && (nt == FUNC || ot == FUNC)) {
- /* (void *)0 already handled in convert() */
- *(nt == FUNC ? &nts : &ots) = "function pointer";
- *(nt == VOID ? &nts : &ots) = "'void *'";
- /* ANSI C forbids conversion of %s to %s */
- warning(303, ots, nts);
- }
- return;
- } else if (nt == FUNC && ot == FUNC) {
- return;
- } else if (nt == FUNC || ot == FUNC) {
- /* questionable conversion of function pointer */
- warning(229);
- return;
- }
-
- if (getbound(tp->t_subt) > getbound(tn->tn_type->t_subt)) {
- if (hflag)
- /* possible pointer alignment problem */
- warning(135);
- }
- if (((nt == STRUCT || nt == UNION) &&
- tp->t_subt->t_str != tn->tn_type->t_subt->t_str) ||
- psize(nt) != psize(ot)) {
- if (cflag) {
- /* pointer casts may be troublesome */
- warning(247);
- }
- }
-}
-
-/*
- * Converts a typed constant in a constant of another type.
- *
- * op operator which requires conversion
- * arg if op is FARG, # of argument
- * tp type to which convert the constant
- * nv new constant
- * v old constant
- */
-void
-cvtcon(op_t op, int arg, type_t *tp, val_t *nv, val_t *v)
-{
- char lbuf[64], rbuf[64];
- tspec_t ot, nt;
- ldbl_t max = 0.0, min = 0.0;
- int sz, rchk;
- int64_t xmask, xmsk1;
- int osz, nsz;
-
- ot = v->v_tspec;
- nt = nv->v_tspec = tp->t_tspec;
- rchk = 0;
-
- if (ot == FLOAT || ot == DOUBLE || ot == LDOUBLE) {
- switch (nt) {
- case CHAR:
- max = CHAR_MAX; min = CHAR_MIN; break;
- case UCHAR:
- max = UCHAR_MAX; min = 0; break;
- case SCHAR:
- max = SCHAR_MAX; min = SCHAR_MIN; break;
- case SHORT:
- max = SHRT_MAX; min = SHRT_MIN; break;
- case USHORT:
- max = USHRT_MAX; min = 0; break;
- case ENUM:
- case INT:
- max = INT_MAX; min = INT_MIN; break;
- case UINT:
- max = (u_int)UINT_MAX; min = 0; break;
- case LONG:
- max = LONG_MAX; min = LONG_MIN; break;
- case ULONG:
- max = (u_long)ULONG_MAX; min = 0; break;
- case QUAD:
- max = QUAD_MAX; min = QUAD_MIN; break;
- case UQUAD:
- max = (uint64_t)UQUAD_MAX; min = 0; break;
- case FLOAT:
- max = FLT_MAX; min = -FLT_MAX; break;
- case DOUBLE:
- max = DBL_MAX; min = -DBL_MAX; break;
- case PTR:
- /* Already got an error because of float --> ptr */
- case LDOUBLE:
- max = LDBL_MAX; min = -LDBL_MAX; break;
- default:
- LERROR("cvtcon()");
- }
- if (v->v_ldbl > max || v->v_ldbl < min) {
- if (nt == LDOUBLE)
- LERROR("cvtcon()");
- if (op == FARG) {
- /* conv. of %s to %s is out of rng., arg #%d */
- warning(295, tyname(lbuf, sizeof(lbuf),
- gettyp(ot)), tyname(rbuf, sizeof(rbuf), tp),
- arg);
- } else {
- /* conversion of %s to %s is out of range */
- warning(119, tyname(lbuf, sizeof(lbuf),
- gettyp(ot)),
- tyname(rbuf, sizeof(rbuf), tp));
- }
- v->v_ldbl = v->v_ldbl > 0 ? max : min;
- }
- if (nt == FLOAT) {
- nv->v_ldbl = (float)v->v_ldbl;
- } else if (nt == DOUBLE) {
- nv->v_ldbl = (double)v->v_ldbl;
- } else if (nt == LDOUBLE) {
- nv->v_ldbl = v->v_ldbl;
- } else {
- nv->v_quad = (nt == PTR || isutyp(nt)) ?
- (uint64_t)v->v_ldbl : (int64_t)v->v_ldbl;
- }
- } else {
- if (nt == FLOAT) {
- nv->v_ldbl = (ot == PTR || isutyp(ot)) ?
- (float)(uint64_t)v->v_quad : (float)v->v_quad;
- } else if (nt == DOUBLE) {
- nv->v_ldbl = (ot == PTR || isutyp(ot)) ?
- (double)(uint64_t)v->v_quad : (double)v->v_quad;
- } else if (nt == LDOUBLE) {
- nv->v_ldbl = (ot == PTR || isutyp(ot)) ?
- (ldbl_t)(uint64_t)v->v_quad : (ldbl_t)v->v_quad;
- } else {
- rchk = 1; /* Check for lost precision. */
- nv->v_quad = v->v_quad;
- }
- }
-
- if (v->v_ansiu && isftyp(nt)) {
- /* ANSI C treats constant as unsigned */
- warning(157);
- v->v_ansiu = 0;
- } else if (v->v_ansiu && (isityp(nt) && !isutyp(nt) &&
- psize(nt) > psize(ot))) {
- /* ANSI C treats constant as unsigned */
- warning(157);
- v->v_ansiu = 0;
- }
-
- if (nt != FLOAT && nt != DOUBLE && nt != LDOUBLE) {
- sz = tp->t_isfield ? tp->t_flen : size(nt);
- nv->v_quad = xsign(nv->v_quad, nt, sz);
- }
-
- if (rchk && op != CVT) {
- osz = size(ot);
- nsz = tp->t_isfield ? tp->t_flen : size(nt);
- xmask = qlmasks[nsz] ^ qlmasks[osz];
- xmsk1 = qlmasks[nsz] ^ qlmasks[osz - 1];
- /*
- * For bitwise operations we are not interested in the
- * value, but in the bits itself.
- */
- if (op == ORASS || op == OR || op == XOR) {
- /*
- * Print a warning if bits which were set are
- * lost due to the conversion.
- * This can happen with operator ORASS only.
- */
- if (nsz < osz && (v->v_quad & xmask) != 0) {
- /* constant truncated by conv., op %s */
- warning(306, modtab[op].m_name);
- }
- } else if (op == ANDASS || op == AND) {
- /*
- * Print a warning if additional bits are not all 1
- * and the most significant bit of the old value is 1,
- * or if at least one (but not all) removed bit was 0.
- */
- if (nsz > osz &&
- (nv->v_quad & qbmasks[osz - 1]) != 0 &&
- (nv->v_quad & xmask) != xmask) {
- /*
- * extra bits set to 0 in conversion
- * of '%s' to '%s', op %s
- */
- warning(309, tyname(lbuf, sizeof(lbuf),
- gettyp(ot)), tyname(rbuf, sizeof(rbuf), tp),
- modtab[op].m_name);
- } else if (nsz < osz &&
- (v->v_quad & xmask) != xmask &&
- (v->v_quad & xmask) != 0) {
- /* const. truncated by conv., op %s */
- warning(306, modtab[op].m_name);
- }
- } else if ((nt != PTR && isutyp(nt)) &&
- (ot != PTR && !isutyp(ot)) && v->v_quad < 0) {
- if (op == ASSIGN) {
- /* assignment of negative constant to ... */
- warning(164);
- } else if (op == INIT) {
- /* initialisation of unsigned with neg. ... */
- warning(221);
- } else if (op == FARG) {
- /* conversion of neg. const. to ..., arg #%d */
- warning(296, arg);
- } else if (modtab[op].m_comp) {
- /* we get this warning already in chkcomp() */
- } else {
- /* conversion of negative constant to ... */
- warning(222);
- }
- } else if (nv->v_quad != v->v_quad && nsz <= osz &&
- (v->v_quad & xmask) != 0 &&
- (isutyp(ot) || (v->v_quad & xmsk1) != xmsk1)) {
- /*
- * Loss of significant bit(s). All truncated bits
- * of unsigned types or all truncated bits plus the
- * msb of the target for signed types are considered
- * to be significant bits. Loss of significant bits
- * means that at least on of the bits was set in an
- * unsigned type or that at least one, but not all of
- * the bits was set in a signed type.
- * Loss of significant bits means that it is not
- * possible, also not with necessary casts, to convert
- * back to the original type. An example for a
- * necessary cast is:
- * char c; int i; c = 128;
- * i = c; ** yields -128 **
- * i = (unsigned char)c; ** yields 128 **
- */
- if (op == ASSIGN && tp->t_isfield) {
- /* precision lost in bit-field assignment */
- warning(166);
- } else if (op == ASSIGN) {
- /* constant truncated by assignment */
- warning(165);
- } else if (op == INIT && tp->t_isfield) {
- /* bit-field initializer does not fit */
- warning(180);
- } else if (op == INIT) {
- /* initializer does not fit */
- warning(178);
- } else if (op == CASE) {
- /* case label affected by conversion */
- warning(196);
- } else if (op == FARG) {
- /* conv. of %s to %s is out of rng., arg #%d */
- warning(295, tyname(lbuf, sizeof(lbuf),
- gettyp(ot)), tyname(rbuf, sizeof(rbuf), tp),
- arg);
- } else {
- /* conversion of %s to %s is out of range */
- warning(119, tyname(lbuf, sizeof(lbuf),
- gettyp(ot)),
- tyname(rbuf, sizeof(rbuf), tp));
- }
- } else if (nv->v_quad != v->v_quad) {
- if (op == ASSIGN && tp->t_isfield) {
- /* precision lost in bit-field assignment */
- warning(166);
- } else if (op == INIT && tp->t_isfield) {
- /* bit-field initializer out of range */
- warning(11);
- } else if (op == CASE) {
- /* case label affected by conversion */
- warning(196);
- } else if (op == FARG) {
- /* conv. of %s to %s is out of rng., arg #%d */
- warning(295, tyname(lbuf, sizeof(lbuf),
- gettyp(ot)), tyname(rbuf, sizeof(rbuf), tp),
- arg);
- } else {
- /* conversion of %s to %s is out of range */
- warning(119, tyname(lbuf, sizeof(lbuf),
- gettyp(ot)),
- tyname(rbuf, sizeof(rbuf), tp));
- }
- }
- }
-}
-
-/*
- * Called if incompatible types were detected.
- * Prints an appropriate warning.
- */
-static void
-incompat(op_t op, tspec_t lt, tspec_t rt)
-{
- mod_t *mp;
-
- mp = &modtab[op];
-
- if (lt == VOID || (mp->m_binary && rt == VOID)) {
- /* void type illegal in expression */
- error(109);
- } else if (op == ASSIGN) {
- if ((lt == STRUCT || lt == UNION) &&
- (rt == STRUCT || rt == UNION)) {
- /* assignment of different structures */
- error(240);
- } else {
- /* assignment type mismatch */
- error(171);
- }
- } else if (mp->m_binary) {
- /* operands of %s have incompatible types */
- error(107, mp->m_name);
- } else {
- /* operand of %s has incompatible type */
- error(108, mp->m_name);
- }
-}
-
-/*
- * Called if incompatible pointer types are detected.
- * Print an appropriate warning.
- */
-static void
-illptrc(mod_t *mp, type_t *ltp, type_t *rtp)
-{
- tspec_t lt, rt;
-
- if (ltp->t_tspec != PTR || rtp->t_tspec != PTR)
- LERROR("illptrc()");
-
- lt = ltp->t_subt->t_tspec;
- rt = rtp->t_subt->t_tspec;
-
- if ((lt == STRUCT || lt == UNION) && (rt == STRUCT || rt == UNION)) {
- if (mp == NULL) {
- /* illegal structure pointer combination */
- warning(244);
- } else {
- /* illegal structure pointer combination, op %s */
- warning(245, mp->m_name);
- }
- } else {
- if (mp == NULL) {
- /* illegal pointer combination */
- warning(184);
- } else {
- /* illegal pointer combination, op %s */
- warning(124, mp->m_name);
- }
- }
-}
-
-/*
- * Make sure type (*tpp)->t_subt has at least the qualifiers
- * of tp1->t_subt and tp2->t_subt.
- */
-static void
-mrgqual(type_t **tpp, type_t *tp1, type_t *tp2)
-{
-
- if ((*tpp)->t_tspec != PTR ||
- tp1->t_tspec != PTR || tp2->t_tspec != PTR) {
- LERROR("mrgqual()");
- }
-
- if ((*tpp)->t_subt->t_const ==
- (tp1->t_subt->t_const | tp2->t_subt->t_const) &&
- (*tpp)->t_subt->t_volatile ==
- (tp1->t_subt->t_volatile | tp2->t_subt->t_volatile)) {
- return;
- }
-
- *tpp = tduptyp(*tpp);
- (*tpp)->t_subt = tduptyp((*tpp)->t_subt);
- (*tpp)->t_subt->t_const =
- tp1->t_subt->t_const | tp2->t_subt->t_const;
- (*tpp)->t_subt->t_volatile =
- tp1->t_subt->t_volatile | tp2->t_subt->t_volatile;
-}
-
-/*
- * Returns 1 if the given structure or union has a constant member
- * (maybe recursively).
- */
-static int
-conmemb(type_t *tp)
-{
- sym_t *m;
- tspec_t t;
-
- if ((t = tp->t_tspec) != STRUCT && t != UNION)
- LERROR("conmemb()");
- for (m = tp->t_str->memb; m != NULL; m = m->s_nxt) {
- tp = m->s_type;
- if (tp->t_const)
- return (1);
- if ((t = tp->t_tspec) == STRUCT || t == UNION) {
- if (conmemb(m->s_type))
- return (1);
- }
- }
- return (0);
-}
-
-const char *
-basictyname(tspec_t t)
-{
- switch (t) {
- case CHAR: return "char";
- case UCHAR: return "unsigned char";
- case SCHAR: return "signed char";
- case SHORT: return "short";
- case USHORT: return "unsigned short";
- case INT: return "int";
- case UINT: return "unsigned int";
- case LONG: return "long";
- case ULONG: return "unsigned long";
- case QUAD: return "long long";
- case UQUAD: return "unsigned long long";
- case FLOAT: return "float";
- case DOUBLE: return "double";
- case LDOUBLE: return "long double";
- case PTR: return "pointer";
- case ENUM: return "enum";
- case STRUCT: return "struct";
- case UNION: return "union";
- case FUNC: return "function";
- case ARRAY: return "array";
- default:
- LERROR("basictyname()");
- return NULL;
- }
-}
-
-const char *
-tyname(char *buf, size_t bufsiz, type_t *tp)
-{
- tspec_t t;
- const char *s;
- char lbuf[64];
-
- if ((t = tp->t_tspec) == INT && tp->t_isenum)
- t = ENUM;
-
- s = basictyname(t);
-
-
- switch (t) {
- case CHAR:
- case UCHAR:
- case SCHAR:
- case SHORT:
- case USHORT:
- case INT:
- case UINT:
- case LONG:
- case ULONG:
- case QUAD:
- case UQUAD:
- case FLOAT:
- case DOUBLE:
- case LDOUBLE:
- case FUNC:
- (void)snprintf(buf, bufsiz, "%s", s);
- break;
- case PTR:
- (void)snprintf(buf, bufsiz, "%s to %s", s,
- tyname(lbuf, sizeof(lbuf), tp->t_subt));
- break;
- case ENUM:
- (void)snprintf(buf, bufsiz, "%s %s", s,
- tp->t_enum->etag->s_name);
- break;
- case STRUCT:
- case UNION:
- (void)snprintf(buf, bufsiz, "%s %s", s,
- tp->t_str->stag->s_name);
- break;
- case ARRAY:
- (void)snprintf(buf, bufsiz, "%s of %s[%d]", s,
- tyname(lbuf, sizeof(lbuf), tp->t_subt), tp->t_dim);
- break;
- default:
- LERROR("tyname()");
- }
- return (buf);
-}
-
-/*
- * Create a new node for one of the operators POINT and ARROW.
- */
-static tnode_t *
-bldstr(op_t op, tnode_t *ln, tnode_t *rn)
-{
- tnode_t *ntn, *ctn;
- int nolval;
-
- if (rn->tn_op != NAME)
- LERROR("bldstr()");
- if (rn->tn_sym->s_value.v_tspec != INT)
- LERROR("bldstr()");
- if (rn->tn_sym->s_scl != MOS && rn->tn_sym->s_scl != MOU)
- LERROR("bldstr()");
-
- /*
- * Remember if the left operand is an lvalue (structure members
- * are lvalues if and only if the structure itself is an lvalue).
- */
- nolval = op == POINT && !ln->tn_lvalue;
-
- if (op == POINT) {
- ln = bldamper(ln, 1);
- } else if (ln->tn_type->t_tspec != PTR) {
- if (!tflag || !isityp(ln->tn_type->t_tspec))
- LERROR("bldstr()");
- ln = convert(NOOP, 0, tincref(gettyp(VOID), PTR), ln);
- }
-
-#if PTRDIFF_IS_LONG
- ctn = getinode(LONG, rn->tn_sym->s_value.v_quad / CHAR_BIT);
-#else
- ctn = getinode(INT, rn->tn_sym->s_value.v_quad / CHAR_BIT);
-#endif
-
- ntn = mktnode(PLUS, tincref(rn->tn_type, PTR), ln, ctn);
- if (ln->tn_op == CON)
- ntn = fold(ntn);
-
- if (rn->tn_type->t_isfield) {
- ntn = mktnode(FSEL, ntn->tn_type->t_subt, ntn, NULL);
- } else {
- ntn = mktnode(STAR, ntn->tn_type->t_subt, ntn, NULL);
- }
-
- if (nolval)
- ntn->tn_lvalue = 0;
-
- return (ntn);
-}
-
-/*
- * Create a node for INCAFT, INCBEF, DECAFT and DECBEF.
- */
-static tnode_t *
-bldincdec(op_t op, tnode_t *ln)
-{
- tnode_t *cn, *ntn;
-
- if (ln == NULL)
- LERROR("bldincdec()");
-
- if (ln->tn_type->t_tspec == PTR) {
- cn = plength(ln->tn_type);
- } else {
- cn = getinode(INT, (int64_t)1);
- }
- ntn = mktnode(op, ln->tn_type, ln, cn);
-
- return (ntn);
-}
-
-/*
- * Create a tree node for the & operator
- */
-static tnode_t *
-bldamper(tnode_t *tn, int noign)
-{
- tnode_t *ntn;
- tspec_t t;
-
- if (!noign && ((t = tn->tn_type->t_tspec) == ARRAY || t == FUNC)) {
- /* & before array or function: ignored */
- if (tflag)
- warning(127);
- return (tn);
- }
-
- /* eliminate &* */
- if (tn->tn_op == STAR &&
- tn->tn_left->tn_type->t_tspec == PTR &&
- tn->tn_left->tn_type->t_subt == tn->tn_type) {
- return (tn->tn_left);
- }
-
- ntn = mktnode(AMPER, tincref(tn->tn_type, PTR), tn, NULL);
-
- return (ntn);
-}
-
-/*
- * Create a node for operators PLUS and MINUS.
- */
-static tnode_t *
-bldplmi(op_t op, tnode_t *ln, tnode_t *rn)
-{
- tnode_t *ntn, *ctn;
- type_t *tp;
-
- /* If pointer and integer, then pointer to the lhs. */
- if (rn->tn_type->t_tspec == PTR && isityp(ln->tn_type->t_tspec)) {
- ntn = ln;
- ln = rn;
- rn = ntn;
- }
-
- if (ln->tn_type->t_tspec == PTR && rn->tn_type->t_tspec != PTR) {
-
- if (!isityp(rn->tn_type->t_tspec))
- LERROR("bldplmi()");
-
- ctn = plength(ln->tn_type);
- if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec)
- rn = convert(NOOP, 0, ctn->tn_type, rn);
- rn = mktnode(MULT, rn->tn_type, rn, ctn);
- if (rn->tn_left->tn_op == CON)
- rn = fold(rn);
- ntn = mktnode(op, ln->tn_type, ln, rn);
-
- } else if (rn->tn_type->t_tspec == PTR) {
-
- if (ln->tn_type->t_tspec != PTR || op != MINUS)
- LERROR("bldplmi()");
-#if PTRDIFF_IS_LONG
- tp = gettyp(LONG);
-#else
- tp = gettyp(INT);
-#endif
- ntn = mktnode(op, tp, ln, rn);
- if (ln->tn_op == CON && rn->tn_op == CON)
- ntn = fold(ntn);
- ctn = plength(ln->tn_type);
- balance(NOOP, &ntn, &ctn);
- ntn = mktnode(DIV, tp, ntn, ctn);
-
- } else {
-
- ntn = mktnode(op, ln->tn_type, ln, rn);
-
- }
- return (ntn);
-}
-
-/*
- * Create a node for operators SHL and SHR.
- */
-static tnode_t *
-bldshft(op_t op, tnode_t *ln, tnode_t *rn)
-{
- tspec_t t;
- tnode_t *ntn;
-
- if ((t = rn->tn_type->t_tspec) != INT && t != UINT)
- rn = convert(CVT, 0, gettyp(INT), rn);
- ntn = mktnode(op, ln->tn_type, ln, rn);
- return (ntn);
-}
-
-/*
- * Create a node for COLON.
- */
-static tnode_t *
-bldcol(tnode_t *ln, tnode_t *rn)
-{
- tspec_t lt, rt, pdt;
- type_t *rtp;
- tnode_t *ntn;
-
- lt = ln->tn_type->t_tspec;
- rt = rn->tn_type->t_tspec;
-#if PTRDIFF_IS_LONG
- pdt = LONG;
-#else
- pdt = INT;
-#endif
-
- /*
- * Arithmetic types are balanced, all other type combinations
- * still need to be handled.
- */
- if (isatyp(lt) && isatyp(rt)) {
- rtp = ln->tn_type;
- } else if (lt == VOID || rt == VOID) {
- rtp = gettyp(VOID);
- } else if (lt == STRUCT || lt == UNION) {
- /* Both types must be identical. */
- if (rt != STRUCT && rt != UNION)
- LERROR("bldcol()");
- if (ln->tn_type->t_str != rn->tn_type->t_str)
- LERROR("bldcol()");
- if (incompl(ln->tn_type)) {
- /* unknown operand size, op %s */
- error(138, modtab[COLON].m_name);
- return (NULL);
- }
- rtp = ln->tn_type;
- } else if (lt == PTR && isityp(rt)) {
- if (rt != pdt) {
- rn = convert(NOOP, 0, gettyp(pdt), rn);
- rt = pdt;
- }
- rtp = ln->tn_type;
- } else if (rt == PTR && isityp(lt)) {
- if (lt != pdt) {
- ln = convert(NOOP, 0, gettyp(pdt), ln);
- lt = pdt;
- }
- rtp = rn->tn_type;
- } else if (lt == PTR && ln->tn_type->t_subt->t_tspec == VOID) {
- if (rt != PTR)
- LERROR("bldcol()");
- rtp = ln->tn_type;
- mrgqual(&rtp, ln->tn_type, rn->tn_type);
- } else if (rt == PTR && rn->tn_type->t_subt->t_tspec == VOID) {
- if (lt != PTR)
- LERROR("bldcol()");
- rtp = rn->tn_type;
- mrgqual(&rtp, ln->tn_type, rn->tn_type);
- } else {
- if (lt != PTR || rt != PTR)
- LERROR("bldcol()");
- /*
- * XXX For now we simply take the left type. This is
- * probably wrong, if one type contains a function prototype
- * and the other one, at the same place, only an old style
- * declaration.
- */
- rtp = ln->tn_type;
- mrgqual(&rtp, ln->tn_type, rn->tn_type);
- }
-
- ntn = mktnode(COLON, rtp, ln, rn);
-
- return (ntn);
-}
-
-/*
- * Create a node for an assignment operator (both = and op= ).
- */
-static tnode_t *
-bldasgn(op_t op, tnode_t *ln, tnode_t *rn)
-{
- tspec_t lt, rt;
- tnode_t *ntn, *ctn;
-
- if (ln == NULL || rn == NULL)
- LERROR("bldasgn()");
-
- lt = ln->tn_type->t_tspec;
- rt = rn->tn_type->t_tspec;
-
- if ((op == ADDASS || op == SUBASS) && lt == PTR) {
- if (!isityp(rt))
- LERROR("bldasgn()");
- ctn = plength(ln->tn_type);
- if (rn->tn_type->t_tspec != ctn->tn_type->t_tspec)
- rn = convert(NOOP, 0, ctn->tn_type, rn);
- rn = mktnode(MULT, rn->tn_type, rn, ctn);
- if (rn->tn_left->tn_op == CON)
- rn = fold(rn);
- }
-
- if ((op == ASSIGN || op == RETURN) && (lt == STRUCT || rt == STRUCT)) {
- if (rt != lt || ln->tn_type->t_str != rn->tn_type->t_str)
- LERROR("bldasgn()");
- if (incompl(ln->tn_type)) {
- if (op == RETURN) {
- /* cannot return incomplete type */
- error(212);
- } else {
- /* unknown operand size, op %s */
- error(138, modtab[op].m_name);
- }
- return (NULL);
- }
- }
-
- if (op == SHLASS) {
- if (psize(lt) < psize(rt)) {
- if (hflag)
- /* semantics of %s change in ANSI C; use ... */
- warning(118, "<<=");
- }
- } else if (op != SHRASS) {
- if (op == ASSIGN || lt != PTR) {
- if (lt != rt ||
- (ln->tn_type->t_isfield && rn->tn_op == CON)) {
- rn = convert(op, 0, ln->tn_type, rn);
- rt = lt;
- }
- }
- }
-
- ntn = mktnode(op, ln->tn_type, ln, rn);
-
- return (ntn);
-}
-
-/*
- * Get length of type tp->t_subt.
- */
-static tnode_t *
-plength(type_t *tp)
-{
- int elem, elsz;
- tspec_t st;
-
- if (tp->t_tspec != PTR)
- LERROR("plength()");
- tp = tp->t_subt;
-
- elem = 1;
- elsz = 0;
-
- while (tp->t_tspec == ARRAY) {
- elem *= tp->t_dim;
- tp = tp->t_subt;
- }
-
- switch (tp->t_tspec) {
- case FUNC:
- /* pointer to function is not allowed here */
- error(110);
- break;
- case VOID:
- /* cannot do pointer arithmetic on operand of ... */
- (void)gnuism(136);
- break;
- case STRUCT:
- case UNION:
- if ((elsz = tp->t_str->size) == 0)
- /* cannot do pointer arithmetic on operand of ... */
- error(136);
- break;
- case ENUM:
- if (incompl(tp)) {
- /* cannot do pointer arithmetic on operand of ... */
- warning(136);
- }
- /* FALLTHROUGH */
- default:
- if ((elsz = size(tp->t_tspec)) == 0) {
- /* cannot do pointer arithmetic on operand of ... */
- error(136);
- } else if (elsz == -1) {
- LERROR("plength()");
- }
- break;
- }
-
- if (elem == 0 && elsz != 0) {
- /* cannot do pointer arithmetic on operand of ... */
- error(136);
- }
-
- if (elsz == 0)
- elsz = CHAR_BIT;
-
-#if PTRDIFF_IS_LONG
- st = LONG;
-#else
- st = INT;
-#endif
-
- return (getinode(st, (int64_t)(elem * elsz / CHAR_BIT)));
-}
-
-/*
- * XXX
- * Note: There appear to be a number of bugs in detecting overflow in
- * this function. An audit and a set of proper regression tests are needed.
- * --Perry Metzger, Nov. 16, 2001
- */
-/*
- * Do only as much as necessary to compute constant expressions.
- * Called only if the operator allows folding and (both) operands
- * are constants.
- */
-static tnode_t *
-fold(tnode_t *tn)
-{
- val_t *v;
- tspec_t t;
- int utyp, ovfl;
- int64_t sl, sr = 0, q = 0, mask;
- uint64_t ul, ur = 0;
- tnode_t *cn;
-
- if ((v = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- v->v_tspec = t = tn->tn_type->t_tspec;
-
- utyp = t == PTR || isutyp(t);
- ul = sl = tn->tn_left->tn_val->v_quad;
- if (modtab[tn->tn_op].m_binary)
- ur = sr = tn->tn_right->tn_val->v_quad;
-
- mask = qlmasks[size(t)];
- ovfl = 0;
-
- switch (tn->tn_op) {
- case UPLUS:
- q = sl;
- break;
- case UMINUS:
- q = -sl;
- if (msb(q, t, -1) == msb(sl, t, -1))
- ovfl = 1;
- break;
- case COMPL:
- q = ~sl;
- break;
- case MULT:
- if (utyp) {
- q = ul * ur;
- if (q != (q & mask))
- ovfl = 1;
- else if ((ul != 0) && ((q / ul) != ur))
- ovfl = 1;
- } else {
- q = sl * sr;
- if (msb(q, t, -1) != (msb(sl, t, -1) ^ msb(sr, t, -1)))
- ovfl = 1;
- }
- break;
- case DIV:
- if (sr == 0) {
- /* division by 0 */
- error(139);
- q = utyp ? UQUAD_MAX : QUAD_MAX;
- } else {
- q = utyp ? ul / ur : sl / sr;
- }
- break;
- case MOD:
- if (sr == 0) {
- /* modulus by 0 */
- error(140);
- q = 0;
- } else {
- q = utyp ? ul % ur : sl % sr;
- }
- break;
- case PLUS:
- q = utyp ? ul + ur : sl + sr;
- if (msb(sl, t, -1) != 0 && msb(sr, t, -1) != 0) {
- if (msb(q, t, -1) == 0)
- ovfl = 1;
- } else if (msb(sl, t, -1) == 0 && msb(sr, t, -1) == 0) {
- if (msb(q, t, -1) != 0)
- ovfl = 1;
- }
- break;
- case MINUS:
- q = utyp ? ul - ur : sl - sr;
- if (msb(sl, t, -1) != 0 && msb(sr, t, -1) == 0) {
- if (msb(q, t, -1) == 0)
- ovfl = 1;
- } else if (msb(sl, t, -1) == 0 && msb(sr, t, -1) != 0) {
- if (msb(q, t, -1) != 0)
- ovfl = 1;
- }
- break;
- case SHL:
- q = utyp ? ul << sr : sl << sr;
- break;
- case SHR:
- /*
- * The sign must be explicitly extended because
- * shifts of signed values are implementation dependent.
- */
- q = ul >> sr;
- q = xsign(q, t, size(t) - (int)sr);
- break;
- case LT:
- q = utyp ? ul < ur : sl < sr;
- break;
- case LE:
- q = utyp ? ul <= ur : sl <= sr;
- break;
- case GE:
- q = utyp ? ul >= ur : sl >= sr;
- break;
- case GT:
- q = utyp ? ul > ur : sl > sr;
- break;
- case EQ:
- q = utyp ? ul == ur : sl == sr;
- break;
- case NE:
- q = utyp ? ul != ur : sl != sr;
- break;
- case AND:
- q = utyp ? ul & ur : sl & sr;
- break;
- case XOR:
- q = utyp ? ul ^ ur : sl ^ sr;
- break;
- case OR:
- q = utyp ? ul | ur : sl | sr;
- break;
- default:
- LERROR("fold()");
- }
-
- /* XXX does not work for quads. */
- if (ovfl || ((q | mask) != ~(uint64_t)0 && (q & ~mask) != 0)) {
- if (hflag)
- /* integer overflow detected, op %s */
- warning(141, modtab[tn->tn_op].m_name);
- }
-
- v->v_quad = xsign(q, t, -1);
-
- cn = getcnode(tn->tn_type, v);
-
- return (cn);
-}
-
-/*
- * Same for operators whose operands are compared with 0 (test context).
- */
-static tnode_t *
-foldtst(tnode_t *tn)
-{
- int l, r = 0;
- val_t *v;
-
- if ((v = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- v->v_tspec = tn->tn_type->t_tspec;
- if (tn->tn_type->t_tspec != INT)
- LERROR("foldtst()");
-
- if (isftyp(tn->tn_left->tn_type->t_tspec)) {
- l = tn->tn_left->tn_val->v_ldbl != 0.0;
- } else {
- l = tn->tn_left->tn_val->v_quad != 0;
- }
-
- if (modtab[tn->tn_op].m_binary) {
- if (isftyp(tn->tn_right->tn_type->t_tspec)) {
- r = tn->tn_right->tn_val->v_ldbl != 0.0;
- } else {
- r = tn->tn_right->tn_val->v_quad != 0;
- }
- }
-
- switch (tn->tn_op) {
- case NOT:
- if (hflag)
- /* constant argument to NOT */
- warning(239);
- v->v_quad = !l;
- break;
- case LOGAND:
- v->v_quad = l && r;
- break;
- case LOGOR:
- v->v_quad = l || r;
- break;
- default:
- LERROR("foldtst()");
- }
-
- return (getcnode(tn->tn_type, v));
-}
-
-/*
- * Same for operands with floating point type.
- */
-static tnode_t *
-foldflt(tnode_t *tn)
-{
- val_t *v;
- tspec_t t;
- ldbl_t l, r = 0;
-
- if ((v = calloc(1, sizeof (val_t))) == NULL)
- nomem();
- v->v_tspec = t = tn->tn_type->t_tspec;
-
- if (!isftyp(t))
- LERROR("foldflt()");
-
- if (t != tn->tn_left->tn_type->t_tspec)
- LERROR("foldflt()");
- if (modtab[tn->tn_op].m_binary && t != tn->tn_right->tn_type->t_tspec)
- LERROR("foldflt()");
-
- l = tn->tn_left->tn_val->v_ldbl;
- if (modtab[tn->tn_op].m_binary)
- r = tn->tn_right->tn_val->v_ldbl;
-
- switch (tn->tn_op) {
- case UPLUS:
- v->v_ldbl = l;
- break;
- case UMINUS:
- v->v_ldbl = -l;
- break;
- case MULT:
- v->v_ldbl = l * r;
- break;
- case DIV:
- if (r == 0.0) {
- /* division by 0 */
- error(139);
- if (t == FLOAT) {
- v->v_ldbl = l < 0 ? -FLT_MAX : FLT_MAX;
- } else if (t == DOUBLE) {
- v->v_ldbl = l < 0 ? -DBL_MAX : DBL_MAX;
- } else {
- v->v_ldbl = l < 0 ? -LDBL_MAX : LDBL_MAX;
- }
- } else {
- v->v_ldbl = l / r;
- }
- break;
- case PLUS:
- v->v_ldbl = l + r;
- break;
- case MINUS:
- v->v_ldbl = l - r;
- break;
- case LT:
- v->v_quad = l < r;
- break;
- case LE:
- v->v_quad = l <= r;
- break;
- case GE:
- v->v_quad = l >= r;
- break;
- case GT:
- v->v_quad = l > r;
- break;
- case EQ:
- v->v_quad = l == r;
- break;
- case NE:
- v->v_quad = l != r;
- break;
- default:
- LERROR("foldflt()");
- }
-
- if (isnan((double)v->v_ldbl))
- LERROR("foldflt()");
- if (!finite((double)v->v_ldbl) ||
- (t == FLOAT &&
- (v->v_ldbl > FLT_MAX || v->v_ldbl < -FLT_MAX)) ||
- (t == DOUBLE &&
- (v->v_ldbl > DBL_MAX || v->v_ldbl < -DBL_MAX))) {
- /* floating point overflow detected, op %s */
- warning(142, modtab[tn->tn_op].m_name);
- if (t == FLOAT) {
- v->v_ldbl = v->v_ldbl < 0 ? -FLT_MAX : FLT_MAX;
- } else if (t == DOUBLE) {
- v->v_ldbl = v->v_ldbl < 0 ? -DBL_MAX : DBL_MAX;
- } else {
- v->v_ldbl = v->v_ldbl < 0 ? -LDBL_MAX: LDBL_MAX;
- }
- }
-
- return (getcnode(tn->tn_type, v));
-}
-
-/*
- * Create a constant node for sizeof.
- */
-tnode_t *
-bldszof(type_t *tp)
-{
- int elem, elsz;
- tspec_t st;
-
- elem = 1;
- while (tp->t_tspec == ARRAY) {
- elem *= tp->t_dim;
- tp = tp->t_subt;
- }
- if (elem == 0) {
- /* cannot take size of incomplete type */
- error(143);
- elem = 1;
- }
- switch (tp->t_tspec) {
- case FUNC:
- /* cannot take size of function */
- error(144);
- elsz = 1;
- break;
- case STRUCT:
- case UNION:
- if (incompl(tp)) {
- /* cannot take size of incomplete type */
- error(143);
- elsz = 1;
- } else {
- elsz = tp->t_str->size;
- }
- break;
- case ENUM:
- if (incompl(tp)) {
- /* cannot take size of incomplete type */
- warning(143);
- }
- /* FALLTHROUGH */
- default:
- if (tp->t_isfield) {
- /* cannot take size of bit-field */
- error(145);
- }
- if (tp->t_tspec == VOID) {
- /* cannot take size of void */
- error(146);
- elsz = 1;
- } else {
- elsz = size(tp->t_tspec);
- if (elsz <= 0)
- LERROR("bldszof()");
- }
- break;
- }
-
-#if SIZEOF_IS_ULONG
- st = ULONG;
-#else
- st = UINT;
-#endif
-
- return (getinode(st, (int64_t)(elem * elsz / CHAR_BIT)));
-}
-
-/*
- * Type casts.
- */
-tnode_t *
-cast(tnode_t *tn, type_t *tp)
-{
- tspec_t nt, ot;
-
- if (tn == NULL)
- return (NULL);
-
- tn = cconv(tn);
-
- nt = tp->t_tspec;
- ot = tn->tn_type->t_tspec;
-
- if (nt == VOID) {
- /*
- * XXX ANSI C requires scalar types or void (Plauger&Brodie).
- * But this seams really questionable.
- */
- } else if (nt == STRUCT || nt == UNION || nt == ARRAY || nt == FUNC) {
- /* invalid cast expression */
- error(147);
- return (NULL);
- } else if (ot == STRUCT || ot == UNION) {
- /* invalid cast expression */
- error(147);
- return (NULL);
- } else if (ot == VOID) {
- /* improper cast of void expression */
- error(148);
- return (NULL);
- } else if (isityp(nt) && issclt(ot)) {
- /* ok */
- } else if (isftyp(nt) && isatyp(ot)) {
- /* ok */
- } else if (nt == PTR && isityp(ot)) {
- /* ok */
- } else if (nt == PTR && ot == PTR) {
- if (!tp->t_subt->t_const && tn->tn_type->t_subt->t_const) {
- if (hflag)
- /* cast discards 'const' from ... */
- warning(275);
- }
- } else {
- /* invalid cast expression */
- error(147);
- return (NULL);
- }
-
- tn = convert(CVT, 0, tp, tn);
- tn->tn_cast = 1;
-
- return (tn);
-}
-
-/*
- * Create the node for a function argument.
- * All necessary conversions and type checks are done in funccall(), because
- * in funcarg() we have no information about expected argument types.
- */
-tnode_t *
-funcarg(tnode_t *args, tnode_t *arg)
-{
- tnode_t *ntn;
-
- /*
- * If there was a serious error in the expression for the argument,
- * create a dummy argument so the positions of the remaining arguments
- * will not change.
- */
- if (arg == NULL)
- arg = getinode(INT, (int64_t)0);
-
- ntn = mktnode(PUSH, arg->tn_type, arg, args);
-
- return (ntn);
-}
-
-/*
- * Create the node for a function call. Also check types of
- * function arguments and insert conversions, if necessary.
- */
-tnode_t *
-funccall(tnode_t *func, tnode_t *args)
-{
- tnode_t *ntn;
- op_t fcop;
-
- if (func == NULL)
- return (NULL);
-
- if (func->tn_op == NAME && func->tn_type->t_tspec == FUNC) {
- fcop = CALL;
- } else {
- fcop = ICALL;
- }
-
- /*
- * after cconv() func will always be a pointer to a function
- * if it is a valid function designator.
- */
- func = cconv(func);
-
- if (func->tn_type->t_tspec != PTR ||
- func->tn_type->t_subt->t_tspec != FUNC) {
- /* illegal function */
- error(149);
- return (NULL);
- }
-
- args = chkfarg(func->tn_type->t_subt, args);
-
- ntn = mktnode(fcop, func->tn_type->t_subt->t_subt, func, args);
-
- return (ntn);
-}
-
-/*
- * Check types of all function arguments and insert conversions,
- * if necessary.
- */
-static tnode_t *
-chkfarg(type_t *ftp, tnode_t *args)
-{
- tnode_t *arg;
- sym_t *asym;
- tspec_t at;
- int narg, npar, n, i;
-
- /* get # of args in the prototype */
- npar = 0;
- for (asym = ftp->t_args; asym != NULL; asym = asym->s_nxt)
- npar++;
-
- /* get # of args in function call */
- narg = 0;
- for (arg = args; arg != NULL; arg = arg->tn_right)
- narg++;
-
- asym = ftp->t_args;
- if (ftp->t_proto && npar != narg && !(ftp->t_vararg && npar < narg)) {
- /* argument mismatch: %d arg%s passed, %d expected */
- error(150, narg, narg > 1 ? "s" : "", npar);
- asym = NULL;
- }
-
- for (n = 1; n <= narg; n++) {
-
- /*
- * The rightmost argument is at the top of the argument
- * subtree.
- */
- for (i = narg, arg = args; i > n; i--, arg = arg->tn_right)
- continue;
-
- /* some things which are always not allowd */
- if ((at = arg->tn_left->tn_type->t_tspec) == VOID) {
- /* void expressions may not be arguments, arg #%d */
- error(151, n);
- return (NULL);
- } else if ((at == STRUCT || at == UNION) &&
- incompl(arg->tn_left->tn_type)) {
- /* argument cannot have unknown size, arg #%d */
- error(152, n);
- return (NULL);
- } else if (isityp(at) && arg->tn_left->tn_type->t_isenum &&
- incompl(arg->tn_left->tn_type)) {
- /* argument cannot have unknown size, arg #%d */
- warning(152, n);
- }
-
- /* class conversions (arg in value context) */
- arg->tn_left = cconv(arg->tn_left);
-
- if (asym != NULL) {
- arg->tn_left = parg(n, asym->s_type, arg->tn_left);
- } else {
- arg->tn_left = promote(NOOP, 1, arg->tn_left);
- }
- arg->tn_type = arg->tn_left->tn_type;
-
- if (asym != NULL)
- asym = asym->s_nxt;
- }
-
- return (args);
-}
-
-/*
- * Compare the type of an argument with the corresponding type of a
- * prototype parameter. If it is a valid combination, but both types
- * are not the same, insert a conversion to convert the argument into
- * the type of the parameter.
- */
-static tnode_t *
-parg( int n, /* pos of arg */
- type_t *tp, /* expected type (from prototype) */
- tnode_t *tn) /* argument */
-{
- tnode_t *ln;
- int warn;
-
- if ((ln = calloc(1, sizeof (tnode_t))) == NULL)
- nomem();
- ln->tn_type = tduptyp(tp);
- ln->tn_type->t_const = 0;
- ln->tn_lvalue = 1;
- if (typeok(FARG, n, ln, tn)) {
- if (!eqtype(tp, tn->tn_type, 1, 0, (warn = 0, &warn)) || warn)
- tn = convert(FARG, n, tp, tn);
- }
- free(ln);
- return (tn);
-}
-
-/*
- * Return the value of an integral constant expression.
- * If the expression is not constant or its type is not an integer
- * type, an error message is printed.
- */
-val_t *
-constant(tnode_t *tn, int required)
-{
- val_t *v;
-
- if (tn != NULL)
- tn = cconv(tn);
- if (tn != NULL)
- tn = promote(NOOP, 0, tn);
-
- if ((v = calloc(1, sizeof (val_t))) == NULL)
- nomem();
-
- if (tn == NULL) {
- if (nerr == 0)
- LERROR("constant()");
- v->v_tspec = INT;
- v->v_quad = 1;
- return (v);
- }
-
- v->v_tspec = tn->tn_type->t_tspec;
-
- if (tn->tn_op == CON) {
- if (tn->tn_type->t_tspec != tn->tn_val->v_tspec)
- LERROR("constant()");
- if (isityp(tn->tn_val->v_tspec)) {
- v->v_ansiu = tn->tn_val->v_ansiu;
- v->v_quad = tn->tn_val->v_quad;
- return (v);
- }
- v->v_quad = tn->tn_val->v_ldbl;
- } else {
- v->v_quad = 1;
- }
-
- /* integral constant expression expected */
- if (required)
- error(55);
- else
- c99ism(318);
-
- if (!isityp(v->v_tspec))
- v->v_tspec = INT;
-
- return (v);
-}
-
-/*
- * Perform some tests on expressions which can't be done in build() and
- * functions called by build(). These tests must be done here because
- * we need some information about the context in which the operations
- * are performed.
- * After all tests are performed, expr() frees the memory which is used
- * for the expression.
- */
-void
-expr(tnode_t *tn, int vctx, int tctx, int freeblk)
-{
-
- if (tn == NULL && nerr == 0)
- LERROR("expr()");
-
- if (tn == NULL) {
- tfreeblk();
- return;
- }
-
- /* expr() is also called in global initialisations */
- if (dcs->d_ctx != EXTERN)
- chkreach();
-
- chkmisc(tn, vctx, tctx, !tctx, 0, 0, 0);
- if (tn->tn_op == ASSIGN) {
- if (hflag && tctx)
- /* assignment in conditional context */
- warning(159);
- } else if (tn->tn_op == CON) {
- if (hflag && tctx && !ccflg)
- /* constant in conditional context */
- warning(161);
- }
- if (!modtab[tn->tn_op].m_sideeff) {
- /*
- * for left operands of COMMA this warning is already
- * printed
- */
- if (tn->tn_op != COMMA && !vctx && !tctx)
- nulleff(tn);
- }
- if (dflag)
- displexpr(tn, 0);
-
- /* free the tree memory */
- if (freeblk)
- tfreeblk();
-}
-
-static void
-nulleff(tnode_t *tn)
-{
-
- if (!hflag)
- return;
-
- while (!modtab[tn->tn_op].m_sideeff) {
- if (tn->tn_op == CVT && tn->tn_type->t_tspec == VOID) {
- tn = tn->tn_left;
- } else if (tn->tn_op == LOGAND || tn->tn_op == LOGOR) {
- /*
- * && and || have a side effect if the right operand
- * has a side effect.
- */
- tn = tn->tn_right;
- } else if (tn->tn_op == QUEST) {
- /*
- * ? has a side effect if at least one of its right
- * operands has a side effect
- */
- tn = tn->tn_right;
- } else if (tn->tn_op == COLON || tn->tn_op == COMMA) {
- /*
- * : has a side effect if at least one of its operands
- * has a side effect
- */
- if (modtab[tn->tn_left->tn_op].m_sideeff) {
- tn = tn->tn_left;
- } else if (modtab[tn->tn_right->tn_op].m_sideeff) {
- tn = tn->tn_right;
- } else {
- break;
- }
- } else {
- break;
- }
- }
- if (!modtab[tn->tn_op].m_sideeff)
- /* expression has null effect */
- warning(129);
-}
-
-/*
- * Dump an expression to stdout
- * only used for debugging
- */
-static void
-displexpr(tnode_t *tn, int offs)
-{
- uint64_t uq;
-
- if (tn == NULL) {
- (void)printf("%*s%s\n", offs, "", "NULL");
- return;
- }
- (void)printf("%*sop %s ", offs, "", modtab[tn->tn_op].m_name);
-
- if (tn->tn_op == NAME) {
- (void)printf("%s: %s ",
- tn->tn_sym->s_name, scltoa(tn->tn_sym->s_scl));
- } else if (tn->tn_op == CON && isftyp(tn->tn_type->t_tspec)) {
- (void)printf("%#g ", (double)tn->tn_val->v_ldbl);
- } else if (tn->tn_op == CON && isityp(tn->tn_type->t_tspec)) {
- uq = tn->tn_val->v_quad;
- (void)printf("0x %08lx %08lx ", (long)(uq >> 32) & 0xffffffffl,
- (long)uq & 0xffffffffl);
- } else if (tn->tn_op == CON) {
- if (tn->tn_type->t_tspec != PTR)
- LERROR("displexpr()");
- (void)printf("0x%0*lx ", (int)(sizeof (void *) * CHAR_BIT / 4),
- (u_long)tn->tn_val->v_quad);
- } else if (tn->tn_op == STRING) {
- if (tn->tn_strg->st_tspec == CHAR) {
- (void)printf("\"%s\"", tn->tn_strg->st_cp);
- } else {
- char *s;
- size_t n;
- n = MB_CUR_MAX * (tn->tn_strg->st_len + 1);
- if ((s = malloc(n)) == NULL)
- nomem();
- (void)wcstombs(s, tn->tn_strg->st_wcp, n);
- (void)printf("L\"%s\"", s);
- free(s);
- }
- (void)printf(" ");
- } else if (tn->tn_op == FSEL) {
- (void)printf("o=%d, l=%d ", tn->tn_type->t_foffs,
- tn->tn_type->t_flen);
- }
- (void)printf("%s\n", ttos(tn->tn_type));
- if (tn->tn_op == NAME || tn->tn_op == CON || tn->tn_op == STRING)
- return;
- displexpr(tn->tn_left, offs + 2);
- if (modtab[tn->tn_op].m_binary ||
- (tn->tn_op == PUSH && tn->tn_right != NULL)) {
- displexpr(tn->tn_right, offs + 2);
- }
-}
-
-/*
- * Called by expr() to recursively perform some tests.
- */
-/* ARGSUSED */
-void
-chkmisc(tnode_t *tn, int vctx, int tctx, int eqwarn, int fcall, int rvdisc,
- int szof)
-{
- tnode_t *ln, *rn;
- mod_t *mp;
- int nrvdisc, cvctx, ctctx;
- op_t op;
- scl_t sc;
- dinfo_t *di;
-
- if (tn == NULL)
- return;
-
- ln = tn->tn_left;
- rn = tn->tn_right;
- mp = &modtab[op = tn->tn_op];
-
- switch (op) {
- case AMPER:
- if (ln->tn_op == NAME && (reached || rchflg)) {
- if (!szof)
- setsflg(ln->tn_sym);
- setuflg(ln->tn_sym, fcall, szof);
- }
- if (ln->tn_op == STAR && ln->tn_left->tn_op == PLUS)
- /* check the range of array indices */
- chkaidx(ln->tn_left, 1);
- break;
- case LOAD:
- if (ln->tn_op == STAR && ln->tn_left->tn_op == PLUS)
- /* check the range of array indices */
- chkaidx(ln->tn_left, 0);
- /* FALLTHROUGH */
- case PUSH:
- case INCBEF:
- case DECBEF:
- case INCAFT:
- case DECAFT:
- case ADDASS:
- case SUBASS:
- case MULASS:
- case DIVASS:
- case MODASS:
- case ANDASS:
- case ORASS:
- case XORASS:
- case SHLASS:
- case SHRASS:
- if (ln->tn_op == NAME && (reached || rchflg)) {
- sc = ln->tn_sym->s_scl;
- /*
- * Look if there was an asm statement in one of the
- * compound statements we are in. If not, we don't
- * print a warning.
- */
- for (di = dcs; di != NULL; di = di->d_nxt) {
- if (di->d_asm)
- break;
- }
- if (sc != EXTERN && sc != STATIC &&
- !ln->tn_sym->s_set && !szof && di == NULL) {
- /* %s may be used before set */
- warning(158, ln->tn_sym->s_name);
- setsflg(ln->tn_sym);
- }
- setuflg(ln->tn_sym, 0, 0);
- }
- break;
- case ASSIGN:
- if (ln->tn_op == NAME && !szof && (reached || rchflg)) {
- setsflg(ln->tn_sym);
- if (ln->tn_sym->s_scl == EXTERN)
- outusg(ln->tn_sym);
- }
- if (ln->tn_op == STAR && ln->tn_left->tn_op == PLUS)
- /* check the range of array indices */
- chkaidx(ln->tn_left, 0);
- break;
- case CALL:
- if (ln->tn_op != AMPER || ln->tn_left->tn_op != NAME)
- LERROR("chkmisc()");
- if (!szof)
- outcall(tn, vctx || tctx, rvdisc);
- break;
- case EQ:
- /* equality operator "==" found where "=" was exp. */
- if (hflag && eqwarn)
- warning(160);
- break;
- case CON:
- case NAME:
- case STRING:
- return;
- /* LINTED (enumeration values not handled in switch) */
- case OR:
- case XOR:
- case NE:
- case GE:
- case GT:
- case LE:
- case LT:
- case SHR:
- case SHL:
- case MINUS:
- case PLUS:
- case MOD:
- case DIV:
- case MULT:
- case STAR:
- case UMINUS:
- case UPLUS:
- case DEC:
- case INC:
- case COMPL:
- case NOT:
- case POINT:
- case ARROW:
- case NOOP:
- case AND:
- case FARG:
- case CASE:
- case INIT:
- case RETURN:
- case ICALL:
- case CVT:
- case COMMA:
- case FSEL:
- case COLON:
- case QUEST:
- case LOGOR:
- case LOGAND:
- break;
- }
-
- cvctx = mp->m_vctx;
- ctctx = mp->m_tctx;
- /*
- * values of operands of ':' are not used if the type of at least
- * one of the operands (for gcc compatibility) is void
- * XXX test/value context of QUEST should probably be used as
- * context for both operands of COLON
- */
- if (op == COLON && tn->tn_type->t_tspec == VOID)
- cvctx = ctctx = 0;
- nrvdisc = op == CVT && tn->tn_type->t_tspec == VOID;
- chkmisc(ln, cvctx, ctctx, mp->m_eqwarn, op == CALL, nrvdisc, szof);
-
- switch (op) {
- case PUSH:
- if (rn != NULL)
- chkmisc(rn, 0, 0, mp->m_eqwarn, 0, 0, szof);
- break;
- case LOGAND:
- case LOGOR:
- chkmisc(rn, 0, 1, mp->m_eqwarn, 0, 0, szof);
- break;
- case COLON:
- chkmisc(rn, cvctx, ctctx, mp->m_eqwarn, 0, 0, szof);
- break;
- case COMMA:
- chkmisc(rn, vctx, tctx, mp->m_eqwarn, 0, 0, szof);
- break;
- default:
- if (mp->m_binary)
- chkmisc(rn, 1, 0, mp->m_eqwarn, 0, 0, szof);
- break;
- }
-
-}
-
-/*
- * Checks the range of array indices, if possible.
- * amper is set if only the address of the element is used. This
- * means that the index is allowed to refer to the first element
- * after the array.
- */
-static void
-chkaidx(tnode_t *tn, int amper)
-{
- int dim;
- tnode_t *ln, *rn;
- int elsz;
- int64_t con;
-
- ln = tn->tn_left;
- rn = tn->tn_right;
-
- /* We can only check constant indices. */
- if (rn->tn_op != CON)
- return;
-
- /* Return if the left node does not stem from an array. */
- if (ln->tn_op != AMPER)
- return;
- if (ln->tn_left->tn_op != STRING && ln->tn_left->tn_op != NAME)
- return;
- if (ln->tn_left->tn_type->t_tspec != ARRAY)
- return;
-
- /*
- * For incomplete array types, we can print a warning only if
- * the index is negative.
- */
- if (incompl(ln->tn_left->tn_type) && rn->tn_val->v_quad >= 0)
- return;
-
- /* Get the size of one array element */
- if ((elsz = length(ln->tn_type->t_subt, NULL)) == 0)
- return;
- elsz /= CHAR_BIT;
-
- /* Change the unit of the index from bytes to element size. */
- if (isutyp(rn->tn_type->t_tspec)) {
- con = (uint64_t)rn->tn_val->v_quad / elsz;
- } else {
- con = rn->tn_val->v_quad / elsz;
- }
-
- dim = ln->tn_left->tn_type->t_dim + (amper ? 1 : 0);
-
- if (!isutyp(rn->tn_type->t_tspec) && con < 0) {
- /* array subscript cannot be negative: %ld */
- warning(167, (long)con);
- } else if (dim > 0 && (uint64_t)con >= dim) {
- /* array subscript cannot be > %d: %ld */
- warning(168, dim - 1, (long)con);
- }
-}
-
-/*
- * Check for ordered comparisons of unsigned values with 0.
- */
-static void
-chkcomp(op_t op, tnode_t *ln, tnode_t *rn)
-{
- char buf[64];
- tspec_t lt, rt;
- mod_t *mp;
-
- lt = ln->tn_type->t_tspec;
- rt = rn->tn_type->t_tspec;
- mp = &modtab[op];
-
- if (ln->tn_op != CON && rn->tn_op != CON)
- return;
-
- if (!isityp(lt) || !isityp(rt))
- return;
-
- if ((hflag || pflag) && lt == CHAR && rn->tn_op == CON &&
- (rn->tn_val->v_quad < 0 ||
- rn->tn_val->v_quad > ~(~0 << (CHAR_BIT - 1)))) {
- /* nonportable character comparison, op %s */
- warning(230, mp->m_name);
- return;
- }
- if ((hflag || pflag) && rt == CHAR && ln->tn_op == CON &&
- (ln->tn_val->v_quad < 0 ||
- ln->tn_val->v_quad > ~(~0 << (CHAR_BIT - 1)))) {
- /* nonportable character comparison, op %s */
- warning(230, mp->m_name);
- return;
- }
- if (isutyp(lt) && !isutyp(rt) &&
- rn->tn_op == CON && rn->tn_val->v_quad <= 0) {
- if (rn->tn_val->v_quad < 0) {
- /* comparison of %s with %s, op %s */
- warning(162, tyname(buf, sizeof(buf), ln->tn_type),
- "negative constant", mp->m_name);
- } else if (op == LT || op == GE || (hflag && op == LE)) {
- /* comparison of %s with %s, op %s */
- warning(162, tyname(buf, sizeof(buf), ln->tn_type),
- "0", mp->m_name);
- }
- return;
- }
- if (isutyp(rt) && !isutyp(lt) &&
- ln->tn_op == CON && ln->tn_val->v_quad <= 0) {
- if (ln->tn_val->v_quad < 0) {
- /* comparison of %s with %s, op %s */
- warning(162, "negative constant",
- tyname(buf, sizeof(buf), rn->tn_type), mp->m_name);
- } else if (op == GT || op == LE || (hflag && op == GE)) {
- /* comparison of %s with %s, op %s */
- warning(162, "0", tyname(buf, sizeof(buf), rn->tn_type),
- mp->m_name);
- }
- return;
- }
-}
-
-/*
- * Takes an expression and returns 0 if this expression can be used
- * for static initialisation, otherwise -1.
- *
- * Constant initialisation expressions must be constant or an address
- * of a static object with an optional offset. In the first case,
- * the result is returned in *offsp. In the second case, the static
- * object is returned in *symp and the offset in *offsp.
- *
- * The expression can consist of PLUS, MINUS, AMPER, NAME, STRING and
- * CON. Type conversions are allowed if they do not change binary
- * representation (including width).
- */
-int
-conaddr(tnode_t *tn, sym_t **symp, ptrdiff_t *offsp)
-{
- sym_t *sym;
- ptrdiff_t offs1, offs2;
- tspec_t t, ot;
-
- switch (tn->tn_op) {
- case MINUS:
- if (tn->tn_right->tn_op == CVT)
- return conaddr(tn->tn_right, symp, offsp);
- else if (tn->tn_right->tn_op != CON)
- return (-1);
- /* FALLTHROUGH */
- case PLUS:
- offs1 = offs2 = 0;
- if (tn->tn_left->tn_op == CON) {
- offs1 = (ptrdiff_t)tn->tn_left->tn_val->v_quad;
- if (conaddr(tn->tn_right, &sym, &offs2) == -1)
- return (-1);
- } else if (tn->tn_right->tn_op == CON) {
- offs2 = (ptrdiff_t)tn->tn_right->tn_val->v_quad;
- if (tn->tn_op == MINUS)
- offs2 = -offs2;
- if (conaddr(tn->tn_left, &sym, &offs1) == -1)
- return (-1);
- } else {
- return (-1);
- }
- *symp = sym;
- *offsp = offs1 + offs2;
- break;
- case AMPER:
- if (tn->tn_left->tn_op == NAME) {
- *symp = tn->tn_left->tn_sym;
- *offsp = 0;
- } else if (tn->tn_left->tn_op == STRING) {
- /*
- * If this would be the front end of a compiler we
- * would return a label instead of 0.
- */
- *offsp = 0;
- }
- break;
- case CVT:
- t = tn->tn_type->t_tspec;
- ot = tn->tn_left->tn_type->t_tspec;
- if ((!isityp(t) && t != PTR) || (!isityp(ot) && ot != PTR))
- return (-1);
- else if (psize(t) != psize(ot)) {
- return (-1);
- }
- if (conaddr(tn->tn_left, symp, offsp) == -1)
- return (-1);
- break;
- default:
- return (-1);
- }
- return (0);
-}
-
-/*
- * Concatenate two string constants.
- */
-strg_t *
-catstrg(strg_t *strg1, strg_t *strg2)
-{
- size_t len1, len2, len;
-
- if (strg1->st_tspec != strg2->st_tspec) {
- /* cannot concatenate wide and regular string literals */
- error(292);
- return (strg1);
- }
-
- len = (len1 = strg1->st_len) + (len2 = strg2->st_len);
-
- if (strg1->st_tspec == CHAR) {
- if ((strg1->st_cp = realloc(strg1->st_cp, len + 1)) == NULL)
- nomem();
- (void)memcpy(strg1->st_cp + len1, strg2->st_cp, len2 + 1);
- free(strg2->st_cp);
- } else {
- if ((strg1->st_wcp = realloc(strg1->st_wcp, (len + 1) *
- sizeof (wchar_t))) == NULL)
- nomem();
- (void)memcpy(strg1->st_wcp + len1, strg2->st_wcp,
- (len2 + 1) * sizeof (wchar_t));
- free(strg2->st_wcp);
- }
- strg1->st_len = len;
- free(strg2);
-
- return (strg1);
-}
-
-/*
- * Print a warning if the given node has operands which should be
- * parenthesized.
- *
- * XXX Does not work if an operand is a constant expression. Constant
- * expressions are already folded.
- */
-static void
-precconf(tnode_t *tn)
-{
- tnode_t *ln, *rn;
- op_t lop, rop = NOOP;
- int lparn, rparn = 0;
- mod_t *mp;
- int warn;
-
- if (!hflag)
- return;
-
- mp = &modtab[tn->tn_op];
-
- lparn = 0;
- for (ln = tn->tn_left; ln->tn_op == CVT; ln = ln->tn_left)
- lparn |= ln->tn_parn;
- lparn |= ln->tn_parn;
- lop = ln->tn_op;
-
- if (mp->m_binary) {
- rparn = 0;
- for (rn = tn->tn_right; tn->tn_op == CVT; rn = rn->tn_left)
- rparn |= rn->tn_parn;
- rparn |= rn->tn_parn;
- rop = rn->tn_op;
- }
-
- warn = 0;
-
- switch (tn->tn_op) {
- case SHL:
- case SHR:
- if (!lparn && (lop == PLUS || lop == MINUS)) {
- warn = 1;
- } else if (!rparn && (rop == PLUS || rop == MINUS)) {
- warn = 1;
- }
- break;
- case LOGOR:
- if (!lparn && lop == LOGAND) {
- warn = 1;
- } else if (!rparn && rop == LOGAND) {
- warn = 1;
- }
- break;
- case AND:
- case XOR:
- case OR:
- if (!lparn && lop != tn->tn_op) {
- if (lop == PLUS || lop == MINUS) {
- warn = 1;
- } else if (lop == AND || lop == XOR) {
- warn = 1;
- }
- }
- if (!warn && !rparn && rop != tn->tn_op) {
- if (rop == PLUS || rop == MINUS) {
- warn = 1;
- } else if (rop == AND || rop == XOR) {
- warn = 1;
- }
- }
- break;
- /* LINTED (enumeration values not handled in switch) */
- case DECAFT:
- case XORASS:
- case SHLASS:
- case NOOP:
- case ARROW:
- case ORASS:
- case POINT:
- case NAME:
- case NOT:
- case COMPL:
- case CON:
- case INC:
- case STRING:
- case DEC:
- case INCBEF:
- case DECBEF:
- case INCAFT:
- case FSEL:
- case CALL:
- case COMMA:
- case CVT:
- case ICALL:
- case LOAD:
- case PUSH:
- case RETURN:
- case INIT:
- case CASE:
- case FARG:
- case SUBASS:
- case ADDASS:
- case MODASS:
- case DIVASS:
- case MULASS:
- case ASSIGN:
- case COLON:
- case QUEST:
- case LOGAND:
- case NE:
- case EQ:
- case GE:
- case GT:
- case LE:
- case LT:
- case MINUS:
- case PLUS:
- case MOD:
- case DIV:
- case MULT:
- case AMPER:
- case STAR:
- case UMINUS:
- case SHRASS:
- case UPLUS:
- case ANDASS:
- break;
- }
-
- if (warn) {
- /* precedence confusion possible: parenthesize! */
- warning(169);
- }
-
-}
Index: usr.bin/xlint/lint2/Makefile
===================================================================
--- usr.bin/xlint/lint2/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $NetBSD: Makefile,v 1.2 1995/07/03 21:24:39 cgd Exp $
-# $FreeBSD$
-
-.PATH: ${.CURDIR}/../lint1
-
-PROG= lint2
-SRCS= main2.c hash.c read.c mem.c mem2.c chk.c msg.c emit.c emit2.c inittyp.c
-MAN=
-CFLAGS+=-I${.CURDIR}/../lint1
-LINTFLAGS=-abehrz
-
-BINDIR= ${LIBEXECDIR}
-
-.include <bsd.prog.mk>
Index: usr.bin/xlint/lint2/Makefile.depend
===================================================================
--- usr.bin/xlint/lint2/Makefile.depend
+++ /dev/null
@@ -1,17 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: usr.bin/xlint/lint2/chk.c
===================================================================
--- usr.bin/xlint/lint2/chk.c
+++ /dev/null
@@ -1,1350 +0,0 @@
-/* $NetBSD: chk.c,v 1.15 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: chk.c,v 1.15 2002/01/21 19:49:52 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <stdlib.h>
-
-#include "lint2.h"
-
-static void chkund(hte_t *);
-static void chkdnu(hte_t *);
-static void chkdnud(hte_t *);
-static void chkmd(hte_t *);
-static void chkvtui(hte_t *, sym_t *, sym_t *);
-static void chkvtdi(hte_t *, sym_t *, sym_t *);
-static void chkfaui(hte_t *, sym_t *, sym_t *);
-static void chkau(hte_t *, int, sym_t *, sym_t *, pos_t *,
- fcall_t *, fcall_t *, type_t *, type_t *);
-static void chkrvu(hte_t *, sym_t *);
-static void chkadecl(hte_t *, sym_t *, sym_t *);
-static void printflike(hte_t *,fcall_t *, int, const char *, type_t **);
-static void scanflike(hte_t *, fcall_t *, int, const char *, type_t **);
-static void badfmt(hte_t *, fcall_t *);
-static void inconarg(hte_t *, fcall_t *, int);
-static void tofewarg(hte_t *, fcall_t *);
-static void tomanyarg(hte_t *, fcall_t *);
-static int eqtype(type_t *, type_t *, int, int, int, int *);
-static int eqargs(type_t *, type_t *, int *);
-static int mnoarg(type_t *, int *);
-
-
-/*
- * If there is a symbol named "main", mark it as used.
- */
-void
-mainused(void)
-{
- hte_t *hte;
-
- if ((hte = hsearch("main", 0)) != NULL)
- hte->h_used = 1;
-}
-
-/*
- * Performs all tests for a single name
- */
-void
-chkname(hte_t *hte)
-{
- sym_t *sym, *def, *pdecl, *decl;
-
- if (uflag) {
- chkund(hte);
- chkdnu(hte);
- if (xflag)
- chkdnud(hte);
- }
- chkmd(hte);
-
- /* Get definition, prototype declaration and declaration */
- def = pdecl = decl = NULL;
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (def == NULL && (sym->s_def == DEF || sym->s_def == TDEF))
- def = sym;
- if (pdecl == NULL && sym->s_def == DECL &&
- TP(sym->s_type)->t_tspec == FUNC &&
- TP(sym->s_type)->t_proto) {
- pdecl = sym;
- }
- if (decl == NULL && sym->s_def == DECL)
- decl = sym;
- }
-
- /* A prototype is better than an old style declaration. */
- if (pdecl != NULL)
- decl = pdecl;
-
- chkvtui(hte, def, decl);
-
- chkvtdi(hte, def, decl);
-
- chkfaui(hte, def, decl);
-
- chkrvu(hte, def);
-
- chkadecl(hte, def, decl);
-}
-
-/*
- * Print a warning if the name has been used, but not defined.
- */
-static void
-chkund(hte_t *hte)
-{
- fcall_t *fcall;
- usym_t *usym;
-
- if (!hte->h_used || hte->h_def)
- return;
-
- if ((fcall = hte->h_calls) != NULL) {
- /* %s used( %s ), but not defined */
- msg(0, hte->h_name, mkpos(&fcall->f_pos));
- } else if ((usym = hte->h_usyms) != NULL) {
- /* %s used( %s ), but not defined */
- msg(0, hte->h_name, mkpos(&usym->u_pos));
- }
-}
-
-/*
- * Print a warning if the name has been defined, but never used.
- */
-static void
-chkdnu(hte_t *hte)
-{
- sym_t *sym;
-
- if (!hte->h_def || hte->h_used)
- return;
-
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym->s_def == DEF || sym->s_def == TDEF) {
- /* %s defined( %s ), but never used */
- msg(1, hte->h_name, mkpos(&sym->s_pos));
- break;
- }
- }
-}
-
-/*
- * Print a warning if the variable has been declared, but is not used
- * or defined.
- */
-static void
-chkdnud(hte_t *hte)
-{
- sym_t *sym;
-
- if (hte->h_syms == NULL || hte->h_used || hte->h_def)
- return;
-
- sym = hte->h_syms;
- if (TP(sym->s_type)->t_tspec == FUNC)
- return;
-
- if (sym->s_def != DECL)
- errx(1, "internal error: chkdnud() 1");
- /* %s declared( %s ), but never used or defined */
- msg(2, hte->h_name, mkpos(&sym->s_pos));
-}
-
-/*
- * Print a warning if there is more than one definition for
- * this name.
- */
-static void
-chkmd(hte_t *hte)
-{
- sym_t *sym, *def1;
- char *pos1;
-
- if (!hte->h_def)
- return;
-
- def1 = NULL;
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- /*
- * ANSI C allows tentative definitions of the same name in
- * only one compilation unit.
- */
- if (sym->s_def != DEF && (!sflag || sym->s_def != TDEF))
- continue;
- if (def1 == NULL) {
- def1 = sym;
- continue;
- }
- pos1 = xstrdup(mkpos(&def1->s_pos));
- /* %s multiply defined\t%s :: %s */
- msg(3, hte->h_name, pos1, mkpos(&sym->s_pos));
- free(pos1);
- }
-}
-
-/*
- * Print a warning if the return value assumed for a function call
- * differs from the return value of the function definition or
- * function declaration.
- *
- * If no definition/declaration can be found, the assumed return values
- * are always int. So there is no need to compare with another function
- * call as it's done for function arguments.
- */
-static void
-chkvtui(hte_t *hte, sym_t *def, sym_t *decl)
-{
- fcall_t *call;
- char *pos1;
- type_t *tp1, *tp2;
- /* LINTED (automatic hides external declaration: warn) */
- int warn, eq;
- tspec_t t1;
-
- if (hte->h_calls == NULL)
- return;
-
- if (def == NULL)
- def = decl;
- if (def == NULL)
- return;
-
- t1 = (tp1 = TP(def->s_type)->t_subt)->t_tspec;
- for (call = hte->h_calls; call != NULL; call = call->f_nxt) {
- tp2 = TP(call->f_type)->t_subt;
- eq = eqtype(tp1, tp2, 1, 0, 0, (warn = 0, &warn));
- if (!call->f_rused) {
- /* no return value used */
- if ((t1 == STRUCT || t1 == UNION) && !eq) {
- /*
- * If a function returns a struct or union it
- * must be declared to return a struct or
- * union, also if the return value is ignored.
- * This is necessary because the caller must
- * allocate stack space for the return value.
- * If it does not, the return value would over-
- * write other data.
- * XXX Following massage may be confusing
- * because it appears also if the return value
- * was declared inconsistently. But this
- * behaviour matches pcc based lint, so it is
- * accepted for now.
- */
- pos1 = xstrdup(mkpos(&def->s_pos));
- /* %s value must be decl. before use %s :: %s */
- msg(17, hte->h_name,
- pos1, mkpos(&call->f_pos));
- free(pos1);
- }
- continue;
- }
- if (!eq || (sflag && warn)) {
- pos1 = xstrdup(mkpos(&def->s_pos));
- /* %s value used inconsistenty\t%s :: %s */
- msg(4, hte->h_name, pos1, mkpos(&call->f_pos));
- free(pos1);
- }
- }
-}
-
-/*
- * Print a warning if a definition/declaration does not match another
- * definition/declaration of the same name. For functions, only the
- * types of return values are tested.
- */
-static void
-chkvtdi(hte_t *hte, sym_t *def, sym_t *decl)
-{
- sym_t *sym;
- type_t *tp1, *tp2;
- /* LINTED (automatic hides external declaration: warn) */
- int eq, warn;
- char *pos1;
-
- if (def == NULL)
- def = decl;
- if (def == NULL)
- return;
-
- tp1 = TP(def->s_type);
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym == def)
- continue;
- tp2 = TP(sym->s_type);
- warn = 0;
- if (tp1->t_tspec == FUNC && tp2->t_tspec == FUNC) {
- eq = eqtype(tp1->t_subt, tp2->t_subt, 1, 0, 0, &warn);
- } else {
- eq = eqtype(tp1, tp2, 0, 0, 0, &warn);
- }
- if (!eq || (sflag && warn)) {
- pos1 = xstrdup(mkpos(&def->s_pos));
- /* %s value declared inconsistently\t%s :: %s */
- msg(5, hte->h_name, pos1, mkpos(&sym->s_pos));
- free(pos1);
- }
- }
-}
-
-/*
- * Print a warning if a function is called with arguments which does
- * not match the function definition, declaration or another call
- * of the same function.
- */
-static void
-chkfaui(hte_t *hte, sym_t *def, sym_t *decl)
-{
- type_t *tp1, *tp2, **ap1, **ap2;
- pos_t *pos1p = NULL;
- fcall_t *calls, *call, *call1;
- int n, as;
- char *pos1;
- arginf_t *ai;
-
- if ((calls = hte->h_calls) == NULL)
- return;
-
- /*
- * If we find a function definition, we use this for comparison,
- * otherwise the first prototype we can find. If there is no
- * definition or prototype declaration, the first function call
- * is used.
- */
- tp1 = NULL;
- call1 = NULL;
- if (def != NULL) {
- if ((tp1 = TP(def->s_type))->t_tspec != FUNC)
- return;
- pos1p = &def->s_pos;
- } else if (decl != NULL && TP(decl->s_type)->t_proto) {
- if ((tp1 = TP(decl->s_type))->t_tspec != FUNC)
- return;
- pos1p = &decl->s_pos;
- }
- if (tp1 == NULL) {
- call1 = calls;
- calls = calls->f_nxt;
- if ((tp1 = TP(call1->f_type))->t_tspec != FUNC)
- return;
- pos1p = &call1->f_pos;
- }
-
- n = 1;
- for (call = calls; call != NULL; call = call->f_nxt) {
- if ((tp2 = TP(call->f_type))->t_tspec != FUNC)
- continue;
- ap1 = tp1->t_args;
- ap2 = tp2->t_args;
- n = 0;
- while (*ap1 != NULL && *ap2 != NULL) {
- if (def != NULL && def->s_va && n >= def->s_nva)
- break;
- n++;
- chkau(hte, n, def, decl, pos1p, call1, call,
- *ap1, *ap2);
- ap1++;
- ap2++;
- }
- if (*ap1 == *ap2) {
- /* equal # of arguments */
- } else if (def != NULL && def->s_va && n >= def->s_nva) {
- /*
- * function definition with VARARGS; The # of
- * arguments of the call must be at least as large
- * as the parameter of VARARGS.
- */
- } else if (*ap2 != NULL && tp1->t_proto && tp1->t_vararg) {
- /*
- * prototype with ... and function call with
- * at least the same # of arguments as declared
- * in the prototype.
- */
- } else {
- pos1 = xstrdup(mkpos(pos1p));
- /* %s: variable # of args\t%s :: %s */
- msg(7, hte->h_name, pos1, mkpos(&call->f_pos));
- free(pos1);
- continue;
- }
-
- /* perform SCANFLIKE/PRINTFLIKE tests */
- if (def == NULL || (!def->s_prfl && !def->s_scfl))
- continue;
- as = def->s_prfl ? def->s_nprfl : def->s_nscfl;
- for (ai = call->f_args; ai != NULL; ai = ai->a_nxt) {
- if (ai->a_num == as)
- break;
- }
- if (ai == NULL || !ai->a_fmt)
- continue;
- if (def->s_prfl) {
- printflike(hte, call, n, ai->a_fstrg, ap2);
- } else {
- scanflike(hte, call, n, ai->a_fstrg, ap2);
- }
- }
-}
-
-/*
- * Check a single argument in a function call.
- *
- * hte a pointer to the hash table entry of the function
- * n the number of the argument (1..)
- * def the function definition or NULL
- * decl prototype declaration, old style declaration or NULL
- * pos1p position of definition, declaration of first call
- * call1 first call, if both def and decl are old style def/decl
- * call checked call
- * arg1 currently checked argument of def/decl/call1
- * arg2 currently checked argument of call
- *
- */
-static void
-chkau(hte_t *hte, int n, sym_t *def, sym_t *decl, pos_t *pos1p,
- fcall_t *call1, fcall_t *call, type_t *arg1, type_t *arg2)
-{
- /* LINTED (automatic hides external declaration: warn) */
- int promote, asgn, warn;
- tspec_t t1, t2;
- arginf_t *ai, *ai1;
- char *pos1;
-
- /*
- * If a function definition is available (def != NULL), we compare the
- * function call (call) with the definition. Otherwise, if a function
- * definition is available and it is not an old style definition
- * (decl != NULL && TP(decl->s_type)->t_proto), we compare the call
- * with this declaration. Otherwise we compare it with the first
- * call we have found (call1).
- */
-
- /* arg1 must be promoted if it stems from an old style definition */
- promote = def != NULL && def->s_osdef;
-
- /*
- * If we compare with a definition or declaration, we must perform
- * the same checks for qualifiers in indirected types as in
- * assignments.
- */
- asgn = def != NULL || (decl != NULL && TP(decl->s_type)->t_proto);
-
- warn = 0;
- if (eqtype(arg1, arg2, 1, promote, asgn, &warn) && (!sflag || !warn))
- return;
-
- /*
- * Other lint implementations print warnings as soon as the type
- * of an argument does not match exactly the expected type. The
- * result are lots of warnings which are really not necessary.
- * We print a warning only if
- * (0) at least one type is not an integer type and types differ
- * (1) hflag is set and types differ
- * (2) types differ, except in signedness
- * If the argument is an integer constant whose msb is not set,
- * signedness is ignored (e.g. 0 matches both signed and unsigned
- * int). This is with and without hflag.
- * If the argument is an integer constant with value 0 and the
- * expected argument is of type pointer and the width of the
- * integer constant is the same as the width of the pointer,
- * no warning is printed.
- */
- t1 = arg1->t_tspec;
- t2 = arg2->t_tspec;
- if (isityp(t1) && isityp(t2) && !arg1->t_isenum && !arg2->t_isenum) {
- if (promote) {
- /*
- * XXX Here is a problem: Although it is possible to
- * pass an int where a char/short it expected, there
- * may be loss in significant digits. We should first
- * check for const arguments if they can be converted
- * into the original parameter type.
- */
- if (t1 == FLOAT) {
- t1 = DOUBLE;
- } else if (t1 == CHAR || t1 == SCHAR) {
- t1 = INT;
- } else if (t1 == UCHAR) {
- t1 = tflag ? UINT : INT;
- } else if (t1 == SHORT) {
- t1 = INT;
- } else if (t1 == USHORT) {
- /* CONSTCOND */
- t1 = INT_MAX < USHRT_MAX || tflag ? UINT : INT;
- }
- }
-
- if (styp(t1) == styp(t2)) {
-
- /*
- * types differ only in signedness; get information
- * about arguments
- */
-
- /*
- * treat a definition like a call with variable
- * arguments
- */
- ai1 = call1 != NULL ? call1->f_args : NULL;
-
- /*
- * if two calls are compared, ai1 is set to the
- * information for the n-th argument, if this was
- * a constant, otherwise to NULL
- */
- for ( ; ai1 != NULL; ai1 = ai1->a_nxt) {
- if (ai1->a_num == n)
- break;
- }
- /*
- * ai is set to the information of the n-th arg
- * of the (second) call, if this was a constant,
- * otherwise to NULL
- */
- for (ai = call->f_args; ai != NULL; ai = ai->a_nxt) {
- if (ai->a_num == n)
- break;
- }
-
- if (ai1 == NULL && ai == NULL) {
- /* no constant at all */
- if (!hflag)
- return;
- } else if (ai1 == NULL || ai == NULL) {
- /* one constant */
- if (ai == NULL)
- ai = ai1;
- if (ai->a_zero || ai->a_pcon)
- /* same value in signed and unsigned */
- return;
- /* value (not representation) differently */
- } else {
- /*
- * two constants, one signed, one unsigned;
- * if the msb of one of the constants is set,
- * the argument is used inconsistently.
- */
- if (!ai1->a_ncon && !ai->a_ncon)
- return;
- }
- }
-
- } else if (t1 == PTR && isityp(t2)) {
- for (ai = call->f_args; ai != NULL; ai = ai->a_nxt) {
- if (ai->a_num == n)
- break;
- }
- /*
- * Vendor implementations of lint (e.g. HP-UX, Digital UNIX)
- * don't care about the size of the integer argument,
- * only whether or not it is zero. We do the same.
- */
- if (ai != NULL && ai->a_zero)
- return;
- }
-
- pos1 = xstrdup(mkpos(pos1p));
- /* %s, arg %d used inconsistently\t%s :: %s */
- msg(6, hte->h_name, n, pos1, mkpos(&call->f_pos));
- free(pos1);
-}
-
-/*
- * Compare the types in the NULL-terminated array ap with the format
- * string fmt.
- */
-static void
-printflike(hte_t *hte, fcall_t *call, int n, const char *fmt, type_t **ap)
-{
- const char *fp;
- int fc;
- int fwidth, prec, left, sign, space, alt, zero;
- tspec_t sz, t1, t2 = NOTSPEC;
- type_t *tp;
-
- fp = fmt;
- fc = *fp++;
-
- for ( ; ; ) {
- if (fc == '\0') {
- if (*ap != NULL)
- tomanyarg(hte, call);
- break;
- }
- if (fc != '%') {
- badfmt(hte, call);
- break;
- }
- fc = *fp++;
- fwidth = prec = left = sign = space = alt = zero = 0;
- sz = NOTSPEC;
-
- /* Flags */
- for ( ; ; ) {
- if (fc == '-') {
- if (left)
- break;
- left = 1;
- } else if (fc == '+') {
- if (sign)
- break;
- sign = 1;
- } else if (fc == ' ') {
- if (space)
- break;
- space = 1;
- } else if (fc == '#') {
- if (alt)
- break;
- alt = 1;
- } else if (fc == '0') {
- if (zero)
- break;
- zero = 1;
- } else {
- break;
- }
- fc = *fp++;
- }
-
- /* field width */
- if (isdigit(fc)) {
- fwidth = 1;
- do { fc = *fp++; } while (isdigit(fc)) ;
- } else if (fc == '*') {
- fwidth = 1;
- fc = *fp++;
- if ((tp = *ap++) == NULL) {
- tofewarg(hte, call);
- break;
- }
- n++;
- if ((t1 = tp->t_tspec) != INT && (hflag || t1 != UINT))
- inconarg(hte, call, n);
- }
-
- /* precision */
- if (fc == '.') {
- fc = *fp++;
- prec = 1;
- if (isdigit(fc)) {
- do { fc = *fp++; } while (isdigit(fc));
- } else if (fc == '*') {
- fc = *fp++;
- if ((tp = *ap++) == NULL) {
- tofewarg(hte, call);
- break;
- }
- n++;
- if (tp->t_tspec != INT)
- inconarg(hte, call, n);
- } else {
- badfmt(hte, call);
- break;
- }
- }
-
- if (fc == 'h') {
- sz = SHORT;
- } else if (fc == 'l') {
- sz = LONG;
- } else if (fc == 'q') {
- sz = QUAD;
- } else if (fc == 'L') {
- sz = LDOUBLE;
- }
- if (sz != NOTSPEC)
- fc = *fp++;
-
- if (fc == '%') {
- if (sz != NOTSPEC || left || sign || space ||
- alt || zero || prec || fwidth) {
- badfmt(hte, call);
- }
- fc = *fp++;
- continue;
- }
-
- if (fc == '\0') {
- badfmt(hte, call);
- break;
- }
-
- if ((tp = *ap++) == NULL) {
- tofewarg(hte, call);
- break;
- }
- n++;
- if ((t1 = tp->t_tspec) == PTR)
- t2 = tp->t_subt->t_tspec;
-
- if (fc == 'd' || fc == 'i') {
- if (alt || sz == LDOUBLE) {
- badfmt(hte, call);
- break;
- }
- int_conv:
- if (sz == LONG) {
- if (t1 != LONG && (hflag || t1 != ULONG))
- inconarg(hte, call, n);
- } else if (sz == QUAD) {
- if (t1 != QUAD && (hflag || t1 != UQUAD))
- inconarg(hte, call, n);
- } else {
- /*
- * SHORT is always promoted to INT, USHORT
- * to INT or UINT.
- */
- if (t1 != INT && (hflag || t1 != UINT))
- inconarg(hte, call, n);
- }
- } else if (fc == 'o' || fc == 'u' || fc == 'x' || fc == 'X') {
- if ((alt && fc == 'u') || sz == LDOUBLE)
- badfmt(hte, call);
- uint_conv:
- if (sz == LONG) {
- if (t1 != ULONG && (hflag || t1 != LONG))
- inconarg(hte, call, n);
- } else if (sz == QUAD) {
- if (t1 != UQUAD && (hflag || t1 != QUAD))
- inconarg(hte, call, n);
- } else if (sz == SHORT) {
- /* USHORT was promoted to INT or UINT */
- if (t1 != UINT && t1 != INT)
- inconarg(hte, call, n);
- } else {
- if (t1 != UINT && (hflag || t1 != INT))
- inconarg(hte, call, n);
- }
- } else if (fc == 'D' || fc == 'O' || fc == 'U') {
- if ((alt && fc != 'O') || sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = LONG;
- if (fc == 'D') {
- goto int_conv;
- } else {
- goto uint_conv;
- }
- } else if (fc == 'f' || fc == 'e' || fc == 'E' ||
- fc == 'g' || fc == 'G') {
- if (sz == NOTSPEC)
- sz = DOUBLE;
- if (sz != DOUBLE && sz != LDOUBLE)
- badfmt(hte, call);
- if (t1 != sz)
- inconarg(hte, call, n);
- } else if (fc == 'c') {
- if (sz != NOTSPEC || alt || zero)
- badfmt(hte, call);
- if (t1 != INT)
- inconarg(hte, call, n);
- } else if (fc == 's') {
- if (sz != NOTSPEC || alt || zero)
- badfmt(hte, call);
- if (t1 != PTR ||
- (t2 != CHAR && t2 != UCHAR && t2 != SCHAR)) {
- inconarg(hte, call, n);
- }
- } else if (fc == 'p') {
- if (fwidth || prec || sz != NOTSPEC || alt || zero)
- badfmt(hte, call);
- if (t1 != PTR || (hflag && t2 != VOID))
- inconarg(hte, call, n);
- } else if (fc == 'n') {
- if (fwidth || prec || alt || zero || sz == LDOUBLE)
- badfmt(hte, call);
- if (t1 != PTR) {
- inconarg(hte, call, n);
- } else if (sz == LONG) {
- if (t2 != LONG && t2 != ULONG)
- inconarg(hte, call, n);
- } else if (sz == SHORT) {
- if (t2 != SHORT && t2 != USHORT)
- inconarg(hte, call, n);
- } else {
- if (t2 != INT && t2 != UINT)
- inconarg(hte, call, n);
- }
- } else {
- badfmt(hte, call);
- break;
- }
-
- fc = *fp++;
- }
-}
-
-/*
- * Compare the types in the NULL-terminated array ap with the format
- * string fmt.
- */
-static void
-scanflike(hte_t *hte, fcall_t *call, int n, const char *fmt, type_t **ap)
-{
- const char *fp;
- int fc;
- int noasgn, fwidth;
- tspec_t sz, t1 = NOTSPEC, t2 = NOTSPEC;
- type_t *tp = NULL;
-
- fp = fmt;
- fc = *fp++;
-
- for ( ; ; ) {
- if (fc == '\0') {
- if (*ap != NULL)
- tomanyarg(hte, call);
- break;
- }
- if (fc != '%') {
- badfmt(hte, call);
- break;
- }
- fc = *fp++;
-
- noasgn = fwidth = 0;
- sz = NOTSPEC;
-
- if (fc == '*') {
- noasgn = 1;
- fc = *fp++;
- }
-
- if (isdigit(fc)) {
- fwidth = 1;
- do { fc = *fp++; } while (isdigit(fc));
- }
-
- if (fc == 'h') {
- sz = SHORT;
- } else if (fc == 'l') {
- sz = LONG;
- } else if (fc == 'q') {
- sz = QUAD;
- } else if (fc == 'L') {
- sz = LDOUBLE;
- }
- if (sz != NOTSPEC)
- fc = *fp++;
-
- if (fc == '%') {
- if (sz != NOTSPEC || noasgn || fwidth)
- badfmt(hte, call);
- fc = *fp++;
- continue;
- }
-
- if (!noasgn) {
- if ((tp = *ap++) == NULL) {
- tofewarg(hte, call);
- break;
- }
- n++;
- if ((t1 = tp->t_tspec) == PTR)
- t2 = tp->t_subt->t_tspec;
- }
-
- if (fc == 'd' || fc == 'i' || fc == 'n') {
- if (sz == LDOUBLE)
- badfmt(hte, call);
- if (sz != SHORT && sz != LONG && sz != QUAD)
- sz = INT;
- conv:
- if (!noasgn) {
- if (t1 != PTR) {
- inconarg(hte, call, n);
- } else if (t2 != styp(sz)) {
- inconarg(hte, call, n);
- } else if (hflag && t2 != sz) {
- inconarg(hte, call, n);
- } else if (tp->t_subt->t_const) {
- inconarg(hte, call, n);
- }
- }
- } else if (fc == 'o' || fc == 'u' || fc == 'x') {
- if (sz == LDOUBLE)
- badfmt(hte, call);
- if (sz == SHORT) {
- sz = USHORT;
- } else if (sz == LONG) {
- sz = ULONG;
- } else if (sz == QUAD) {
- sz = UQUAD;
- } else {
- sz = UINT;
- }
- goto conv;
- } else if (fc == 'D') {
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = LONG;
- goto conv;
- } else if (fc == 'O') {
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = ULONG;
- goto conv;
- } else if (fc == 'X') {
- /*
- * XXX valid in ANSI C, but in NetBSD's libc imple-
- * mented as "lx". Thats why it should be avoided.
- */
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = ULONG;
- goto conv;
- } else if (fc == 'E') {
- /*
- * XXX valid in ANSI C, but in NetBSD's libc imple-
- * mented as "lf". Thats why it should be avoided.
- */
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = DOUBLE;
- goto conv;
- } else if (fc == 'F') {
- /* XXX only for backward compatibility */
- if (sz != NOTSPEC || !tflag)
- badfmt(hte, call);
- sz = DOUBLE;
- goto conv;
- } else if (fc == 'G') {
- /*
- * XXX valid in ANSI C, but in NetBSD's libc not
- * implemented
- */
- if (sz != NOTSPEC && sz != LONG && sz != LDOUBLE)
- badfmt(hte, call);
- goto fconv;
- } else if (fc == 'e' || fc == 'f' || fc == 'g') {
- fconv:
- if (sz == NOTSPEC) {
- sz = FLOAT;
- } else if (sz == LONG) {
- sz = DOUBLE;
- } else if (sz != LDOUBLE) {
- badfmt(hte, call);
- sz = FLOAT;
- }
- goto conv;
- } else if (fc == 's' || fc == '[' || fc == 'c') {
- if (sz != NOTSPEC)
- badfmt(hte, call);
- if (fc == '[') {
- if ((fc = *fp++) == '-') {
- badfmt(hte, call);
- fc = *fp++;
- }
- if (fc != ']') {
- badfmt(hte, call);
- if (fc == '\0')
- break;
- }
- }
- if (!noasgn) {
- if (t1 != PTR) {
- inconarg(hte, call, n);
- } else if (t2 != CHAR && t2 != UCHAR &&
- t2 != SCHAR) {
- inconarg(hte, call, n);
- }
- }
- } else if (fc == 'p') {
- if (sz != NOTSPEC)
- badfmt(hte, call);
- if (!noasgn) {
- if (t1 != PTR || t2 != PTR) {
- inconarg(hte, call, n);
- } else if (tp->t_subt->t_subt->t_tspec!=VOID) {
- if (hflag)
- inconarg(hte, call, n);
- }
- }
- } else {
- badfmt(hte, call);
- break;
- }
-
- fc = *fp++;
- }
-}
-
-static void
-badfmt(hte_t *hte, fcall_t *call)
-{
-
- /* %s: malformed format string\t%s */
- msg(13, hte->h_name, mkpos(&call->f_pos));
-}
-
-static void
-inconarg(hte_t *hte, fcall_t *call, int n)
-{
-
- /* %s, arg %d inconsistent with format\t%s(%d) */
- msg(14, hte->h_name, n, mkpos(&call->f_pos));
-}
-
-static void
-tofewarg(hte_t *hte, fcall_t *call)
-{
-
- /* %s: too few args for format \t%s */
- msg(15, hte->h_name, mkpos(&call->f_pos));
-}
-
-static void
-tomanyarg(hte_t *hte, fcall_t *call)
-{
-
- /* %s: too many args for format \t%s */
- msg(16, hte->h_name, mkpos(&call->f_pos));
-}
-
-
-/*
- * Print warnings for return values which are used, but not returned,
- * or return values which are always or sometimes ignored.
- */
-static void
-chkrvu(hte_t *hte, sym_t *def)
-{
- fcall_t *call;
- int used, ignored;
-
- if (def == NULL)
- /* don't know wheter or not the functions returns a value */
- return;
-
- if (hte->h_calls == NULL)
- return;
-
- if (def->s_rval) {
- /* function has return value */
- used = ignored = 0;
- for (call = hte->h_calls; call != NULL; call = call->f_nxt) {
- used |= call->f_rused || call->f_rdisc;
- ignored |= !call->f_rused && !call->f_rdisc;
- }
- /*
- * XXX as soon as we are able to disable single warnings
- * the following dependencies from hflag should be removed.
- * but for now I do'nt want to be botherd by this warnings
- * which are almost always useless.
- */
- if (!used && ignored) {
- if (hflag)
- /* %s returns value which is always ignored */
- msg(8, hte->h_name);
- } else if (used && ignored) {
- if (hflag)
- /* %s returns value which is sometimes ign. */
- msg(9, hte->h_name);
- }
- } else {
- /* function has no return value */
- for (call = hte->h_calls; call != NULL; call = call->f_nxt) {
- if (call->f_rused)
- /* %s value is used( %s ), but none ret. */
- msg(10, hte->h_name, mkpos(&call->f_pos));
- }
- }
-}
-
-/*
- * Print warnings for inconsistent argument declarations.
- */
-static void
-chkadecl(hte_t *hte, sym_t *def, sym_t *decl)
-{
- /* LINTED (automatic hides external declaration: warn) */
- int osdef, eq, warn, n;
- sym_t *sym1, *sym;
- type_t **ap1, **ap2, *tp1, *tp2;
- char *pos1;
- const char *pos2;
-
- osdef = 0;
- if (def != NULL) {
- osdef = def->s_osdef;
- sym1 = def;
- } else if (decl != NULL && TP(decl->s_type)->t_proto) {
- sym1 = decl;
- } else {
- return;
- }
- if (TP(sym1->s_type)->t_tspec != FUNC)
- return;
-
- /*
- * XXX Prototypes should also be compared with old style function
- * declarations.
- */
-
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym == sym1 || !TP(sym->s_type)->t_proto)
- continue;
- ap1 = TP(sym1->s_type)->t_args;
- ap2 = TP(sym->s_type)->t_args;
- n = 0;
- while (*ap1 != NULL && *ap2 != NULL) {
- warn = 0;
- eq = eqtype(*ap1, *ap2, 1, osdef, 0, &warn);
- if (!eq || warn) {
- pos1 = xstrdup(mkpos(&sym1->s_pos));
- pos2 = mkpos(&sym->s_pos);
- /* %s, arg %d declared inconsistently ... */
- msg(11, hte->h_name, n + 1, pos1, pos2);
- free(pos1);
- }
- n++;
- ap1++;
- ap2++;
- }
- if (*ap1 == *ap2) {
- tp1 = TP(sym1->s_type);
- tp2 = TP(sym->s_type);
- if (tp1->t_vararg == tp2->t_vararg)
- continue;
- if (tp2->t_vararg &&
- sym1->s_va && sym1->s_nva == n && !sflag) {
- continue;
- }
- }
- /* %s: variable # of args declared\t%s :: %s */
- pos1 = xstrdup(mkpos(&sym1->s_pos));
- msg(12, hte->h_name, pos1, mkpos(&sym->s_pos));
- free(pos1);
- }
-}
-
-
-/*
- * Check compatibility of two types. Returns 1 if types are compatible,
- * otherwise 0.
- *
- * ignqual if set, ignore qualifiers of outhermost type; used for
- * function arguments
- * promote if set, promote left type before comparison; used for
- * comparisons of arguments with parameters of old style
- * definitions
- * asgn left indirected type must have at least the same qualifiers
- * like right indirected type (for assignments and function
- * arguments)
- * *warn set to 1 if an old style declaration was compared with
- * an incompatible prototype declaration
- */
-static int
-eqtype(type_t *tp1, type_t *tp2, int ignqual, int promot, int asgn, int *warn)
-{
- tspec_t t, to;
- int indir;
-
- to = NOTSPEC;
- indir = 0;
-
- while (tp1 != NULL && tp2 != NULL) {
-
- t = tp1->t_tspec;
- if (promot) {
- if (t == FLOAT) {
- t = DOUBLE;
- } else if (t == CHAR || t == SCHAR) {
- t = INT;
- } else if (t == UCHAR) {
- t = tflag ? UINT : INT;
- } else if (t == SHORT) {
- t = INT;
- } else if (t == USHORT) {
- /* CONSTCOND */
- t = INT_MAX < USHRT_MAX || tflag ? UINT : INT;
- }
- }
-
- if (asgn && to == PTR) {
- if (indir == 1 && (t == VOID || tp2->t_tspec == VOID))
- return (1);
- }
-
- if (t != tp2->t_tspec) {
- /*
- * Give pointer to types which differ only in
- * signedness a chance if not sflag and not hflag.
- */
- if (sflag || hflag || to != PTR)
- return (0);
- if (styp(t) != styp(tp2->t_tspec))
- return (0);
- }
-
- if (tp1->t_isenum && tp2->t_isenum) {
- if (tp1->t_istag && tp2->t_istag) {
- return (tp1->t_tag == tp2->t_tag);
- } else if (tp1->t_istynam && tp2->t_istynam) {
- return (tp1->t_tynam == tp2->t_tynam);
- } else if (tp1->t_isuniqpos && tp2->t_isuniqpos) {
- return (tp1->t_uniqpos.p_line ==
- tp2->t_uniqpos.p_line &&
- tp1->t_uniqpos.p_file ==
- tp2->t_uniqpos.p_file &&
- tp1->t_uniqpos.p_uniq ==
- tp2->t_uniqpos.p_uniq);
- } else {
- return (0);
- }
- }
-
- /*
- * XXX Handle combinations of enum and int if eflag is set.
- * But note: enum and 0 should be allowed.
- */
-
- if (asgn && indir == 1) {
- if (!tp1->t_const && tp2->t_const)
- return (0);
- if (!tp1->t_volatile && tp2->t_volatile)
- return (0);
- } else if (!ignqual && !tflag) {
- if (tp1->t_const != tp2->t_const)
- return (0);
- if (tp1->t_const != tp2->t_const)
- return (0);
- }
-
- if (t == STRUCT || t == UNION) {
- if (tp1->t_istag && tp2->t_istag) {
- return (tp1->t_tag == tp2->t_tag);
- } else if (tp1->t_istynam && tp2->t_istynam) {
- return (tp1->t_tynam == tp2->t_tynam);
- } else if (tp1->t_isuniqpos && tp2->t_isuniqpos) {
- return (tp1->t_uniqpos.p_line ==
- tp2->t_uniqpos.p_line &&
- tp1->t_uniqpos.p_file ==
- tp2->t_uniqpos.p_file &&
- tp1->t_uniqpos.p_uniq ==
- tp2->t_uniqpos.p_uniq);
- } else {
- return (0);
- }
- }
-
- if (t == ARRAY && tp1->t_dim != tp2->t_dim) {
- if (tp1->t_dim != 0 && tp2->t_dim != 0)
- return (0);
- }
-
- if (t == FUNC) {
- if (tp1->t_proto && tp2->t_proto) {
- if (!eqargs(tp1, tp2, warn))
- return (0);
- } else if (tp1->t_proto) {
- if (!mnoarg(tp1, warn))
- return (0);
- } else if (tp2->t_proto) {
- if (!mnoarg(tp2, warn))
- return (0);
- }
- }
-
- tp1 = tp1->t_subt;
- tp2 = tp2->t_subt;
- ignqual = promot = 0;
- to = t;
- indir++;
-
- }
-
- return (tp1 == tp2);
-}
-
-/*
- * Compares arguments of two prototypes
- */
-static int
-eqargs(type_t *tp1, type_t *tp2, int *warn)
-{
- type_t **a1, **a2;
-
- if (tp1->t_vararg != tp2->t_vararg)
- return (0);
-
- a1 = tp1->t_args;
- a2 = tp2->t_args;
-
- while (*a1 != NULL && *a2 != NULL) {
-
- if (eqtype(*a1, *a2, 1, 0, 0, warn) == 0)
- return (0);
-
- a1++;
- a2++;
-
- }
-
- return (*a1 == *a2);
-}
-
-/*
- * mnoarg() (matches functions with no argument type information)
- * returns 1 if all parameters of a prototype are compatible with
- * and old style function declaration.
- * This is the case if following conditions are met:
- * 1. the prototype must have a fixed number of parameters
- * 2. no parameter is of type float
- * 3. no parameter is converted to another type if integer promotion
- * is applied on it
- */
-static int
-mnoarg(type_t *tp, int *warn)
-{
- type_t **arg;
- tspec_t t;
-
- if (tp->t_vararg && warn != NULL)
- *warn = 1;
- for (arg = tp->t_args; *arg != NULL; arg++) {
- if ((t = (*arg)->t_tspec) == FLOAT)
- return (0);
- if (t == CHAR || t == SCHAR || t == UCHAR)
- return (0);
- if (t == SHORT || t == USHORT)
- return (0);
- }
- return (1);
-}
Index: usr.bin/xlint/lint2/emit2.c
===================================================================
--- usr.bin/xlint/lint2/emit2.c
+++ /dev/null
@@ -1,300 +0,0 @@
-/* $NetBSD: emit2.c,v 1.8 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: emit2.c,v 1.8 2002/01/21 19:49:52 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <err.h>
-
-#include "lint2.h"
-
-static void outtype(type_t *);
-static void outdef(hte_t *, sym_t *);
-static void dumpname(hte_t *);
-static void outfiles(void);
-
-/*
- * Write type into the output buffer.
- */
-static void
-outtype(type_t *tp)
-{
- int t, s, na;
- tspec_t ts;
- type_t **ap;
-
- while (tp != NULL) {
- if ((ts = tp->t_tspec) == INT && tp->t_isenum)
- ts = ENUM;
- switch (ts) {
- case CHAR: t = 'C'; s = '\0'; break;
- case SCHAR: t = 'C'; s = 's'; break;
- case UCHAR: t = 'C'; s = 'u'; break;
- case SHORT: t = 'S'; s = '\0'; break;
- case USHORT: t = 'S'; s = 'u'; break;
- case INT: t = 'I'; s = '\0'; break;
- case UINT: t = 'I'; s = 'u'; break;
- case LONG: t = 'L'; s = '\0'; break;
- case ULONG: t = 'L'; s = 'u'; break;
- case QUAD: t = 'Q'; s = '\0'; break;
- case UQUAD: t = 'Q'; s = 'u'; break;
- case FLOAT: t = 'D'; s = 's'; break;
- case DOUBLE: t = 'D'; s = '\0'; break;
- case LDOUBLE: t = 'D'; s = 'l'; break;
- case VOID: t = 'V'; s = '\0'; break;
- case PTR: t = 'P'; s = '\0'; break;
- case ARRAY: t = 'A'; s = '\0'; break;
- case ENUM: t = 'T'; s = 'e'; break;
- case STRUCT: t = 'T'; s = 's'; break;
- case UNION: t = 'T'; s = 'u'; break;
- case FUNC:
- if (tp->t_args != NULL && !tp->t_proto) {
- t = 'f';
- } else {
- t = 'F';
- }
- s = '\0';
- break;
- default:
- errx(1, "internal error: outtype() 1");
- }
- if (tp->t_const)
- outchar('c');
- if (tp->t_volatile)
- outchar('v');
- if (s != '\0')
- outchar(s);
- outchar(t);
- if (ts == ARRAY) {
- outint(tp->t_dim);
- } else if (ts == ENUM || ts == STRUCT || ts == UNION) {
- if (tp->t_istag) {
- outint(1);
- outname(tp->t_tag->h_name);
- } else if (tp->t_istynam) {
- outint(2);
- outname(tp->t_tynam->h_name);
- } else if (tp->t_isuniqpos) {
- outint(3);
- outint(tp->t_uniqpos.p_line);
- outchar('.');
- outint(tp->t_uniqpos.p_file);
- outchar('.');
- outint(tp->t_uniqpos.p_uniq);
- } else
- errx(1, "internal error: outtype() 2");
- } else if (ts == FUNC && tp->t_args != NULL) {
- na = 0;
- for (ap = tp->t_args; *ap != NULL; ap++)
- na++;
- if (tp->t_vararg)
- na++;
- outint(na);
- for (ap = tp->t_args; *ap != NULL; ap++)
- outtype(*ap);
- if (tp->t_vararg)
- outchar('E');
- }
- tp = tp->t_subt;
- }
-}
-
-/*
- * Write a definition.
- */
-static void
-outdef(hte_t *hte, sym_t *sym)
-{
-
- /* reset output buffer */
- outclr();
-
- /* line number in C source file */
- outint(0);
-
- /* this is a definition */
- outchar('d');
-
- /* index of file where symbol was defined and line number of def. */
- outint(0);
- outchar('.');
- outint(0);
-
- /* flags */
- if (sym->s_va) {
- outchar('v'); /* varargs */
- outint(sym->s_nva);
- }
- if (sym->s_scfl) {
- outchar('S'); /* scanflike */
- outint(sym->s_nscfl);
- }
- if (sym->s_prfl) {
- outchar('P'); /* printflike */
- outint(sym->s_nprfl);
- }
- /* definition or tentative definition */
- outchar(sym->s_def == DEF ? 'd' : 't');
- if (TP(sym->s_type)->t_tspec == FUNC) {
- if (sym->s_rval)
- outchar('r'); /* fkt. has return value */
- if (sym->s_osdef)
- outchar('o'); /* old style definition */
- }
- outchar('u'); /* used (no warning if not used) */
-
- /* name */
- outname(hte->h_name);
-
- /* type */
- outtype(TP(sym->s_type));
-}
-
-/*
- * Write the first definition of a name into the lint library.
- */
-static void
-dumpname(hte_t *hte)
-{
- sym_t *sym, *def;
-
- /* static and undefined symbols are not written */
- if (hte->h_static || !hte->h_def)
- return;
-
- /*
- * If there is a definition, write it. Otherwise write a tentative
- * definition. This is necessary because more than one tentative
- * definition is allowed (except with sflag).
- */
- def = NULL;
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym->s_def == DEF) {
- def = sym;
- break;
- }
- if (sym->s_def == TDEF && def == NULL)
- def = sym;
- }
- if (def == NULL)
- errx(1, "internal error: dumpname() %s", hte->h_name);
-
- outdef(hte, def);
-}
-
-/*
- * Write a new lint library.
- */
-void
-outlib(const char *name)
-{
- /* Open of output file and initialisation of the output buffer */
- outopen(name);
-
- /* write name of lint library */
- outsrc(name);
-
- /* name of lint lib has index 0 */
- outclr();
- outint(0);
- outchar('s');
- outstrg(name);
-
- /*
- * print the names of all files references by unnamed
- * struct/union/enum declarations.
- */
- outfiles();
-
- /* write all definitions with external linkage */
- forall(dumpname);
-
- /* close the output */
- outclose();
-}
-
-/*
- * Write out the name of a file referenced by a type.
- */
-struct outflist {
- short ofl_num;
- struct outflist *ofl_next;
-};
-static struct outflist *outflist;
-
-int
-addoutfile(short num)
-{
- struct outflist *ofl, **pofl;
- int i;
-
- ofl = outflist;
- pofl = &outflist;
- i = 1; /* library is 0 */
-
- while (ofl != NULL) {
- if (ofl->ofl_num == num)
- break;
-
- pofl = &ofl->ofl_next;
- ofl = ofl->ofl_next;
- i++;
- }
-
- if (ofl == NULL) {
- ofl = *pofl = xmalloc(sizeof (struct outflist));
- ofl->ofl_num = num;
- ofl->ofl_next = NULL;
- }
- return (i);
-}
-
-static void
-outfiles(void)
-{
- struct outflist *ofl;
- int i;
-
- for (ofl = outflist, i = 1; ofl != NULL; ofl = ofl->ofl_next, i++) {
- /* reset output buffer */
- outclr();
-
- outint(i);
- outchar('s');
- outstrg(fnames[ofl->ofl_num]);
- }
-}
Index: usr.bin/xlint/lint2/externs2.h
===================================================================
--- usr.bin/xlint/lint2/externs2.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* $NetBSD: externs2.h,v 1.7 2001/05/28 12:40:38 lukem Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * main.c
- */
-extern int xflag;
-extern int uflag;
-extern int Cflag;
-extern const char *libname;
-extern int sflag;
-extern int tflag;
-extern int Hflag;
-extern int hflag;
-extern int Fflag;
-
-
-/*
- * hash.c
- */
-extern void _inithash(hte_t ***);
-extern hte_t *_hsearch(hte_t **, const char *, int);
-extern void _forall(hte_t **, void (*)(hte_t *));
-extern void _destroyhash(hte_t **);
-
-#define inithash() _inithash(NULL);
-#define hsearch(a, b) _hsearch(NULL, (a), (b))
-#define forall(a) _forall(NULL, (a))
-
-/*
- * read.c
- */
-extern const char **fnames;
-extern type_t **tlst;
-
-extern void readfile(const char *);
-extern void mkstatic(hte_t *);
-
-/*
- * mem2.c
- */
-extern void initmem(void);
-extern void *xalloc(size_t);
-
-/*
- * chk.c
- */
-extern void inittyp(void);
-extern void mainused(void);
-extern void chkname(hte_t *);
-
-/*
- * msg.c
- */
-extern void msg(int, ...);
-extern const char *mkpos(pos_t *);
-
-/*
- * emit2.c
- */
-extern void outlib(const char *);
-extern int addoutfile(short);
Index: usr.bin/xlint/lint2/hash.c
===================================================================
--- usr.bin/xlint/lint2/hash.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/* $NetBSD: hash.c,v 1.7 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: hash.c,v 1.7 2002/01/21 19:49:52 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-/*
- * XXX Really need a generalized hash table package
- */
-
-#include <err.h>
-#include <limits.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint2.h"
-
-/* pointer to hash table, initialized in inithash() */
-static hte_t **htab;
-
-static int hash(const char *);
-
-/*
- * Initialize hash table.
- */
-void
-_inithash(hte_t ***tablep)
-{
-
- if (tablep == NULL)
- tablep = &htab;
-
- *tablep = xcalloc(HSHSIZ2, sizeof (hte_t *));
-}
-
-/*
- * Compute hash value from a string.
- */
-static int
-hash(const char *s)
-{
- u_int v;
- const u_char *us;
-
- v = 0;
- for (us = (const u_char *)s; *us != '\0'; us++) {
- v = (v << sizeof (v)) + *us;
- v ^= v >> (sizeof (v) * CHAR_BIT - sizeof (v));
- }
- return (v % HSHSIZ2);
-}
-
-/*
- * Look for a hash table entry. If no hash table entry for the
- * given name exists and mknew is set, create a new one.
- */
-hte_t *
-_hsearch(hte_t **table, const char *s, int mknew)
-{
- int h;
- hte_t *hte;
-
- if (table == NULL)
- table = htab;
-
- h = hash(s);
- for (hte = table[h]; hte != NULL; hte = hte->h_link) {
- if (strcmp(hte->h_name, s) == 0)
- break;
- }
-
- if (hte != NULL || !mknew)
- return (hte);
-
- /* create a new hte */
- hte = xmalloc(sizeof (hte_t));
- hte->h_name = xstrdup(s);
- hte->h_used = 0;
- hte->h_def = 0;
- hte->h_static = 0;
- hte->h_syms = NULL;
- hte->h_lsym = &hte->h_syms;
- hte->h_calls = NULL;
- hte->h_lcall = &hte->h_calls;
- hte->h_usyms = NULL;
- hte->h_lusym = &hte->h_usyms;
- hte->h_link = table[h];
- hte->h_hte = NULL;
- table[h] = hte;
-
- return (hte);
-}
-
-/*
- * Call function f for each name in the hash table.
- */
-void
-_forall(hte_t **table, void (*f)(hte_t *))
-{
- int i;
- hte_t *hte;
-
- if (table == NULL)
- table = htab;
-
- for (i = 0; i < HSHSIZ2; i++) {
- for (hte = table[i]; hte != NULL; hte = hte->h_link)
- (*f)(hte);
- }
-}
-
-/*
- * Free all contents of the hash table that this module allocated.
- */
-void
-_destroyhash(hte_t **table)
-{
- int i;
- hte_t *hte, *nexthte;
-
- if (table == NULL)
- err(1, "_destroyhash called on main hash table");
-
- for (i = 0; i < HSHSIZ2; i++) {
- for (hte = table[i]; hte != NULL; hte = nexthte) {
- free((void *)hte->h_name);
- nexthte = hte->h_link;
- free(hte);
- }
- }
- free(table);
-}
Index: usr.bin/xlint/lint2/lint2.h
===================================================================
--- usr.bin/xlint/lint2/lint2.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/* $NetBSD: lint2.h,v 1.5 2000/06/14 06:49:23 cgd Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "lint.h"
-
-/*
- * Types are described by structures of type type_t.
- */
-typedef struct type {
- tspec_t t_tspec; /* type specifier */
- u_int t_const : 1; /* constant */
- u_int t_volatile : 1; /* volatile */
- u_int t_vararg : 1; /* function has variable number of arguments */
- u_int t_isenum : 1; /* enum type */
- u_int t_proto : 1; /* this is a prototype */
- u_int t_istag : 1; /* tag with _t_tag valid */
- u_int t_istynam : 1; /* tag with _t_tynam valid */
- u_int t_isuniqpos : 1; /* tag with _t_uniqpos valid */
- union {
- int _t_dim; /* if the type is an ARRAY than this
- is the dimension of the array. */
- struct hte *_t_tag; /* hash table entry of tag if
- t_isenum, STRUCT or UNION */
- struct hte *_t_tynam; /* hash table entry of typename if
- t_isenum, STRUCT or UNION */
- struct {
- int p_line;
- short p_file;
- int p_uniq;
- } _t_uniqpos; /* unique position, for untagged
- untyped STRUCTs, UNIONS, and ENUMs,
- if t_isuniqpos */
- struct type **_t_args; /* list of argument types if this
- is a prototype */
- } t_u;
- struct type *t_subt; /* indirected type (array element, pointed to
- type, type of return value) */
-} type_t;
-
-#define t_dim t_u._t_dim
-#define t_tag t_u._t_tag
-#define t_tynam t_u._t_tynam
-#define t_uniqpos t_u._t_uniqpos
-#define t_args t_u._t_args
-
-/*
- * argument information
- *
- * Such a structure is created for each argument of a function call
- * which is an integer constant or a constant string.
- */
-typedef struct arginf {
- int a_num; /* # of argument (1..) */
- u_int a_zero : 1; /* argument is 0 */
- u_int a_pcon : 1; /* msb of argument is not set */
- u_int a_ncon : 1; /* msb of argument is set */
- u_int a_fmt : 1; /* a_fstrg points to format string */
- char *a_fstrg; /* format string */
- struct arginf *a_nxt; /* information for next const. argument */
-} arginf_t;
-
-/*
- * Keeps information about position in source file.
- */
-typedef struct {
- u_short p_src; /* index of name of translation unit
- (the name which was specified at the
- command line) */
- u_short p_line; /* line number in p_src */
- u_short p_isrc; /* index of (included) file */
- u_short p_iline; /* line number in p_iline */
-} pos_t;
-
-/*
- * Used for definitions and declarations
- *
- * To save memory, variable sized structures are used. If
- * all s_va, s_prfl and s_scfl are not set, the memory allocated
- * for a symbol is only large enough to keep the first member of
- * struct sym, s_s.
- */
-typedef struct sym {
- struct {
- pos_t s_pos; /* pos of def./decl. */
-#ifndef lint
- u_int s_def : 3; /* DECL, TDEF or DEF */
-#else
- def_t s_def;
-#endif
- u_int s_rval : 1; /* function has return value */
- u_int s_osdef : 1; /* old style function definition */
- u_int s_static : 1; /* symbol is static */
- u_int s_va : 1; /* check only first s_nva arguments */
- u_int s_prfl : 1; /* printflike */
- u_int s_scfl : 1; /* scanflike */
- u_short s_type; /* type */
- struct sym *s_nxt; /* next symbol with same name */
- } s_s;
- short s_nva;
- short s_nprfl;
- short s_nscfl;
-} sym_t;
-
-#define s_pos s_s.s_pos
-#define s_rval s_s.s_rval
-#define s_osdef s_s.s_osdef
-#define s_static s_s.s_static
-#define s_def s_s.s_def
-#define s_va s_s.s_va
-#define s_prfl s_s.s_prfl
-#define s_scfl s_s.s_scfl
-#define s_type s_s.s_type
-#define s_nxt s_s.s_nxt
-
-/*
- * Used to store informations about function calls.
- */
-typedef struct fcall {
- pos_t f_pos; /* position of call */
- u_int f_rused : 1; /* return value used */
- u_int f_rdisc : 1; /* return value discarded (casted to void) */
- u_short f_type; /* types of expected return value and args */
- arginf_t *f_args; /* information about constant arguments */
- struct fcall *f_nxt; /* next call of same function */
-} fcall_t;
-
-/*
- * Used to store information about usage of symbols other
- * than for function calls.
- */
-typedef struct usym {
- pos_t u_pos; /* position */
- struct usym *u_nxt; /* next usage */
-} usym_t;
-
-/*
- * hash table entry
- */
-typedef struct hte {
- const char *h_name; /* name */
- u_int h_used : 1; /* symbol is used */
- u_int h_def : 1; /* symbol is defined */
- u_int h_static : 1; /* static symbol */
- sym_t *h_syms; /* declarations and definitions */
- sym_t **h_lsym; /* points to s_nxt of last decl./def. */
- fcall_t *h_calls; /* function calls */
- fcall_t **h_lcall; /* points to f_nxt of last call */
- usym_t *h_usyms; /* usage info */
- usym_t **h_lusym; /* points to u_nxt of last usage info */
- struct hte *h_link; /* next hte with same hash function */
- struct hte *h_hte; /* pointer to other htes (for renames */
-} hte_t;
-
-/* maps type indices into pointers to type structs */
-#define TP(idx) (tlst[idx])
-
-#include "externs2.h"
Index: usr.bin/xlint/lint2/main2.c
===================================================================
--- usr.bin/xlint/lint2/main2.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/* $NetBSD: main2.c,v 1.5 2001/11/21 19:14:26 wiz Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: main2.c,v 1.5 2001/11/21 19:14:26 wiz Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "lint2.h"
-
-/* warnings for symbols which are declared but not defined or used */
-int xflag;
-
-/*
- * warnings for symbols which are used and not defined or defined
- * and not used
- */
-int uflag = 1;
-
-/* Create a lint library in the current directory with name libname. */
-int Cflag;
-const char *libname;
-
-int pflag;
-
-/*
- * warnings for (tentative) definitions of the same name in more than
- * one translation unit
- */
-int sflag;
-
-int tflag;
-
-/*
- * If a complaint stems from an included file, print the name of the included
- * file instead of the name spezified at the command line followed by '?'
- */
-int Hflag;
-
-int hflag;
-
-/* Print full path names, not only the last component */
-int Fflag;
-
-/*
- * List of libraries (from -l flag). These libraries are read after all
- * other input files has been read and, for Cflag, after the new lint library
- * has been written.
- */
-const char **libs;
-
-static void usage(void);
-
-int main(int, char *[]);
-
-int
-main(int argc, char *argv[])
-{
- int c, i;
- size_t len;
- char *lname;
-
- libs = xcalloc(1, sizeof (char *));
-
- opterr = 0;
- while ((c = getopt(argc, argv, "hpstxuC:HFl:")) != -1) {
- switch (c) {
- case 's':
- sflag = 1;
- break;
- case 't':
- tflag = 1;
- break;
- case 'u':
- uflag = 0;
- break;
- case 'x':
- xflag = 1;
- break;
- case 'p':
- pflag = 1;
- break;
- case 'C':
- len = strlen(optarg);
- lname = xmalloc(len + 10);
- (void)sprintf(lname, "llib-l%s.ln", optarg);
- libname = lname;
- Cflag = 1;
- uflag = 0;
- break;
- case 'H':
- Hflag = 1;
- break;
- case 'h':
- hflag = 1;
- break;
- case 'F':
- Fflag = 1;
- break;
- case 'l':
- for (i = 0; libs[i] != NULL; i++)
- continue;
- libs = xrealloc(libs, (i + 2) * sizeof (char *));
- libs[i] = xstrdup(optarg);
- libs[i + 1] = NULL;
- break;
- case '?':
- usage();
- }
- }
-
- argc -= optind;
- argv += optind;
-
- if (argc == 0)
- usage();
-
- initmem();
-
- /* initialize hash table */
- inithash();
-
- inittyp();
-
- for (i = 0; i < argc; i++)
- readfile(argv[i]);
-
- /* write the lint library */
- if (Cflag) {
- forall(mkstatic);
- outlib(libname);
- }
-
- /* read additional libraries */
- for (i = 0; libs[i] != NULL; i++)
- readfile(libs[i]);
-
- forall(mkstatic);
-
- mainused();
-
- /* perform all tests */
- forall(chkname);
-
- exit(0);
- /* NOTREACHED */
-}
-
-static void
-usage(void)
-{
- (void)fprintf(stderr,
- "usage: lint2 -hpstxuHF -Clib -l lib ... src1 ...\n");
- exit(1);
-}
Index: usr.bin/xlint/lint2/mem2.c
===================================================================
--- usr.bin/xlint/lint2/mem2.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/* $NetBSD: mem2.c,v 1.6 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: mem2.c,v 1.6 2002/01/21 19:49:52 tv Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <err.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "lint2.h"
-
-/* length of new allocated memory blocks */
-static size_t mblklen;
-
-/* offset of next free byte in mbuf */
-static size_t nxtfree;
-
-/* current buffer to server memory requests from */
-static void *mbuf;
-
-void
-initmem(void)
-{
- int pgsz;
-
- pgsz = getpagesize();
- mblklen = ((MBLKSIZ + pgsz - 1) / pgsz) * pgsz;
-
- nxtfree = mblklen;
-}
-
-/*
- * Allocate memory in large chunks to avoid space and time overhead of
- * malloc(). This is possible because memory allocated by xalloc()
- * need never to be freed.
- */
-void *
-xalloc(size_t sz)
-{
- void *ptr;
- int prot, flags;
-
- /* Align to at least 8 bytes. */
- sz = (sz + 7) & ~7L;
- if (nxtfree + sz > mblklen) {
- /* use mmap() instead of malloc() to avoid malloc overhead. */
- prot = PROT_READ | PROT_WRITE;
- flags = MAP_ANON | MAP_PRIVATE;
- mbuf = mmap(NULL, mblklen, prot, flags, -1, (off_t)0);
- if (mbuf == (void *)MAP_FAILED)
- err(1, "can't map memory");
- (void)memset(mbuf, 0, mblklen);
- nxtfree = 0;
- }
-
- ptr = (char *)mbuf + nxtfree;
- nxtfree += sz;
-
- return (ptr);
-}
Index: usr.bin/xlint/lint2/msg.c
===================================================================
--- usr.bin/xlint/lint2/msg.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/* $NetBSD: msg.c,v 1.6 2002/01/21 19:49:52 tv Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: msg.c,v 1.6 2002/01/21 19:49:52 tv Exp $");
-#endif
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-
-#include "lint2.h"
-
-static const char *msgs[] = {
- "%s used( %s ), but not defined", /* 0 */
- "%s defined( %s ), but never used", /* 1 */
- "%s declared( %s ), but never used or defined", /* 2 */
- "%s multiply defined \t%s :: %s", /* 3 */
- "%s value used inconsistently \t%s :: %s", /* 4 */
- "%s value declared inconsistently \t%s :: %s", /* 5 */
- "%s, arg %d used inconsistently \t%s :: %s", /* 6 */
- "%s: variable # of args \t%s :: %s", /* 7 */
- "%s returns value which is always ignored", /* 8 */
- "%s returns value which is sometimes ignored", /* 9 */
- "%s value is used( %s ), but none returned", /* 10 */
- "%s, arg %d declared inconsistently \t%s :: %s", /* 11 */
- "%s: variable # of args declared \t%s :: %s", /* 12 */
- "%s: malformed format string \t%s", /* 13 */
- "%s, arg %d inconsistent with format \t%s", /* 14 */
- "%s: too few args for format \t%s", /* 15 */
- "%s: too many args for format \t%s", /* 16 */
- "%s function value must be declared before use \t%s :: %s",/* 17 */
- "%s renamed multiple times \t%s :: %s", /* 18 */
-};
-
-static const char *lbasename(const char *);
-
-void
-msg(int n, ...)
-{
- va_list ap;
-
- va_start(ap, n);
-
- (void)vprintf(msgs[n], ap);
- (void)printf("\n");
-
- va_end(ap);
-}
-
-/*
- * Return a pointer to the last component of a path.
- */
-static const char *
-lbasename(const char *path)
-{
- const char *cp, *cp1, *cp2;
-
- if (Fflag)
- return (path);
-
- cp = cp1 = cp2 = path;
- while (*cp != '\0') {
- if (*cp++ == '/') {
- cp2 = cp1;
- cp1 = cp;
- }
- }
- return (*cp1 == '\0' ? cp2 : cp1);
-}
-
-/*
- * Create a string which describes a position in a source file.
- */
-const char *
-mkpos(pos_t *posp)
-{
- size_t len;
- const char *fn;
- static char *buf;
- static size_t blen = 0;
- int qm, src, line;
-
- if (Hflag && posp->p_src != posp->p_isrc) {
- src = posp->p_isrc;
- line = posp->p_iline;
- } else {
- src = posp->p_src;
- line = posp->p_line;
- }
- qm = !Hflag && posp->p_src != posp->p_isrc;
-
- len = strlen(fn = lbasename(fnames[src]));
- len += 3 * sizeof (u_short) + 4;
-
- if (len > blen)
- buf = xrealloc(buf, blen = len);
- if (line != 0) {
- (void)sprintf(buf, "%s%s(%d)",
- fn, qm ? "?" : "", line);
- } else {
- (void)sprintf(buf, "%s", fn);
- }
-
- return (buf);
-}
Index: usr.bin/xlint/lint2/read.c
===================================================================
--- usr.bin/xlint/lint2/read.c
+++ /dev/null
@@ -1,1245 +0,0 @@
-/* $NetBSD: read.c,v 1.19 2007/09/28 21:53:50 uwe Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: read.c,v 1.19 2007/09/28 21:53:50 uwe Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <ctype.h>
-#include <err.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "lint2.h"
-
-
-/* index of current (included) source file */
-static int srcfile;
-
-/*
- * The array pointed to by inpfns maps the file name indices of input files
- * to the file name indices used in lint2
- */
-static short *inpfns;
-static size_t ninpfns;
-
-/*
- * The array pointed to by *fnames maps file name indizes to file names.
- * Indices of type short are used instead of pointers to save memory.
- */
-const char **fnames;
-static size_t nfnames;
-
-/*
- * Types are shared (to save memory for the types itself) and accessed
- * via indices (to save memory for references to types (indices are short)).
- * To share types, an equal type must be located fast. This is done by a
- * hash table. Access by indices is done via an array of pointers to the
- * types.
- */
-typedef struct thtab {
- const char *th_name;
- u_short th_idx;
- struct thtab *th_nxt;
-} thtab_t;
-static thtab_t **thtab; /* hash table */
-type_t **tlst; /* array for indexed access */
-static size_t tlstlen; /* length of tlst */
-
-static hte_t **renametab;
-
-/* index of current C source file (as spezified at the command line) */
-static int csrcfile;
-
-
-#define inperr() inperror(__FILE__, __LINE__)
-static void inperror(const char *, size_t);
-static void setsrc(const char *);
-static void setfnid(int, const char *);
-static void funccall(pos_t *, const char *);
-static void decldef(pos_t *, const char *);
-static void usedsym(pos_t *, const char *);
-static u_short inptype(const char *, const char **);
-static int gettlen(const char *, const char **);
-static u_short findtype(const char *, size_t, int);
-static u_short storetyp(type_t *, const char *, size_t, int);
-static int thash(const char *, size_t);
-static char *inpqstrg(const char *, const char **);
-static const char *inpname(const char *, const char **);
-static int getfnidx(const char *);
-
-void
-readfile(const char *name)
-{
- FILE *inp;
- size_t len;
- const char *cp;
- char *line, *eptr, rt = '\0';
- int cline, isrc, iline;
- pos_t pos;
-
- if (inpfns == NULL)
- if ((inpfns = calloc(ninpfns = 128, sizeof (short))) == NULL)
- nomem();
- if (fnames == NULL)
- if ((fnames = calloc(nfnames = 256, sizeof (char *))) == NULL)
- nomem();
- if (tlstlen == 0)
- if ((tlst = calloc(tlstlen = 256, sizeof (type_t *))) == NULL)
- nomem();
- if (thtab == NULL)
- if ((thtab = calloc(THSHSIZ2, sizeof (thtab_t))) == NULL)
- nomem();
-
- _inithash(&renametab);
-
- srcfile = getfnidx(name);
-
- if ((inp = fopen(name, "r")) == NULL)
- err(1, "cannot open %s", name);
-
- while ((line = fgetln(inp, &len)) != NULL) {
-
- if (len == 0 || line[len - 1] != '\n')
- inperr();
- line[len - 1] = '\0';
- cp = line;
-
- /* line number in csrcfile */
- cline = (int)strtol(cp, &eptr, 10);
- if (cp == eptr) {
- cline = -1;
- } else {
- cp = eptr;
- }
-
- /* record type */
- if (*cp != '\0') {
- rt = *cp++;
- } else {
- inperr();
- }
-
- if (rt == 'S') {
- setsrc(cp);
- continue;
- } else if (rt == 's') {
- setfnid(cline, cp);
- continue;
- }
-
- /*
- * Index of (included) source file. If this index is
- * different from csrcfile, it refers to an included
- * file.
- */
- isrc = (int)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- isrc = inpfns[isrc];
-
- /* line number in isrc */
- if (*cp++ != '.')
- inperr();
- iline = (int)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
-
- pos.p_src = (u_short)csrcfile;
- pos.p_line = (u_short)cline;
- pos.p_isrc = (u_short)isrc;
- pos.p_iline = (u_short)iline;
-
- /* process rest of this record */
- switch (rt) {
- case 'c':
- funccall(&pos, cp);
- break;
- case 'd':
- decldef(&pos, cp);
- break;
- case 'u':
- usedsym(&pos, cp);
- break;
- default:
- inperr();
- }
-
- }
-
- _destroyhash(renametab);
-
- if (ferror(inp))
- err(1, "read error on %s", name);
-
- (void)fclose(inp);
-}
-
-
-static void
-inperror(const char *file, size_t line)
-{
-
- errx(1, "%s,%zd: input file error: %s", file, line, fnames[srcfile]);
-}
-
-/*
- * Set the name of the C source file of the .ln file which is
- * currently read.
- */
-static void
-setsrc(const char *cp)
-{
-
- csrcfile = getfnidx(cp);
-}
-
-/*
- * setfnid() gets as input an index as used in an input file and the
- * associated file name. If necessary, it creates a new lint2 file
- * name index for this file name and creates the mapping of the index
- * as used in the input file to the index used in lint2.
- */
-static void
-setfnid(int fid, const char *cp)
-{
-
- if (fid == -1)
- inperr();
-
- if (fid >= ninpfns) {
- if ((inpfns = realloc(inpfns, (ninpfns * 2) * sizeof (short)))
- == NULL)
- nomem();
- (void)memset(inpfns + ninpfns, 0, ninpfns * sizeof (short));
- ninpfns *= 2;
- }
- /*
- * Should always be true because indices written in the output
- * file by lint1 are always the previous index + 1.
- */
- if (fid >= ninpfns)
- errx(1, "internal error: setfnid()");
- inpfns[fid] = (u_short)getfnidx(cp);
-}
-
-/*
- * Process a function call record (c-record).
- */
-static void
-funccall(pos_t *posp, const char *cp)
-{
- arginf_t *ai, **lai;
- char c, *eptr;
- int rused, rdisc;
- hte_t *hte;
- fcall_t *fcall;
- const char *name;
-
- fcall = xalloc(sizeof (fcall_t));
- STRUCT_ASSIGN(fcall->f_pos, *posp);
-
- /* read flags */
- rused = rdisc = 0;
- lai = &fcall->f_args;
- while ((c = *cp) == 'u' || c == 'i' || c == 'd' ||
- c == 'z' || c == 'p' || c == 'n' || c == 's') {
- cp++;
- switch (c) {
- case 'u':
- if (rused || rdisc)
- inperr();
- rused = 1;
- break;
- case 'i':
- if (rused || rdisc)
- inperr();
- break;
- case 'd':
- if (rused || rdisc)
- inperr();
- rdisc = 1;
- break;
- case 'z':
- case 'p':
- case 'n':
- case 's':
- ai = xalloc(sizeof (arginf_t));
- ai->a_num = (int)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- if (c == 'z') {
- ai->a_pcon = ai->a_zero = 1;
- } else if (c == 'p') {
- ai->a_pcon = 1;
- } else if (c == 'n') {
- ai->a_ncon = 1;
- } else {
- ai->a_fmt = 1;
- ai->a_fstrg = inpqstrg(cp, &cp);
- }
- *lai = ai;
- lai = &ai->a_nxt;
- break;
- }
- }
- fcall->f_rused = rused;
- fcall->f_rdisc = rdisc;
-
- /* read name of function */
- name = inpname(cp, &cp);
-
- /* first look it up in the renaming table, then in the normal table */
- hte = _hsearch(renametab, name, 0);
- if (hte != NULL)
- hte = hte->h_hte;
- else
- hte = hsearch(name, 1);
- hte->h_used = 1;
-
- fcall->f_type = inptype(cp, &cp);
-
- *hte->h_lcall = fcall;
- hte->h_lcall = &fcall->f_nxt;
-
- if (*cp != '\0')
- inperr();
-}
-
-/*
- * Process a declaration or definition (d-record).
- */
-static void
-decldef(pos_t *posp, const char *cp)
-{
- sym_t *symp, sym;
- char c, *ep, *pos1;
- int used, renamed;
- hte_t *hte, *renamehte = NULL;
- const char *name, *rename;
-
- (void)memset(&sym, 0, sizeof (sym));
- STRUCT_ASSIGN(sym.s_pos, *posp);
- sym.s_def = NODECL;
-
- used = 0;
-
- while (strchr("tdeurosvPS", (c = *cp)) != NULL) {
- cp++;
- switch (c) {
- case 't':
- if (sym.s_def != NODECL)
- inperr();
- sym.s_def = TDEF;
- break;
- case 'd':
- if (sym.s_def != NODECL)
- inperr();
- sym.s_def = DEF;
- break;
- case 'e':
- if (sym.s_def != NODECL)
- inperr();
- sym.s_def = DECL;
- break;
- case 'u':
- if (used)
- inperr();
- used = 1;
- break;
- case 'r':
- if (sym.s_rval)
- inperr();
- sym.s_rval = 1;
- break;
- case 'o':
- if (sym.s_osdef)
- inperr();
- sym.s_osdef = 1;
- break;
- case 's':
- if (sym.s_static)
- inperr();
- sym.s_static = 1;
- break;
- case 'v':
- if (sym.s_va)
- inperr();
- sym.s_va = 1;
- sym.s_nva = (short)strtol(cp, &ep, 10);
- if (cp == ep)
- inperr();
- cp = ep;
- break;
- case 'P':
- if (sym.s_prfl)
- inperr();
- sym.s_prfl = 1;
- sym.s_nprfl = (short)strtol(cp, &ep, 10);
- if (cp == ep)
- inperr();
- cp = ep;
- break;
- case 'S':
- if (sym.s_scfl)
- inperr();
- sym.s_scfl = 1;
- sym.s_nscfl = (short)strtol(cp, &ep, 10);
- if (cp == ep)
- inperr();
- cp = ep;
- break;
- }
- }
-
- /* read symbol name, doing renaming if necessary */
- name = inpname(cp, &cp);
- renamed = 0;
- if (*cp == 'r') {
- cp++;
- name = xstrdup(name);
- rename = inpname(cp, &cp);
-
- /* enter it and see if it's already been renamed */
- renamehte = _hsearch(renametab, name, 1);
- if (renamehte->h_hte == NULL) {
- hte = hsearch(rename, 1);
- renamehte->h_hte = hte;
- renamed = 1;
- } else if (strcmp((hte = renamehte->h_hte)->h_name, rename)) {
- pos1 = xstrdup(mkpos(&renamehte->h_syms->s_pos));
- /* %s renamed multiple times\t%s :: %s */
- msg(18, name, pos1, mkpos(&sym.s_pos));
- free(pos1);
- }
- free((char *)name);
- } else {
- /* it might be a previously-done rename */
- hte = _hsearch(renametab, name, 0);
- if (hte != NULL)
- hte = hte->h_hte;
- else
- hte = hsearch(name, 1);
- }
- hte->h_used |= used;
- if (sym.s_def == DEF || sym.s_def == TDEF)
- hte->h_def = 1;
-
- sym.s_type = inptype(cp, &cp);
-
- /*
- * Allocate memory for this symbol only if it was not already
- * declared or tentatively defined at the same location with
- * the same type. Works only for symbols with external linkage,
- * because static symbols, tentatively defined at the same location
- * but in different translation units are really different symbols.
- */
- for (symp = hte->h_syms; symp != NULL; symp = symp->s_nxt) {
- if (symp->s_pos.p_isrc == sym.s_pos.p_isrc &&
- symp->s_pos.p_iline == sym.s_pos.p_iline &&
- symp->s_type == sym.s_type &&
- ((symp->s_def == DECL && sym.s_def == DECL) ||
- (!sflag && symp->s_def == TDEF && sym.s_def == TDEF)) &&
- !symp->s_static && !sym.s_static) {
- break;
- }
- }
-
- if (symp == NULL) {
- /* allocsym reserviert keinen Platz fuer s_nva */
- if (sym.s_va || sym.s_prfl || sym.s_scfl) {
- symp = xalloc(sizeof (sym_t));
- STRUCT_ASSIGN(*symp, sym);
- } else {
- symp = xalloc(sizeof (symp->s_s));
- STRUCT_ASSIGN(symp->s_s, sym.s_s);
- }
- *hte->h_lsym = symp;
- hte->h_lsym = &symp->s_nxt;
-
- /* XXX hack so we can remember where a symbol was renamed */
- if (renamed)
- renamehte->h_syms = symp;
- }
-
- if (*cp != '\0')
- inperr();
-}
-
-/*
- * Read an u-record (emitted by lint1 if a symbol was used).
- */
-static void
-usedsym(pos_t *posp, const char *cp)
-{
- usym_t *usym;
- hte_t *hte;
- const char *name;
-
- usym = xalloc(sizeof (usym_t));
- STRUCT_ASSIGN(usym->u_pos, *posp);
-
- /* needed as delimiter between two numbers */
- if (*cp++ != 'x')
- inperr();
-
- name = inpname(cp, &cp);
- hte = _hsearch(renametab, name, 0);
- if (hte != NULL)
- hte = hte->h_hte;
- else
- hte = hsearch(name, 1);
- hte->h_used = 1;
-
- *hte->h_lusym = usym;
- hte->h_lusym = &usym->u_nxt;
-}
-
-/*
- * Read a type and return the index of this type.
- */
-static u_short
-inptype(const char *cp, const char **epp)
-{
- char c, s, *eptr;
- const char *ep;
- type_t *tp;
- int narg, i, osdef = 0;
- size_t tlen;
- u_short tidx, sidx;
- int h;
-
- /* If we have this type already, return it's index. */
- tlen = gettlen(cp, &ep);
- h = thash(cp, tlen);
- if ((tidx = findtype(cp, tlen, h)) != 0) {
- *epp = ep;
- return (tidx);
- }
-
- /* No, we must create a new type. */
- tp = xalloc(sizeof (type_t));
-
- tidx = storetyp(tp, cp, tlen, h);
-
- c = *cp++;
-
- while (c == 'c' || c == 'v') {
- if (c == 'c') {
- tp->t_const = 1;
- } else {
- tp->t_volatile = 1;
- }
- c = *cp++;
- }
-
- if (c == 's' || c == 'u' || c == 'l' || c == 'e') {
- s = c;
- c = *cp++;
- } else {
- s = '\0';
- }
-
- switch (c) {
- case 'C':
- tp->t_tspec = s == 's' ? SCHAR : (s == 'u' ? UCHAR : CHAR);
- break;
- case 'S':
- tp->t_tspec = s == 'u' ? USHORT : SHORT;
- break;
- case 'I':
- tp->t_tspec = s == 'u' ? UINT : INT;
- break;
- case 'L':
- tp->t_tspec = s == 'u' ? ULONG : LONG;
- break;
- case 'Q':
- tp->t_tspec = s == 'u' ? UQUAD : QUAD;
- break;
- case 'D':
- tp->t_tspec = s == 's' ? FLOAT : (s == 'l' ? LDOUBLE : DOUBLE);
- break;
- case 'V':
- tp->t_tspec = VOID;
- break;
- case 'P':
- tp->t_tspec = PTR;
- break;
- case 'A':
- tp->t_tspec = ARRAY;
- break;
- case 'F':
- case 'f':
- osdef = c == 'f';
- tp->t_tspec = FUNC;
- break;
- case 'T':
- tp->t_tspec = s == 'e' ? ENUM : (s == 's' ? STRUCT : UNION);
- break;
- }
-
- switch (tp->t_tspec) {
- case ARRAY:
- tp->t_dim = (int)strtol(cp, &eptr, 10);
- cp = eptr;
- sidx = inptype(cp, &cp); /* force seq. point! (ditto below) */
- tp->t_subt = TP(sidx);
- break;
- case PTR:
- sidx = inptype(cp, &cp);
- tp->t_subt = TP(sidx);
- break;
- case FUNC:
- c = *cp;
- if (isdigit((u_char)c)) {
- if (!osdef)
- tp->t_proto = 1;
- narg = (int)strtol(cp, &eptr, 10);
- cp = eptr;
- if ((tp->t_args = calloc((size_t)(narg + 1),
- sizeof (type_t *))) == NULL)
- nomem();
- for (i = 0; i < narg; i++) {
- if (i == narg - 1 && *cp == 'E') {
- tp->t_vararg = 1;
- cp++;
- } else {
- sidx = inptype(cp, &cp);
- tp->t_args[i] = TP(sidx);
- }
- }
- }
- sidx = inptype(cp, &cp);
- tp->t_subt = TP(sidx);
- break;
- case ENUM:
- tp->t_tspec = INT;
- tp->t_isenum = 1;
- /* FALLTHROUGH */
- case STRUCT:
- case UNION:
- switch (*cp++) {
- case '1':
- tp->t_istag = 1;
- tp->t_tag = hsearch(inpname(cp, &cp), 1);
- break;
- case '2':
- tp->t_istynam = 1;
- tp->t_tynam = hsearch(inpname(cp, &cp), 1);
- break;
- case '3':
- tp->t_isuniqpos = 1;
- tp->t_uniqpos.p_line = strtol(cp, &eptr, 10);
- cp = eptr;
- cp++;
- /* xlate to 'global' file name. */
- tp->t_uniqpos.p_file =
- addoutfile(inpfns[strtol(cp, &eptr, 10)]);
- cp = eptr;
- cp++;
- tp->t_uniqpos.p_uniq = strtol(cp, &eptr, 10);
- cp = eptr;
- break;
- }
- break;
- case LONG:
- case VOID:
- case LDOUBLE:
- case DOUBLE:
- case FLOAT:
- case UQUAD:
- case QUAD:
- case ULONG:
- case UINT:
- case INT:
- case USHORT:
- case SHORT:
- case UCHAR:
- case SCHAR:
- case CHAR:
- case UNSIGN:
- case SIGNED:
- case NOTSPEC:
- break;
- }
-
- *epp = cp;
- return (tidx);
-}
-
-/*
- * Get the length of a type string.
- */
-static int
-gettlen(const char *cp, const char **epp)
-{
- const char *cp1;
- char c, s, *eptr;
- tspec_t t;
- int narg, i, cm, vm;
-
- cp1 = cp;
-
- c = *cp++;
-
- cm = vm = 0;
-
- while (c == 'c' || c == 'v') {
- if (c == 'c') {
- if (cm)
- inperr();
- cm = 1;
- } else {
- if (vm)
- inperr();
- vm = 1;
- }
- c = *cp++;
- }
-
- if (c == 's' || c == 'u' || c == 'l' || c == 'e') {
- s = c;
- c = *cp++;
- } else {
- s = '\0';
- }
-
- t = NOTSPEC;
-
- switch (c) {
- case 'C':
- if (s == 's') {
- t = SCHAR;
- } else if (s == 'u') {
- t = UCHAR;
- } else if (s == '\0') {
- t = CHAR;
- }
- break;
- case 'S':
- if (s == 'u') {
- t = USHORT;
- } else if (s == '\0') {
- t = SHORT;
- }
- break;
- case 'I':
- if (s == 'u') {
- t = UINT;
- } else if (s == '\0') {
- t = INT;
- }
- break;
- case 'L':
- if (s == 'u') {
- t = ULONG;
- } else if (s == '\0') {
- t = LONG;
- }
- break;
- case 'Q':
- if (s == 'u') {
- t = UQUAD;
- } else if (s == '\0') {
- t = QUAD;
- }
- break;
- case 'D':
- if (s == 's') {
- t = FLOAT;
- } else if (s == 'l') {
- t = LDOUBLE;
- } else if (s == '\0') {
- t = DOUBLE;
- }
- break;
- case 'V':
- if (s == '\0')
- t = VOID;
- break;
- case 'P':
- if (s == '\0')
- t = PTR;
- break;
- case 'A':
- if (s == '\0')
- t = ARRAY;
- break;
- case 'F':
- case 'f':
- if (s == '\0')
- t = FUNC;
- break;
- case 'T':
- if (s == 'e') {
- t = ENUM;
- } else if (s == 's') {
- t = STRUCT;
- } else if (s == 'u') {
- t = UNION;
- }
- break;
- default:
- inperr();
- }
-
- if (t == NOTSPEC)
- inperr();
-
- switch (t) {
- case ARRAY:
- (void)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- (void)gettlen(cp, &cp);
- break;
- case PTR:
- (void)gettlen(cp, &cp);
- break;
- case FUNC:
- c = *cp;
- if (isdigit((u_char)c)) {
- narg = (int)strtol(cp, &eptr, 10);
- cp = eptr;
- for (i = 0; i < narg; i++) {
- if (i == narg - 1 && *cp == 'E') {
- cp++;
- } else {
- (void)gettlen(cp, &cp);
- }
- }
- }
- (void)gettlen(cp, &cp);
- break;
- case ENUM:
- case STRUCT:
- case UNION:
- switch (*cp++) {
- case '1':
- (void)inpname(cp, &cp);
- break;
- case '2':
- (void)inpname(cp, &cp);
- break;
- case '3':
- /* unique position: line.file.uniquifier */
- (void)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- if (*cp++ != '.')
- inperr();
- (void)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- if (*cp++ != '.')
- inperr();
- (void)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- break;
- default:
- inperr();
- }
- break;
- case FLOAT:
- case USHORT:
- case SHORT:
- case UCHAR:
- case SCHAR:
- case CHAR:
- case UNSIGN:
- case SIGNED:
- case NOTSPEC:
- case INT:
- case UINT:
- case DOUBLE:
- case LDOUBLE:
- case VOID:
- case ULONG:
- case QUAD:
- case UQUAD:
- case LONG:
- break;
- }
-
- *epp = cp;
- return (cp - cp1);
-}
-
-/*
- * Search a type by its type string.
- */
-static u_short
-findtype(const char *cp, size_t len, int h)
-{
- thtab_t *thte;
-
- for (thte = thtab[h]; thte != NULL; thte = thte->th_nxt) {
- if (strncmp(thte->th_name, cp, len) != 0)
- continue;
- if (thte->th_name[len] == '\0')
- return (thte->th_idx);
- }
-
- return (0);
-}
-
-/*
- * Store a type and it's type string so we can later share this type
- * if we read the same type string from the input file.
- */
-static u_short
-storetyp(type_t *tp, const char *cp, size_t len, int h)
-{
- static u_int tidx = 1; /* 0 is reserved */
- thtab_t *thte;
- char *name;
-
- if (tidx >= USHRT_MAX)
- errx(1, "sorry, too many types");
-
- if (tidx == tlstlen - 1) {
- if ((tlst = realloc(tlst, (tlstlen * 2) * sizeof (type_t *)))
- == NULL)
- nomem();
- (void)memset(tlst + tlstlen, 0, tlstlen * sizeof (type_t *));
- tlstlen *= 2;
- }
-
- tlst[tidx] = tp;
-
- /* create a hash table entry */
- name = xalloc(len + 1);
- (void)memcpy(name, cp, len);
- name[len] = '\0';
-
- thte = xalloc(sizeof (thtab_t));
- thte->th_name = name;
- thte->th_idx = tidx;
- thte->th_nxt = thtab[h];
- thtab[h] = thte;
-
- return ((u_short)tidx++);
-}
-
-/*
- * Hash function for types
- */
-static int
-thash(const char *s, size_t len)
-{
- u_int v;
-
- v = 0;
- while (len-- != 0) {
- v = (v << sizeof (v)) + (u_char)*s++;
- v ^= v >> (sizeof (v) * CHAR_BIT - sizeof (v));
- }
- return (v % THSHSIZ2);
-}
-
-/*
- * Read a string enclosed by "". This string may contain quoted chars.
- */
-static char *
-inpqstrg(const char *src, const char **epp)
-{
- char *strg, *dst;
- size_t slen;
- int c;
- int v;
-
- if ((dst = strg = malloc(slen = 32)) == NULL)
- nomem();
-
- if ((c = *src++) != '"')
- inperr();
- if ((c = *src++) == '\0')
- inperr();
-
- while (c != '"') {
- if (c == '\\') {
- if ((c = *src++) == '\0')
- inperr();
- switch (c) {
- case 'n':
- c = '\n';
- break;
- case 't':
- c = '\t';
- break;
- case 'v':
- c = '\v';
- break;
- case 'b':
- c = '\b';
- break;
- case 'r':
- c = '\r';
- break;
- case 'f':
- c = '\f';
- break;
- case 'a':
- c = '\a';
- break;
- case '\\':
- c = '\\';
- break;
- case '"':
- c = '"';
- break;
- case '\'':
- c = '\'';
- break;
- case '0': case '1': case '2': case '3':
- v = (c - '0') << 6;
- if ((c = *src++) < '0' || c > '7')
- inperr();
- v |= (c - '0') << 3;
- if ((c = *src++) < '0' || c > '7')
- inperr();
- v |= c - '0';
- c = (u_char)v;
- break;
- default:
- inperr();
- }
- }
- /* keep space for trailing '\0' */
- if (dst - strg == slen - 1) {
- if ((strg = realloc(strg, slen * 2)) == NULL)
- nomem();
- dst = strg + (slen - 1);
- slen *= 2;
- }
- *dst++ = (char)c;
- if ((c = *src++) == '\0')
- inperr();
- }
- *dst = '\0';
-
- *epp = src;
- return (strg);
-}
-
-/*
- * Read the name of a symbol in static memory.
- */
-static const char *
-inpname(const char *cp, const char **epp)
-{
- static char *buf;
- static size_t blen = 0;
- size_t len, i;
- char *eptr, c;
-
- len = (int)strtol(cp, &eptr, 10);
- if (cp == eptr)
- inperr();
- cp = eptr;
- if (len + 1 > blen)
- if ((buf = realloc(buf, blen = len + 1)) == NULL)
- nomem();
- for (i = 0; i < len; i++) {
- c = *cp++;
- if (!isalnum((unsigned char)c) && c != '_')
- inperr();
- buf[i] = c;
- }
- buf[i] = '\0';
-
- *epp = cp;
- return (buf);
-}
-
-/*
- * Return the index of a file name. If the name cannot be found, create
- * a new entry and return the index of the newly created entry.
- */
-static int
-getfnidx(const char *fn)
-{
- int i;
-
- /* 0 ist reserved */
- for (i = 1; fnames[i] != NULL; i++) {
- if (strcmp(fnames[i], fn) == 0)
- break;
- }
- if (fnames[i] != NULL)
- return (i);
-
- if (i == nfnames - 1) {
- if ((fnames = realloc(fnames, (nfnames * 2) * sizeof (char *)))
- == NULL)
- nomem();
- (void)memset(fnames + nfnames, 0, nfnames * sizeof (char *));
- nfnames *= 2;
- }
-
- if ((fnames[i] = strdup(fn)) == NULL)
- nomem();
- return (i);
-}
-
-/*
- * Separate symbols with static and external linkage.
- */
-void
-mkstatic(hte_t *hte)
-{
- sym_t *sym1, **symp, *sym;
- fcall_t **callp, *call;
- usym_t **usymp, *usym;
- hte_t *nhte;
- int ofnd;
-
- /* Look for first static definition */
- for (sym1 = hte->h_syms; sym1 != NULL; sym1 = sym1->s_nxt) {
- if (sym1->s_static)
- break;
- }
- if (sym1 == NULL)
- return;
-
- /* Do nothing if this name is used only in one translation unit. */
- ofnd = 0;
- for (sym = hte->h_syms; sym != NULL && !ofnd; sym = sym->s_nxt) {
- if (sym->s_pos.p_src != sym1->s_pos.p_src)
- ofnd = 1;
- }
- for (call = hte->h_calls; call != NULL && !ofnd; call = call->f_nxt) {
- if (call->f_pos.p_src != sym1->s_pos.p_src)
- ofnd = 1;
- }
- for (usym = hte->h_usyms; usym != NULL && !ofnd; usym = usym->u_nxt) {
- if (usym->u_pos.p_src != sym1->s_pos.p_src)
- ofnd = 1;
- }
- if (!ofnd) {
- hte->h_used = 1;
- /* errors about undef. static symbols are printed in lint1 */
- hte->h_def = 1;
- hte->h_static = 1;
- return;
- }
-
- /*
- * Create a new hash table entry
- *
- * XXX this entry should be put at the beginning of the list to
- * avoid to process the same symbol twice.
- */
- for (nhte = hte; nhte->h_link != NULL; nhte = nhte->h_link)
- continue;
- nhte->h_link = xmalloc(sizeof (hte_t));
- nhte = nhte->h_link;
- nhte->h_name = hte->h_name;
- nhte->h_used = 1;
- nhte->h_def = 1; /* error in lint1 */
- nhte->h_static = 1;
- nhte->h_syms = NULL;
- nhte->h_lsym = &nhte->h_syms;
- nhte->h_calls = NULL;
- nhte->h_lcall = &nhte->h_calls;
- nhte->h_usyms = NULL;
- nhte->h_lusym = &nhte->h_usyms;
- nhte->h_link = NULL;
- nhte->h_hte = NULL;
-
- /*
- * move all symbols used in this translation unit into the new
- * hash table entry.
- */
- for (symp = &hte->h_syms; (sym = *symp) != NULL; ) {
- if (sym->s_pos.p_src == sym1->s_pos.p_src) {
- sym->s_static = 1;
- (*symp) = sym->s_nxt;
- if (hte->h_lsym == &sym->s_nxt)
- hte->h_lsym = symp;
- sym->s_nxt = NULL;
- *nhte->h_lsym = sym;
- nhte->h_lsym = &sym->s_nxt;
- } else {
- symp = &sym->s_nxt;
- }
- }
- for (callp = &hte->h_calls; (call = *callp) != NULL; ) {
- if (call->f_pos.p_src == sym1->s_pos.p_src) {
- (*callp) = call->f_nxt;
- if (hte->h_lcall == &call->f_nxt)
- hte->h_lcall = callp;
- call->f_nxt = NULL;
- *nhte->h_lcall = call;
- nhte->h_lcall = &call->f_nxt;
- } else {
- callp = &call->f_nxt;
- }
- }
- for (usymp = &hte->h_usyms; (usym = *usymp) != NULL; ) {
- if (usym->u_pos.p_src == sym1->s_pos.p_src) {
- (*usymp) = usym->u_nxt;
- if (hte->h_lusym == &usym->u_nxt)
- hte->h_lusym = usymp;
- usym->u_nxt = NULL;
- *nhte->h_lusym = usym;
- nhte->h_lusym = &usym->u_nxt;
- } else {
- usymp = &usym->u_nxt;
- }
- }
-
- /* h_def must be recalculated for old hte */
- hte->h_def = nhte->h_def = 0;
- for (sym = hte->h_syms; sym != NULL; sym = sym->s_nxt) {
- if (sym->s_def == DEF || sym->s_def == TDEF) {
- hte->h_def = 1;
- break;
- }
- }
-
- mkstatic(hte);
-}
Index: usr.bin/xlint/llib/Makefile
===================================================================
--- usr.bin/xlint/llib/Makefile
+++ /dev/null
@@ -1,30 +0,0 @@
-# $NetBSD: Makefile,v 1.7 2000/06/14 20:22:19 matt Exp $
-# $FreeBSD$
-
-LIBS= llib-lposix.ln llib-lstdc.ln
-
-FILES= ${LIBS}
-FILESDIR= ${LINTLIBDIR}
-
-CLEANFILES+= ${LIBS}
-
-llib-lposix.ln: llib-lposix
- ${LINT} ${LINTFLAGS} -Cposix ${.ALLSRC}
-
-llib-lstdc.ln: llib-lstdc
- ${LINT} ${LINTFLAGS} -Cstdc ${.ALLSRC}
-
-.include <bsd.prog.mk>
-
-.if !empty(STAGE_INCLUDEDIR)
-LINTFLAGS+= -I${STAGE_INCLUDEDIR}
-.else
-.if ${CFLAGS:M--sysroot=*} != ""
-_sysroot?= ${CFLAGS:M--sysroot=*:[1]:C,^--sysroot=,,}
-.elif ${CC:M--sysroot=*} != ""
-_sysroot?= ${CC:M--sysroot=*:[1]:C,^--sysroot=,,}
-.endif
-.if !empty(_sysroot)
-LINTFLAGS+= -I${_sysroot}/usr/include
-.endif
-.endif
Index: usr.bin/xlint/llib/Makefile.depend
===================================================================
--- usr.bin/xlint/llib/Makefile.depend
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- include \
- lib/msun \
- usr.bin/xlint/xlint.host \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: usr.bin/xlint/llib/llib-lposix
===================================================================
--- usr.bin/xlint/llib/llib-lposix
+++ /dev/null
@@ -1,314 +0,0 @@
-/* $NetBSD: llib-lposix,v 1.2 1995/07/03 21:25:09 cgd Exp $ */
-/* $FreeBSD$ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* LINTLIBRARY */
-
-#define _POSIX_SOURCE
-
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/utsname.h>
-#include <sys/times.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <math.h>
-#include <time.h>
-#include <assert.h>
-#include <termios.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <grp.h>
-#include <pwd.h>
-#include <ctype.h>
-#include <signal.h>
-#include <locale.h>
-#include <setjmp.h>
-#include <string.h>
-#include <utime.h>
-
-
-/* PROTOLIB1 */
-
-
-void (abort)(void);
-int (abs)(int j);
-int (access)(const char *path, int amode);
-double (acos)(double x);
-unsigned (alarm)(unsigned seconds);
-char *(asctime)(const struct tm *timeptr);
-double (asin)(double x);
-void (__assert)(const char *expression, const char *func, int line,
- const char *file);
-double (atan)(double x);
-double (atan2)(double y, double x);
-int (atexit)(void (*func)(void));
-double (atof)(const char *nptr);
-int (atoi)(const char *nptr);
-long (atol)(const char *nptr);
-void *(bsearch)(const void *key, const void *base, size_t nmemb,
- size_t size, int (*compar)(const void *, const void *));
-void *(calloc)(size_t nmemb, size_t size);
-double (ceil)(double x);
-speed_t (cfgetispeed)(const struct termios *p);
-speed_t (cfgetospeed)(const struct termios *p);
-int (cfsetispeed)(struct termios *p, speed_t speed);
-int (cfsetospeed)(struct termios *p, speed_t speed);
-int (chdir)(const char *path);
-int (chmod)(const char *path, mode_t mode);
-int (chown)(const char *path, uid_t owner, gid_t group);
-void (clearerr)(FILE *stream);
-clock_t (clock)(void);
-int (close)(int fildes);
-int (closedir)(DIR *dirp);
-double (cos)(double x);
-double (cosh)(double x);
-int (creat)(const char *path, mode_t mode);
-char *(ctermid)(char *s);
-char *(ctime)(const time_t *timer);
-char *(cuserid)(char *s);
-double (difftime)(time_t time1, time_t time0);
-div_t (div)(int numer, int denom);
-int (dup)(int fildes);
-int (dup2)(int fildes, int fildes2);
-int (errno);
-int (execl)(const char *path, const char *arg, ...);
-int (execle)(const char *path, const char *arg, ...);
-int (execlp)(const char *file, const char *arg, ...);
-int (execv)(const char *path, char *const argv[]);
-int (execve)(const char *path, char *const argv[], char *const *envp);
-int (execvp)(const char *file, char *const argv[]);
-void (exit)(int status);
-void (_exit)(int status);
-double (exp)(double x);
-double (fabs)(double x);
-int (fclose)(FILE *stream);
-int (fcntl)(int fildes, int cmd, ...);
-FILE *(fdopen)(int fildes, const char *type);
-int (feof)(FILE *stream);
-int (ferror)(FILE *stream);
-int (fflush)(FILE *stream);
-int (fgetc)(FILE *stream);
-int (fgetpos)(FILE *stream, fpos_t *pos);
-char *(fgets)(char *s, int n, FILE *stream);
-int (fileno)(FILE *stream);
-double (floor)(double x);
-double (fmod)(double x, double y);
-FILE *(fopen)(const char *filename, const char *mode);
-pid_t (fork)(void);
-long (fpathconf)(int fildes, int name);
-/* PRINTFLIKE2 */
-int (fprintf)(FILE *stream, const char *format, ...);
-int (fputc)(int c, FILE *stream);
-int (fputs)(const char *s, FILE *stream);
-size_t (fread)(void *ptr, size_t size, size_t nmemb, FILE *stream);
-void (free)(void *ptr);
-FILE *(freopen)(const char *filename, const char *mode, FILE *stream);
-double (frepx)(double value, int *exp);
-/* SCANFLIKE2 */
-int (fscanf)(FILE *stream, const char *format, ...);
-int (fseek)(FILE *stream, long int offset, int whence);
-int (fsetpos)(FILE *stream, const fpos_t *pos);
-int (fstat)(int fildes, struct stat *buf);
-long (ftell)(FILE *stream);
-size_t (fwrite)(const void *ptr, size_t size, size_t nmemb, FILE *stream);
-int (getc)(FILE *stream);
-int (getchar)(void);
-char *(getcwd)(char *buf, size_t size);
-gid_t (getegid)(void);
-char *(getenv)(const char *name);
-uid_t (geteuid)(void);
-gid_t (getgid)(void);
-struct group *(getgrgid)(gid_t gid);
-struct group *(getgrnam)(const char *name);
-int (getgroups)(int gidsetsize, gid_t grouplist[]);
-char *(getlogin)(void);
-pid_t (getpgrp)(void);
-pid_t (getpid)(void);
-pid_t (getppid)(void);
-struct passwd *(getpwnam)(const char *name);
-struct passwd *(getpwuid)(uid_t uid);
-char *(gets)(char *s);
-uid_t (getuid)(void);
-struct tm *(gmtime)(const time_t *timer);
-int (isalnum)(int c);
-int (isalpha)(int c);
-int (isatty)(int fildes);
-int (iscntrl)(int c);
-int (isdigit)(int c);
-int (isgraph)(int c);
-int (islower)(int c);
-int (isprint)(int c);
-int (ispunct)(int c);
-int (isspace)(int c);
-int (isupper)(int c);
-int (isxdigit)(int c);
-int (kill)(pid_t pid, int sig);
-long (labs)(long j);
-double (ldexp)(double x, int exp);
-ldiv_t (ldiv)(long numer, long denom);
-int (link)(const char *existing, const char *new);
-struct lconv *(localeconv)(void);
-struct tm *(localtime)(const time_t *timer);
-double (log)(double x);
-double (log10)(double x);
-void (longjmp)(jmp_buf env, int val);
-off_t (lseek)(int fildes, off_t offset, int whence);
-void *(malloc)(size_t size);
-int (mblen)(const char *s, size_t n);
-size_t (mbstowcs)(wchar_t *pwcs, const char *s, size_t n);
-int (mbtowc)(wchar_t *pwc, const char *s, size_t n);
-void *(memchr)(const void *s, int c, size_t n);
-int (memcmp)(const void *s1, const void *s2, size_t n);
-void *(memcpy)(void *s1, const void *s2, size_t n);
-void *(memmove)(void *s1, const void *s2, size_t n);
-void *(memset)(void *s, int c, size_t n);
-int (mkdir)(const char *path, mode_t mode);
-int (mkfifo)(const char *path, mode_t mode);
-time_t (mktime)(struct tm *timeptr);
-double (modf)(double value, double *iptr);
-int (open)(const char *path, int oflag, ...);
-DIR *(opendir)(const char *dirname);
-long (pathconf)(const char *path, int name);
-int (pause)(void);
-void (perror)(const char *s);
-int (pipe)(int fildes[2]);
-double (pow)(double x, double y);
-/* PRINTFLIKE1 */
-int (printf)(const char *format, ...);
-int (putc)(int c, FILE *stream);
-int (putchar)(int c);
-int (puts)(const char *s);
-void (qsort)(void *base, size_t nmemb, size_t size,
- int (*compar)(const void *, const void *));
-int (raise)(int sig);
-int (rand)(void);
-ssize_t (read)(int fildes, void *buf, size_t nbyte);
-struct dirent *(readdir)(DIR *dirp);
-void *(realloc)(void *ptr, size_t size);
-int (remove)(const char *filename);
-int (rename)(const char *old, const char *new);
-void (rewind)(FILE *stream);
-void (rewinddir)(DIR *dirp);
-int (rmdir)(const char *path);
-/* SCANFLIKE1 */
-int (scanf)(const char *format, ...);
-void (setbuf)(FILE *stream, char *buf);
-int (setgid)(gid_t gid);
-int (setjmp)(jmp_buf env);
-char *(setlocale)(int category, const char *locale);
-int (setpgid)(pid_t pid, pid_t pgid);
-pid_t (setsid)(void);
-int (setuid)(uid_t uid);
-int (setvbuf)(FILE *stream, char *buf, int mode, size_t size);
-int (sigaction)(int sig, const struct sigaction *act,
- struct sigaction *oact);
-int (sigaddset)(sigset_t *set, int signo);
-int (sigdelset)(sigset_t *set, int signo);
-int (sigemptyset)(sigset_t *set);
-int (sigfillset)(sigset_t *set);
-int (sigismember)(const sigset_t *set, int signo);
-void (siglongjmp)(sigjmp_buf env, int val);
-void (*(signal)(int sig, void (*func)(int)))(int);
-int (sigpending)(sigset_t *set);
-int (sigprocmask)(int how, const sigset_t *set, sigset_t *oset);
-int (sigsetjmp)(sigjmp_buf env, int savemask);
-int (sigsuspend)(const sigset_t *sigmask);
-double (sin)(double x);
-double (sinh)(double x);
-unsigned (sleep)(unsigned seconds);
-/* PRINTFLIKE2 */
-int (sprintf)(char *s, const char *format, ...);
-double (sqrt)(double x);
-void (srand)(unsigned seed);
-/* SCANFLIKE2 */
-int (sscanf)(const char *s, const char *format, ...);
-int (stat)(const char *path, struct stat *buf);
-char *(strcat)(char *s1, const char *s2);
-char *(strchr)(const char *s, int c);
-int (strcmp)(const char *s1, const char *s2);
-int (strcoll)(const char *s1, const char *s2);
-char *(strcpy)(char *s1, const char *s2);
-size_t (strcspn)(const char *s1, const char *s2);
-char *(strerror)(int errnum);
-size_t (strftime)(char *s, size_t maxsize, const char *format,
- const struct tm *timeptr);
-size_t (strlen)(const char *s);
-char *(strncat)(char *s1, const char *s2, size_t n);
-int (strncmp)(const char *s1, const char *s2, size_t n);
-char *(strncpy)(char *s1, const char *s2, size_t n);
-char *(strpbrk)(const char *s1, const char *s2);
-char *(strrchr)(const char *s, int c);
-size_t (strspn)(const char *s1, const char *s2);
-char *(strstr)(const char *s1, const char *s2);
-double (strtod)(const char *nptr, char **endptr);
-char *(strtok)(char *s1, const char *s2);
-long (strtol)(const char *nptr, char **endptr, int base);
-unsigned long (strtoul)(const char *nptr, char **endptr, int base);
-size_t (strxfrm)(char *s1, const char *s2, size_t n);
-long (sysconf)(int name);
-int (system)(const char *string);
-double (tan)(double x);
-double (tanh)(double x);
-int (tcdrain)(int fildes);
-int (tcflow)(int fildes, int action);
-int (tcflush)(int fildes, int queue_selector);
-int (tcgetattr)(int fildes, struct termios *tp);
-pid_t (tcgetpgrp)(int fildes);
-int (tcsendbreak)(int fildes, int duration);
-int (tcsetattr)(int fildes, int options, const struct termios *tp);
-int (tcsetpgrp)(int fildes, pid_t pgrpid);
-time_t (time)(time_t *timer);
-clock_t (times)(struct tms *buffer);
-FILE *(tmpfile)(void);
-char *(tmpnam)(char *s);
-int (tolower)(int c);
-int (toupper)(int c);
-char *(ttyname)(int filedes);
-void (tzset)(void);
-mode_t (umask)(mode_t cmask);
-int (uname)(struct utsname *name);
-int (ungetc)(int c, FILE *stream);
-int (unlink)(const char *path);
-int (utime)(const char *path, const struct utimbuf *times);
-int (vfprintf)(FILE *stream, const char *format, va_list arg);
-int (vprintf)(const char *format, va_list arg);
-int (vsprintf)(char *s, const char *format, va_list arg);
-pid_t (wait)(int *statloc);
-pid_t (waitpid)(pid_t pid, int *stat_loc, int options);
-size_t (wcstombs)(char *s, const wchar_t *pwcs, size_t n);
-int (wctomb)(char *s, wchar_t wchar);
-ssize_t (write)(int fildes, const void *buf, size_t nbyte);
Index: usr.bin/xlint/llib/llib-lstdc
===================================================================
--- usr.bin/xlint/llib/llib-lstdc
+++ /dev/null
@@ -1,254 +0,0 @@
-/* $NetBSD: llib-lstdc,v 1.2 1995/07/03 21:25:11 cgd Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* LINTLIBRARY */
-
-#define _ANSI_SOURCE
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <locale.h>
-#include <math.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-/* PROTOLIB1 */
-
-/*
- * assert.h
- */
-#ifdef __NetBSD__
-void (__assert)(const char *expression, int line, const char *file);
-#else
-void (assert)(int expression);
-#endif
-
-/*
- * ctype.h
- */
-int (isalnum)(int c);
-int (isalpha)(int c);
-int (iscntrl)(int c);
-int (isdigit)(int c);
-int (isgraph)(int c);
-int (islower)(int c);
-int (isprint)(int c);
-int (ispunct)(int c);
-int (isspace)(int c);
-int (isupper)(int c);
-int (isxdigit)(int c);
-int (tolower)(int c);
-int (toupper)(int c);
-
-/*
- * errno.h
- */
-int (errno);
-
-/*
- * locale.h
- */
-char *(setlocale)(int category, const char *locale);
-struct lconv *(localeconv)(void);
-
-/*
- * math.h
- */
-double (acos)(double x);
-double (asin)(double x);
-double (atan)(double x);
-double (atan2)(double y, double x);
-double (cos)(double x);
-double (sin)(double x);
-double (tan)(double x);
-double (cosh)(double x);
-double (sinh)(double x);
-double (tanh)(double x);
-double (exp)(double x);
-double (frexp)(double value, int *exp);
-double (ldexp)(double x, int exp);
-double (log)(double x);
-double (log10)(double x);
-double (modf)(double value, double *iptr);
-double (pow)(double x, double y);
-double (sqrt)(double x);
-double (ceil)(double x);
-double (fabs)(double x);
-double (floor)(double x);
-double (fmod)(double x, double y);
-
-/*
- * setjmp.h
- */
-int (setjmp)(jmp_buf env);
-void (longjmp)(jmp_buf env, int val);
-
-/*
- * signal.h
- */
-void (*(signal)(int sig, void (*func)(int)))(int);
-int (raise)(int sig);
-
-/*
- * stdio.h
- */
-int (remove)(const char *filename);
-int (rename)(const char *old, const char *new);
-FILE *(tmpfile)(void);
-char *(tmpnam)(char *s);
-int (fclose)(FILE *stream);
-int (fflush)(FILE *stream);
-FILE *(fopen)(const char *filename, const char *mode);
-FILE *(freopen)(const char *filename, const char *mode, FILE *stream);
-void (setbuf)(FILE *stream, char *buf);
-int (setvbuf)(FILE *stream, char *buf, int mode, size_t size);
-/* PRINTFLIKE2 */
-int (fprintf)(FILE *stream, const char *format, ...);
-/* SCANFLIKE2 */
-int (fscanf)(FILE *stream, const char *format, ...);
-/* PRINTFLIKE1 */
-int (printf)(const char *format, ...);
-/* SCANFLIKE1 */
-int (scanf)(const char *format, ...);
-/* PRINTFLIKE2 */
-int (sprintf)(char *s, const char *format, ...);
-/* SCANFLIKE2 */
-int (sscanf)(const char *s, const char *format, ...);
-int (vfprintf)(FILE *stream, const char *format, va_list arg);
-int (vprintf)(const char *format, va_list arg);
-int (vsprintf)(char *s, const char *format, va_list arg);
-int (fgetc)(FILE *stream);
-char *(fgets)(char *s, int n, FILE *stream);
-int (fputc)(int c, FILE *stream);
-int (fputs)(const char *s, FILE *stream);
-int (getc)(FILE *stream);
-int (getchar)(void);
-char *(gets)(char *s);
-int (putc)(int c, FILE *stream);
-int (putchar)(int c);
-int (puts)(const char *s);
-int (ungetc)(int c, FILE *stream);
-size_t (fread)(void *ptr, size_t size, size_t nmemb, FILE *stream);
-size_t (fwrite)(const void *ptr, size_t size, size_t nmemb, FILE *stream);
-int (fgetpos)(FILE *stream, fpos_t *pos);
-int (fseek)(FILE *stream, long offset, int whence);
-int (fsetpos)(FILE *stream, const fpos_t *pos);
-long (ftell)(FILE *stream);
-void (rewind)(FILE *stream);
-void (clearerr)(FILE *stream);
-int (feof)(FILE *stream);
-int (ferror)(FILE *stream);
-void (perror)(const char *s);
-
-/*
- * stdlib.h
- */
-double (atof)(const char *nptr);
-int (atoi)(const char *nptr);
-long (atol)(const char *nptr);
-double (strtod)(const char *nptr, char **endptr);
-long (strtol)(const char *nptr, char **endptr, int base);
-unsigned long (strtoul)(const char *nptr, char **endptr, int base);
-int (rand)(void);
-void (srand)(unsigned seed);
-void *(calloc)(size_t nmemb, size_t size);
-void (free)(void *ptr);
-void *(malloc)(size_t size);
-void *(realloc)(void *ptr, size_t size);
-void (abort)(void);
-int (atexit)(void (*func)(void));
-void (exit)(int status);
-char *(getenv)(const char *name);
-int (system)(const char *string);
-void *(bsearch)(const void *key, const void *base, size_t nmemb,
- size_t size, int (*compar)(const void *, const void *));
-void (qsort)(void *base, size_t nmemb, size_t size,
- int (*compar)(const void *, const void *));
-int (abs)(int j);
-div_t (div)(int numer, int denom);
-long (labs)(long j);
-ldiv_t (ldiv)(long numer, long denom);
-int (mblen)(const char *s, size_t n);
-int (mbtowc)(wchar_t *PWC, const char *s, size_t n);
-int (wctomb)(char *s, wchar_t wchar);
-size_t (mbstowcs)(wchar_t *pwcs, const char *s, size_t n);
-size_t (wcstombs)(char *s, const wchar_t *pwcs, size_t n);
-
-/*
- * string.h
- */
-void *(memcpy)(void *s1, const void *s2, size_t n);
-void *(memmove)(void *s1, const void *s2, size_t n);
-char *(strcpy)(char *s1, const char *s2);
-char *(strncpy)(char *s1, const char *s2, size_t n);
-char *(strcat)(char *s1, const char *s2);
-char *(strncat)(char *s1, const char *s2, size_t n);
-int (memcmp)(const void *s1, const void *s2, size_t n);
-int (strcmp)(const char *s1, const char *s2);
-int (strcoll)(const char *s1, const char *s2);
-int (strncmp)(const char *s1, const char *s2, size_t n);
-size_t (strxfrm)(char *s1, const char *s2, size_t n);
-void *(memchr)(const void *s, int c, size_t n);
-char *(strchr)(const char *s, int c);
-size_t (strcspn)(const char *s1, const char *s2);
-char *(strpbrk)(const char *s1, const char *s2);
-char *(strrchr)(const char *s1, int c);
-size_t (strspn)(const char *s1, const char *s2);
-char *(strstr)(const char *s1, const char *s2);
-char *(strtok)(char *s1, const char *s2);
-void *(memset)(void *s, int c, size_t n);
-char *(strerror)(int errnom);
-size_t (strlen)(const char *s);
-
-/*
- * time.h
- */
-clock_t (clock)(void);
-double (difftime)(time_t time1, time_t time2);
-time_t (mktime)(struct tm *timeptr);
-time_t (time)(time_t *timer);
-char *(asctime)(const struct tm *timeptr);
-char *(ctime)(const time_t *timer);
-struct tm *(gmtime)(const time_t *timer);
-struct tm *(localtime)(const time_t *timer);
-size_t (strftime)(char *s, size_t maxsize, const char *format,
- const struct tm *timeptr);
Index: usr.bin/xlint/xlint/Makefile
===================================================================
--- usr.bin/xlint/xlint/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# $NetBSD: Makefile,v 1.2 1995/07/03 21:25:14 cgd Exp $
-# $FreeBSD$
-
-.PATH: ${.CURDIR}/../lint1
-
-PROG= xlint
-PROGNAME= lint
-SRCS= xlint.c mem.c
-MAN= lint.1
-
-CFLAGS+=-I${.CURDIR}/../lint1
-CFLAGS+= -DPREFIX=\"${TOOLS_PREFIX}\"
-
-.include "${.CURDIR}/../../Makefile.inc"
-.include <bsd.prog.mk>
Index: usr.bin/xlint/xlint/Makefile.depend
===================================================================
--- usr.bin/xlint/xlint/Makefile.depend
+++ /dev/null
@@ -1,17 +0,0 @@
-# $FreeBSD$
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
- gnu/lib/csu \
- include \
- include/xlocale \
- lib/${CSU_DIR} \
- lib/libc \
- lib/libcompiler_rt \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
Index: usr.bin/xlint/xlint/lint.1
===================================================================
--- usr.bin/xlint/xlint/lint.1
+++ /dev/null
@@ -1,627 +0,0 @@
-.\" $NetBSD: lint.1,v 1.29 2004/01/26 21:59:42 wiz Exp $
-.\"
-.\" Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
-.\" Copyright (c) 1994, 1995 Jochen Pohl
-.\" All Rights Reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\" notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\" notice, this list of conditions and the following disclaimer in the
-.\" documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\" must display the following acknowledgement:
-.\" This product includes software developed by Jochen Pohl for
-.\" The NetBSD Project.
-.\" 4. The name of the author may not be used to endorse or promote products
-.\" derived from this software without specific prior written permission.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\" $FreeBSD$
-.\"
-.Dd Mar 23, 2015
-.Dt LINT 1
-.Os
-.Sh NAME
-.Nm lint
-.Nd a C program verifier
-.Sh SYNOPSIS
-.Bk -words
-.Nm
-.Op Fl abceghprvwxzHFV
-.Op Fl s | t
-.Op Fl i | nu
-.Op Fl D Ar name Ns Op = Ns Ar def
-.Op Fl U Ar name
-.Op Fl I Ar directory
-.Op Fl d Ar directory
-.Op Fl L Ar directory
-.Op Fl MD
-.Op Fl l Ar library
-.Op Fl o Ar outputfile
-.Op Fl B Ar directory
-.Op Fl X Ar id Ns Op , Ns Ar id ...
-.Ar
-.Nm
-.Op Fl abceghprvwzHFV
-.Op Fl s | t
-.Fl C Ar library
-.Op Fl D Ar name Ns Op = Ns Ar def
-.Op Fl U Ar name
-.Op Fl I Ar directory
-.Op Fl d Ar directory
-.Op Fl B Ar directory
-.Op Fl X Ar id Ns Op , Ns Ar id ...
-.Ar
-.Ek
-.Sh DESCRIPTION
-The
-.Nm
-utility attempts to detect features of the named C program files
-that are likely to be bugs, to be non-portable, or to be
-wasteful.
-It also performs stricter type checking than does
-the C compiler.
-The
-.Nm
-utility runs the C preprocessor as its first phase, with the
-preprocessor symbol
-.Dq Dv lint
-defined to allow certain questionable code to be altered
-or skipped by
-.Nm .
-Therefore, this symbol should be thought of as a reserved
-word for all code that is to be checked by
-.Nm .
-.Pp
-Among the possible problems that are currently noted are
-unreachable statements, loops not entered at the top,
-variables declared and not used, and logical expressions
-with constant values.
-Function calls are checked for
-inconsistencies, such as calls to functions that return
-values in some places and not in others, functions called
-with varying numbers of arguments, function calls that
-pass arguments of a type other than the type the function
-expects to receive, functions whose values are not used,
-and calls to functions not returning values that use
-the non-existent return value of the function.
-.Pp
-Filename arguments ending with
-.Pa .c
-are taken to be C source files.
-Filename arguments with
-names ending with
-.Pa .ln
-are taken to be the result of an earlier invocation of
-.Nm ,
-with either the
-.Fl i , o ,
-or
-.Fl C
-option in effect.
-The
-.Pa .ln
-files are analogous to the
-.Pa .o
-(object) files produced by
-.Xr cc 1
-from
-.Pa .c
-files.
-The
-.Nm
-utility also accepts special libraries specified with the
-.Fl l
-option, which contain definitions of library routines and
-variables.
-.Pp
-The
-.Nm
-utility takes all the
-.Pa .c , .ln ,
-and
-.Pa llib-l Ns Ar library Ns Pa .ln
-(lint library) files and processes them in command-line order.
-By default,
-.Nm
-appends the standard C lint library
-.Pq Pa llib-lc.ln
-to the end of the list of files.
-When the
-.Fl i
-option is used, the
-.Pa .ln
-files are ignored.
-Also, when the
-.Fl o
-or
-.Fl i
-options are used, the
-.Pa llib-l Ns Ar library Ns Pa .ln
-files are ignored.
-When the
-.Fl i
-option is
-.Em omitted
-the second pass of
-.Nm
-checks this list of files for mutual compatibility.
-At this point,
-if a complaint stems not from a given source file, but from one of
-its included files, the source filename will be printed followed by
-a question mark.
-.Pp
-The special input file name
-.Dq Pa -
-causes
-.Nm
-to take input from standard input (until end of file) and process
-it as if it were a
-.Pa .c
-file.
-If the
-.Fl i
-flag is given and
-.Dq Pa -
-is named as one of the input files, the
-.Fl o
-flag must also be specified to provide an output file name.
-The options are as follows:
-.Bl -tag -width indent
-.It Fl a
-Report assignments of
-.Vt long
-values to variables that are not
-.Vt long .
-.It Fl aa
-Additional to
-.Fl a ,
-report
-.Em all
-assignments of integer values to other integer values which
-cause implicit narrowing conversion.
-.It Fl b
-Report
-.Ic break
-statements that cannot be reached.
-This is not the default
-because, unfortunately, most
-.Xr lex 1
-and many
-.Xr yacc 1
-outputs produce many such complaints.
-.It Fl c
-Complain about casts which have questionable portability.
-.It Fl e
-Complain about unusual operations on
-.Vt enum Ns -Types
-and combinations of
-.Vt enum Ns -
-and
-.Sy integer Ns -Types .
-.It Fl g
-Do not print warnings for some extensions of
-.Xr gcc 1
-to the C language.
-Currently these are nonconstant initializers in
-automatic aggregate initializations, arithmetic on pointer to void,
-trailing commas in
-.Vt enum
-declarations, C++ -style
-.Dq Li //
-comments,
-zero sized structures, subscripting of non-lvalue arrays, prototypes
-overriding old style function declarations and long long
-integer types.
-The
-.Fl g
-flag also turns on the keywords
-.Ic asm
-and
-.Ic inline
-(alternative keywords with leading underscores for both
-.Ic asm
-and
-.Ic inline
-are always available).
-.It Fl h
-Apply a number of heuristic tests to attempt to intuit
-bugs, improve style, and reduce waste.
-.It Fl i
-Produce a
-.Pa .ln
-file for every
-.Pa .c
-file on the command line.
-These
-.Pa .ln
-files are the product of
-.Nm Ns 's
-first pass only, and are not checked for compatibility
-between functions.
-.It Fl n
-Do not check compatibility against the standard library.
-.It Fl p
-Attempt to check portability of code to other dialects of C.
-.It Fl r
-In case of redeclarations report the position of the
-previous declaration.
-.It Fl s
-Strict ANSI C mode.
-Issue warnings and errors required by ANSI C.
-Also do not produce warnings for constructs which behave
-differently in traditional C and ANSI C.
-With the
-.Fl s
-flag,
-.Dv __STRICT_ANSI__
-is a predefined preprocessor macro.
-.It Fl S
-C9X mode. Currently not fully implemented.
-.It Fl t
-Traditional C mode.
-.Dv __STDC__
-is not predefined in this mode.
-Warnings are printed for constructs
-not allowed in traditional C.
-Warnings for constructs which behave
-differently in traditional C and ANSI C are suppressed.
-Preprocessor
-macros describing the machine type (e.g.,
-.Dv sun3 )
-and machine architecture (e.g.,
-.Dv m68k )
-are defined without leading and trailing underscores.
-The keywords
-.Ic const , volatile
-and
-.Ic signed
-are not available in traditional C mode (although the alternative
-keywords with leading underscores still are).
-.It Fl u
-Do not complain about functions and external variables used
-and not defined, or defined and not used (this is suitable
-for running
-.Nm
-on a subset of files comprising part of a larger program).
-.It Fl v
-Suppress complaints about unused arguments in functions.
-.It Fl x
-Report variables referred to by
-.Ic extern
-declarations, but never used.
-.It Fl z
-Do not complain about structures that are never defined
-(for example, using a structure pointer without knowing
-its contents).
-.It Fl B Ar path
-Path to use when looking for the
-.Pa lint1
-and
-.Pa lint2
-binaries.
-Defaults to
-.Pa /usr/libexec .
-.It Fl C Ar library
-Create a
-.Nm
-library with the name
-.Pa llib-l Ns Ar library Ns Pa .ln .
-This library is built from all
-.Pa .c
-and
-.Pa .ln
-input files.
-After all global definitions of functions and
-variables in these files are written to the newly created library,
-.Nm
-checks all input files, including libraries specified with the
-.Fl l
-option, for mutual compatibility.
-.It Fl D Ar name Ns Op = Ns Ar def
-Define
-.Ar name
-for
-.Xr cpp 1 ,
-as if by a
-.Ic #define
-directive.
-If no definition is given,
-.Ar name
-is defined as 1.
-.It Fl I Ar directory
-Add
-.Ar directory
-to the list of directories in which to search for include files.
-.It Fl d Ar directory
-Use
-.Ar directory
-instead of
-.Pa /usr/include
-as the default place to find include files.
-.It Fl l Ar library
-Include the lint library
-.Pa llib-l Ns Ar library Ns Pa .ln .
-.It Fl L Ar directory
-Search for lint libraries in
-.Ar directory
-and
-.Ar directory Ns Pa /lint
-before searching the standard place.
-.It Fl F
-Print pathnames of files.
-The
-.Nm
-utility normally prints the filename without the path.
-.It Fl H
-If a complaint stems from an included file
-.Nm
-prints the name of the included file instead of the source file name
-followed by a question mark.
-.It Fl MD
-Pass
-.Fl MD
-to
-.Xr cpp 1
-causing cpp to create files containing dependency information for
-each source file.
-.It Fl o Ar outputfile
-Name the output file
-.Ar outputfile .
-The output file produced is the input that is given to
-.Nm Ns 's
-second pass.
-The
-.Fl o
-option simply saves this file in the named output file.
-If the
-.Fl i
-option is also used the files are not checked for compatibility.
-To produce a
-.Pa llib-l Ns Ar library Ns Pa .ln
-without extraneous messages, use of the
-.Fl u
-option is suggested.
-The
-.Fl v
-option is useful if the source file(s) for the lint library
-are just external interfaces.
-.It Fl U Ar name
-Remove any initial definition of
-.Ar name
-for the preprocessor.
-.It Fl V
-Print the command lines constructed by the controller program to
-run the C preprocessor and
-.Nm Ns 's
-first and second pass.
-.It Fl w
-Treat warnings as errors.
-.It Fl X Ar id Ns Op , Ns Ar id ...
-Suppress error messages identified by the list of ids.
-A list of messages
-and ids can be found in
-.Xr lint 7 .
-.El
-.Ss Input Grammar
-.Nm Ns 's
-first pass reads standard C source files.
-The
-.Nm
-utility recognizes the following C comments as commands.
-.Bl -tag -width indent
-.It Li /* ARGSUSED Ns Ar n Li */
-Makes
-.Nm
-check only the first
-.Ar n
-arguments for usage; a missing
-.Ar n
-is taken to be 0 (this option acts like the
-.Fl v
-option for the next function).
-.It Li /* BITFIELDTYPE */
-Suppress error messages about illegal bitfield types if the type
-is an integer type, and suppress non-portable bitfield type warnings.
-.It Xo
-.Li /* CONSTCOND */
-or
-.Li /* CONSTANTCOND */
-or
-.Li /* CONSTANTCONDITION */
-.Xc
-suppress complaints about constant operands for the next expression.
-.It Xo
-.Li /* FALLTHRU */
-or
-.Li /* FALLTHROUGH */
-.Xc
-suppress complaints about fall through to a
-.Ic case
-or
-.Ic default
-labelled statement.
-This directive should be placed immediately
-preceding the label.
-.It Li /* LINTLIBRARY */
-At the beginning of a file, mark all functions and variables defined
-in this file as
-.Em used .
-Also shut off complaints about unused function arguments.
-.It Xo
-.Li /* LINTED Oo Ar comment Oc Li */
-or
-.Li /* NOSTRICT Oo Ar comment Oc Li */
-.Xc
-Suppresses any intra-file warning except those dealing with
-unused variables or functions.
-This directive should be placed
-on the line immediately preceding where the
-.Nm
-warning occurred.
-.It Li /* LONGLONG */
-Suppress complaints about use of long long integer types.
-.It Li /* NOTREACHED */
-At appropriate points, inhibit complaints about unreachable code.
-(This comment is typically placed just after calls to functions
-like
-.Xr exit 3 ) .
-.It Li /* PRINTFLIKE Ns Ar n Li */
-makes
-.Nm
-check the first
-.Pq Ar n Ns -1
-arguments as usual.
-The
-.Ar n Ns -th
-argument is interpreted as a
-.Xr printf 3
-format string that is used to check the remaining arguments.
-.It Li /* PROTOLIB Ns Ar n Li */
-causes
-.Nm
-to treat function declaration prototypes as function definitions
-if
-.Ar n
-is non-zero.
-This directive can only be used in conjunction with
-the
-.Li /* LINTLIBRARY */
-directive.
-If
-.Ar n
-is zero, function prototypes will be treated normally.
-.It Li /* SCANFLIKE Ns Ar n Li */
-makes
-.Nm
-check the first
-.Pq Ar n Ns -1
-arguments as usual.
-The
-.Ar n Ns -th
-argument is interpreted as a
-.Xr scanf 3
-format string that is used to check the remaining arguments.
-.It Li /* VARARGS Ns Ar n Li */
-Suppress the usual checking for variable numbers of arguments in
-the following function declaration.
-The data types of the first
-.Ar n
-arguments are checked; a missing
-.Ar n
-is taken to be 0.
-.El
-.Pp
-The behavior of the
-.Fl i
-and the
-.Fl o
-options allows for incremental use of
-.Nm
-on a set of C source files.
-Generally, one invokes
-.Nm
-once for each source file with the
-.Fl i
-option.
-Each of these invocations produces a
-.Pa .ln
-file that corresponds to the
-.Pa .c
-file, and prints all messages that are about just that
-source file.
-After all the source files have been separately
-run through
-.Nm ,
-it is invoked once more (without the
-.Fl i
-option), listing all the
-.Pa .ln
-files with the needed
-.Fl l Ar library
-options.
-This will print all the inter-file inconsistencies.
-This
-scheme works well with
-.Xr make 1 ;
-it allows
-.Xr make 1
-to be used to
-.Nm
-only the source files that have been modified since the last
-time the set of source files were
-.Nm Ns ed .
-.Sh ENVIRONMENT
-.Bl -tag -width LIBDIR
-.It Ev LIBDIR
-the directory where the lint libraries specified by the
-.Bk -words
-.Fl l Ar library
-.Ek
-option must exist.
-If this environment variable is undefined,
-then the default path
-.Pa /usr/libdata/lint
-will be used to search for the libraries.
-.It Ev TMPDIR
-usually the path for temporary files can be redefined by setting
-this environment variable.
-.It Ev CC
-Location of the C compiler program.
-Defaults to
-.Pa /usr/bin/cc .
-.El
-.Sh FILES
-.Bl -tag -width /usr/libdata/lint/llib-lc.ln -compact
-.It Pa /usr/libexec/lint Ns Bq Pa 12
-programs
-.It Pa /usr/libdata/lint/llib-l*.ln
-various prebuilt lint libraries
-.It Pa /tmp/lint*
-temporaries
-.El
-.Sh SEE ALSO
-.Xr cc 1 ,
-.Xr cpp 1 ,
-.Xr make 1
-.Sh AUTHORS
-.An Jochen Pohl
-.Sh BUGS
-.Bl -item
-.It
-The routines
-.Xr exit 3 ,
-.Xr longjmp 3
-and other functions that do not return are not understood; this
-causes various incorrect diagnostics.
-.It
-Static functions which are used only before their first
-extern declaration are reported as unused.
-.It
-Libraries created by the
-.Fl o
-option will, when used in later
-.Nm
-runs, cause certain errors that were reported when the libraries
-were created to be reported again, and cause line numbers and file
-names from the original source used to create those libraries
-to be reported in error messages.
-For these reasons, it is recommended
-to use the
-.Fl C
-option to create lint libraries.
-.El
Index: usr.bin/xlint/xlint/pathnames.h
===================================================================
--- usr.bin/xlint/xlint/pathnames.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* $NetBSD: pathnames.h,v 1.3 1999/04/22 04:40:58 mrg Exp $ */
-
-/*
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD$
- */
-
-/* directory where lint1 and lint2 reside */
-#ifndef PATH_LIBEXEC
-#define PATH_LIBEXEC PREFIX"/usr/libexec"
-#endif
-
-/* directory where cc(1) resides */
-#define PATH_USRBIN PREFIX"/usr/bin"
-
-/* default library search path */
-#define PATH_LINTLIB PREFIX"/usr/libdata/lint"
Index: usr.bin/xlint/xlint/xlint.c
===================================================================
--- usr.bin/xlint/xlint/xlint.c
+++ /dev/null
@@ -1,883 +0,0 @@
-/* $NetBSD: xlint.c,v 1.36 2005/02/09 21:24:48 dsl Exp $ */
-
-/*
- * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
- * Copyright (c) 1994, 1995 Jochen Pohl
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Jochen Pohl for
- * The NetBSD Project.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/cdefs.h>
-#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: xlint.c,v 1.36 2005/02/09 21:24:48 dsl Exp $");
-#endif
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <sys/utsname.h>
-#include <err.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <paths.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "lint.h"
-#include "pathnames.h"
-
-#define DEFAULT_PATH _PATH_DEFPATH
-
-int main(int, char *[]);
-
-/* directory for temporary files */
-static const char *tmpdir;
-
-/* path name for cpp output */
-static char *cppout;
-
-/* file descriptor for cpp output */
-static int cppoutfd = -1;
-
-/* files created by 1st pass */
-static char **p1out;
-
-/* input files for 2nd pass (without libraries) */
-static char **p2in;
-
-/* library which will be created by 2nd pass */
-static char *p2out;
-
-/* flags always passed to cc(1) */
-static char **cflags;
-
-/* flags for cc(1), controlled by sflag/tflag */
-static char **lcflags;
-
-/* flags for lint1 */
-static char **l1flags;
-
-/* flags for lint2 */
-static char **l2flags;
-
-/* libraries for lint2 */
-static char **l2libs;
-
-/* default libraries */
-static char **deflibs;
-
-/* additional libraries */
-static char **libs;
-
-/* search path for libraries */
-static char **libsrchpath;
-
-static char *libexec_path;
-
-/* flags */
-static int iflag, oflag, Cflag, sflag, tflag, Fflag, dflag, Bflag, Sflag;
-
-/* print the commands executed to run the stages of compilation */
-static int Vflag;
-
-/* filename for oflag */
-static char *outputfn;
-
-/* reset after first .c source has been processed */
-static int first = 1;
-
-/*
- * name of a file which is currently written by a child and should
- * be removed after abnormal termination of the child
- */
-static const char *currfn;
-
-#if !defined(TARGET_PREFIX)
-#define TARGET_PREFIX ""
-#endif
-static const char target_prefix[] = TARGET_PREFIX;
-
-static void appstrg(char ***, char *);
-static void appcstrg(char ***, const char *);
-static void applst(char ***, char *const *);
-static void freelst(char ***);
-static char *concat2(const char *, const char *);
-static char *concat3(const char *, const char *, const char *);
-static void terminate(int) __attribute__((__noreturn__));
-static const char *lbasename(const char *, int);
-static void appdef(char ***, const char *);
-static void usage(void) __dead2;
-static void fname(const char *);
-static void runchild(const char *, char *const *, const char *, int);
-static void findlibs(char *const *);
-static int rdok(const char *);
-static void lint2(void);
-static void cat(char *const *, const char *);
-
-/*
- * Some functions to deal with lists of strings.
- * Take care that we get no surprises in case of asynchronous signals.
- */
-static void
-appstrg(char ***lstp, char *s)
-{
- char **lst, **olst;
- int i;
-
- olst = *lstp;
- for (i = 0; olst[i] != NULL; i++)
- continue;
- lst = xrealloc(olst, (i + 2) * sizeof (char *));
- lst[i] = s;
- lst[i + 1] = NULL;
- *lstp = lst;
-}
-
-static void
-appcstrg(char ***lstp, const char *s)
-{
-
- appstrg(lstp, xstrdup(s));
-}
-
-static void
-applst(char ***destp, char *const *src)
-{
- int i, k;
- char **dest, **odest;
-
- odest = *destp;
- for (i = 0; odest[i] != NULL; i++)
- continue;
- for (k = 0; src[k] != NULL; k++)
- continue;
- dest = xrealloc(odest, (i + k + 1) * sizeof (char *));
- for (k = 0; src[k] != NULL; k++)
- dest[i + k] = xstrdup(src[k]);
- dest[i + k] = NULL;
- *destp = dest;
-}
-
-static void
-freelst(char ***lstp)
-{
- char *s;
- int i;
-
- for (i = 0; (*lstp)[i] != NULL; i++)
- continue;
- while (i-- > 0) {
- s = (*lstp)[i];
- (*lstp)[i] = NULL;
- free(s);
- }
-}
-
-static char *
-concat2(const char *s1, const char *s2)
-{
- char *s;
-
- s = xmalloc(strlen(s1) + strlen(s2) + 1);
- (void)strcpy(s, s1);
- (void)strcat(s, s2);
-
- return (s);
-}
-
-static char *
-concat3(const char *s1, const char *s2, const char *s3)
-{
- char *s;
-
- s = xmalloc(strlen(s1) + strlen(s2) + strlen(s3) + 1);
- (void)strcpy(s, s1);
- (void)strcat(s, s2);
- (void)strcat(s, s3);
-
- return (s);
-}
-
-/*
- * Clean up after a signal.
- */
-static void
-terminate(int signo)
-{
- int i;
-
- if (cppoutfd != -1)
- (void)close(cppoutfd);
- if (cppout != NULL)
- (void)remove(cppout);
-
- if (p1out != NULL) {
- for (i = 0; p1out[i] != NULL; i++)
- (void)remove(p1out[i]);
- }
-
- if (p2out != NULL)
- (void)remove(p2out);
-
- if (currfn != NULL)
- (void)remove(currfn);
-
- exit(signo != 0 ? 1 : 0);
-}
-
-/*
- * Returns a pointer to the last component of strg after delim.
- * Returns strg if the string does not contain delim.
- */
-static const char *
-lbasename(const char *strg, int delim)
-{
- const char *cp, *cp1, *cp2;
-
- cp = cp1 = cp2 = strg;
- while (*cp != '\0') {
- if (*cp++ == delim) {
- cp2 = cp1;
- cp1 = cp;
- }
- }
- return (*cp1 == '\0' ? cp2 : cp1);
-}
-
-static void
-appdef(char ***lstp, const char *def)
-{
-
- appstrg(lstp, concat2("-D__", def));
- appstrg(lstp, concat3("-D__", def, "__"));
-}
-
-static void
-usage(void)
-{
-
- (void)fprintf(stderr,
- "usage: lint [-abceghprvwxzHFS] [-s|-t] [-i|-nu] [-Dname[=def]]"
- " [-Uname] [-X <id>[,<id>]...\n");
- (void)fprintf(stderr,
- "\t[-Idirectory] [-Ldirectory] [-llibrary] [-ooutputfile]"
- " file...\n");
- (void)fprintf(stderr,
- " lint [-abceghprvwzHFS] [-s|-t] -Clibrary [-Dname[=def]]\n"
- " [-X <id>[,<id>]...\n");
- (void)fprintf(stderr, "\t[-Idirectory] [-Uname] [-Bpath] file"
- " ...\n");
- terminate(-1);
-}
-
-
-int
-main(int argc, char *argv[])
-{
- int c;
- char flgbuf[3], *s;
- const char *tmp;
- size_t len;
-
- if ((tmp = getenv("TMPDIR")) == NULL || (len = strlen(tmp)) == 0) {
- tmpdir = _PATH_TMP;
- } else {
- s = xmalloc(len + 2);
- (void)sprintf(s, "%s%s", tmp, tmp[len - 1] == '/' ? "" : "/");
- tmpdir = s;
- }
-
- cppout = xmalloc(strlen(tmpdir) + sizeof ("lint0.XXXXXX"));
- (void)sprintf(cppout, "%slint0.XXXXXX", tmpdir);
- cppoutfd = mkstemp(cppout);
- if (cppoutfd == -1) {
- warn("can't make temp");
- terminate(-1);
- }
-
- p1out = xcalloc(1, sizeof (char *));
- p2in = xcalloc(1, sizeof (char *));
- cflags = xcalloc(1, sizeof (char *));
- lcflags = xcalloc(1, sizeof (char *));
- l1flags = xcalloc(1, sizeof (char *));
- l2flags = xcalloc(1, sizeof (char *));
- l2libs = xcalloc(1, sizeof (char *));
- deflibs = xcalloc(1, sizeof (char *));
- libs = xcalloc(1, sizeof (char *));
- libsrchpath = xcalloc(1, sizeof (char *));
-
- appcstrg(&cflags, "-E");
- appcstrg(&cflags, "-x");
- appcstrg(&cflags, "c");
-#if 0
- appcstrg(&cflags, "-D__attribute__(x)=");
- appcstrg(&cflags, "-D__extension__(x)=/*NOSTRICT*/0");
-#else
- appcstrg(&cflags, "-U__GNUC__");
- appcstrg(&cflags, "-undef");
-#endif
-#if 0
- appcstrg(&cflags, "-Wp,-$");
-#endif
- appcstrg(&cflags, "-Wp,-C");
- appcstrg(&cflags, "-Wcomment");
- appcstrg(&cflags, "-D__LINT__");
- appcstrg(&cflags, "-Dlint"); /* XXX don't def. with -s */
-
- appdef(&cflags, "lint");
-
- appcstrg(&deflibs, "c");
-
- if (signal(SIGHUP, terminate) == SIG_IGN)
- (void)signal(SIGHUP, SIG_IGN);
- (void)signal(SIGINT, terminate);
- (void)signal(SIGQUIT, terminate);
- (void)signal(SIGTERM, terminate);
- while ((c = getopt(argc, argv, "abcd:eghil:no:prstuvwxzB:C:D:FHI:L:M:SU:VX:")) != -1) {
- switch (c) {
-
- case 'a':
- case 'b':
- case 'c':
- case 'e':
- case 'g':
- case 'r':
- case 'v':
- case 'w':
- case 'z':
- (void)sprintf(flgbuf, "-%c", c);
- appcstrg(&l1flags, flgbuf);
- break;
-
- case 'F':
- Fflag = 1;
- /* FALLTHROUGH */
- case 'u':
- case 'h':
- (void)sprintf(flgbuf, "-%c", c);
- appcstrg(&l1flags, flgbuf);
- appcstrg(&l2flags, flgbuf);
- break;
-
- case 'X':
- (void)sprintf(flgbuf, "-%c", c);
- appcstrg(&l1flags, flgbuf);
- appcstrg(&l1flags, optarg);
- break;
-
- case 'i':
- if (Cflag)
- usage();
- iflag = 1;
- break;
-
- case 'n':
- freelst(&deflibs);
- break;
-
- case 'p':
- appcstrg(&lcflags, "-Wtraditional");
- appcstrg(&lcflags, "-Wno-system-headers");
- appcstrg(&l1flags, "-p");
- appcstrg(&l2flags, "-p");
- if (*deflibs != NULL) {
- freelst(&deflibs);
- appcstrg(&deflibs, "c");
- }
- break;
-
- case 's':
- if (tflag)
- usage();
- freelst(&lcflags);
- appcstrg(&lcflags, "-trigraphs");
- appcstrg(&lcflags, "-Wtrigraphs");
- appcstrg(&lcflags, "-pedantic");
- appcstrg(&lcflags, "-D__STRICT_ANSI__");
- appcstrg(&l1flags, "-s");
- appcstrg(&l2flags, "-s");
- sflag = 1;
- break;
-
- case 'S':
- if (tflag)
- usage();
- appcstrg(&l1flags, "-S");
- Sflag = 1;
- break;
-
-#if !HAVE_CONFIG_H
- case 't':
- if (sflag)
- usage();
- freelst(&lcflags);
- appcstrg(&lcflags, "-traditional");
- appstrg(&lcflags, concat2("-D", MACHINE));
- appstrg(&lcflags, concat2("-D", MACHINE_ARCH));
- appcstrg(&l1flags, "-t");
- appcstrg(&l2flags, "-t");
- tflag = 1;
- break;
-#endif
-
- case 'x':
- appcstrg(&l2flags, "-x");
- break;
-
- case 'C':
- if (Cflag || oflag || iflag)
- usage();
- Cflag = 1;
- appstrg(&l2flags, concat2("-C", optarg));
- p2out = xmalloc(sizeof ("llib-l.ln") + strlen(optarg));
- (void)sprintf(p2out, "llib-l%s.ln", optarg);
- freelst(&deflibs);
- break;
-
- case 'd':
- if (dflag)
- usage();
- dflag = 1;
- appcstrg(&cflags, "-nostdinc");
- appcstrg(&cflags, "-idirafter");
- appcstrg(&cflags, optarg);
- break;
-
- case 'D':
- case 'I':
- case 'M':
- case 'U':
- (void)sprintf(flgbuf, "-%c", c);
- appstrg(&cflags, concat2(flgbuf, optarg));
- break;
-
- case 'l':
- appcstrg(&libs, optarg);
- break;
-
- case 'o':
- if (Cflag || oflag)
- usage();
- oflag = 1;
- outputfn = xstrdup(optarg);
- break;
-
- case 'L':
- appcstrg(&libsrchpath, optarg);
- break;
-
- case 'H':
- appcstrg(&l2flags, "-H");
- break;
-
- case 'B':
- Bflag = 1;
- libexec_path = xstrdup(optarg);
- break;
-
- case 'V':
- Vflag = 1;
- break;
-
- default:
- usage();
- /* NOTREACHED */
- }
- }
- argc -= optind;
- argv += optind;
-
- /*
- * To avoid modifying getopt(3)'s state engine midstream, we
- * explicitly accept just a few options after the first source file.
- *
- * In particular, only -l<lib> and -L<libdir> (and these with a space
- * after -l or -L) are allowed.
- */
- while (argc > 0) {
- const char *arg = argv[0];
-
- if (arg[0] == '-') {
- char ***list;
-
- /* option */
- switch (arg[1]) {
- case 'l':
- list = &libs;
- break;
-
- case 'L':
- list = &libsrchpath;
- break;
-
- default:
- usage();
- /* NOTREACHED */
- }
- if (arg[2])
- appcstrg(list, arg + 2);
- else if (argc > 1) {
- argc--;
- appcstrg(list, *++argv);
- } else
- usage();
- } else {
- /* filename */
- fname(arg);
- first = 0;
- }
- argc--;
- argv++;
- }
-
- if (first)
- usage();
-
- if (iflag)
- terminate(0);
-
- if (!oflag) {
- if ((tmp = getenv("LIBDIR")) == NULL || strlen(tmp) == 0)
- tmp = PATH_LINTLIB;
- appcstrg(&libsrchpath, tmp);
- findlibs(libs);
- findlibs(deflibs);
- }
-
- (void)printf("Lint pass2:\n");
- lint2();
-
- if (oflag)
- cat(p2in, outputfn);
-
- if (Cflag)
- p2out = NULL;
-
- terminate(0);
- /* NOTREACHED */
-}
-
-/*
- * Read a file name from the command line
- * and pass it through lint1 if it is a C source.
- */
-static void
-fname(const char *name)
-{
- const char *bn, *suff;
- char **args, *ofn, *p, *pathname;
- size_t len;
- int is_stdin;
- int fd;
-
- is_stdin = (strcmp(name, "-") == 0);
- bn = lbasename(name, '/');
- suff = lbasename(bn, '.');
-
- if (strcmp(suff, "ln") == 0) {
- /* only for lint2 */
- if (!iflag)
- appcstrg(&p2in, name);
- return;
- }
-
- if (!is_stdin && strcmp(suff, "c") != 0 &&
- (strncmp(bn, "llib-l", 6) != 0 || bn != suff)) {
- warnx("unknown file type: %s\n", name);
- return;
- }
-
- if (!iflag || !first)
- (void)printf("%s:\n",
- is_stdin ? "{standard input}" : Fflag ? name : bn);
-
- /* build the name of the output file of lint1 */
- if (oflag) {
- ofn = outputfn;
- outputfn = NULL;
- oflag = 0;
- } else if (iflag) {
- if (is_stdin) {
- warnx("-i not supported without -o for standard input");
- return;
- }
- ofn = xmalloc(strlen(bn) + (bn == suff ? 4 : 2));
- len = bn == suff ? strlen(bn) : (size_t)((suff - 1) - bn);
- (void)sprintf(ofn, "%.*s", (int)len, bn);
- (void)strcat(ofn, ".ln");
- } else {
- ofn = xmalloc(strlen(tmpdir) + sizeof ("lint1.XXXXXX"));
- (void)sprintf(ofn, "%slint1.XXXXXX", tmpdir);
- fd = mkstemp(ofn);
- if (fd == -1) {
- warn("can't make temp");
- terminate(-1);
- }
- close(fd);
- }
- if (!iflag)
- appcstrg(&p1out, ofn);
-
- args = xcalloc(1, sizeof (char *));
-
- /* run cc */
-
- if (getenv("CC") == NULL) {
- pathname = xmalloc(strlen(PATH_USRBIN) + sizeof ("/cc"));
- (void)sprintf(pathname, "%s/cc", PATH_USRBIN);
- appcstrg(&args, pathname);
- } else {
- pathname = strdup(getenv("CC"));
- for (p = strtok(pathname, " \t"); p; p = strtok(NULL, " \t"))
- appcstrg(&args, p);
- }
-
- applst(&args, cflags);
- applst(&args, lcflags);
- appcstrg(&args, name);
-
- /* we reuse the same tmp file for cpp output, so rewind and truncate */
- if (lseek(cppoutfd, (off_t)0, SEEK_SET) != 0) {
- warn("lseek");
- terminate(-1);
- }
- if (ftruncate(cppoutfd, (off_t)0) != 0) {
- warn("ftruncate");
- terminate(-1);
- }
-
- runchild(pathname, args, cppout, cppoutfd);
- free(pathname);
- freelst(&args);
-
- /* run lint1 */
-
- if (!Bflag) {
- pathname = xmalloc(strlen(PATH_LIBEXEC) + sizeof ("/lint1") +
- strlen(target_prefix));
- (void)sprintf(pathname, "%s/%slint1", PATH_LIBEXEC,
- target_prefix);
- } else {
- /*
- * XXX Unclear whether we should be using target_prefix
- * XXX here. --thorpej@wasabisystems.com
- */
- pathname = xmalloc(strlen(libexec_path) + sizeof ("/lint1"));
- (void)sprintf(pathname, "%s/lint1", libexec_path);
- }
-
- appcstrg(&args, pathname);
- applst(&args, l1flags);
- appcstrg(&args, cppout);
- appcstrg(&args, ofn);
-
- runchild(pathname, args, ofn, -1);
- free(pathname);
- freelst(&args);
-
- appcstrg(&p2in, ofn);
- free(ofn);
-
- free(args);
-}
-
-static void
-runchild(const char *path, char *const *args, const char *crfn, int fdout)
-{
- int status, rv, signo, i;
-
- if (Vflag) {
- for (i = 0; args[i] != NULL; i++)
- (void)printf("%s ", args[i]);
- (void)printf("\n");
- }
-
- currfn = crfn;
-
- (void)fflush(stdout);
-
- switch (vfork()) {
- case -1:
- warn("cannot fork");
- terminate(-1);
- /* NOTREACHED */
- default:
- /* parent */
- break;
- case 0:
- /* child */
-
- /* setup the standard output if necessary */
- if (fdout != -1) {
- dup2(fdout, STDOUT_FILENO);
- close(fdout);
- }
- (void)execvp(path, args);
- warn("cannot exec %s", path);
- _exit(1);
- /* NOTREACHED */
- }
-
- while ((rv = wait(&status)) == -1 && errno == EINTR) ;
- if (rv == -1) {
- warn("wait");
- terminate(-1);
- }
- if (WIFSIGNALED(status)) {
- signo = WTERMSIG(status);
-#if HAVE_DECL_SYS_SIGNAME
- warnx("%s got SIG%s", path, sys_signame[signo]);
-#else
- warnx("%s got signal %d", path, signo);
-#endif
- terminate(-1);
- }
- if (WEXITSTATUS(status) != 0)
- terminate(-1);
- currfn = NULL;
-}
-
-static void
-findlibs(char *const *liblst)
-{
- int i, k;
- const char *lib, *path;
- char *lfn;
- size_t len;
-
- lfn = NULL;
-
- for (i = 0; (lib = liblst[i]) != NULL; i++) {
- for (k = 0; (path = libsrchpath[k]) != NULL; k++) {
- len = strlen(path) + strlen(lib);
- lfn = xrealloc(lfn, len + sizeof ("/llib-l.ln"));
- (void)sprintf(lfn, "%s/llib-l%s.ln", path, lib);
- if (rdok(lfn))
- break;
- lfn = xrealloc(lfn, len + sizeof ("/lint/llib-l.ln"));
- (void)sprintf(lfn, "%s/lint/llib-l%s.ln", path, lib);
- if (rdok(lfn))
- break;
- }
- if (path != NULL) {
- appstrg(&l2libs, concat2("-l", lfn));
- } else {
- warnx("cannot find llib-l%s.ln", lib);
- }
- }
-
- free(lfn);
-}
-
-static int
-rdok(const char *path)
-{
- struct stat sbuf;
-
- if (stat(path, &sbuf) == -1)
- return (0);
- if (!S_ISREG(sbuf.st_mode))
- return (0);
- if (access(path, R_OK) == -1)
- return (0);
- return (1);
-}
-
-static void
-lint2(void)
-{
- char *path, **args;
-
- args = xcalloc(1, sizeof (char *));
-
- if (!Bflag) {
- path = xmalloc(strlen(PATH_LIBEXEC) + sizeof ("/lint2") +
- strlen(target_prefix));
- (void)sprintf(path, "%s/%slint2", PATH_LIBEXEC,
- target_prefix);
- } else {
- /*
- * XXX Unclear whether we should be using target_prefix
- * XXX here. --thorpej@wasabisystems.com
- */
- path = xmalloc(strlen(libexec_path) + sizeof ("/lint2"));
- (void)sprintf(path, "%s/lint2", libexec_path);
- }
-
- appcstrg(&args, path);
- applst(&args, l2flags);
- applst(&args, l2libs);
- applst(&args, p2in);
-
- runchild(path, args, p2out, -1);
- free(path);
- freelst(&args);
- free(args);
-}
-
-static void
-cat(char *const *srcs, const char *dest)
-{
- int ifd, ofd, i;
- char *src, *buf;
- ssize_t rlen;
-
- if ((ofd = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) {
- warn("cannot open %s", dest);
- terminate(-1);
- }
-
- buf = xmalloc(MBLKSIZ);
-
- for (i = 0; (src = srcs[i]) != NULL; i++) {
- if ((ifd = open(src, O_RDONLY)) == -1) {
- free(buf);
- warn("cannot open %s", src);
- terminate(-1);
- }
- do {
- if ((rlen = read(ifd, buf, MBLKSIZ)) == -1) {
- free(buf);
- warn("read error on %s", src);
- terminate(-1);
- }
- if (write(ofd, buf, (size_t)rlen) == -1) {
- free(buf);
- warn("write error on %s", dest);
- terminate(-1);
- }
- } while (rlen == MBLKSIZ);
- (void)close(ifd);
- }
- (void)close(ofd);
- free(buf);
-}

File Metadata

Mime Type
text/plain
Expires
Sun, Nov 17, 11:34 PM (7 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14686573
Default Alt Text
D13015.id34997.diff (595 KB)

Event Timeline