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