#! /bin/sh

# Copyright (C) 1991 The Geometry Center

if [ $# = 0 -a -t 0 ]; then
	echo "Usage: $0   file.off  >newfile.off"
	echo "Checks a .off-format file, removing redundant vertices and 0-length edges."
	echo "Writes a new .off file to stdout."
	exit 1
fi

awk '
   NF==3 && nv == "" { nv=$1; nf=$2; euler=$1+$2-$3; curv=0; newv=0; newf=0; next }

   NF==0 { next }

   NF==3 && curv<nv {
	    vert[curv] = $0; 
	    samev[curv] = curv;
	    for(i=0; i<curv; i++) {
		if($0 == vert[i]) {
		    newvert[curv] = newvert[i];
		    dupvert[curv] = 1;
		    curv++;
		    next;
		}
	    }
	    dupvert[curv] = 0;
	    newvert[curv] = newv;
	    newv++;
	    curv++;
	    next;
	}

   curv >= nv {

	fv = $1;
	newfv = 0;
	was = -1;
	for(i = 1; i <= fv; i++) {
		fvert[newfv] = newvert[$(i+1)];
		if(fvert[newfv] != was) {
			was = fvert[newfv];
			newfv++;
		}
	}
	if(fvert[newfv-1] == fvert[0])  newfv--;

	if(newfv >= 3) {
	    face[newf] = newfv "\t";
	    was = fvert[newfv-1];
	    for(i = 0; i < newfv; i++) {
		    face[newf] = face[newf] fvert[i] " ";

		    if(was < fvert[i]) edge[was "," fvert[i]] = 1;
		    else edge[fvert[i] "," was] = 1;
		    was = fvert[i];
	    }
	    face[newf] = face[newf] "\t" $(fv+2) " " $(fv+3) " " $(fv+4);
	    newf++;
	}
    }

END {
	newe = -1;
	edge[""] = 0;
	for(x in edge) { newe++; }
	print newv, newf, newe;
	print ""
	for(i = 0; i < nv; i++) {
	    if(dupvert[i] == 0) print vert[i];
	}
	print ""
	for(i = 0; i < newf; i++) {
	    print face[i]
	}
    }
' $@
