2005-12-18 18:47:43 +01:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
|
2008-12-05 02:20:14 +01:00
|
|
|
void ProcessFile(FILE *in, bool stripFirstComment)
|
2005-12-18 18:47:43 +01:00
|
|
|
{
|
|
|
|
char s[256];
|
|
|
|
bool striping = false;
|
2006-04-06 10:18:53 +02:00
|
|
|
while (fgets(s, sizeof(s), in)) {
|
2005-12-18 18:47:43 +01:00
|
|
|
if (stripFirstComment) {
|
|
|
|
char *x = strstr(s, "/*");
|
|
|
|
if (x) {
|
|
|
|
striping = true;
|
|
|
|
stripFirstComment = false;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (striping) {
|
|
|
|
char *x = strstr(s, "*/");
|
|
|
|
if (x) {
|
|
|
|
striping = false;
|
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
const char* include = "#include";
|
|
|
|
if (memcmp(s, include, strlen(include))) {
|
|
|
|
fputs(s, stdout);
|
|
|
|
continue;
|
|
|
|
}
|
2006-07-25 13:09:44 +02:00
|
|
|
char *p = strchr(s, '<');
|
|
|
|
if (p) {
|
|
|
|
fputs(s, stdout);
|
|
|
|
continue;
|
|
|
|
}
|
2006-07-25 15:06:02 +02:00
|
|
|
p = strchr(s, '"');
|
2005-12-18 18:47:43 +01:00
|
|
|
if (! p) {
|
|
|
|
throw "#include misses \" - start of filename";
|
|
|
|
}
|
|
|
|
++p;
|
|
|
|
char *p2 = strchr(p, '"');
|
|
|
|
if (! p2) {
|
|
|
|
throw "#include misses \" - end of filename";
|
|
|
|
}
|
|
|
|
*p2 = 0;
|
|
|
|
p2 = strrchr(p, '/'); // always open files in current directory
|
|
|
|
if (p2) {
|
|
|
|
p = p2 + 1;
|
|
|
|
}
|
|
|
|
FILE *newIn = fopen(p, "rt");
|
|
|
|
if (! newIn) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
ProcessFile(newIn, true);
|
|
|
|
fclose(newIn);
|
|
|
|
// clean after Makefile's cp
|
|
|
|
unlink(p);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
ProcessFile(stdin, false);
|
|
|
|
}
|
2006-07-25 12:46:44 +02:00
|
|
|
catch (const char* x)
|
2005-12-18 18:47:43 +01:00
|
|
|
{
|
|
|
|
fprintf(stderr, "%s\n", x);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|