#include <stdio.h>
#include <string.h>

static void doit(FILE *fp, int comm);

static void usage(void)
{
    fprintf(stderr, "Usage: ccomm -p filename\n");
    fprintf(stderr, "       ccomm -r filename\n");
    exit(0);
}

int main(int argc, char **argv)
{
    int comm;

    if(argc != 3)
	usage();
    if(strcmp(argv[1], "-p") == 0)
	comm = 1;
    else if(strcmp(argv[1], "-r") == 0)
	comm = 0;
    else
	usage();

    if(argc == 2)
	doit(stdin, comm);
    else
    {
	FILE *fp;

	if((fp = fopen(argv[2], "r")) == NULL)
	{
	    perror(argv[2]);
	    return 1;
	}
	doit(fp, comm);
    }
    return 0;
}

enum
{
    ST_STATEMENT,
    ST_STRING,
    ST_STRING_ESC,
    ST_CHAR,
    ST_CHAR_ESC,
    ST_SLASH,
    ST_SLASHSTAR,
    ST_SLASHSTAR2,
    ST_SLASHSLASH
};

static void skip_until(FILE *fp, int term, int pr, int nlp)
{
    int c;

    while((c = getc(fp)) != EOF)
    {
	if(pr || (c == '\n' && nlp)) putc(c, stdout);

	if(c == term)
	    break;

	if(c == '\\')
	{
	    if((c = getc(fp)) == EOF)
		break;
	    if(pr) putc(c, stdout);
	}
    }
}

static void doit(FILE *fp, int comm)
{
    int c;

    if(!comm)
    {
	while((c = getc(fp)) != EOF)
	{
	  redo:
	    if(c == '"' || c == '\'')
	    {
		putc(c, stdout);
		skip_until(fp, c, 1, 0);
	    }
	    else if(c == '/')
	    {
		if((c = getc(fp)) == EOF)
		{
		    putc('/', stdout);
		    break;
		}

		if(c == '/')
		    skip_until(fp, '\n', 0, 1);
		else if(c == '*')
		{
		    do
		    {
			skip_until(fp, '*', 0, 1);
			if((c = getc(fp)) == EOF)
			    goto end_comm_loop;
			if(c == '*')
			    ungetc(c, fp);
		    } while(c != '/');
		    putc(' ', stdout);
		}
		else
		    goto redo;
	    }
	    else
		putc(c, stdout);
	}
      end_comm_loop:
    }
    else
    {
	fprintf(stderr, "-p is not supported\n");
    }
}
