-
Notifications
You must be signed in to change notification settings - Fork 1
/
funny.c
executable file
·108 lines (99 loc) · 1.56 KB
/
funny.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/* 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);
}