1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/*
* $Id$
*
* Convert multi-file etags files to something
* which can be used by jed.
*
* Thomas Roessler <roessler@guug.de>
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void doit (const char *fname, char *prefix, int crlf_pending);
char Cwd[2048];
size_t Cwdl;
int main (int argc, char *argv[])
{
if (argc < 2)
{
fprintf (stderr, "usage: %s filename\n", argv[0]);
exit (1);
}
if (getcwd (Cwd, sizeof (Cwd)) == NULL)
{
fprintf (stderr, "%s: Your current working directory has a really long name.\n", argv[0]);
exit (1);
}
Cwdl = strlen (Cwd);
doit (argv[1], Cwd, 0);
return 0;
}
void doit (const char *fname, char *prefix, int crlf_pending)
{
char buffer[2048];
char tmpf[2048];
FILE *fp;
char *cp;
size_t l;
if (strncmp (prefix, Cwd, Cwdl) == 0)
{
prefix += Cwdl;
if (*prefix == '/')
prefix++;
}
if (!*prefix)
prefix = NULL;
if (!(fp = fopen (fname, "r")))
{
perror (fname);
exit (1);
}
while (fgets (buffer, sizeof (buffer), fp))
{
l = strlen (buffer);
if (*buffer == '\f')
{
if (!crlf_pending)
fputs (buffer, stdout);
}
else if (crlf_pending && l > 9 && !strcmp (buffer + l - 9, ",include\n"))
{
if ((cp = strrchr (buffer, ',')))
*cp = 0;
strcpy (tmpf, buffer); /* __STRCPY_CHECKED__ - this program isn't invoked
* with unknown data anyway, so we don't care about
* buffer overflows. */
if ((cp = strrchr (buffer, '/')))
*cp = 0;
doit (tmpf, buffer, crlf_pending);
}
else if (crlf_pending && prefix)
printf ("%s/%s", prefix, buffer);
else
fputs (buffer, stdout);
crlf_pending = (*buffer == '\f');
}
fclose (fp);
}
|