pr.c revision b2f5b1db
10eb10989Smrg/*
20eb10989Smrg
30eb10989SmrgCopyright (c) 1993, 1994, 1998 The Open Group
40eb10989Smrg
50eb10989SmrgPermission to use, copy, modify, distribute, and sell this software and its
60eb10989Smrgdocumentation for any purpose is hereby granted without fee, provided that
70eb10989Smrgthe above copyright notice appear in all copies and that both that
80eb10989Smrgcopyright notice and this permission notice appear in supporting
90eb10989Smrgdocumentation.
100eb10989Smrg
110eb10989SmrgThe above copyright notice and this permission notice shall be included in
120eb10989Smrgall copies or substantial portions of the Software.
130eb10989Smrg
140eb10989SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
150eb10989SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
160eb10989SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
170eb10989SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
180eb10989SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
190eb10989SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
200eb10989Smrg
210eb10989SmrgExcept as contained in this notice, the name of The Open Group shall not be
220eb10989Smrgused in advertising or otherwise to promote the sale, use or other dealings
230eb10989Smrgin this Software without prior written authorization from The Open Group.
240eb10989Smrg
250eb10989Smrg*/
260eb10989Smrg
270eb10989Smrg#include "def.h"
280eb10989Smrg
290eb10989Smrgvoid
30d43532a6Smrgadd_include(struct filepointer *filep, struct inclist *file,
3163165362Smrg	    struct inclist *file_red, const char *include, int type,
320eb10989Smrg	    boolean failOK)
330eb10989Smrg{
340eb10989Smrg	register struct inclist	*newfile;
350eb10989Smrg	register struct filepointer	*content;
360eb10989Smrg
370eb10989Smrg	/*
380eb10989Smrg	 * First decide what the pathname of this include file really is.
390eb10989Smrg	 */
400eb10989Smrg	newfile = inc_path(file->i_file, include, type);
410eb10989Smrg	if (newfile == NULL) {
420eb10989Smrg		if (failOK)
430eb10989Smrg		    return;
440eb10989Smrg		if (file != file_red)
4563165362Smrg			warning("%s (reading %s, line %ld): ",
460eb10989Smrg				file_red->i_file, file->i_file, filep->f_line);
470eb10989Smrg		else
4863165362Smrg			warning("%s, line %ld: ", file->i_file, filep->f_line);
490eb10989Smrg		warning1("cannot find include file \"%s\"\n", include);
500eb10989Smrg		show_where_not = TRUE;
510eb10989Smrg		newfile = inc_path(file->i_file, include, type);
520eb10989Smrg		show_where_not = FALSE;
530eb10989Smrg	}
540eb10989Smrg
550eb10989Smrg	if (newfile) {
560eb10989Smrg		included_by(file, newfile);
570eb10989Smrg		if (!(newfile->i_flags & SEARCHED)) {
580eb10989Smrg			newfile->i_flags |= SEARCHED;
590eb10989Smrg			content = getfile(newfile->i_file);
600eb10989Smrg			find_includes(content, newfile, file_red, 0, failOK);
610eb10989Smrg			freefile(content);
620eb10989Smrg		}
630eb10989Smrg	}
640eb10989Smrg}
650eb10989Smrg
66b2f5b1dbSmrg/**
67b2f5b1dbSmrg * Replaces all ":" occurrences in @p input with "\:" using @p outputbuffer (of size @p bufsize)
68b2f5b1dbSmrg * possibly to hold the result. @p returns the string with quoted colons
69b2f5b1dbSmrg */
70b2f5b1dbSmrgstatic const char *
71b2f5b1dbSmrgquoteColons(const char *input, char *outputbuffer, size_t bufsize)
72b2f5b1dbSmrg{
73b2f5b1dbSmrg        const char *tmp=input;
74b2f5b1dbSmrg        const char *loc;
75b2f5b1dbSmrg        char *output=outputbuffer;
76b2f5b1dbSmrg
77b2f5b1dbSmrg        loc = strchr(input, ':');
78b2f5b1dbSmrg        if (loc == NULL) {
79b2f5b1dbSmrg                return input;
80b2f5b1dbSmrg        }
81b2f5b1dbSmrg
82b2f5b1dbSmrg        tmp=input;
83b2f5b1dbSmrg        while (loc != NULL && bufsize > loc-tmp+2 ) {
84b2f5b1dbSmrg                memcpy(output, tmp, loc-tmp);
85b2f5b1dbSmrg                output+=loc-tmp;
86b2f5b1dbSmrg                bufsize-=loc-tmp+2;
87b2f5b1dbSmrg                tmp=loc+1;
88b2f5b1dbSmrg                *output='\\';
89b2f5b1dbSmrg                output++;
90b2f5b1dbSmrg                *output=':';
91b2f5b1dbSmrg                output++;
92b2f5b1dbSmrg                loc = strchr(tmp, ':');
93b2f5b1dbSmrg        }
94b2f5b1dbSmrg
95b2f5b1dbSmrg        if (strlen(tmp) <= bufsize)
96b2f5b1dbSmrg           strcpy(output, tmp);
97b2f5b1dbSmrg        else {
98b2f5b1dbSmrg           strncpy(output, tmp, bufsize-1);
99b2f5b1dbSmrg           output[bufsize]=0;
100b2f5b1dbSmrg        }
101b2f5b1dbSmrg        return outputbuffer;
102b2f5b1dbSmrg}
103b2f5b1dbSmrg
1040eb10989Smrgstatic void
10563165362Smrgpr(struct inclist *ip, const char *file, const char *base)
1060eb10989Smrg{
10763165362Smrg	static const char *lastfile;
1080eb10989Smrg	static int	current_len;
1090eb10989Smrg	register int	len, i;
110b2f5b1dbSmrg	const char *	quoted;
111b2f5b1dbSmrg	char	quotebuf[ BUFSIZ ];
1120eb10989Smrg
1130eb10989Smrg	printed = TRUE;
114b2f5b1dbSmrg	quoted = quoteColons(ip->i_file, quotebuf, sizeof(quotebuf));
115b2f5b1dbSmrg	len = strlen(quoted)+1;
1160eb10989Smrg	if (current_len + len > width || file != lastfile) {
1170eb10989Smrg		lastfile = file;
118b2f5b1dbSmrg		current_len = fprintf(stdout, "\n%s%s%s: %s",
119b2f5b1dbSmrg			 objprefix, base, objsuffix, quoted);
1200eb10989Smrg	}
1210eb10989Smrg	else {
122b2f5b1dbSmrg		fprintf(stdout, " %s", quoted);
1230eb10989Smrg		current_len += len;
1240eb10989Smrg	}
1250eb10989Smrg
1260eb10989Smrg	/*
1270eb10989Smrg	 * If verbose is set, then print out what this file includes.
1280eb10989Smrg	 */
1290eb10989Smrg	if (! verbose || ip->i_list == NULL || ip->i_flags & NOTIFIED)
1300eb10989Smrg		return;
1310eb10989Smrg	ip->i_flags |= NOTIFIED;
1320eb10989Smrg	lastfile = NULL;
1330eb10989Smrg	printf("\n# %s includes:", ip->i_file);
1340eb10989Smrg	for (i=0; i<ip->i_listlen; i++)
1350eb10989Smrg		printf("\n#\t%s", ip->i_list[ i ]->i_incstring);
1360eb10989Smrg}
1370eb10989Smrg
1380eb10989Smrgvoid
13963165362Smrgrecursive_pr_include(struct inclist *head, const char *file, const char *base)
1400eb10989Smrg{
1410eb10989Smrg	int	i;
1420eb10989Smrg
1430eb10989Smrg	if (head->i_flags & MARKED)
1440eb10989Smrg		return;
1450eb10989Smrg	head->i_flags |= MARKED;
1460eb10989Smrg	if (head->i_file != file)
1470eb10989Smrg		pr(head, file, base);
1480eb10989Smrg	for (i=0; i<head->i_listlen; i++)
1490eb10989Smrg		recursive_pr_include(head->i_list[ i ], file, base);
1500eb10989Smrg}
151