Hex Artifact Content

Artifact a9b931eec8332e2068be48a20d1dfb0624f432ae:


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 6c 61  rg/ioutil".."fla
0050: 67 22 0a 09 22 66 6d 74 22 0a 09 22 69 6f 22 0a  g".."fmt".."io".
0060: 09 22 6f 73 22 0a 29 0a 0a 66 75 6e 63 20 6d 61  ."os".)..func ma
0070: 69 6e 28 29 20 7b 0a 09 64 20 3a 3d 20 66 6c 61  in() {..d := fla
0080: 67 2e 42 6f 6f 6c 28 22 64 22 2c 20 66 61 6c 73  g.Bool("d", fals
0090: 65 2c 20 22 55 73 65 20 74 6f 20 74 6f 67 67 6c  e, "Use to toggl
00a0: 65 20 64 65 63 6f 64 65 20 6d 6f 64 65 22 29 0a  e decode mode").
00b0: 09 66 6c 61 67 2e 50 61 72 73 65 28 29 0a 0a 09  .flag.Parse()...
00c0: 76 61 72 20 63 6f 64 65 20 69 6e 74 0a 09 69 66  var code int..if
00d0: 20 2a 64 20 7b 0a 09 09 63 6f 64 65 20 3d 20 64   *d {...code = d
00e0: 65 63 6f 64 65 28 6f 73 2e 53 74 64 6f 75 74 2c  ecode(os.Stdout,
00f0: 20 6f 73 2e 53 74 64 69 6e 29 0a 09 7d 20 65 6c   os.Stdin)..} el
0100: 73 65 20 7b 0a 09 09 63 6f 64 65 20 3d 20 65 6e  se {...code = en
0110: 63 6f 64 65 28 6f 73 2e 53 74 64 6f 75 74 2c 20  code(os.Stdout, 
0120: 6f 73 2e 53 74 64 69 6e 29 0a 09 7d 0a 0a 09 6f  os.Stdin)..}...o
0130: 73 2e 45 78 69 74 28 63 6f 64 65 29 0a 7d 0a 0a  s.Exit(code).}..
0140: 2f 2f 20 54 72 61 6e 73 66 6f 72 6d 73 20 74 68  // Transforms th
0150: 65 20 64 61 74 61 20 61 63 63 6f 72 64 69 6e 67  e data according
0160: 20 74 6f 20 74 68 65 20 6d 6f 76 65 2d 74 6f 2d   to the move-to-
0170: 66 72 6f 6e 74 20 61 6c 67 6f 72 69 74 68 6d 0a  front algorithm.
0180: 2f 2f 20 49 2f 4f 20 69 73 20 62 75 66 66 65 72  // I/O is buffer
0190: 65 64 20 66 6f 72 20 62 65 74 74 65 72 20 70 65  ed for better pe
01a0: 72 66 6f 72 6d 61 6e 63 65 0a 66 75 6e 63 20 65  rformance.func e
01b0: 6e 63 6f 64 65 28 6f 75 74 70 75 74 20 69 6f 2e  ncode(output io.
01c0: 57 72 69 74 65 72 2c 20 69 6e 70 75 74 20 69 6f  Writer, input io
01d0: 2e 52 65 61 64 65 72 29 20 69 6e 74 20 7b 0a 09  .Reader) int {..
01e0: 76 61 72 20 28 0a 09 09 65 72 72 20 20 20 20 20  var (...err     
01f0: 65 72 72 6f 72 0a 09 09 65 6e 63 6f 64 65 72 20  error...encoder 
0200: 69 6f 2e 52 65 61 64 65 72 20 3d 20 6d 74 66 2e  io.Reader = mtf.
0210: 45 6e 63 6f 64 65 72 28 69 6f 75 2e 53 69 7a 65  Encoder(iou.Size
0220: 64 52 65 61 64 65 72 28 69 6e 70 75 74 2c 20 34  dReader(input, 4
0230: 30 39 36 29 29 0a 09 29 0a 0a 09 5f 2c 20 65 72  096))..)..._, er
0240: 72 20 3d 20 69 6f 2e 43 6f 70 79 28 6f 75 74 70  r = io.Copy(outp
0250: 75 74 2c 20 65 6e 63 6f 64 65 72 29 0a 09 69 66  ut, encoder)..if
0260: 20 65 72 72 20 21 3d 20 6e 69 6c 20 7b 0a 09 09   err != nil {...
0270: 66 6d 74 2e 46 70 72 69 6e 74 6c 6e 28 6f 73 2e  fmt.Fprintln(os.
0280: 53 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 77  Stderr, "Error w
0290: 68 69 6c 65 20 65 6e 63 6f 64 69 6e 67 2e 5c 6e  hile encoding.\n
02a0: 22 2c 20 65 72 72 29 0a 09 09 72 65 74 75 72 6e  ", err)...return
02b0: 20 31 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 30   1..}...return 0
02c0: 0a 7d 0a 0a 2f 2f 20 52 65 76 65 72 73 65 73 20  .}..// Reverses 
02d0: 4d 54 46 60 65 64 20 64 61 74 61 20 61 6e 64 20  MTF`ed data and 
02e0: 77 72 69 74 65 73 20 62 61 63 6b 20 74 68 65 20  writes back the 
02f0: 6f 72 69 67 69 6e 61 6c 20 62 79 74 65 73 0a 2f  original bytes./
0300: 2f 20 49 2f 4f 20 69 73 20 62 75 66 66 65 72 65  / I/O is buffere
0310: 64 20 66 6f 72 20 62 65 74 74 65 72 20 70 65 72  d for better per
0320: 66 6f 72 6d 61 6e 63 65 0a 66 75 6e 63 20 64 65  formance.func de
0330: 63 6f 64 65 28 6f 75 74 70 75 74 20 69 6f 2e 57  code(output io.W
0340: 72 69 74 65 72 2c 20 69 6e 70 75 74 20 69 6f 2e  riter, input io.
0350: 52 65 61 64 65 72 29 20 69 6e 74 20 7b 0a 09 76  Reader) int {..v
0360: 61 72 20 28 0a 09 09 65 72 72 20 20 20 20 20 65  ar (...err     e
0370: 72 72 6f 72 0a 09 09 64 65 63 6f 64 65 72 20 69  rror...decoder i
0380: 6f 2e 52 65 61 64 65 72 20 3d 20 6d 74 66 2e 44  o.Reader = mtf.D
0390: 65 63 6f 64 65 72 28 69 6f 75 2e 53 69 7a 65 64  ecoder(iou.Sized
03a0: 52 65 61 64 65 72 28 69 6e 70 75 74 2c 20 34 30  Reader(input, 40
03b0: 39 36 29 29 0a 09 29 0a 0a 09 5f 2c 20 65 72 72  96))..)..._, err
03c0: 20 3d 20 69 6f 2e 43 6f 70 79 28 6f 75 74 70 75   = io.Copy(outpu
03d0: 74 2c 20 64 65 63 6f 64 65 72 29 0a 09 69 66 20  t, decoder)..if 
03e0: 65 72 72 20 21 3d 20 6e 69 6c 20 7b 0a 09 09 66  err != nil {...f
03f0: 6d 74 2e 46 70 72 69 6e 74 6c 6e 28 6f 73 2e 53  mt.Fprintln(os.S
0400: 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 77 68  tderr, "Error wh
0410: 69 6c 65 20 64 65 63 6f 64 69 6e 67 2e 5c 6e 22  ile decoding.\n"
0420: 2c 20 65 72 72 29 0a 09 09 72 65 74 75 72 6e 20  , err)...return 
0430: 31 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 30 0a  1..}...return 0.
0440: 7d 0a                                            }.