Hex Artifact Content

Artifact 8212c2eba281baffd2bb335d12ab7558b86cfb63:


0000: 70 61 63 6b 61 67 65 20 6d 61 69 6e 0a 0a 69 6d  package main..im
0010: 70 6f 72 74 20 28 0a 09 6d 74 66 20 22 30 64 65  port (..mtf "0de
0020: 76 2e 6f 72 67 2f 65 6e 63 6f 64 69 6e 67 2f 6d  v.org/encoding/m
0030: 74 66 22 0a 09 69 6f 75 20 22 30 64 65 76 2e 6f  tf"..iou "0dev.o
0040: 72 67 2f 69 6f 75 74 69 6c 22 0a 09 22 66 6d 74  rg/ioutil".."fmt
0050: 22 0a 09 22 69 6f 22 0a 09 22 6f 73 22 0a 29 0a  ".."io".."os".).
0060: 0a 66 75 6e 63 20 6d 61 69 6e 28 29 20 7b 0a 09  .func main() {..
0070: 76 61 72 20 63 6f 64 65 20 69 6e 74 0a 09 73 77  var code int..sw
0080: 69 74 63 68 20 7b 0a 09 63 61 73 65 20 6c 65 6e  itch {..case len
0090: 28 6f 73 2e 41 72 67 73 29 20 3d 3d 20 31 3a 0a  (os.Args) == 1:.
00a0: 09 09 63 6f 64 65 20 3d 20 74 72 61 6e 73 66 6f  ..code = transfo
00b0: 72 6d 28 6f 73 2e 53 74 64 6f 75 74 2c 20 6f 73  rm(os.Stdout, os
00c0: 2e 53 74 64 69 6e 29 0a 09 63 61 73 65 20 6c 65  .Stdin)..case le
00d0: 6e 28 6f 73 2e 41 72 67 73 29 20 3d 3d 20 32 20  n(os.Args) == 2 
00e0: 26 26 20 6f 73 2e 41 72 67 73 5b 31 5d 20 3d 3d  && os.Args[1] ==
00f0: 20 22 2d 64 22 3a 0a 09 09 63 6f 64 65 20 3d 20   "-d":...code = 
0100: 72 65 76 65 72 73 65 28 6f 73 2e 53 74 64 6f 75  reverse(os.Stdou
0110: 74 2c 20 6f 73 2e 53 74 64 69 6e 29 0a 09 64 65  t, os.Stdin)..de
0120: 66 61 75 6c 74 3a 0a 09 09 66 6d 74 2e 46 70 72  fault:...fmt.Fpr
0130: 69 6e 74 6c 6e 28 6f 73 2e 53 74 64 6f 75 74 2c  intln(os.Stdout,
0140: 20 22 55 73 61 67 65 3a 20 6d 74 66 20 5b 2d 64   "Usage: mtf [-d
0150: 5d 22 29 0a 09 7d 0a 09 6f 73 2e 45 78 69 74 28  ]")..}..os.Exit(
0160: 63 6f 64 65 29 0a 7d 0a 0a 2f 2f 20 54 72 61 6e  code).}..// Tran
0170: 73 66 6f 72 6d 73 20 74 68 65 20 64 61 74 61 20  sforms the data 
0180: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
0190: 20 6d 6f 76 65 2d 74 6f 2d 66 72 6f 6e 74 20 61   move-to-front a
01a0: 6c 67 6f 72 69 74 68 6d 0a 2f 2f 20 49 2f 4f 20  lgorithm.// I/O 
01b0: 69 73 20 62 75 66 66 65 72 65 64 20 66 6f 72 20  is buffered for 
01c0: 62 65 74 74 65 72 20 70 65 72 66 6f 72 6d 61 6e  better performan
01d0: 63 65 0a 66 75 6e 63 20 74 72 61 6e 73 66 6f 72  ce.func transfor
01e0: 6d 28 6f 75 74 70 75 74 20 69 6f 2e 57 72 69 74  m(output io.Writ
01f0: 65 72 2c 20 69 6e 70 75 74 20 69 6f 2e 52 65 61  er, input io.Rea
0200: 64 65 72 29 20 69 6e 74 20 7b 0a 09 76 61 72 20  der) int {..var 
0210: 28 0a 09 09 65 72 72 20 20 20 20 20 65 72 72 6f  (...err     erro
0220: 72 0a 09 09 62 75 66 66 65 72 20 20 69 6f 2e 57  r...buffer  io.W
0230: 72 69 74 65 72 20 3d 20 69 6f 75 2e 53 69 7a 65  riter = iou.Size
0240: 64 57 72 69 74 65 72 28 6f 75 74 70 75 74 2c 20  dWriter(output, 
0250: 34 30 39 36 29 0a 09 09 65 6e 63 6f 64 65 72 20  4096)...encoder 
0260: 69 6f 2e 57 72 69 74 65 72 20 3d 20 6d 74 66 2e  io.Writer = mtf.
0270: 45 6e 63 6f 64 65 72 28 62 75 66 66 65 72 29 0a  Encoder(buffer).
0280: 09 29 0a 0a 09 5f 2c 20 65 72 72 20 3d 20 69 6f  .)..._, err = io
0290: 2e 43 6f 70 79 28 65 6e 63 6f 64 65 72 2c 20 69  .Copy(encoder, i
02a0: 6e 70 75 74 29 0a 09 69 66 20 65 72 72 20 21 3d  nput)..if err !=
02b0: 20 6e 69 6c 20 7b 0a 09 09 66 6d 74 2e 46 70 72   nil {...fmt.Fpr
02c0: 69 6e 74 6c 6e 28 6f 73 2e 53 74 64 65 72 72 2c  intln(os.Stderr,
02d0: 20 22 45 72 72 6f 72 20 77 68 69 6c 65 20 65 6e   "Error while en
02e0: 63 6f 64 69 6e 67 2e 5c 6e 22 2c 20 65 72 72 29  coding.\n", err)
02f0: 0a 09 09 72 65 74 75 72 6e 20 31 0a 09 7d 0a 0a  ...return 1..}..
0300: 09 2f 2f 20 46 6c 75 73 68 20 74 68 65 20 62 75  .// Flush the bu
0310: 66 66 65 72 0a 09 5f 2c 20 65 72 72 20 3d 20 62  ffer.._, err = b
0320: 75 66 66 65 72 2e 57 72 69 74 65 28 6e 69 6c 29  uffer.Write(nil)
0330: 0a 09 69 66 20 65 72 72 20 21 3d 20 6e 69 6c 20  ..if err != nil 
0340: 7b 0a 09 09 66 6d 74 2e 46 70 72 69 6e 74 6c 6e  {...fmt.Fprintln
0350: 28 6f 73 2e 53 74 64 65 72 72 2c 20 22 45 72 72  (os.Stderr, "Err
0360: 6f 72 20 77 68 69 6c 65 20 66 6c 75 73 68 69 6e  or while flushin
0370: 67 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  g output buffer.
0380: 5c 6e 22 2c 20 65 72 72 29 0a 09 09 72 65 74 75  \n", err)...retu
0390: 72 6e 20 31 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  rn 1..}...return
03a0: 20 30 0a 7d 0a 0a 2f 2f 20 52 65 76 65 72 73 65   0.}..// Reverse
03b0: 73 20 4d 54 46 60 65 64 20 64 61 74 61 20 61 6e  s MTF`ed data an
03c0: 64 20 77 72 69 74 65 73 20 62 61 63 6b 20 74 68  d writes back th
03d0: 65 20 6f 72 69 67 69 6e 61 6c 20 62 79 74 65 73  e original bytes
03e0: 0a 2f 2f 20 49 2f 4f 20 69 73 20 62 75 66 66 65  .// I/O is buffe
03f0: 72 65 64 20 66 6f 72 20 62 65 74 74 65 72 20 70  red for better p
0400: 65 72 66 6f 72 6d 61 6e 63 65 0a 66 75 6e 63 20  erformance.func 
0410: 72 65 76 65 72 73 65 28 6f 75 74 70 75 74 20 69  reverse(output i
0420: 6f 2e 57 72 69 74 65 72 2c 20 69 6e 70 75 74 20  o.Writer, input 
0430: 69 6f 2e 52 65 61 64 65 72 29 20 69 6e 74 20 7b  io.Reader) int {
0440: 0a 09 76 61 72 20 28 0a 09 09 65 72 72 20 20 20  ..var (...err   
0450: 20 20 65 72 72 6f 72 0a 09 09 64 65 63 6f 64 65    error...decode
0460: 72 20 69 6f 2e 52 65 61 64 65 72 20 3d 20 6d 74  r io.Reader = mt
0470: 66 2e 44 65 63 6f 64 65 72 28 69 6f 75 2e 53 69  f.Decoder(iou.Si
0480: 7a 65 64 52 65 61 64 65 72 28 69 6e 70 75 74 2c  zedReader(input,
0490: 20 34 30 39 36 29 29 0a 09 29 0a 0a 09 5f 2c 20   4096))..)..._, 
04a0: 65 72 72 20 3d 20 69 6f 2e 43 6f 70 79 28 6f 75  err = io.Copy(ou
04b0: 74 70 75 74 2c 20 64 65 63 6f 64 65 72 29 0a 09  tput, decoder)..
04c0: 69 66 20 65 72 72 20 21 3d 20 6e 69 6c 20 7b 0a  if err != nil {.
04d0: 09 09 66 6d 74 2e 46 70 72 69 6e 74 6c 6e 28 6f  ..fmt.Fprintln(o
04e0: 73 2e 53 74 64 65 72 72 2c 20 22 45 72 72 6f 72  s.Stderr, "Error
04f0: 20 77 68 69 6c 65 20 64 65 63 6f 64 69 6e 67 2e   while decoding.
0500: 5c 6e 22 2c 20 65 72 72 29 0a 09 09 72 65 74 75  \n", err)...retu
0510: 72 6e 20 31 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  rn 1..}...return
0520: 20 30 0a 7d 0a                                    0.}.