home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 48
/
Amiga_Dream_48.iso
/
Atari
/
c
/
cpp.zoo
/
src
/
comment.c
next >
Wrap
C/C++ Source or Header
|
1993-06-03
|
5KB
|
207 lines
#include <stddef.h>
#include <string.h>
#include <ctype.h>
#include "global.h"
#define SPC_GRAN 16
#define LINEBUF 128
char *the_comment;
size_t len_comment;
/*
find_start_comment() -- return a pointer to the first comment-start
sequence after |s|, or |NULL| if none is found
*/
static char *find_start_comment(s)
register char *s;
{
int in_dq = 0, in_sq = 0;
for (;;) {
switch (*s++) {
case '\0':
return NULL;
case '\\':
s++;
continue;
case '"':
if (!in_sq)
in_dq ^= 1;
break;
case '\'':
if (!in_dq)
in_sq ^= 1;
break;
case '/':
if (!in_dq && !in_sq && *s == '*')
return s - 1;
}
}
}
/*
find_end_comment() -- return a pointer to the first character after the
current comment, or end of line if the comment does not end on this line.
Modifies |in_comment| appropriately.
*/
static char *find_end_comment(s)
register char *s;
{
for (; *s; s++) {
if (*s == '*' && s[1] == '/')
return s + 2;
}
return NULL;
}
/*
nest_check() -- examine the body of a comment for comment-start sequences.
Return 1 if one is found, 0 if not.
*/
static int nest_check(s, t)
char *s, *t;
{
register char *u;
if (!t)
t = s + strlen(s);
if (f_cpp_cmts) {
for (u = s; u < t - 1; u++)
if (*u == '/' && (u[1] == '*' || u[1] == '/'))
return 1;
} else {
for (u = s; u < t - 1; u++)
if (*u == '/' && u[1] == '*')
return 1;
}
return 0;
}
/*
copy_comment() -- place a malloc()'ed copy of the comment beginning at |s|
into the global pointer |the_comment|. Return a pointer to the first
character after the comment.
*/
static char *copy_comment(s)
char *s;
{
register char *in_com, *t;
int n;
unsigned long in_comment;
in_comment = this_line;
in_com = the_comment = mallok(len_comment = LINEBUF);
if (s[1] == '/') {
free(the_comment);
the_comment = strdup(s);
if (w_nest_cmts && nest_check(s + 2, NULL))
warning("nested comment (began at line %lu)", in_comment);
return s + strlen(s);
}
for (;;) {
t = find_end_comment(s);
n = (!t ? strlen(s) + 2 : (int)(t - s) + 1);
in_com = grow(&the_comment, &len_comment, in_com, n);
strncpy(in_com, s, n);
in_com += n;
if (!t)
*in_com++ = '\n';
*in_com = '\0';
if (w_nest_cmts && nest_check(s, t))
warning("nested comment (began at line %lu)", in_comment);
if (t)
break;
s = getline();
if (!s) {
error("unterminated comment (began at line %ld)", in_comment);
in_com = grow(&the_comment, &len_comment, in_com, 3);
*in_com++ = '*';
*in_com++ = '/';
*in_com = '\0';
t = NULL;
break;
}
}
return t;
}
/*
suck_comment() -- Skip over the comment beginning at |s|. Return a
pointer to the first character after the comment.
*/
static char *suck_comment(s)
char *s;
{
register char *t;
unsigned long in_comment;
if (keep_comments)
return copy_comment(s);
in_comment = this_line;
/* C++ comments end at the end of the line */
if (s[1] == '/') {
if (w_nest_cmts && nest_check(s + 2, NULL))
warning("nested comment (began at line %lu)", in_comment);
return s + strlen(s);
}
for (;;) {
t = find_end_comment(s);
if (w_nest_cmts && nest_check(s, t))
warning("nested comment (began at line %lu)", in_comment);
if (t) {
return t;
}
s = getline();
if (!s) {
error("unterminated comment (began at line %ld)", in_comment);
return NULL;
}
}
}
/*
suck_ws() -- skip over whitespace characters after |S|, placing a
malloc()'ed copy of same in |*spc|. Return a pointer to the first
non-whitespace character after |s|.
*/
char *suck_ws(s, spc)
register char *s;
char **spc;
{
register char *t, *u;
char *spc_buf;
size_t sz_spc_buf;
int n;
extern char *the_comment;
u = spc_buf = mallok(sz_spc_buf = SPC_GRAN);
for (;;) {
t = s;
while (isspace(*s))
*s++;
n = s - t;
u = grow(&spc_buf, &sz_spc_buf, u, n + 2);
strncpy(u, t, n);
u += n;
*u = '\0';
if (!(*s == '/' && (s[1] == '*' || (f_cpp_cmts && s[1] == '/'))))
break;
s = suck_comment(s);
if (!keep_comments)
*u++ = ' ';
else {
n = strlen(the_comment);
u = grow(&spc_buf, &sz_spc_buf, u, n + 1);
strcpy(u, the_comment);
u += n;
}
if (!s)
break;
}
*u = '\0';
*spc = spc_buf;
return s;
}