BSD 2 development
[unix-history] / src / funny.c
/* Copyright (c) 1979 Regents of the University of California */
#include <retrofit.h>
/* funny -
* funny accepts a line from the user and prints it out in
* a mildly amusing manner.
*/
#define WORDLEN 200
char nl[] { 015, 0};
char is3a;
main(ct,av)
int ct;
char **av;
{
int cvec[2],size,order[WORDLEN],i,rubout();
char *word,current[WORDLEN],myline[WORDLEN],*src;
if (ct > 1 && av[1][0] == '-') {
is3a++;
ct--;
av++;
}
time(cvec);
srand(cvec[1]);
if (ct<2)
{
printf("Input a line - ");
size=read(0,myline,WORDLEN)-1;
myline[size]=0;
src=myline;
}
else src=av[1];
signal(2,rubout);
word=src;
size=0;
while (*word++) size++;
if (size>=WORDLEN)
{
printf("%s\nLINE TOO LONG.\n",src);
exit(9);
}
word=src;
for (;;)
{
for (i=0;i<size;++i) current[i]=040;
pick(size,order);
for (i=0;i<size;++i) prch(order[i],word,current);
printf("\n");
}
}
pick(s,a)
int s,*a;
{
int i,j,r,this[WORDLEN];
for (i=0;i<s;++i) this[i]=i;
for (i=s-1;i>=0;--i)
{
r=rnd(i+1);
a[i]=this[r];
this[r]=this[i];
}
}
rnd(i)
int i;
{
int r;
r=rand();
if (r<0) r= -r;
return(r % i);
}
prch(who,from,to)
int who;
char *from,*to;
{
int i;
to[who]=from[who];
if (is3a) {
printf("\033=%c%c%c", ' '+23, ' '+who, to[who]);
return;
}
for (i=0;i<=who;++i) write(1,to+i,1);
/*
for (i=0;i<=who;++i) write(1,"\b",1);
*/
write(1,nl,1);
}
rubout()
{
char *cp,resp[100];
signal(2,1);
printf("\nHad enough?");
read(0,resp,100);
cp=resp;
while (*cp != 012 && *cp != 'y' && *cp !='n') ++cp;
if (*cp == 'n')
{
signal(2,rubout);
return;
}
exit(9);
}