V10/cmd/xref/xrefa.l
%k 100
%a 1000
%o 1000
%n 300
%e 500
%p 3000
%{
char *filename="-";
int pflag=0;
int lflag=0;
int level=0;
main(argc,argv)
int argc;
char *argv[];
{
register int rc=0;
if(argc<=1) {
yylex();
}else{
while(argc>1) {
if(strcmp(argv[1],"-p")==0) {
pflag++;
}else if(strcmp(argv[1],"-l")==0) {
lflag++;
}else if(freopen(argv[1],"r",stdin)==NULL) {
fprintf(stderr,"xref: %s: cannot open\n", argv[1]);
rc++;
}else{
filename=argv[1];
yylineno=1;
yylex();
}
argc--; argv++;
}
}
return(rc);
}
fndef()
{
/* fn defs */
register char *p = &yytext[yyleng];
*--p=0; /* remove ) */
while(*--p!='(');
while(*p==' ' || *p=='\t') {
p--;
if(p<yytext) break;
}
while(*p!=' ' && *p!='\t') {
p--;
if(p<yytext) break;
}
p++;
printf("%s", p);
if(p!=yytext) {
*--p=0;
printf("/%s", yytext);
}
printf(":%s:+%d\n", filename, yylineno-1);
}
%}
%%
"/*" {
/* comments */
char c;
while(c=yyinput())
if(c=='*' && yyinput()=='/')
break;
}
"\"" {
/* strings */
char c;
while(c=yyinput())
if(c=='"')
break;
else if(c=='\\') yyinput();
}
"{" {
/* brace */
if(lflag) level++;
}
"}" {
if(lflag) level--;
}
^[a-zA-Z_][a-zA-Z0-9 \t_]*"("[a-zA-Z0-9, ]*")"\n {
fndef();
}
if[ \t]*"(" ;
return[ \t]*"(" ;
while[ \t]*"(" ;
for[ \t]*"(" ;
switch[ \t]*"(" ;
break ;
extern ;
short ;
ifdef ;
endif ;
long ;
return ;
register ;
include ;
define ;
continue ;
int ;
char ;
float ;
static ;
auto ;
unsigned ;
double ;
else ;
do ;
default ;
struct ;
union ;
[a-zA-Z_][a-zA-Z0-9_]*[ \t]*"(" {
/* fn calls */
if(level==0)
printf("%s):%s:%d\n", yytext, filename, yylineno);
}
[a-zA-Z_][a-zA-Z0-9_]* {
/* id references */
if(pflag==0 && level==0)
printf("%s:%s:%d\n", yytext, filename, yylineno);
}
. ;
\n ;