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 0 : 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 : struct inclist *newfile;
46 : struct filepointer *content;
47 :
48 : /*
49 : * First decide what the pathname of this include file really is.
50 : */
51 0 : newfile = inc_path(file->i_file, include, dot, incCollection);
52 0 : if (newfile == NULL) {
53 0 : if (failOK)
54 0 : return;
55 0 : if (file != file_red)
56 0 : warning("%s (reading %s, line %d): ",
57 : file_red->i_file, file->i_file, filep->f_line);
58 : else
59 0 : warning("%s, line %d: ", file->i_file, filep->f_line);
60 0 : warning1("cannot find include file \"%s\"\n", include);
61 0 : show_where_not = TRUE;
62 0 : newfile = inc_path(file->i_file, include, dot, incCollection);
63 0 : show_where_not = FALSE;
64 : }
65 :
66 0 : if (newfile) {
67 :
68 : /* Only add new dependency files if they don't have "/usr/include" in them. */
69 0 : if (!(newfile && newfile->i_file && strstr(newfile->i_file, "/usr/"))) {
70 0 : included_by(file, newfile);
71 : }
72 :
73 0 : if (!newfile->i_searched) {
74 0 : newfile->i_searched = TRUE;
75 0 : content = getfile(newfile->i_file);
76 0 : find_includes(content, newfile, file_red, 0, failOK, incCollection, symbols);
77 0 : freefile(content);
78 : }
79 : }
80 : }
81 :
82 0 : void pr_dummy(struct inclist *ip)
83 : {
84 0 : fwrite(ip->i_file, strlen(ip->i_file), 1, stdout);
85 0 : fwrite(" :\n\n", 4, 1, stdout);
86 0 : }
87 :
88 0 : void recursive_pr_dummy(struct inclist *head, char *file)
89 : {
90 : int i;
91 :
92 0 : if (head->i_marked == 2)
93 0 : return;
94 0 : head->i_marked = 2; // it's a large boolean...
95 0 : if (head->i_file != file)
96 0 : pr_dummy(head);
97 0 : for (i=0; i<head->i_listlen; i++)
98 0 : recursive_pr_dummy(head->i_list[ i ], file);
99 : }
100 :
101 :
102 0 : void recursive_pr_include(struct inclist *head, char *file, char *base)
103 : {
104 : int i;
105 :
106 0 : if (head->i_marked)
107 0 : return;
108 0 : head->i_marked = TRUE;
109 0 : if (head->i_file != file)
110 0 : pr(head, file, base);
111 0 : for (i=0; i<head->i_listlen; i++)
112 0 : recursive_pr_include(head->i_list[ i ], file, base);
113 : }
114 :
115 0 : size_t pr(struct inclist *ip, char *file, char *base)
116 : {
117 : size_t ret;
118 : static char *lastfile;
119 : static int current_len;
120 : int len, i;
121 : char buf[ BUFSIZ ];
122 :
123 0 : printed = TRUE;
124 0 : len = (int)strlen(ip->i_file)+4;
125 0 : if (file != lastfile) {
126 0 : lastfile = file;
127 0 : sprintf(buf, "\n%s%s%s: \\\n %s", objprefix, base, objsuffix,
128 : ip->i_file);
129 0 : len = current_len = (int)strlen(buf);
130 : }
131 : else {
132 0 : buf[0] = ' ';
133 0 : buf[1] = '\\';
134 0 : buf[2] = '\n';
135 0 : buf[3] = ' ';
136 0 : strcpy(buf+4, ip->i_file);
137 0 : current_len += len;
138 : }
139 0 : ret = fwrite(buf, len, 1, stdout);
140 :
141 : /*
142 : * If verbose is set, then print out what this file includes.
143 : */
144 0 : if (! verbose || ip->i_list == NULL || ip->i_notified)
145 0 : return ret;
146 0 : ip->i_notified = TRUE;
147 0 : lastfile = NULL;
148 0 : printf("\n# %s includes:", ip->i_file);
149 0 : for (i=0; i<ip->i_listlen; i++)
150 0 : printf("\n#\t%s", ip->i_list[ i ]->i_incstring);
151 0 : return ret;
152 : }
153 :
154 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|