#! /usr/bin/env bash
#
# A diff canonifier that sorts elements within fields of type set[T] for any T.

awk '
BEGIN { FS="\t"; OFS="\t"; }

function bubble_sort(arr, len,    keep_going, i, tmp)
    {
    keep_going = 1;

    while ( keep_going == 1 )
        {
        keep_going = 0;

        for ( i = 1; i <= len - 1; ++i )
            {
            if ( arr[i] > arr[i + 1] )
                {
                tmp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = tmp;
                keep_going = 1;
                }
            }
        }

    return len;
    }

/^#types/ {
    for ( i = 2; i <= NF; ++i )
        {
        if ( index($i, "set[") == 1 )
            rem[i-1] = 1;
        }
}

/^[^#]/ {
    for ( i in rem )
        {
        if ( $i == "-" )
            # The set has no value, skip sorting it.
            continue;

        n = split($i, set_contents, ",");
        n = bubble_sort(set_contents, n);
        sorted_field = set_contents[1];

        for ( e = 2; e <= n; ++e )
            sorted_field = sorted_field "," set_contents[e];

        $i = sorted_field;
        }
}

{
    print;
}
'
