mjranum@gouldsd.UUCP (03/26/87)
This is a quick hack that may come in handy. It takes a .c file
and tries to chop it up into discrete subroutines. (Note the "TRIES")
If you use it, I suggest using it in a subdirectory of its own, and
on one file at a time. It functions by getting subroutine names, prepending
and "_" and then appending what it thinks is the subroutine. Misc stuff
(that it can't recognize) goes into _header.h
Hope it comes in handy...
--mjr()
--------------------------cut anywhere you like ------------
:
#FROBOZZOROBOZZO
#the following files are in this bundle: (Use them wisely)
# Makefile shred.l
# To unbundle - sh this file
echo unbundling: Makefile shred.l
echo unbundling Makefile
if [ -f Makefile ] ; then
echo cannot unbundle Makefile - file exists already
exit 1
fi
cat >Makefile <<'End of Makefile'
DEST = .
LINKER = cc
CFLGS = -O -s -n
PROGRAM = shred
SRCS = lex.yy.c
$(PROGRAM): $(SRCS)
$(LINKER) $(CFLGS) -o $(PROGRAM) $(SRCS)
@echo "done"
lex.yy.c: shred.l
lex shred.l
install: $(PROGRAM)
cp $(PROGRAM) $(DEST)
chmod 555 $(DEST)
End of Makefile
echo done unbundling Makefile
echo unbundling shred.l
if [ -f shred.l ] ; then
echo cannot unbundle shred.l - file exists already
exit 1
fi
cat >shred.l <<'End of shred.l'
shred.l:
%e 2000
%p 5000
%n 1000
%k 500
%a 4000
%o 2000
%{
/* Copyright, 1987, Marcus J Ranum */
/* All rights reserved. This code can be distributed, modified, */
/* or altered at will, but it or versions of it may not be sold */
/* for profit */
/* krufty hack to rip large source modules into subroutine modules */
/* this program is only semi-intelligent and should be treated as such */
#include <sys/types.h>
#include <sys/stat.h>
int trigger =0;
int bracelev =0;
int incomment =0;
int ininclude =0;
int junkint =0;
struct stat stbuf;
char jfname[400];
char *strcat();
%}
%%
[a-zA-Z1-9 ]+"("[a-zA-Z1-9, ]*")" {
/* found a function decl ! */
if(!bracelev && !incomment &&!ininclude) {
(void)sprintf(jfname,"_%s",yytext);
for(junkint = 0 ; junkint <strlen(jfname); junkint++) {
if(jfname[junkint] == ' ' || jfname[junkint] == '(')
jfname[junkint]='\0';
}
(void)strcat(jfname,".c");
fprintf(stderr,"writing %s\n",jfname);
(void)fclose(yyout);
if((yyout = fopen(jfname,"a")) ==NULL) {
perror("shred");
exit(9);
}
fprintf(yyout,"%s",yytext);
} else {
fprintf(yyout,"%s",yytext);
}
}
"{" {
if(!incomment)
++bracelev;
fprintf(yyout,"%s",yytext);
}
"}" {
if(!incomment)
--bracelev;
fprintf(yyout,"%s",yytext);
if(bracelev <0) {
fprintf(yyout,"too many \"}\" ! unmatched \"{\"\n");
exit(0);
}
/* if we're not in braces, anything goes to _header.h */
if(!bracelev) {
fprintf(yyout,"\n");
(void)fclose(yyout);
if((yyout = fopen("_header.h","a")) ==NULL) {
perror("shred");
exit(9);
}
}
}
\*\/ {
/*
foobar
*/
incomment--;
fprintf(yyout,"%s",yytext);
}
\/\* {
incomment++;
fprintf(yyout,"%s",yytext);
}
^[]*"#" {
ininclude++;
/* flush includes */
fprintf(yyout,"%s",yytext);
}
\n {
ininclude =0;
fprintf(yyout,"%s",yytext);
}
. fprintf(yyout,"%s",yytext);
%%
/* beginning of MAIN */
main(argc,argv)
int argc;
char *argv[];
{
int index =0;
if(!stat("_header.h",&stbuf)) {
printf("%d braces\n",bracelev);
fprintf(stderr,"will not overwrite existing %s\n","_header.h");
exit(1);
} else {
if((yyout = fopen("_header.h","w")) ==NULL) {
perror("shred");
exit(9);
}
}
for(index = 1; index <argc; index++) {
if((yyin = fopen(argv[index],"r")) ==NULL) {
perror("shred");
exit(1);
} else {
yylex();
}
}
}
yywrap()
{
/*yywrap returns a 1. It can be used to detect end of
file, and whether to provide more input to
yyinput. I get rid of it like this.
If you have some desire to frob the input,
here is one place to do it. -mjr */
return(1);
}
End of shred.l
echo done unbundling shred.l
# end of the bundle !!
--
"It is better to shred the bugger than to bugger the shredder."
-ancient doltic proverb.