1#/usr/local/bin/perl
2
3sub lab_shift
4	{
5	local(*a,$n)=@_;
6	local(@r,$i,$j,$k,$d,@z);
7
8	@r=&shift(*a,$n);
9	foreach $i (0 .. 31)
10		{
11		@z=split(/\^/,$r[$i]);
12		for ($j=0; $j <= $#z; $j++)
13			{
14			($d)=($z[$j] =~ /^(..)/);
15			($k)=($z[$j] =~ /\[(.*)\]$/);
16			$k.=",$n" if ($k ne "");
17			$k="$n"	  if ($k eq "");
18			$d="$d[$k]";
19			$z[$j]=$d;
20			}
21		$r[$i]=join('^',@z);
22		}
23	return(@r);
24	}
25
26sub shift
27	{
28	local(*a,$n)=@_;
29	local(@f);
30
31	if ($n > 0)
32		{
33		@f=&shiftl(*a,$n);
34		}
35	else
36		{
37		@f=&shiftr(*a,-$n);
38		}
39	return(@f);
40	}
41
42sub rotate
43	{
44	local(*a,$n)=@_;
45	local(@f);
46
47	if ($n > 0)
48		{ @f=&rotatel(*a,$n); }
49	else
50		{ @f=&rotater(*a,-$n); }
51	return(@f);
52	}
53
54sub rotater
55	{
56	local(*a,$n)=@_;
57	local(@f,@g);
58
59	@f=&shiftr(*a,$n);
60	@g=&shiftl(*a,32-$n);
61	$#f=31;
62	$#g=31;
63	return(&or(*f,*g));
64	}
65
66sub rotatel
67	{
68	local(*a,$n)=@_;
69	local(@f,@g);
70
71	@f=&shiftl(*a,$n);
72	@g=&shiftr(*a,32-$n);
73	$#f=31;
74	$#g=31;
75	return(&or(*f,*g));
76	}
77
78sub shiftr
79	{
80	local(*a,$n)=@_;
81	local(@r,$i);
82
83	$#r=31;
84	foreach $i (0 .. 31)
85		{
86		if (($i+$n) > 31)
87			{
88			$r[$i]="--";
89			}
90		else
91			{
92			$r[$i]=$a[$i+$n];
93			}
94		}
95	return(@r);
96	}
97
98sub shiftl
99	{
100	local(*a,$n)=@_;
101	local(@r,$i);
102
103	$#r=31;
104	foreach $i (0 .. 31)
105		{
106		if ($i < $n)
107			{
108			$r[$i]="--";
109			}
110		else
111			{
112			$r[$i]=$a[$i-$n];
113			}
114		}
115	return(@r);
116	}
117
118sub printit
119	{
120	local(@a)=@_;
121	local($i);
122
123	foreach $i (0 .. 31)
124		{
125		printf "%2s  ",$a[$i];
126		print "\n" if (($i%8) == 7);
127		}
128	print "\n";
129	}
130
131sub xor
132	{
133	local(*a,*b)=@_;
134	local(@r,$i);
135
136	$#r=31;
137	foreach $i (0 .. 31)
138		{
139		$r[$i]=&compress($a[$i].'^'.$b[$i]);
140#		$r[$i]=$a[$i]."^".$b[$i];
141		}
142	return(@r);
143	}
144
145sub and
146	{
147	local(*a,$m)=@_;
148	local(@r,$i);
149
150	$#r=31;
151	foreach $i (0 .. 31)
152		{
153		$r[$i]=(($m & (1<<$i))?($a[$i]):('--'));
154		}
155	return(@r);
156	}
157
158sub or
159	{
160	local(*a,*b)=@_;
161	local(@r,$i);
162
163	$#r=31;
164	foreach $i (0 .. 31)
165		{
166		$r[$i]='--'   if (($a[$i] eq '--') && ($b[$i] eq '--'));
167		$r[$i]=$a[$i] if (($a[$i] ne '--') && ($b[$i] eq '--'));
168		$r[$i]=$b[$i] if (($a[$i] eq '--') && ($b[$i] ne '--'));
169		$r[$i]='++'   if (($a[$i] ne '--') && ($b[$i] ne '--'));
170		}
171	return(@r);
172	}
173
174sub compress
175	{
176	local($s)=@_;
177	local($_,$i,@a,%a,$r);
178
179	$s =~ s/\^\^/\^/g;
180	$s =~ s/^\^//;
181	$s =~ s/\^$//;
182	@a=split(/\^/,$s);
183
184	while ($#a >= 0)
185		{
186		$_=shift(@a);
187		next unless /\d/;
188		$a{$_}++;
189		}
190	foreach $i (sort keys %a)
191		{
192		next if ($a{$i}%2 == 0);
193		$r.="$i^";
194		}
195	chop($r);
196	return($r);
197	}
1981;
199