/*
 * Copyright (c) 2004, Jilles Tjoelker
 * 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.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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
 * COPYRIGHT OWNER 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.
 */

#include <errno.h>
#include <stdio.h>

int
main(int argc, char *argv[])
{
    int c;
    int state = 0;
    int didctl = 0;

    if (argc != 1)
    {
	fprintf(stderr, "Usage: %s\n", argv[0]);
	return 1;
    }

    while ((c = fgetc(stdin)) != EOF)
    {
	switch (c)
	{
	    case 13: case 10:
		didctl++;
		break;
	    case 27:
		didctl++;
		state = 1;
		break;
	    case 0x9B:
		didctl++;
		state = 2;
		break;
	    default:
		if (state == 1)
		{
		    if (c == '[')
			state = 2;
		    else
			state = 0;
		}
		else if (state == 2)
		{
		    if (c >= '@' && c <= '~')
			state = 0;
		}
		else if (c >= ' ')
		{
		    if (didctl)
			fputc('\n', stdout), didctl = 0;
		    fputc(c, stdout);
		}
	}
	if (ferror(stdout))
	{
	    perror("write stdout");
	    exit(1);
	}
    }

    if (ferror(stdin))
    {
	perror("read stdin");
	exit(1);
    }

    return 0;
}

/* vim:ts=8:cin:sw=4
 *  */
