#!/bin/bash
# check-clearstructure — Strukturen mit Zeichenkettenfeldern muessen vor
# FreeMemory ein ClearStructure bekommen.
#
# WARUM: `AllocateMemory(SizeOf(S))` liefert einen Block aus GLIBC. Die
# `.s`-Felder darin legt PureBasic aber in MIMALLOC ab. `FreeMemory` gibt nur
# den Block zurueck — die Zeichenketten bleiben liegen, fuer immer.
#
# Die Signatur im Betrieb ist heimtueckisch: mimalloc waechst langsam und
# stetig, glibc bleibt flach, und KEIN Register waechst mit. Ein Bestandsbericht
# ueber Maps und Listen kann das prinzipiell nicht sehen. Auf .10 hat diese
# Klasse vier Tage Untersuchung gekostet (HTTPLIB-122): ~2 MiB/h, eine
# Zeichenkette je HTTP/1.1-Verbindung.
#
# Die Pruefung ist bewusst grob — sie fragt nur, ob in DERSELBEN Datei ueberhaupt
# ein `ClearStructure(..., S)` steht. Das faengt den Fall „ganz vergessen", nicht
# „an einer von fuenf Stellen vergessen". Fuer Letzteres gibt es Fall 65.
set -u
cd "$(dirname "$0")/.."
fehler=0
for f in http_lib/*.pbi net_lib/*.pbi lhs_lib/*.pbi lhs_lib/*/*.pbi inc/*.pbi wowa-edge.pb; do
    [ -e "$f" ] || continue
    grep -o "AllocateMemory(SizeOf([A-Za-z_0-9:]*))" "$f" 2>/dev/null |
      sed 's/.*SizeOf(//; s/)).*//; s/.*:://' | sort -u |
    while read -r st; do
        [ -n "$st" ] || continue
        # Hat die Struktur ueberhaupt .s-Felder? (Definition kann anderswo liegen)
        ns=$(cat http_lib/*.pbi net_lib/*.pbi lhs_lib/*.pbi lhs_lib/*/*.pbi inc/*.pbi 2>/dev/null |
             awk -v s="$st" '$0 ~ "^ *Structure +"s"( |$)" {f=1; next}
                             f && /^ *EndStructure/ {exit}
                             f && /\.s( |$|;|\[)/ {n++} END{print n+0}')
        [ "${ns:-0}" -gt 0 ] || continue
        if ! grep -q "ClearStructure(.*$st)" "$f"; then
            printf "  FEHLT: %s — %s hat %s Zeichenkettenfeld(er), aber kein ClearStructure\n" "$f" "$st" "$ns"
            echo x >> /tmp/.cscheck.$$
        fi
    done
done
if [ -f /tmp/.cscheck.$$ ]; then
    n=$(wc -l < /tmp/.cscheck.$$); rm -f /tmp/.cscheck.$$
    echo "  -> $n Struktur(en) ohne ClearStructure. Siehe HTTPLIB-122."
    exit 1
fi
echo "  ClearStructure-Pruefung: in Ordnung"
