[docs] Fix typo in ch04 of the PIR book
[parrot.git] / examples / pir / uniq.pir
blob97c232c705b0989cf176fb8b6ea8f2c46708b525
1 # Copyright (C) 2001-2008, Parrot Foundation.
2 # $Id$
4 =head1 NAME
6 examples/pir/uniq.pir - Remove duplicate lines from a sorted file
8 =head1 SYNOPSIS
10     % ./parrot examples/pir/uniq.pir -o uniq.pbc
12 =head1 DESCRIPTION
14 Parrot implementation of C<uniq>. Removes duplicate lines from a sorted
15 file. You'll have to create a suitable file to "de-dup".
17 =head2 Command-line Options
19 =over 4
21 =item C<-c>
23 Precede each output line with the count of the number of times the
24    line occurred in the input, followed by a single space
26 =item C<-d>
28 Don't output lines that are not repeated in the input
30 =item C<-u>
32 Don't output lines that are repeated in the input
34 =back
36 =head1 HISTORY
38 By Leon Brocard <acme@astray.com>.
40 Converted to PIR by Bernhard Schmalhofer.
42 =cut
44 .sub "uniq" :main
45   .param pmc argv
47   .local string program
48   program = shift argv
50   .local int num_args
51   num_args = argv
52   if num_args > 0 goto SOURCE
53   print "usage: parrot "
54   print program
55   print " [-c] [-d] [-u] filename\n"
56   goto END
58 SOURCE:
59   # set up flag registers
60   $I10 = 0
61   $I11 = 0
62   $I12 = 0
63   # do some simple option parsing
64   .local string option
65   option = shift argv
67   ne option, "-c", NOTC
68   $I10 = 1 # count mode
69   option = shift argv
71 NOTC:
72   ne option, "-d", NOTD
73   $I11 = 1 # duplicate mode
74   option = shift argv
76 NOTD:
77   ne option, "-u", GO
78   $I12 = 1 # unique mode
79   option = shift argv
81 GO:
82   .local string file_name
83   file_name = option
85   $I1 = 1 # count
86   .local pmc in_fh
87   in_fh = open file_name, 'r'
88   unless in_fh, ERR
89   .local string prev_line, curr_line
90   prev_line = readline in_fh
92 SOURCE_LOOP:
93   unless in_fh, END
94   curr_line = readline in_fh
96   if curr_line == prev_line goto MATCH
98   # different line
100   unless $I10, NOTC2
101   # count mode
102   # we go to some lengths to make the count pretty
103   set $S3, $I1
104   length $I2, $S3
105   sub $I2, 7, $I2
106   set $S3, " "
107   repeat $S3, $S3, $I2
108   print $S3
109   print $I1
110   print " "
111   print prev_line
112   branch RESET
114 NOTC2:
115   unless $I11, NOTD2
117   # show duplicates mode
118   eq 1, $I1, RESET
119   print prev_line
120   branch RESET
122 ERR:
123   print "Couldn't read "
124   print $S0
125   exit 1
127 NOTD2:
128   unless $I12, NOTU2
130   # don't show lines that are duplicated mode
131   ne 1, $I1, RESET
132   print prev_line
133   branch RESET
135 NOTU2:
137   # default mode
138   print prev_line
139   branch RESET
141 RESET:
142   set $I1, 1
143   branch LOOP
145 MATCH:
146   inc $I1
147   # fall through
149 LOOP:
150   set prev_line, curr_line
151   if curr_line, SOURCE_LOOP
152   close in_fh
154 END:
155 .end
158 # Local Variables:
159 #   mode: pir
160 #   fill-column: 100
161 # End:
162 # vim: expandtab shiftwidth=4 ft=pir: