ics - folder.go
1 package ics
2
3 import (
4 "io"
5 "unicode/utf8"
6 )
7
8 type folder struct {
9 w io.Writer
10 err error
11 line uint8
12 }
13
14 const maxLineLength = 75
15
16 var eol = [...]byte{'\r', '\n', ' '}
17
18 func (f *folder) Write(q []byte) (int, error) {
19 if f.err != nil {
20 return 0, f.err
21 }
22 var (
23 r rune
24 s, n, m int
25 )
26 for pos := 0; pos < len(q); pos += s {
27 r, s = utf8.DecodeRune(q[pos:])
28 f.line += uint8(s)
29 if r == '\n' {
30 f.line = 0
31 } else if r == '\r' {
32 } else if f.line > maxLineLength {
33 if pos > 0 {
34 m, f.err = f.w.Write(q[:pos])
35 n += m
36 if f.err != nil {
37 return n, f.err
38 }
39 q = q[pos:]
40 }
41 _, f.err = f.w.Write(eol[:])
42 if f.err != nil {
43 return n, f.err
44 }
45
46 pos = 0
47 f.line = uint8(s) + 1
48 }
49 }
50 if len(q) > 0 {
51 m, f.err = f.w.Write(q)
52 n += m
53 }
54 return n, f.err
55 }
56
57 func (f *folder) WriteString(q string) (int, error) {
58 return f.Write([]byte(q))
59 }