--- /usr/src/usr.bin/calendar/calcpp.c 2014-02-19 00:43:47.000000000 +0100 +++ calcpp.c 2014-02-19 17:56:34.000000000 +0100 @@ -52,6 +52,8 @@ static void pushfp(FILE *fp); static FILE *popfp(void); static int tokenscpp(char *buf, char *string); +static void striptags(char *buf, int size, const char *ts, const char *te); +static void rmcomments(char *buf, int size); #define T_INVALID -1 #define T_INCLUDE 0 @@ -93,6 +95,7 @@ return(fp); } } + rmcomments(buf,size); switch (tokenscpp(buf, name)) { case T_INCLUDE: *buf = '\0'; @@ -230,3 +233,46 @@ return (1); return (0); } + + + + + +static void +rmcomments(char *buf, int size) +{ + striptags(buf,size,"/*", "*/"); +} + + +static void +striptags(char *buf, int size, const char *ts, const char *te) +{ + static int cf = 0; /* carry flag */ + int te_len = strlen(te); /* end tag length */ + char *idx_ts = strstr(buf, ts); + char *idx_te = strstr(buf, te); + + if (idx_ts == NULL && idx_te == NULL) { + if (cf == 0) + return; + else + *buf='\0'; + } else if (idx_ts != NULL && idx_te == NULL) { + if (cf == 0) { + cf = 1; + while (buf++ != idx_ts); + } + *buf = '\0'; + } else if (idx_ts != NULL && idx_te != NULL && cf == 0 + && idx_ts < idx_te) { + memmove(idx_ts, idx_te+te_len, + (buf+size)-(idx_ts+te_len)); + striptags(buf,size,ts,te); + } else if (idx_ts == NULL && idx_te != NULL && cf == 1) { + memmove(buf, idx_te+te_len, + (buf+size)-(idx_te+te_len)); + cf = 0; + } + return; +}