/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1987-2011 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Glenn Fowler <gsf@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
/*
* Glenn Fowler
* AT&T Research
*
* nocomment -- strip C comments
*/
#include <ast.h>
#include <ctype.h>
#if 0
{
}
{
}
#endif
#define SYNC() do \
{ \
{ \
{ \
} \
{ \
prev++; \
} \
data = 0; \
} \
} while (0)
#define DATA(c) do \
{ \
SYNC(); \
data = 1; \
} while (0)
/*
* get next token on ip
*/
static char*
{
register int c;
register char* s;
s = buf;
for (;;)
{
{
case EOF:
if (s > buf)
break;
return 0;
case '\\':
case '/':
case '\n':
break;
default:
if (isspace(c))
{
if (s > buf)
{
break;
}
}
*s++ = c;
continue;
}
break;
}
*s = 0;
return buf;
}
/*
* uncomment ip into op
*/
{
register int c = 0;
register int p;
register int data = 0;
int sync = 0;
int formals = 0;
unsigned long line = 0;
unsigned long prev = 0;
unsigned long directive = 0;
int quote;
int n;
char* s;
for (;;)
{
next:
p = c;
switch (c)
{
case EOF:
goto done;
case 0:
goto done;
case '\\':
DATA(c);
{
case EOF:
goto done;
case '\n':
directive++;
c = 0;
break;
default:
break;
}
break;
case '\f':
case '\t':
case '\v':
c = ' ';
/*FALLTHROUGH*/
case ' ':
if (data) switch (p)
{
case ' ':
case '\n':
case '(':
case '[':
case ']':
case '{':
case '}':
case ';':
case ':':
case '!':
case '<':
case '>':
case '|':
case ',':
case '?':
case '*':
break;
case ')':
{
formals = 0;
}
break;
default:
{
case '\n':
case ')':
case '[':
case ']':
case '{':
case '}':
case ';':
case ':':
case '=':
case '!':
case '<':
case '>':
case '|':
case ',':
case '?':
break;
case '(':
{
formals = 0;
}
break;
case '*':
if (p == '/' || p == '=')
break;
case '+':
case '-':
case '&':
if (p == c || p == '=')
break;
default:
break;
}
p = ' ';
goto check;
}
break;
case '\n':
data = 0;
line++;
break;
case '#':
SYNC();
formals = 1;
{
{
if (isdigit(*s))
{
sync = 1;
directive = 0;
{
while (isspace(*s))
s++;
if (*s == '"')
{
}
}
break;
}
if (!sync)
{
{
{
sync = -1;
{
n = dup(0);
close(0);
dup(c);
}
if (c)
{
close(0);
dup(n);
}
c = 0;
break;
}
DATA('#');
c = 0;
break;
}
sync = -1;
}
DATA('#');
c = 0;
}
else sync = -1;
}
if (c) DATA(c);
else data = 1;
break;
case '/':
{
case EOF:
goto done;
case '/':
{
case EOF:
goto done;
case '\n':
if (p == '\\')
{
break;
}
p = ' ';
c = '\n';
goto check;
}
break;
case '*':
{
case EOF:
goto done;
case '\n':
directive++;
line++;
break;
case '*':
for (;;)
{
{
case EOF:
goto done;
case '\n':
directive++;
line++;
break;
case '/':
p = c = ' ';
goto check;
case '*':
continue;
}
break;
}
break;
}
break;
default:
p = '/';
DATA(p);
goto check;
}
break;
case '"':
case '\'':
DATA(c);
quote = c;
for (;;)
{
{
case EOF:
goto done;
case '\\':
{
case EOF:
goto done;
case '\n':
directive++;
break;
}
break;
case '"':
case '\'':
if (c == quote)
{
goto next;
}
break;
case '\n':
p = ' ';
goto check;
}
}
break;
default:
DATA(c);
break;
}
}
done:
return count;
}