cppp (c pre-pre-processor) fix 8-char symbol limit.

loci!clb loci at killer.UUCP
Thu Mar 3 17:03:58 AEST 1988



	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 0



More information about the Unix-pc.sources mailing list