Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /* $XConsortium: pr.c,v 1.17 94/04/17 20:10:38 gildea Exp $ */
3 : /*
4 :
5 : Copyright (c) 1993, 1994 X Consortium
6 :
7 : Permission is hereby granted, free of charge, to any person obtaining a copy
8 : of this software and associated documentation files (the "Software"), to deal
9 : in the Software without restriction, including without limitation the rights
10 : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 : copies of the Software, and to permit persons to whom the Software is
12 : furnished to do so, subject to the following conditions:
13 :
14 : The above copyright notice and this permission notice shall be included in
15 : all copies or substantial portions of the Software.
16 :
17 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 : X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 : AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 : CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 :
24 : Except as contained in this notice, the name of the X Consortium shall not be
25 : used in advertising or otherwise to promote the sale, use or other dealings
26 : in this Software without prior written authorization from the X Consortium.
27 :
28 : */
29 :
30 : #include "def.h"
31 : #include <string.h>
32 : size_t pr( struct inclist *ip, char *file,char *base);
33 :
34 : extern struct inclist inclist[ MAXFILES ],
35 : *inclistp;
36 : extern char *objprefix;
37 : extern char *objsuffix;
38 : extern int width;
39 : extern boolean printed;
40 : extern boolean verbose;
41 : extern boolean show_where_not;
42 :
43 34 : void add_include(struct filepointer *filep, struct inclist *file, struct inclist *file_red, char *include, boolean dot, boolean failOK, struct IncludesCollection* incCollection, struct symhash *symbols)
44 : {
45 : register struct inclist *newfile;
46 : register struct filepointer *content;
47 :
48 : /*
49 : * First decide what the pathname of this include file really is.
50 : */
51 34 : newfile = inc_path(file->i_file, include, dot, incCollection);
52 34 : if (newfile == NULL) {
53 13 : if (failOK)
54 34 : return;
55 13 : if (file != file_red)
56 2 : warning("%s (reading %s, line %d): ",
57 : file_red->i_file, file->i_file, filep->f_line);
58 : else
59 11 : warning("%s, line %d: ", file->i_file, filep->f_line);
60 13 : warning1("cannot find include file \"%s\"\n", include);
61 13 : show_where_not = TRUE;
62 13 : newfile = inc_path(file->i_file, include, dot, incCollection);
63 13 : show_where_not = FALSE;
64 : }
65 :
66 34 : if (newfile) {
67 :
68 : /* Only add new dependency files if they don't have "/usr/include" in them. */
69 21 : if (!(newfile && newfile->i_file && strstr(newfile->i_file, "/usr/"))) {
70 0 : included_by(file, newfile);
71 : }
72 :
73 21 : if (!newfile->i_searched) {
74 9 : newfile->i_searched = TRUE;
75 9 : content = getfile(newfile->i_file);
76 9 : find_includes(content, newfile, file_red, 0, failOK, incCollection, symbols);
77 9 : freefile(content);
78 : }
79 : }
80 : }
81 :
82 2 : void recursive_pr_include(head, file, base)
83 : register struct inclist *head;
84 : register char *file, *base;
85 : {
86 : register int i;
87 :
88 2 : if (head->i_marked)
89 2 : return;
90 2 : head->i_marked = TRUE;
91 2 : if (head->i_file != file)
92 0 : pr(head, file, base);
93 2 : for (i=0; i<head->i_listlen; i++)
94 0 : recursive_pr_include(head->i_list[ i ], file, base);
95 : }
96 :
97 0 : size_t pr(ip, file, base)
98 : register struct inclist *ip;
99 : char *file, *base;
100 : {
101 : size_t ret;
102 : static char *lastfile;
103 : static int current_len;
104 : register int len, i;
105 : char buf[ BUFSIZ ];
106 :
107 0 : printed = TRUE;
108 0 : len = (int)strlen(ip->i_file)+1;
109 0 : if (current_len + len > width || file != lastfile) {
110 0 : lastfile = file;
111 0 : sprintf(buf, "\n%s%s%s: %s", objprefix, base, objsuffix,
112 : ip->i_file);
113 0 : len = current_len = (int)strlen(buf);
114 : }
115 : else {
116 0 : buf[0] = ' ';
117 0 : strcpy(buf+1, ip->i_file);
118 0 : current_len += len;
119 : }
120 0 : ret = fwrite(buf, len, 1, stdout);
121 :
122 : /*
123 : * If verbose is set, then print out what this file includes.
124 : */
125 0 : if (! verbose || ip->i_list == NULL || ip->i_notified)
126 0 : return ret;
127 0 : ip->i_notified = TRUE;
128 0 : lastfile = NULL;
129 0 : printf("\n# %s includes:", ip->i_file);
130 0 : for (i=0; i<ip->i_listlen; i++)
131 0 : printf("\n#\t%s", ip->i_list[ i ]->i_incstring);
132 0 : return ret;
133 : }
134 :
135 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|