1*24492Sbloom static char *sccsid = "@(#)files.c 4.11 (Berkeley) 85/08/30"; 216212Sralph #include <fcntl.h> 316212Sralph 42805Swnj /* UNIX DEPENDENT PROCEDURES */ 52805Swnj 62805Swnj 72805Swnj /* DEFAULT RULES FOR UNIX */ 82805Swnj 92805Swnj char *builtin[] = 102805Swnj { 112805Swnj #ifdef pwb 122805Swnj ".SUFFIXES : .L .out .o .c .f .e .r .y .yr .ye .l .s .z .x .t .h .cl", 132805Swnj #else 1413463Snicklin ".SUFFIXES : .out .o .c .F .f .e .r .y .yr .ye .l .s .cl .p", 152805Swnj #endif 162805Swnj "YACC=yacc", 172805Swnj "YACCR=yacc -r", 182805Swnj "YACCE=yacc -e", 192805Swnj "YFLAGS=", 202805Swnj "LEX=lex", 212805Swnj "LFLAGS=", 222805Swnj "CC=cc", 2310803Ssam #if defined(vax) || defined(sun) 242805Swnj "AS=as", 252805Swnj #else 262805Swnj "AS=as -", 272805Swnj #endif 282805Swnj "PC=pc", 292805Swnj "PFLAGS=", 302805Swnj "CFLAGS=", 312805Swnj "RC=f77", 322805Swnj "RFLAGS=", 332811Swnj "FC=f77", 342805Swnj "EFLAGS=", 352805Swnj "FFLAGS=", 362805Swnj "LOADLIBES=", 372805Swnj #ifdef pwb 382805Swnj "SCOMP=scomp", 392805Swnj "SCFLAGS=", 402805Swnj "CMDICT=cmdict", 412805Swnj "CMFLAGS=", 422805Swnj #endif 432805Swnj 442805Swnj ".c.o :", 452805Swnj "\t$(CC) $(CFLAGS) -c $<", 462805Swnj 472805Swnj ".p.o :", 482805Swnj "\t$(PC) $(PFLAGS) -c $<", 492805Swnj 502805Swnj ".cl.o :", 512805Swnj "\tclass -c $<", 522805Swnj 5312525Snicklin ".e.o .r.o .F.o .f.o :", 542805Swnj "\t$(FC) $(RFLAGS) $(EFLAGS) $(FFLAGS) -c $<", 552805Swnj 562805Swnj ".s.o :", 572805Swnj "\t$(AS) -o $@ $<", 582805Swnj 592805Swnj ".y.o :", 602805Swnj "\t$(YACC) $(YFLAGS) $<", 612805Swnj "\t$(CC) $(CFLAGS) -c y.tab.c", 622805Swnj "\trm y.tab.c", 632805Swnj "\tmv y.tab.o $@", 642805Swnj 652805Swnj ".yr.o:", 662805Swnj "\t$(YACCR) $(YFLAGS) $<", 672805Swnj "\t$(RC) $(RFLAGS) -c y.tab.r", 682805Swnj "\trm y.tab.r", 692805Swnj "\tmv y.tab.o $@", 702805Swnj 712805Swnj ".ye.o :", 722805Swnj "\t$(YACCE) $(YFLAGS) $<", 732805Swnj "\t$(EC) $(RFLAGS) -c y.tab.e", 742805Swnj "\trm y.tab.e", 752805Swnj "\tmv y.tab.o $@", 762805Swnj 772805Swnj ".l.o :", 782805Swnj "\t$(LEX) $(LFLAGS) $<", 792805Swnj "\t$(CC) $(CFLAGS) -c lex.yy.c", 802805Swnj "\trm lex.yy.c", 812805Swnj "\tmv lex.yy.o $@", 822805Swnj 832805Swnj ".y.c :", 842805Swnj "\t$(YACC) $(YFLAGS) $<", 852805Swnj "\tmv y.tab.c $@", 862805Swnj 872805Swnj ".l.c :", 882805Swnj "\t$(LEX) $(LFLAGS) $<", 892805Swnj "\tmv lex.yy.c $@", 902805Swnj 912805Swnj ".yr.r:", 922805Swnj "\t$(YACCR) $(YFLAGS) $<", 932805Swnj "\tmv y.tab.r $@", 942805Swnj 952805Swnj ".ye.e :", 962805Swnj "\t$(YACCE) $(YFLAGS) $<", 972805Swnj "\tmv y.tab.e $@", 982805Swnj 992805Swnj #ifdef pwb 1002805Swnj ".o.L .c.L .t.L:", 1012805Swnj "\t$(SCOMP) $(SCFLAGS) $<", 1022805Swnj 1032805Swnj ".t.o:", 1042805Swnj "\t$(SCOMP) $(SCFLAGS) -c $<", 1052805Swnj 1062805Swnj ".t.c:", 1072805Swnj "\t$(SCOMP) $(SCFLAGS) -t $<", 1082805Swnj 1092805Swnj ".h.z .t.z:", 1102805Swnj "\t$(CMDICT) $(CMFLAGS) $<", 1112805Swnj 1122805Swnj ".h.x .t.x:", 1132805Swnj "\t$(CMDICT) $(CMFLAGS) -c $<", 1142805Swnj #endif 1152805Swnj 1162805Swnj ".s.out .c.out .o.out :", 1172805Swnj "\t$(CC) $(CFLAGS) $< $(LOADLIBES) -o $@", 1182805Swnj 11912525Snicklin ".f.out .F.out .r.out .e.out :", 1202805Swnj "\t$(FC) $(EFLAGS) $(RFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@", 1212805Swnj "\t-rm $*.o", 1222805Swnj 1232805Swnj ".y.out :", 1242805Swnj "\t$(YACC) $(YFLAGS) $<", 1252805Swnj "\t$(CC) $(CFLAGS) y.tab.c $(LOADLIBES) -ly -o $@", 1262805Swnj "\trm y.tab.c", 1272805Swnj 1282805Swnj ".l.out :", 1292805Swnj "\t$(LEX) $(LFLAGS) $<", 1302805Swnj "\t$(CC) $(CFLAGS) lex.yy.c $(LOADLIBES) -ll -o $@", 1312805Swnj "\trm lex.yy.c", 1322805Swnj 1332805Swnj 0 }; 1342805Swnj 1352805Swnj #include "defs" 13618644Smckusick #include <sys/stat.h> 1372805Swnj 1382805Swnj 13918644Smckusick 14018644Smckusick TIMETYPE 14118644Smckusick exists(pname) 14218644Smckusick struct nameblock *pname; 1432805Swnj { 1442805Swnj struct stat buf; 14518644Smckusick register char *s, *filename; 1462805Swnj TIMETYPE lookarch(); 14718644Smckusick extern char *findfl(); 1482805Swnj 14918644Smckusick filename = pname->namep; 15018644Smckusick 1512805Swnj for(s = filename ; *s!='\0' && *s!='(' ; ++s) 1522805Swnj ; 1532805Swnj 1542805Swnj if(*s == '(') 1552805Swnj return(lookarch(filename)); 1562805Swnj 1577208Sroot if (stat(filename, &buf) < 0) 15818644Smckusick { 15918644Smckusick s = findfl(filename); 16018644Smckusick if(s != (char *)-1) 16118644Smckusick { 16218644Smckusick pname->alias = copys(s); 16318644Smckusick if(stat(pname->alias, &buf) == 0) 16418644Smckusick return(buf.st_mtime); 16518644Smckusick } 1662805Swnj return(0); 16718644Smckusick } 1682805Swnj else return(buf.st_mtime); 1692805Swnj } 1702805Swnj 1712805Swnj 1722805Swnj TIMETYPE prestime() 1732805Swnj { 1742805Swnj TIMETYPE t; 1752805Swnj time(&t); 1762805Swnj return(t); 1772805Swnj } 1782805Swnj 1792805Swnj 1802805Swnj 1816578Smckusick FSTATIC char nbuf[MAXNAMLEN + 1]; 1826578Smckusick FSTATIC char *nbufend = &nbuf[MAXNAMLEN]; 1832805Swnj 1842805Swnj 1852805Swnj 1862805Swnj struct depblock *srchdir(pat, mkchain, nextdbl) 1872805Swnj register char *pat; /* pattern to be matched in directory */ 1882805Swnj int mkchain; /* nonzero if results to be remembered */ 1892805Swnj struct depblock *nextdbl; /* final value for chain */ 1902805Swnj { 1916578Smckusick DIR *dirf; 1922805Swnj register int i; 1932805Swnj int nread, cldir; 194*24492Sbloom char *dirname, *dirpref, *endir, *filepat, *p, temp[BUFSIZ]; 195*24492Sbloom char fullname[BUFSIZ], *p1, *p2; 1962805Swnj struct nameblock *q; 1972805Swnj struct depblock *thisdbl; 1986578Smckusick struct dirhdr *od; 1992805Swnj struct pattern *patp; 20018644Smckusick struct varblock *cp, *varptr(); 201*24492Sbloom char *path, pth[BUFSIZ], *strcpy(); 2026578Smckusick struct direct *dptr; 2032805Swnj 2042805Swnj 2052805Swnj thisdbl = 0; 2062805Swnj 2072805Swnj if(mkchain == NO) 2082805Swnj for(patp=firstpat ; patp ; patp = patp->nxtpattern) 2092805Swnj if(! unequal(pat, patp->patval)) return(0); 2102805Swnj 2112805Swnj patp = ALLOC(pattern); 2122805Swnj patp->nxtpattern = firstpat; 2132805Swnj firstpat = patp; 2142805Swnj patp->patval = copys(pat); 2152805Swnj 2162805Swnj endir = 0; 2172805Swnj 2182805Swnj for(p=pat; *p!='\0'; ++p) 2192805Swnj if(*p=='/') endir = p; 2202805Swnj 2212805Swnj if(endir==0) 2222805Swnj { 2232805Swnj dirpref = ""; 2242805Swnj filepat = pat; 22518644Smckusick cp = varptr("VPATH"); 22618644Smckusick if (*cp->varval == 0) path = "."; 22718644Smckusick else { 22818644Smckusick path = pth; 22918644Smckusick *path = '\0'; 23018644Smckusick if (*cp->varval != '.') strcpy(pth,".:"); 23118644Smckusick strcat(pth, cp->varval); 23218644Smckusick } 2332805Swnj } 2342805Swnj else { 2352805Swnj *endir = '\0'; 23618644Smckusick path = strcpy(pth, pat); 23718644Smckusick dirpref = concat(pat, "/", temp); 2382805Swnj filepat = endir+1; 2392805Swnj } 2402805Swnj 24118644Smckusick while (*path) { /* Loop thru each VPATH directory */ 24218644Smckusick dirname = path; 24318644Smckusick for (; *path; path++) 24418644Smckusick if (*path == ':') { 24518644Smckusick *path++ = '\0'; 24618644Smckusick break; 24718644Smckusick } 24818644Smckusick 2492805Swnj dirf = NULL; 2502805Swnj cldir = NO; 2512805Swnj 2522805Swnj for(od = firstod; od; od = od->nxtopendir) 2532805Swnj if(! unequal(dirname, od->dirn) ) 2542805Swnj { 2552805Swnj dirf = od->dirfc; 2566578Smckusick if (dirf != NULL) 2576578Smckusick rewinddir(dirf); /* start over at the beginning */ 2582805Swnj break; 2592805Swnj } 2602805Swnj 2612805Swnj if(dirf == NULL) 2622805Swnj { 2636578Smckusick dirf = opendir(dirname); 2642805Swnj if(nopdir >= MAXDIR) 2652805Swnj cldir = YES; 2662805Swnj else { 2672805Swnj ++nopdir; 2686578Smckusick od = ALLOC(dirhdr); 2692805Swnj od->nxtopendir = firstod; 2702805Swnj firstod = od; 2712805Swnj od->dirfc = dirf; 2722805Swnj od->dirn = copys(dirname); 27316212Sralph fcntl(dirf->dd_fd, F_SETFD, 1); 2742805Swnj } 2752805Swnj } 2762805Swnj 2772805Swnj if(dirf == NULL) 2782805Swnj { 2792805Swnj fprintf(stderr, "Directory %s: ", dirname); 2802805Swnj fatal("Cannot open"); 2812805Swnj } 2822805Swnj 2836578Smckusick else for (dptr = readdir(dirf); dptr != NULL; dptr = readdir(dirf)) 2842805Swnj { 2856578Smckusick p1 = dptr->d_name; 2866578Smckusick p2 = nbuf; 2876578Smckusick while( (p2<nbufend) && (*p2++ = *p1++)!='\0' ) 2886578Smckusick /* void */; 2896578Smckusick if( amatch(nbuf,filepat) ) 2906578Smckusick { 2916578Smckusick concat(dirpref,nbuf,fullname); 2926578Smckusick if( (q=srchname(fullname)) ==0) 2936578Smckusick q = makename(copys(fullname)); 2946578Smckusick if(mkchain) 2952805Swnj { 2966578Smckusick thisdbl = ALLOC(depblock); 2976578Smckusick thisdbl->nxtdepblock = nextdbl; 2986578Smckusick thisdbl->depname = q; 2996578Smckusick nextdbl = thisdbl; 3002805Swnj } 3016578Smckusick } 3026578Smckusick } 3032805Swnj 3042805Swnj if(endir != 0) *endir = '/'; 3052805Swnj 3066578Smckusick if(cldir) { 3076578Smckusick closedir(dirf); 3086578Smckusick dirf = NULL; 3096578Smckusick } 31018644Smckusick } /* End of VPATH loop */ 3112805Swnj return(thisdbl); 3122805Swnj } 3132805Swnj 3142805Swnj /* stolen from glob through find */ 3152805Swnj 3162805Swnj static amatch(s, p) 3172805Swnj char *s, *p; 3182805Swnj { 3192805Swnj register int cc, scc, k; 3202805Swnj int c, lc; 3212805Swnj 3222805Swnj scc = *s; 3232805Swnj lc = 077777; 3242805Swnj switch (c = *p) { 3252805Swnj 3262805Swnj case '[': 3272805Swnj k = 0; 3282805Swnj while (cc = *++p) { 3292805Swnj switch (cc) { 3302805Swnj 3312805Swnj case ']': 3322805Swnj if (k) 3332805Swnj return(amatch(++s, ++p)); 3342805Swnj else 3352805Swnj return(0); 3362805Swnj 3372805Swnj case '-': 3382805Swnj k |= (lc <= scc) & (scc <= (cc=p[1]) ) ; 3392805Swnj } 3402805Swnj if (scc==(lc=cc)) k++; 3412805Swnj } 3422805Swnj return(0); 3432805Swnj 3442805Swnj case '?': 3452805Swnj caseq: 3462805Swnj if(scc) return(amatch(++s, ++p)); 3472805Swnj return(0); 3482805Swnj case '*': 3492805Swnj return(umatch(s, ++p)); 3502805Swnj case 0: 3512805Swnj return(!scc); 3522805Swnj } 3532805Swnj if (c==scc) goto caseq; 3542805Swnj return(0); 3552805Swnj } 3562805Swnj 3572805Swnj static umatch(s, p) 3582805Swnj char *s, *p; 3592805Swnj { 3602805Swnj if(*p==0) return(1); 3612805Swnj while(*s) 3622805Swnj if (amatch(s++,p)) return(1); 3632805Swnj return(0); 3642805Swnj } 3652805Swnj 3662805Swnj #ifdef METERFILE 3672805Swnj #include <pwd.h> 3682805Swnj int meteron = 0; /* default: metering off */ 3692805Swnj 3702805Swnj meter(file) 3712805Swnj char *file; 3722805Swnj { 3732805Swnj TIMETYPE tvec; 3742805Swnj char *p, *ctime(); 3752805Swnj FILE * mout; 3762805Swnj struct passwd *pwd, *getpwuid(); 3772805Swnj 3782805Swnj if(file==0 || meteron==0) return; 3792805Swnj 3802805Swnj pwd = getpwuid(getuid()); 3812805Swnj 3822805Swnj time(&tvec); 3832805Swnj 3842805Swnj if( (mout=fopen(file,"a")) != NULL ) 3852805Swnj { 3862805Swnj p = ctime(&tvec); 3872805Swnj p[16] = '\0'; 3882805Swnj fprintf(mout,"User %s, %s\n",pwd->pw_name,p+4); 3892805Swnj fclose(mout); 3902805Swnj } 3912805Swnj } 3922805Swnj #endif 3932805Swnj 3942805Swnj 3952805Swnj /* look inside archives for notations a(b) and a((b)) 3962805Swnj a(b) is file member b in archive a 3972805Swnj a((b)) is entry point _b in object archive a 3982805Swnj */ 3992805Swnj 4002805Swnj #ifdef ASCARCH 4012805Swnj # include <ar.h> 4022805Swnj #else 4032805Swnj # include <ar.h> 4042805Swnj #endif 4052805Swnj #include <a.out.h> 4062805Swnj 4072805Swnj static long arflen; 4082805Swnj static long arfdate; 4092805Swnj static char arfname[16]; 4102805Swnj FILE *arfd; 4112805Swnj long int arpos, arlen; 4122805Swnj 4132805Swnj static struct exec objhead; 4142805Swnj 4152805Swnj static struct nlist objentry; 4162805Swnj 4172805Swnj 4182805Swnj TIMETYPE lookarch(filename) 4192805Swnj char *filename; 4202805Swnj { 4216578Smckusick char *p, *q, *send, s[MAXNAMLEN + 1]; 4222805Swnj int i, nc, nsym, objarch; 4232805Swnj 4242805Swnj for(p = filename; *p!= '(' ; ++p) 4252805Swnj ; 4262805Swnj *p = '\0'; 4272805Swnj openarch(filename); 4282805Swnj *p++ = '('; 4292805Swnj 4302805Swnj if(*p == '(') 4312805Swnj { 4322805Swnj objarch = YES; 4332805Swnj nc = 8; 4342805Swnj ++p; 4352805Swnj } 4362805Swnj else 4372805Swnj { 4382805Swnj objarch = NO; 4396578Smckusick nc = MAXNAMLEN; 4402805Swnj } 4412805Swnj send = s + nc; 4422805Swnj 4432805Swnj for( q = s ; q<send && *p!='\0' && *p!=')' ; *q++ = *p++ ) 4442805Swnj ; 4452805Swnj while(q < send) 4462805Swnj *q++ = '\0'; 4472805Swnj while(getarch()) 4482805Swnj { 4492805Swnj if(objarch) 4502805Swnj { 4512805Swnj getobj(); 4522805Swnj nsym = objhead.a_syms / sizeof(objentry); 4532805Swnj for(i = 0; i<nsym ; ++i) 4542805Swnj { 4552805Swnj fread( (char *) &objentry, sizeof(objentry),1,arfd); 4562805Swnj if( (objentry.n_type & N_EXT) 4572805Swnj && ((objentry.n_type & ~N_EXT) || objentry.n_value) 4582805Swnj && eqstr(objentry.n_un.n_name,s,nc)) 4592805Swnj { 4602805Swnj clarch(); 4612805Swnj return(arfdate); 4622805Swnj } 4632805Swnj } 4642805Swnj } 4652805Swnj 4662805Swnj else if( eqstr(arfname, s, nc)) 4672805Swnj { 4682805Swnj clarch(); 4692805Swnj return(arfdate); 4702805Swnj } 4712805Swnj } 4722805Swnj 4732805Swnj clarch(); 4742805Swnj return( 0L); 4752805Swnj } 4762805Swnj 4772805Swnj 4782805Swnj clarch() 4792805Swnj { 4802805Swnj fclose( arfd ); 4812805Swnj } 4822805Swnj 4832805Swnj 4842805Swnj openarch(f) 4852805Swnj register char *f; 4862805Swnj { 4872805Swnj #ifdef ASCARCH 4882805Swnj char magic[SARMAG]; 4892805Swnj #endif 4902805Swnj int word; 4912805Swnj #include <sys/stat.h> 4922805Swnj struct stat buf; 4932805Swnj 4942805Swnj stat(f, &buf); 4952805Swnj arlen = buf.st_size; 4962805Swnj 4972805Swnj arfd = fopen(f, "r"); 4982805Swnj if(arfd == NULL) 4992805Swnj fatal1("cannot open %s", f); 5002805Swnj 5012805Swnj fread( (char *) &word, sizeof(word), 1, arfd); 5022805Swnj #ifdef ASCARCH 5032805Swnj fseek(arfd, 0L, 0); 5042805Swnj fread(magic, SARMAG, 1, arfd); 5052805Swnj arpos = SARMAG; 5062805Swnj if( ! eqstr(magic, ARMAG, SARMAG) ) 5072805Swnj #else 5082805Swnj arpos = sizeof(word); 5092805Swnj if(word != ARMAG) 5102805Swnj #endif 5112805Swnj fatal1("%s is not an archive", f); 5122805Swnj 5132805Swnj arflen = 0; 5142805Swnj } 5152805Swnj 5162805Swnj 5172805Swnj 5182805Swnj getarch() 5192805Swnj { 5202805Swnj struct ar_hdr arhead; 5212805Swnj long atol(); 5222805Swnj 5232805Swnj arpos += (arflen + 1) & ~1L; /* round archived file length up to even */ 5242805Swnj if(arpos >= arlen) 5252805Swnj return(0); 5262805Swnj fseek(arfd, arpos, 0); 5272805Swnj 5282805Swnj fread( (char *) &arhead, sizeof(arhead), 1, arfd); 5292805Swnj arpos += sizeof(arhead); 5302805Swnj #ifdef ASCARCH 5312805Swnj arflen = atol(arhead.ar_size); 5322805Swnj arfdate = atol(arhead.ar_date); 5332805Swnj #else 5342805Swnj arflen = arhead.ar_size; 5352805Swnj arfdate = arhead.ar_date; 5362805Swnj #endif 5372805Swnj strncpy(arfname, arhead.ar_name, sizeof(arhead.ar_name)); 5382805Swnj return(1); 5392805Swnj } 5402805Swnj 5412805Swnj 5422805Swnj getobj() 5432805Swnj { 5442805Swnj long int skip; 5452805Swnj 5462805Swnj fread( (char *) &objhead, sizeof(objhead), 1, arfd); 5472805Swnj if (N_BADMAG(objhead)) 5482805Swnj fatal1("%s is not an object module", arfname); 5492805Swnj skip = objhead.a_text + objhead.a_data; 55010803Ssam #if defined(vax) || defined(sun) 5512805Swnj skip += objhead.a_trsize + objhead.a_drsize; 5522805Swnj #else 5532805Swnj if(! objhead.a_flag ) 5542805Swnj skip *= 2; 5552805Swnj #endif 5562805Swnj fseek(arfd, skip, 1); 5572805Swnj } 5582805Swnj 5592805Swnj 5602805Swnj eqstr(a,b,n) 5612805Swnj register char *a, *b; 5622805Swnj int n; 5632805Swnj { 5642805Swnj register int i; 5652805Swnj for(i = 0 ; i < n ; ++i) 5662805Swnj if(*a++ != *b++) 5672805Swnj return(NO); 5682805Swnj return(YES); 5692805Swnj } 57018644Smckusick 57118644Smckusick 57218644Smckusick /* 57318644Smckusick * findfl(name) (like execvp, but does path search and finds files) 57418644Smckusick */ 57518644Smckusick static char fname[128]; 57618644Smckusick 57718644Smckusick char *execat(); 57818644Smckusick 57918644Smckusick char *findfl(name) 58018644Smckusick register char *name; 58118644Smckusick { 58218644Smckusick register char *p; 58318644Smckusick register struct varblock *cp; 58418644Smckusick struct stat buf; 58518644Smckusick 58618644Smckusick for (p = name; *p; p++) 58718644Smckusick if(*p == '/') return(name); 58818644Smckusick 58918644Smckusick cp = varptr("VPATH"); 59018644Smckusick if(cp->varval == NULL || *cp->varval == 0) 59118644Smckusick p = ":"; 59218644Smckusick else 59318644Smckusick p = cp->varval; 59418644Smckusick 59518644Smckusick do 59618644Smckusick { 59718644Smckusick p = execat(p, name, fname); 59818644Smckusick if(stat(fname,&buf) >= 0) 59918644Smckusick return(fname); 60018644Smckusick } while (p); 60118644Smckusick return((char *)-1); 60218644Smckusick } 60318644Smckusick 60418644Smckusick char *execat(s1, s2, si) 60518644Smckusick register char *s1, *s2; 60618644Smckusick char *si; 60718644Smckusick { 60818644Smckusick register char *s; 60918644Smckusick 61018644Smckusick s = si; 61118644Smckusick while (*s1 && *s1 != ':' && *s1 != '-') 61218644Smckusick *s++ = *s1++; 61318644Smckusick if (si != s) 61418644Smckusick *s++ = '/'; 61518644Smckusick while (*s2) 61618644Smckusick *s++ = *s2++; 61718644Smckusick *s = '\0'; 61818644Smckusick return(*s1? ++s1: 0); 61918644Smckusick } 62018644Smckusick 62118644Smckusick 62218644Smckusick /* copy s to d, changing file names to file aliases */ 62318644Smckusick fixname(s, d) 62418644Smckusick char *s, *d; 62518644Smckusick { 62618644Smckusick register char *r, *q; 62718644Smckusick struct nameblock *pn; 628*24492Sbloom char name[BUFSIZ]; 62918644Smckusick 63018644Smckusick while (*s) { 63118644Smckusick if (isspace(*s)) *d++ = *s++; 63218644Smckusick else { 63318644Smckusick r = name; 63418644Smckusick while (*s) { 63518644Smckusick if (isspace(*s)) break; 63618644Smckusick *r++ = *s++; 63718644Smckusick } 63818644Smckusick *r = '\0'; 63918644Smckusick 64018644Smckusick if (((pn = srchname(name)) != 0) && (pn->alias)) 64118644Smckusick q = pn->alias; 64218644Smckusick else q = name; 64318644Smckusick 64418644Smckusick while (*q) *d++ = *q++; 64518644Smckusick } 64618644Smckusick } 64718644Smckusick *d = '\0'; 64818644Smckusick } 649