[PDD] Add docs for the Parrot_PMC_push_* and Parrot_PMC_pop_* functions
[parrot.git] / examples / shootout / revcomp.pir
blobe5e81a02914debbc22933f572557a24bc7b1bc7a
1 #!parrot
2 # Copyright (C) 2005-2009, Parrot Foundation.
3 # $Id$
4 # Reads from stdin a file in the format made by fasta.pir
5 # ./parrot -R jit
6 # N = 2500000 for fasta
8 # 2.2 s on AMD@2000/512K cache
10 # Original by Joshua Isom, heavily hacked by Leopold Toetsch
12 # create tr table at compile-time
13 # tr{wsatugcyrkmbdhvnATUGCYRKMBDHVN}
14 #            {WSTAACGRYMKVHDBNTAACGRYMKVHDBN};
16 .sub tr_00_init :immediate
17     .local pmc tr_array
18     tr_array = new 'FixedIntegerArray'  # Todo char array
19     tr_array = 256                      # Python compat ;)
20     .local string from, to
21     from = 'wsatugcyrkmbdhvnATUGCYRKMBDHVN'
22     to   = 'WSTAACGRYMKVHDBNTAACGRYMKVHDBN'
23     .local int i, ch, r, len
24     len = length from
25     null i
26 loop:
27     ch = ord from, i
28     r  = ord to,   i
29     tr_array[ch] = r
30     inc i
31     if i < len goto loop
32     .return(tr_array)
33 .end
35 .sub main :main
36         .local pmc stdin, stdout
37         .local string line, seq
38         stdin = getstdin
39         stdout = getstdout
40         # stdout is linebuffered per default - make it block buffered
41         stdout.'buffer_size'(8192)
43         seq = ''
45 beginwhile:
46         line = readline stdin
47         unless line goto endwhile
48         $I0 = ord line
49         unless $I0 == 62 goto else   # '>'
50                 if seq == '' goto no_rev
51                 print_revcomp(seq)
52                 seq = ''
53         no_rev:
54                 print line
55                 goto endif
56         else:
57                 chopn line, 1
58                 seq .= line
59         endif:
60         goto beginwhile
61 endwhile:
62         if seq == '' goto done
63         print_revcomp(seq)
64 done:
65 .end
67 .sub print_revcomp
68         .param string line
69         .local int i, linelen, ch
70         linelen = length line
72         $P0 = new 'String'
73         $P0.'reverse'(line)
75         .const 'Sub' tr_00 = 'tr_00_init'
76         $P0.'trans'(line, tr_00)
78         i = 0
79         $S0 = 'x'
80 print_loop:
81         $S0 = substr line, i, 60
82         print $S0
83         print "\n"
84         i += 60
85         if i >= linelen goto done
86         goto print_loop
87 done:
88         $S0 = ''
89 .end
92 # Local Variables:
93 #   mode: pir
94 #   fill-column: 100
95 # End:
96 # vim: expandtab shiftwidth=4 ft=pir: