clb) (03/03/88)
Here is a simple program to remedy the 8-character name problem
on the earlier c compilers. Cppp scans the files named as args
and prepares ed(1) or sed(1) scripts to fix long-name conflicts.
Typical usage might be as follows ...
cppp *.[hcly] ;# list conflicts for inspection
cppp -e *.[hcly] > script.ed ;# make "ed" script
for i in *.[hcly] ;# loop through all files, substitute
do ;# shorter names
ed $i < script.ed
done
This program is new and may contain bugs. If you find any, or
make interesting changes, let me know at killer!loci!clb
CLBrunow
#___________________________________________
# CUT EVERYTHING ABOVE THIS LINE
# Shell archive created: Thu Mar 3 04:45:37 TBD 1988
# by Loci Products, 32 56 N, 96 41 W
# mail to: ihnp4!killer!loci!clb (administrator)
# To unpack the enclosed files, use this file as input
# to the Bourne shell (/bin/sh)
# This can be most easily done by the command;
# sh < thisfilename
# This archive contains;
# ---------- file list----------
echo Files: cppp.1 cppp.l cppp.mk
filename=cppp.1
if [ -f $filename ]
then
echo "$filename" exists. Skipping.
filename=/dev/null
else
echo extracting file $filename
fi
cat << END_OF_FILE > $filename
.TH cppp 1
.UC 1
.SH NAME
.B cppp
\- A c-program compactifier
.SH SYNOPSIS
.B cppp
.B \[-flag]
[
.B file ...
]
.br
.SH DESCRIPTION
.PP
.B Cppp
scans the named files (stdin default) and collects a list of long words
(more than 8 characters), test for conflicts and prints the list on stdout. The optional
.B flag
specifies the output format, choices are:
.B \-l
list,
.B \-s
command script suitable for sed(1),
.B \-e
command script suitable for ed(1).
.B \-v
verbosely list words, skip test for conflicts.
.PP
Words listed are specified as beginning with an alphabetic (a-zA-Z)
or underscore ('_') character, followed
by enough alphabetic, numeric (0-9), or '_' characters to exceed the maximum
allowable length of eight characters. C-program comments and strings
protected by double quotes ("string") are exempted from the list.
.PP
If either the -e or -s flags are specified, the output format will be
a command script suitable for the indicated editor. When the editor is
invoked with this file as command input, the long words are replaced by
a short, sequentially generated word and the original long word inside
comment delimiters. In this way, the readability of the file is not
jeopardized. For example ...
.PP
#define SUPER_LONG_WORD 22
.br
becomes something like ...
.br
#define xxx143/*SUPER_LONG_WORD*/ 22
.SH FILES
cppp.l The 'lex' source script.
.SH AUTHOR
CLBrunow, Loci Products, Richardson, Tx.
.SH BUGS
.PP
Mail complaints to killer!loci!clb .
END_OF_FILE
if [ "$filename" != "/dev/null" ]
then
size=`wc -c < $filename`
if [ $size != 1464 ]
then
echo $filename should be 1464 bytes, is $size
fi
chmod 644 $filename
fi
filename=cppp.l
if [ -f $filename ]
then
echo "$filename" exists. Skipping.
filename=/dev/null
else
echo extracting file $filename
fi
cat << END_OF_FILE > $filename
%{
#include <stdio.h>
#define MAXLENGTH 8
#define USE_ED 1
#define USE_SED 2
#define USE_VERB 4
extern char *calloc();
struct tnode{
char *word;
short count, number;
struct tnode *left, *right;
} *root;
int use, /* ed or sed marker */
dun, /* flg indicates string printed */
nextid = 1; /* used for consecutive numbering */
struct tnode *pot; /* pointer to old tnode */
extern struct tnode *tree(), *talloc();
/* Lex source script */
%}
F [a-zA-Z_]
P [a-zA-Z0-9_]
%%
\/\*[^/]* { /* ignore comments */
if(yytext[yyleng-1] != '*')
yymore();
else
input();
}
\"[^"]* { /* exempt text enclosed in "s */
if(yytext[yyleng-1] == '\\')
yymore();
else
input();
}
{F}{P}+ if(yyleng > MAXLENGTH) root = tree(root, yytext);
"\n" ;
. ; /* ignore everything (\n excepted) */
%%
main(argc, argv)
char *argv[];
{
int i;
char flgs[8];
FILE *ifp;
root = NULL;
use = 0; /* define default editor format */
if(argc == 1)
yylex();
else {
i = 1; /* number of first filename */
if(*argv[1] == '-')
{
strncpy(flgs, argv[1], 7);
switch(flgs[1])
{
case 'e': use = USE_ED; break;
case 's': use = USE_SED; break;
case 'v': use = USE_VERB; break;
case 'l': use = 0; break;
default:
printf("%s: unknown flag %s\n",
argv[0], argv[1]);
printf("usage: %s -[elsv] file ...\n",
argv[0]);
exit(1);
}
i = 2;
}
if(i == argc)
yylex();
else
{
fclose(stdin);
while(i < argc)
{
ifp = fopen(argv[i], "r");
if(ifp == NULL)
{
fprintf(stderr, "%s: can't open %s\n",
argv[0], argv[i]);
continue;
}
yylex();
fclose(ifp);
i++;
}
}
}
treeprint(root);
if(use == USE_ED)
printf("w\nq\n");
exit(0);
}
struct tnode *tree(p, w)
struct tnode *p; char *w;
{
extern struct tnode *talloc();
extern char *strsave();
int cond;
if(p == NULL) {
p = talloc();
p->word = strsave(w);
p->number= nextid++;
p->left = p->right = NULL;
} else if((cond= strcmp(w, p->word)) < 0)
p->left = tree(p->left, w);
else if(cond > 0)
p->right = tree(p->right, w);
else p->count++;
return(p);
}
treeprint(p)
struct tnode *p;
{
if(p != NULL) {
treeprint(p->right);
if(use == USE_VERB)
printf("%d\t%s\n", ++p->count, p->word);
else if(p->count)
cmp_strs(p);
treeprint(p->left);
}
}
cmp_strs(p)
struct tnode *p;
{
if(p && pot) {
if(strncmp(pot->word, p->word, MAXLENGTH) == 0) {
if( !dun)
use_fmt(pot);
use_fmt(p);
dun++;
} else dun = 0;
}
pot = p;
}
use_fmt(p)
struct tnode *p;
{
if(use == USE_ED)
printf("g,%s,s,,xxx%d/*&*/,g\n",
p->word, p->number);
else if(use == USE_SED)
printf("s,%s,xxx%d/*&*/,g\n",
p->word, p->number);
else printf("%d\t%s\n", ++p->count, p->word);
}
struct tnode *talloc() {
char *alloc;
return((struct tnode *) calloc(sizeof(struct tnode), 1));
}
char *strsave(s) char *s; {
char *p;
p= calloc(strlen(s) + 1, 1);
strcpy(p, s);
return(p);
}
yywrap(){}
END_OF_FILE
if [ "$filename" != "/dev/null" ]
then
size=`wc -c < $filename`
if [ $size != 3263 ]
then
echo $filename should be 3263 bytes, is $size
fi
chmod 644 $filename
fi
filename=cppp.mk
if [ -f $filename ]
then
echo "$filename" exists. Skipping.
filename=/dev/null
else
echo extracting file $filename
fi
cat << END_OF_FILE > $filename
cppp : cppp.l
lex cppp.l
cc -g lex.yy.c -o cppp
rm lex.yy.c
END_OF_FILE
if [ "$filename" != "/dev/null" ]
then
size=`wc -c < $filename`
if [ $size != 64 ]
then
echo $filename should be 64 bytes, is $size
fi
chmod 644 $filename
fi
echo done
exit 0clb) (03/08/88)
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of shell archive."
# Contents: cppp.1 cppp.l cppp.mk
# Wrapped by loci@killer on Mon Mar 7 16:07:33 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f cppp.1 -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"cppp.1\"
else
echo shar: Extracting \"cppp.1\" \(1464 characters\)
sed "s/^X//" >cppp.1 <<'END_OF_cppp.1'
X.TH cppp 1
X.UC 1
X.SH NAME
X.B cppp
X\- A c-program compactifier
X.SH SYNOPSIS
X.B cppp
X.B \[-flag]
X[
X.B file ...
X]
X.br
X.SH DESCRIPTION
X.PP
X.B Cppp
Xscans the named files (stdin default) and collects a list of long words
X(more than 8 characters), test for conflicts and prints the list on stdout. The optional
X.B flag
Xspecifies the output format, choices are:
X.B \-l
Xlist,
X.B \-s
Xcommand script suitable for sed(1),
X.B \-e
Xcommand script suitable for ed(1).
X.B \-v
Xverbosely list words, skip test for conflicts.
X.PP
XWords listed are specified as beginning with an alphabetic (a-zA-Z)
Xor underscore ('_') character, followed
Xby enough alphabetic, numeric (0-9), or '_' characters to exceed the maximum
Xallowable length of eight characters. C-program comments and strings
Xprotected by double quotes ("string") are exempted from the list.
X.PP
XIf either the -e or -s flags are specified, the output format will be
Xa command script suitable for the indicated editor. When the editor is
Xinvoked with this file as command input, the long words are replaced by
Xa short, sequentially generated word and the original long word inside
Xcomment delimiters. In this way, the readability of the file is not
Xjeopardized. For example ...
X.PP
X#define SUPER_LONG_WORD 22
X.br
X becomes something like ...
X.br
X#define xxx143/*SUPER_LONG_WORD*/ 22
X.SH FILES
Xcppp.l The 'lex' source script.
X.SH AUTHOR
XCLBrunow, Loci Products, Richardson, Tx.
X.SH BUGS
X.PP
XMail complaints to killer!loci!clb .
END_OF_cppp.1
if test 1464 -ne `wc -c <cppp.1`; then
echo shar: \"cppp.1\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f cppp.l -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"cppp.l\"
else
echo shar: Extracting \"cppp.l\" \(3263 characters\)
sed "s/^X//" >cppp.l <<'END_OF_cppp.l'
X%{
X#include <stdio.h>
X
X#define MAXLENGTH 8
X#define USE_ED 1
X#define USE_SED 2
X#define USE_VERB 4
X
Xextern char *calloc();
X
Xstruct tnode{
X char *word;
X short count, number;
X struct tnode *left, *right;
X} *root;
X
Xint use, /* ed or sed marker */
X dun, /* flg indicates string printed */
X nextid = 1; /* used for consecutive numbering */
X
Xstruct tnode *pot; /* pointer to old tnode */
X
Xextern struct tnode *tree(), *talloc();
X
X/* Lex source script */
X%}
XF [a-zA-Z_]
XP [a-zA-Z0-9_]
X%%
X\/\*[^/]* { /* ignore comments */
X if(yytext[yyleng-1] != '*')
X yymore();
X else
X input();
X }
X\"[^"]* { /* exempt text enclosed in "s */
X if(yytext[yyleng-1] == '\\')
X yymore();
X else
X input();
X }
X{F}{P}+ if(yyleng > MAXLENGTH) root = tree(root, yytext);
X"\n" ;
X. ; /* ignore everything (\n excepted) */
X%%
X
Xmain(argc, argv)
Xchar *argv[];
X{
X int i;
X char flgs[8];
X FILE *ifp;
X
X root = NULL;
X use = 0; /* define default editor format */
X
X if(argc == 1)
X yylex();
X else {
X i = 1; /* number of first filename */
X if(*argv[1] == '-')
X {
X strncpy(flgs, argv[1], 7);
X switch(flgs[1])
X {
X case 'e': use = USE_ED; break;
X case 's': use = USE_SED; break;
X case 'v': use = USE_VERB; break;
X case 'l': use = 0; break;
X default:
X printf("%s: unknown flag %s\n",
X argv[0], argv[1]);
X printf("usage: %s -[elsv] file ...\n",
X argv[0]);
X exit(1);
X }
X i = 2;
X }
X if(i == argc)
X yylex();
X else
X {
X fclose(stdin);
X while(i < argc)
X {
X ifp = fopen(argv[i], "r");
X if(ifp == NULL)
X {
X fprintf(stderr, "%s: can't open %s\n",
X argv[0], argv[i]);
X continue;
X }
X yylex();
X fclose(ifp);
X i++;
X }
X }
X }
X treeprint(root);
X if(use == USE_ED)
X printf("w\nq\n");
X exit(0);
X}
X
Xstruct tnode *tree(p, w)
Xstruct tnode *p; char *w;
X{
X extern struct tnode *talloc();
X extern char *strsave();
X int cond;
X
X if(p == NULL) {
X p = talloc();
X p->word = strsave(w);
X p->number= nextid++;
X p->left = p->right = NULL;
X } else if((cond= strcmp(w, p->word)) < 0)
X p->left = tree(p->left, w);
X else if(cond > 0)
X p->right = tree(p->right, w);
X else p->count++;
X return(p);
X}
X
Xtreeprint(p)
Xstruct tnode *p;
X{
X if(p != NULL) {
X treeprint(p->right);
X if(use == USE_VERB)
X printf("%d\t%s\n", ++p->count, p->word);
X else if(p->count)
X cmp_strs(p);
X treeprint(p->left);
X }
X}
X
Xcmp_strs(p)
Xstruct tnode *p;
X{
X if(p && pot) {
X if(strncmp(pot->word, p->word, MAXLENGTH) == 0) {
X if( !dun)
X use_fmt(pot);
X use_fmt(p);
X dun++;
X } else dun = 0;
X }
X pot = p;
X}
X
Xuse_fmt(p)
Xstruct tnode *p;
X{
X if(use == USE_ED)
X printf("g,%s,s,,xxx%d/*&*/,g\n",
X p->word, p->number);
X else if(use == USE_SED)
X printf("s,%s,xxx%d/*&*/,g\n",
X p->word, p->number);
X else printf("%d\t%s\n", ++p->count, p->word);
X}
X
Xstruct tnode *talloc() {
X char *alloc;
X
X return((struct tnode *) calloc(sizeof(struct tnode), 1));
X}
X
Xchar *strsave(s) char *s; {
X char *p;
X
X p= calloc(strlen(s) + 1, 1);
X strcpy(p, s);
X return(p);
X}
X
Xyywrap(){}
END_OF_cppp.l
if test 3263 -ne `wc -c <cppp.l`; then
echo shar: \"cppp.l\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f cppp.mk -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"cppp.mk\"
else
echo shar: Extracting \"cppp.mk\" \(64 characters\)
sed "s/^X//" >cppp.mk <<'END_OF_cppp.mk'
Xcppp : cppp.l
X lex cppp.l
X cc -g lex.yy.c -o cppp
X rm lex.yy.c
X
END_OF_cppp.mk
if test 64 -ne `wc -c <cppp.mk`; then
echo shar: \"cppp.mk\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of shell archive.
exit 0