#!/usr/bin/python -b

# Ripped from HP and updated from Debian
# Update by Gentoo to support unicode output

#
# Copyright (c) 2004 Hewlett-Packard Development Company, L.P.
#	David Mosberger <davidm@hpl.hp.com>
#
# Scan standard input for GCC warning messages that are likely to
# source of real 64-bit problems.  In particular, see whether there
# are any implicitly declared functions whose return values are later
# interpreted as pointers.  Those are almost guaranteed to cause
# crashes.
#

from __future__ import print_function

import re
import sys

implicit_pattern = re.compile(r"([^:]*):(\d+): warning: implicit declaration "
                              + "of function [`']([^']*)'")
pointer_pattern = (
    r"([^:]*):(\d+): warning: "
    + r"("
    +  r"(assignment"
    +  r"|initialization"
    +  r"|return"
    +  r"|passing arg \d+ of `[^']*'"
    +  r"|passing arg \d+ of pointer to function"
    +  r") makes pointer from integer without a cast"
    + r"|"
    + r"cast to pointer from integer of different size)")

if sys.hexversion < 0x3000000:
    # Use encoded byte strings in python-2.x, since the python ebuilds are
    # known to remove the encodings module when USE=build is enabled (thus
    # disabling unicode decoding/encoding). The portage module has a
    # workaround for this, but currently we don't import that here since we
    # don't want to trigger potential sandbox violations due to stale pyc
    # files for the portage module.
    unicode_quote_open = '\xE2\x80\x98'
    unicode_quote_close = '\xE2\x80\x99'
    def write(msg):
        sys.stdout.write(msg)
else:
    unicode_quote_open = '\u2018'
    unicode_quote_close = '\u2019'
    def write(msg):
        sys.stdout.buffer.write(msg.encode('utf_8', 'backslashreplace'))

pointer_pattern = re.compile(pointer_pattern)

last_implicit_filename = ""
last_implicit_linenum = -1
last_implicit_func = ""

while True:
    if sys.hexversion >= 0x3000000:
        line = sys.stdin.buffer.readline().decode('utf_8', 'replace')
    else:
        line = sys.stdin.readline()
    if not line:
        break
    # translate unicode open/close quotes to ascii ones
    line = line.replace(unicode_quote_open, "`")
    line = line.replace(unicode_quote_close, "'")
    m = implicit_pattern.match(line)
    if m:
        last_implicit_filename = m.group(1)
        last_implicit_linenum = int(m.group(2))
        last_implicit_func = m.group(3)
    else:
        m = pointer_pattern.match(line)
        if m:
            pointer_filename = m.group(1)
            pointer_linenum = int(m.group(2))
            if (last_implicit_filename == pointer_filename
                and last_implicit_linenum == pointer_linenum):
                write("Function `%s' implicitly converted to pointer at " \
                      "%s:%d\n" % (last_implicit_func,
                                   last_implicit_filename,
                                   last_implicit_linenum))
