|
|
1.1 root 1: /* @(#)/usr/src/cmd/make/misc.c 3.4 */
2:
3: /* @(#)misc.c 3.2 */
4:
5: #include "defs"
6: #include "ctype.h"
7:
8:
9:
10: FSTATIC CHARSTAR nextchar=0;
11: FSTATIC CHARSTAR lastchar=0;
12:
13: FSTATIC int *nextint=0;
14: FSTATIC int *lastint=0;
15:
16: FSTATIC NAMEBLOCK hashtab[HASHSIZE];
17: int nhashed=0;
18:
19:
20: /* simple linear hash. hash function is sum of
21: characters mod hash table size.
22: */
23: hashloc(s)
24: CHARSTAR s;
25: {
26: register int i;
27: register int hashval;
28: register CHARSTAR t;
29:
30: hashval = 0;
31:
32: for(t=s; *t!=CNULL ; ++t)
33: hashval += *t;
34:
35: hashval %= HASHSIZE;
36:
37: for(i=hashval;
38: hashtab[i]!=0 && !equal(s,hashtab[i]->namep);
39: i = (i+1)%HASHSIZE ) ;
40:
41: return(i);
42: }
43:
44:
45: NAMEBLOCK srchname(s)
46: register CHARSTAR s;
47: {
48: return( hashtab[hashloc(s)] );
49: }
50:
51:
52:
53:
54: NAMEBLOCK makename(s)
55: register CHARSTAR s;
56: {
57: /* make a name entry; `s' is presumed to already to have been saved */
58:
59: register NAMEBLOCK p;
60: register CHARSTAR t;
61:
62: if(nhashed++ > HASHSIZE-3)
63: fatal("Hash table overflow");
64:
65: p = ALLOC(nameblock);
66: p->nextname = firstname;
67: p->backname = NULL;
68:
69: p->namep = s;
70: p->linep = 0;
71: p->done = 0;
72: p->septype = 0;
73: p->rundep = 0;
74: p->modtime = 0;
75:
76: firstname = p;
77:
78: hashtab[hashloc(s)] = p;
79:
80: return(p);
81: }
82:
83:
84:
85:
86:
87:
88:
89: #define NOTSHORT sizeof (struct nameblock)
90:
91: extern CHARSTAR end; /* loader value of end of core */
92:
93: CHARSTAR copys(s)
94: register CHARSTAR s;
95: {
96: register CHARSTAR t;
97: register struct
98: {
99: int i_i;
100: CHARSTAR i_s;
101: } i;
102:
103: i.i_i = strlen(s) + 1;
104: if(i.i_i > NOTSHORT)
105: {
106: i.i_i = (i.i_i + 1)&~1;
107: t = (CHARSTAR )calloc(i.i_i, sizeof (*s));
108: if(t == NULL)
109: goto fat;
110: i.i_s = t;
111: while(*t++ = *s++);
112: return(i.i_s);
113: }
114:
115: if( i.i_i >= (lastchar-nextchar) )
116: {
117: i.i_i = (i.i_i + 1)&~1;
118: if( (nextchar=(CHARSTAR )calloc(i.i_i, sizeof (*s) )) == NULL)
119: fat:
120: fatal("Cannot allocate memory");
121: lastchar = nextchar + i.i_i;
122: }
123:
124: t = nextchar;
125: while(*nextchar++ = *s++);
126: return(t);
127: }
128:
129:
130: CHARSTAR concat(a,b,c) /* c = concatenation of a and b */
131: register CHARSTAR a, b;
132: register CHARSTAR c;
133: {
134: register CHARSTAR t;
135: t = c;
136:
137: while(*t = *a++) t++;
138: while(*t++ = *b++);
139: return(c);
140: }
141:
142: suffix(a,b,p) /* is b the suffix of a? if so, set p = prefix */
143: register CHARSTAR a, b, p;
144: {
145: CHARSTAR a0, b0;
146: a0 = a;
147: b0 = b;
148:
149: if(!a || !b)
150: return(0);
151:
152: while(*a++);
153: while(*b++);
154:
155: if( (a-a0) < (b-b0) )
156: return(0);
157:
158: while(b>b0)
159: if(*--a != *--b)
160: return(0);
161:
162: while(a0<a)
163: *p++ = *a0++;
164: *p = CNULL;
165:
166: return(1);
167: }
168:
169:
170:
171: int *intalloc(n)
172: register int n;
173: {
174: register INTSTAR p;
175:
176: if( p = (int *) calloc(1,n) )
177: return(p);
178:
179: fatal("out of memory");
180: }
181:
182: /* copy string a into b, substituting for arguments */
183: extern NAMEBLOCK cur_name;
184:
185: CHARSTAR subst(a,b)
186: register CHARSTAR a, b;
187: {
188: register CHARSTAR s;
189: register VARBLOCK vbp;
190: static depth=0;
191: char vname[100];
192: char closer;
193:
194: if(++depth > 100)
195: fatal("infinitely recursive macro?");
196: if(a!=0)
197: {
198: while(*a)
199: {
200: if(*a != DOLLAR)
201: *b++ = *a++;
202: else if(*++a==CNULL || *a==DOLLAR)
203: *b++ = *a++;
204: else
205: {
206: s = vname;
207: if( *a==LPAREN || *a==LCURLY )
208: {
209: closer=(*a==LPAREN ? RPAREN : RCURLY);
210: ++a;
211: while(*a == BLANK)
212: ++a;
213: while( *a!=BLANK &&
214: *a!=closer &&
215: *a!=CNULL)
216: *s++ = *a++;
217: while(*a!=closer && *a!=CNULL)
218: ++a;
219: if(*a == closer)
220: ++a;
221: }
222: else
223: *s++ = *a++;
224:
225: *s = CNULL;
226: if(amatch(&vname[0], "*:*=*"))
227: {
228: b = colontrans(b, vname);
229: }
230: else if(amatch(vname, "[@*<%][DF]"))
231: {
232: b = dftrans(b, vname);
233: }
234: else
235: {
236: b = straightrans(b, vname);
237: }
238: }
239: }
240: }
241:
242: *b = CNULL;
243: --depth;
244: return(b);
245: }
246:
247:
248: /*
249: * Translate the $(name:*=*) type things.
250: */
251:
252: CHARSTAR colontrans(b, vname)
253: register CHARSTAR b;
254: char vname[];
255: {
256: register int i;
257: register CHARSTAR ps1;
258: int fromlen;
259: char from[30], to[70];
260: char dftemp[128];
261: char tmp, nextchr;
262: CHARSTAR psave, pcolon;
263: VARBLOCK vbp;
264:
265: /*
266: * Mark off the name (up to colon), the from expression (up to '='),
267: * and the to expresion (up to CNULL).
268: */
269: i = 0;
270: for(ps1 = &vname[0]; *ps1 != KOLON; ps1++);
271: pcolon = ps1;
272: *pcolon = CNULL;
273: while(*++ps1 != EQUALS)
274: from[i++] = *ps1;
275: from[i] = CNULL;
276: fromlen = i;
277: i = 0;
278: while(*++ps1)
279: to[i++] = *ps1;
280: to[i] = CNULL;
281:
282: /*
283: * Now, tanslate.
284: */
285:
286: if(amatch(vname, "[@*<%][DF]"))
287: {
288: dftrans(dftemp, vname);
289: ps1 = dftemp;
290: }
291: else
292: {
293: if((vbp = srchvar(vname)) == NULL)
294: {
295: return(b);
296: }
297: ps1 = vbp->varval;
298: }
299: if(ps1 != NULL && *ps1 != NULL)
300: {
301: psave = ps1;
302: while((i = sindex(ps1, from)) >= 0)
303: {
304: ps1 = &ps1[i];
305: tmp = *ps1;
306: *ps1 = CNULL;
307: nextchr = *(ps1+fromlen);
308: if( nextchr == TAB ||
309: nextchr == BLANK ||
310: nextchr == CNULL)
311: {
312: b = copstr(b, psave);
313: b = copstr(b, to);
314: *ps1 = tmp;
315: ps1 += fromlen;
316: }
317: else
318: {
319: b = copstr(b, psave);
320: *b++ = tmp;
321: *ps1 = tmp;
322: ps1++;
323: }
324: psave = ps1;
325: }
326: b = copstr(b, ps1);
327: }
328: *pcolon = KOLON;
329: return(b);
330: }
331:
332: /*
333: * Do the $(@D) type translations.
334: */
335:
336: CHARSTAR dftrans(b, vname)
337: register CHARSTAR b;
338: char vname[];
339: {
340: char c, c1;
341: CHARSTAR p1, p2;
342: VARBLOCK vbp;
343:
344: c1 = vname[1];
345: vname[1] = CNULL;
346: vbp = srchvar(vname);
347: if(vbp != 0 && vbp->varval != 0)
348: {
349: for(p1=p2=vbp->varval;*p1;p1++)
350: if(*p1 == SLASH)
351: p2 = p1;
352: if(*p2 == SLASH)
353: {
354: if(c1 == 'D')
355: {
356: if(p2 == vbp->varval)
357: p2++;
358: c = *p2;
359: *p2 = CNULL;
360: b = copstr(b,vbp->varval);
361: *p2 = c;
362: }
363: else
364: {
365: b = copstr(b, p2+1);
366: }
367: }
368: else
369: {
370: if(c1 == 'D')
371: b = copstr(b, ".");
372: else
373: b = copstr(b, p2);
374: }
375: }
376: vname[1] = c1;
377: return(b);
378: }
379:
380:
381: /*
382: * Standard trnaslation, nothing fancy.
383: */
384:
385: CHARSTAR straightrans(b, vname)
386: register CHARSTAR b;
387: char vname[];
388: {
389: register VARBLOCK vbp;
390: register CHAIN pchain;
391: register NAMEBLOCK pn;
392:
393: vbp = srchvar(vname);
394: if( vbp != 0 && vbp->varval != 0)
395: {
396: if(vbp->v_aflg == YES)
397: {
398: pchain = (CHAIN)vbp->varval;
399: for(; pchain; pchain = pchain->nextchain)
400: {
401: pn = (NAMEBLOCK)pchain->datap;
402: if(pn->alias)
403: b=copstr(b, pn->alias);
404: else
405: b=copstr(b,pn->namep);
406: *b++ = BLANK;
407: }
408: }
409: else
410: {
411: b = subst(vbp->varval, b);
412: }
413: vbp->used = YES;
414: }
415: return(b);
416: }
417:
418:
419:
420: /* copy s into t, return the location of the next free character in s */
421: CHARSTAR copstr(s, t)
422: register CHARSTAR s, t;
423: {
424: if(t == 0)
425: return(s);
426: while (*t)
427: *s++ = *t++;
428: *s = CNULL;
429: return(s);
430: }
431:
432: setvar(v,s)
433: register CHARSTAR v, s;
434: {
435: register VARBLOCK p;
436:
437: p = srchvar(v);
438: if(p == 0)
439: {
440: p = varptr(v);
441: }
442: if (p->noreset == NO)
443: {
444: if(IS_ON(EXPORT))
445: p->envflg = YES;
446: p->varval = s;
447: if(IS_ON(INARGS) || IS_ON(ENVOVER))
448: p->noreset = YES;
449: else
450: p->noreset = NO;
451: if(IS_ON(DBUG))printf("setvar: %s = %s noreset = %d envflg = %d Mflags = 0%o\n",
452: v, p->varval, p->noreset, p->envflg, Mflags);
453:
454: if(p->used && !amatch(v, "[@*<?!%]") )
455: if(IS_ON(DBUG))
456: fprintf(stderr, "Warning: %s changed after being used\n",v);
457: }
458: }
459:
460:
461: eqsign(a)
462: register CHARSTAR a;
463: {
464: register CHARSTAR p;
465:
466: for(p = ":;=$\n\t"; *p; p++)
467: if(any(a, *p))
468: {
469: callyacc(a);
470: return(YES);
471: }
472: return(NO);
473: }
474:
475:
476: VARBLOCK varptr(v)
477: register CHARSTAR v;
478: {
479: register VARBLOCK vp;
480:
481: if((vp = srchvar(v)) != 0)
482: return(vp);
483:
484: vp = ALLOC(varblock);
485: vp->nextvar = firstvar;
486: firstvar = vp;
487: vp->varname = copys(v);
488: vp->varval = 0;
489: return(vp);
490: }
491:
492: VARBLOCK srchvar(vname)
493: register CHARSTAR vname;
494: {
495: register VARBLOCK vp;
496:
497: for(vp=firstvar; vp != 0 ; vp = vp->nextvar)
498: if(equal(vname, vp->varname))
499: return(vp);
500: return(NO);
501: }
502:
503:
504: fatal1(s,t)
505: CHARSTAR s, t;
506: {
507: char buf[100];
508: sprintf(buf, s, t);
509: fatal(buf);
510: }
511:
512:
513:
514: fatal(s)
515: CHARSTAR s;
516: {
517: if(s)
518: fprintf(stderr, "Make: %s. Stop.\n", s);
519: else
520: fprintf(stderr, "\nStop.\n");
521: #ifdef unix
522: exit(1);
523: #endif
524: #ifdef gcos
525: exit(0);
526: #endif
527: }
528:
529:
530:
531: yyerror(s)
532: CHARSTAR s;
533: {
534: char buf[50];
535: extern int yylineno;
536:
537: sprintf(buf, "line %d: %s", yylineno, s);
538: fatal(buf);
539: }
540:
541:
542:
543: CHAIN appendq(head,tail)
544: register CHAIN head;
545: register CHARSTAR tail;
546: {
547: register CHAIN p;
548:
549: p = ALLOC(chain);
550: p->datap = tail;
551: while(head->nextchain)
552: head = head->nextchain;
553: head->nextchain = p;
554: }
555:
556:
557:
558:
559:
560: CHARSTAR mkqlist(p)
561: register CHAIN p;
562: {
563: register CHARSTAR qbufp, s;
564: static char qbuf[OUTMAX];
565:
566: qbufp = qbuf;
567:
568: for( ; p ; p = p->nextchain)
569: {
570: s = p->datap;
571: if(qbufp != qbuf)
572: *qbufp++ = BLANK;
573: if(qbufp+strlen(s) > &qbuf[OUTMAX-3])
574: {
575: fprintf(stderr, "$? list too long\n");
576: break;
577: }
578: while (*s)
579: *qbufp++ = *s++;
580: }
581: *qbufp = CNULL;
582: return(qbuf);
583: }
584:
585: any(s,c)
586: register CHARSTAR s;
587: register char c;
588: {
589: register char d;
590:
591: while(d = *s++)
592: {
593: if(d==c)
594: return(1);
595: }
596: return(0);
597: }
598:
599:
600: sindex(s1,s2)
601: CHARSTAR s1;
602: CHARSTAR s2;
603: {
604: register CHARSTAR p1;
605: register CHARSTAR p2;
606: register int flag;
607: int ii;
608:
609: p1 = &s1[0];
610: p2 = &s2[0];
611: flag = -1;
612: for(ii = 0; ; ii++)
613: {
614: while(*p1 == *p2)
615: {
616: if(flag < 0)
617: flag = ii;
618: if(*p1++ == CNULL)
619: return(flag);
620: p2++;
621: }
622: if(*p2 == CNULL)
623: return(flag);
624: if(flag >= 0)
625: {
626: flag = -1;
627: p2 = &s2[0];
628: }
629: if(*s1++ == CNULL)
630: return(flag);
631: p1 = s1;
632: }
633: }
634:
635:
636: #include "sys/types.h"
637: #include "sys/stat.h"
638:
639: /*
640: * findfl(name) (like execvp, but does path search and finds files)
641: */
642: static char fname[128];
643:
644: char *execat();
645:
646: CHARSTAR findfl(name)
647: register CHARSTAR name;
648: {
649: register CHARSTAR p;
650: register VARBLOCK cp;
651:
652: if(name[0] == SLASH)
653: return(name);
654: cp = varptr("VPATH");
655: if(cp->varval == 0)
656: p = ":";
657: else
658: p = cp->varval;
659:
660: do
661: {
662: p = execat(p, name, fname);
663: if(access(fname, 4) == 0)
664: return(fname);
665: } while (p);
666: return((CHARSTAR )-1);
667: }
668:
669: CHARSTAR execat(s1, s2, si)
670: register CHARSTAR s1, s2;
671: CHARSTAR si;
672: {
673: register CHARSTAR s;
674:
675: s = si;
676: while (*s1 && *s1 != KOLON && *s1 != MINUS)
677: *s++ = *s1++;
678: if (si != s)
679: *s++ = SLASH;
680: while (*s2)
681: *s++ = *s2++;
682: *s = CNULL;
683: return(*s1? ++s1: 0);
684: }
685:
686:
687: /*
688: * change xx to s.xx or /x/y/z to /x/y/s.z
689: */
690: CHARSTAR trysccs(str)
691: register CHARSTAR str;
692: {
693: register CHARSTAR sstr;
694: register int i = 2;
695:
696: sstr = str;
697: for(; *str; str++);
698: str[2] = CNULL;
699: str--;
700: for(;str >= sstr; str--)
701: {
702: if(*str == SLASH)
703: if(i == 2)
704: {
705: i = 0;
706: *(str+2) = DOT;
707: *(str+1) = 's';
708: }
709: *(str+i) = *str;
710: }
711: if(i == 2)
712: {
713: *(str+2) = DOT;
714: *(str+1) = 's';
715: }
716: return(sstr);
717: }
718:
719:
720: is_sccs(filename)
721: register CHARSTAR filename;
722: {
723: register CHARSTAR p;
724:
725: for(p = filename; *p; p++)
726: if(*p == 's')
727: if(p == filename && p[1] == DOT)
728: return(YES);
729: else if(p[-1] == SLASH && p[1] == DOT)
730: return(YES);
731: return(NO);
732: }
733:
734: /*
735: * change pfx to /xxx/yy/*zz.* or *zz.*
736: */
737: CHARSTAR addstars(pfx)
738: register CHARSTAR pfx;
739: {
740: register CHARSTAR p1, p2;
741:
742: for(p1 = pfx; *p1; p1++);
743: p2 = p1 + 3; /* 3 characters, '*', '.', and '*'. */
744: p1--;
745:
746: *p2-- = CNULL;
747: *p2-- = STAR;
748: *p2-- = DOT;
749: while(p1 >= pfx)
750: {
751: if(*p1 == SLASH)
752: {
753: *p2 = STAR;
754: return(pfx);
755: }
756: *p2-- = *p1--;
757: }
758: *p2 = STAR;
759: return(p2);
760: }
761:
762:
763: #define NENV 300
764: extern CHARSTAR *environ;
765:
766: /*
767: * This routine is called just before and exec.
768: */
769:
770: setenv()
771: {
772: register CHARSTAR *ea;
773: register int nenv = 0;
774: register CHARSTAR p;
775: CHARSTAR *es;
776: VARBLOCK vp;
777: int length;
778:
779: if(firstvar == 0)
780: return;
781:
782: es=ea=(CHARSTAR *)calloc(NENV, sizeof *ea);
783: if(es == (CHARSTAR *)-1)
784: fatal("Cannot alloc mem for envp.");
785:
786: for(vp=firstvar; vp != 0; vp=vp->nextvar)
787: if(vp->envflg)
788: {
789: if(++nenv >= NENV)
790: fatal("Too many env parameters.");
791: length = strlen(vp->varname) + strlen(vp->varval) + 2;
792: if((*ea = (CHARSTAR )calloc(length, sizeof **ea)) == (CHARSTAR )-1)
793: fatal("Cannot alloc mem for env.");
794: p = copstr(*ea++, vp->varname);
795: p = copstr(p, "=");
796: p = copstr(p, vp->varval);
797: }
798: *ea = 0;
799: if(nenv > 0)
800: environ=es;
801: if(IS_ON(DBUG))
802: printf("nenv = %d\n", nenv);
803: }
804:
805:
806: /*
807: * Called in main
808: * If a string like "CC=" occurs then CC is not put in environment.
809: * This is because there is no good way to remove a variable
810: * from the environment within the shell.
811: */
812:
813: readenv()
814: {
815: register CHARSTAR *ea;
816: register CHARSTAR p;
817:
818: ea=environ;
819: for(;*ea; ea++)
820: {
821: for(p = *ea; *p && *p != EQUALS; p++);
822: if(*p == EQUALS)
823: if(*(p+1))
824: eqsign(*ea);
825: }
826: }
827:
828:
829: sccstrip(pstr)
830: register CHARSTAR pstr;
831: {
832: register CHARSTAR p2;
833: register CHARSTAR sstr;
834:
835: sstr = pstr;
836: for(; *pstr ; pstr++)
837: if(*pstr == RCURLY)
838: {
839: if(isdigit(pstr[1]))
840: if(pstr != sstr)
841: if(pstr[-1] != DOLLAR)
842: {
843: for(p2 = pstr; *p2 && (*p2 != LCURLY); p2++);
844: if(*p2 == CNULL)
845: break;
846: strshift(pstr, -(int)(p2-pstr+1) );
847: }
848: }
849: }
850:
851: /*
852: * Shift a string `pstr' count places. negative is left, pos is right
853: * Negative shifts cause char's at front to be lost.
854: * Positive shifts assume enough space!
855: */
856: CHARSTAR strshift(pstr, count)
857: register CHARSTAR pstr;
858: register int count;
859: {
860: register CHARSTAR sstr;
861:
862: sstr = pstr;
863: if(count < 0)
864: {
865: count = -count;
866: while(pstr[count])
867: *pstr = pstr++[count];
868: *pstr = 0;
869: return(sstr);
870: }
871: for(; *pstr; pstr++);
872: pstr--[count] = 0;
873: while(pstr != sstr)
874: pstr[count] = *pstr--;
875: pstr[count] = *pstr;
876:
877: return(sstr);
878:
879: }
880:
881:
882: /*
883: * execlp(name, arg,...,0) (like execl, but does path search)
884: * execvp(name, argv) (like execv, but does path search)
885: */
886: #include <errno.h>
887:
888: CHARSTAR execat();
889: extern errno;
890:
891: execlp(name, argv)
892: CHARSTAR name, argv;
893: {
894: return(execvp(name, &argv));
895: }
896:
897: execvp(name, argv)
898: CHARSTAR name, *argv;
899: {
900: register etxtbsy = 1;
901: register eacces = 0;
902: register CHARSTAR cp;
903: CHARSTAR pathstr;
904: CHARSTAR shell;
905: char fname[128];
906:
907: pathstr = varptr("PATH")->varval;
908: if(pathstr == 0 || *pathstr == CNULL)
909: pathstr = ":/bin:/usr/bin";
910: shell = varptr("SHELL")->varval;
911: if(shell == 0 || *shell == CNULL)
912: shell = "/bin/sh";
913: cp = strchr(name, SLASH)? "": pathstr;
914:
915: do
916: {
917: cp = execat(cp, name, fname);
918: retry:
919: execv(fname, argv);
920: switch(errno)
921: {
922: case ENOEXEC:
923: *argv = fname;
924: *--argv = "sh";
925: execv(shell, argv);
926: return(-1);
927: case ETXTBSY:
928: if (++etxtbsy > 5)
929: return(-1);
930: sleep(etxtbsy);
931: goto retry;
932: case EACCES:
933: eacces++;
934: break;
935: case ENOMEM:
936: case E2BIG:
937: return(-1);
938: }
939: } while (cp);
940: if (eacces)
941: errno = EACCES;
942: return(-1);
943: }
944:
945: /*
946: * get() does an SCCS get on the file ssfile.
947: * For the get command, get() uses the value of the variable "GET".
948: * If ssfile has a slash in it, get() does a "chdir" to the appropriate
949: * directory if the cdflag is set to CD. This assures
950: * the program finds the ssfile where it belongs when necessary.
951: * If the rlse string variable is set, get() uses it in the
952: * get command sequence.
953: * Thus a possible sequence is:
954: * set -x;
955: * cd ../sys/head;
956: * get -r2.3.4.5 s.stdio.h
957: *
958: */
959:
960: /*
961: * The gothead and gotf structures are used to remember
962: * the names of the files `make' automatically gets so
963: * `make' can remove them upon exit.
964: */
965: GOTHEAD gotfiles;
966:
967: get(ssfile, cdflag, rlse)
968: register CHARSTAR ssfile;
969: int cdflag;
970: CHARSTAR rlse;
971: {
972: register CHARSTAR pr;
973: register CHARSTAR pr1;
974: char gbuf[128];
975: char sfile[128];
976: int retval;
977: GOTF gf;
978:
979: copstr(sfile, ssfile);
980: if(!is_sccs(sfile))
981: trysccs(sfile);
982: if(access(sfile, 4) != 0 && IS_OFF(GET))
983: return(NO);
984:
985: pr = gbuf;
986: if(IS_OFF(SIL))
987: pr = copstr(pr, "set -x;\n");
988:
989: if(cdflag == CD)
990: if(any(sfile, SLASH))
991: {
992: pr = copstr(pr, "cd ");
993: for(pr1 = sfile; *pr1; pr1++);
994: while(*pr1 != SLASH)
995: pr1--;
996: *pr1 = CNULL;
997: pr = copstr(pr, sfile);
998: pr = copstr(pr, ";\n");
999: *pr1 = SLASH;
1000: }
1001:
1002: pr = copstr(pr, varptr("GET")->varval);
1003: pr = copstr(pr, " ");
1004: pr = copstr(pr, varptr("GFLAGS")->varval);
1005: pr = copstr(pr, " ");
1006:
1007: pr1 = rlse;
1008: if(pr1 != NULL && pr1[0] != CNULL)
1009: {
1010: if(pr1[0] != MINUS) /* RELEASE doesn't have '-r' */
1011: pr = copstr(pr, "-r");
1012: pr = copstr(pr, pr1);
1013: pr = copstr(pr, " ");
1014: }
1015:
1016: pr = copstr(pr, sfile);
1017: /*
1018: * exit codes are opposite of error codes so do the following:
1019: */
1020: retval = (system(gbuf) == 0) ? YES : NO ;
1021: if(retval == YES)
1022: {
1023: if(gotfiles == 0)
1024: {
1025: gotfiles = ALLOC(gothead);
1026: gf = (GOTF)gotfiles;
1027: gotfiles->gnextp = 0;
1028: gotfiles->endp = (GOTF)gotfiles;
1029: }
1030: else
1031: {
1032: gf = gotfiles->endp;
1033: gf->gnextp = ALLOC(gotf);
1034: gf = gf->gnextp;
1035: gf->gnextp = 0;
1036: }
1037: gf->gnamep = copys(sfile+2); /* `+2' skips `s.' */
1038: gotfiles->endp = gf;
1039: }
1040: return(retval);
1041: }
1042:
1043: /*
1044: * subroutine to actually remove to gotten files.
1045: */
1046: rm_gots()
1047: {
1048: register GOTF gf;
1049:
1050: if(IS_ON(GF_KEEP))
1051: return;
1052: for(gf = (GOTF)gotfiles; gf ; gf=gf->gnextp)
1053: if(gf->gnamep)
1054: {
1055: if(IS_ON(DBUG))printf("rm_got: %s\n", gf->gnamep);
1056: unlink(gf->gnamep);
1057: }
1058: }
1059: callyacc(str)
1060: register CHARSTAR str;
1061: {
1062: CHARSTAR lines[2];
1063: FILE *finsave;
1064: CHARSTAR *lpsave;
1065:
1066: finsave = fin;
1067: lpsave = linesptr;
1068: fin = 0;
1069: lines[0] = str;
1070: lines[1] = 0;
1071: linesptr = lines;
1072: yyparse();
1073: fin = finsave;
1074: linesptr = lpsave;
1075: }
1076:
1077: /*
1078: * exit routine for removing the files `make' automatically
1079: * got.
1080: */
1081: exit(arg)
1082: {
1083: rm_gots();
1084: if(IS_ON(MEMMAP))
1085: {
1086: prtmem();
1087: }
1088: _cleanup();
1089: _exit(arg);
1090: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.