static char sccsid
[] = "@(#)expand.c 4.5 %G%";
* Bell Telephone Laboratories
/* globals (file name generation)
* "*" in params matches r.e ".*"
* "?" in params matches r.e. "."
* "[...]" in params matches character class
* "[...a-z...]" in params matches a through z.
IF trapnote
&SIGSET THEN
return(0); FI
/* check for meta chars */
THEN IF rflg ANDF slash THEN
break; ELSE
return(0) FI
ANDF (statb
.st_mode
&S_IFMT
)==S_IFDIR
ANDF (dirf
=opendir(s
)) != NULL
IF
*cs
==0 THEN
*cs
++=0200 FI
THEN
/* check for rescan */
REP IF
*rs
=='/' THEN rescan
=rs
; *rs
=0; gchain
=0 FI
IF
setjmp(INTbuf
) == 0 THEN trapjmp
[INTR
] = 1; FI
WHILE (trapnote
&SIGSET
) == 0 ANDF (dp
= readdir(dirf
)) != NULL
DO
IF (*dp
->d_name
=='.' ANDF
*cs
!='.')
IF
gmatch(dp
->d_name
, cs
)
THEN
addg(s
,dp
->d_name
,rescan
); count
++;
closedir(dirf
); trapjmp
[INTR
] = 0;
rchain
=gchain
; gchain
=schain
;
DO count
+= expand(rchain
->argval
,1);
DO
*s
++=(c
&STRIP
?c
:'/') OD
THEN
IF (scc
&= STRIP
)==0
THEN
return(ok
?gmatch(s
,p
):0);
THEN IF lc
<=scc ANDF scc
<=(*p
++) THEN ok
++ FI
ELSE IF scc
==(lc
=(c
&STRIP
)) THEN ok
++ FI
IF (c
&STRIP
)!=scc THEN
return(0) FI
return(scc
?gmatch(s
,p
):0);
IF
*p
==0 THEN
return(1) FI
DO IF
gmatch(s
++,p
) THEN
return(1) FI OD
LOCAL VOID
addg(as1
,as2
,as3
)
s2
= locstak()+BYTESPERWORD
;
WHILE
*s2
= *s1
++ DO s2
++ OD