diff --git a/mailcap.go b/mailcap.go index ec674aa..8cf45f0 100644 --- a/mailcap.go +++ b/mailcap.go @@ -15,17 +15,17 @@ type Mailcap struct { } func NewMailcap() *Mailcap { - mc := Mailcap{Caps{}} + mc := Mailcap{} mc.getCaps() return &mc } -(m *Mailcap) func ShowAll() { +func (m *Mailcap) ShowAll() { fmt.Print(m.Caps) } -(m *Mailcap) func Show(mime string) { - if v, ok := m.Caps["mime"] { +func (m *Mailcap) Show(mime string) { + if v, ok := m.Caps[mime]; ok { fmt.Println(mime + ":") fmt.Print(v) } else { @@ -33,22 +33,25 @@ func NewMailcap() *Mailcap { } } -(m *Mailcap) func getCaps() { +func (m *Mailcap) getCaps() { lnNum := 0 - for mailcapFile := range getMailcapFileList() { + var moreCaps Cap + for _, mailcapFile := range getMailcapFileList() { file, err := os.Open(mailcapFile) if err != nil { continue } - moreCaps, lnNum, err := readMailcapFile(file, lnNum) + moreCaps, lnNum = readMailcapFile(file, lnNum) for k, v := range moreCaps { - if v, ok := m.Caps[key]; ok { - m.Caps[key] = m.Caps[key] + value + if _, ok := m.Caps[k]; ok { + for _, item := range v { + m.Caps[k] = append(m.Caps[k], item) + } } else { - m.Caps[key] = value + m.Caps[k] = v } } - file.close() + file.Close() } } @@ -57,19 +60,20 @@ func NewMailcap() *Mailcap { // found on the system. func getMailcapFileList() (mCapSlice []string) { var home string = "." - if val, ok := os.LookupEnv('MAILCAPS'); ok { + if val, ok := os.LookupEnv("MAILCAPS"); ok { mCapSlice = strings.Split(val, string(os.PathListSeparator)) } else { - if val, ok := os.LookupEnv('HOME'); ok { + if val, ok := os.LookupEnv("HOME"); ok { home = val } mCapSlice = []string{ home + "/.mailcap", "/etc/mailcap", "/usr/etc/mailcap", - "/usr/local/etc/mailcap" + "/usr/local/etc/mailcap", } } + return } func readMailcapFile(f *os.File,ln int) (Cap, int) { @@ -84,6 +88,7 @@ func readMailcapFile(f *os.File,ln int) (Cap, int) { // Handle continuations for long lines nxtLn := l for ;nxtLn[len(nxtLn)-3:] == "\\\n"; { + var er error nxtLn, er = reader.ReadString('\n') if er != nil || strings.TrimSpace(nxtLn) == "" { nxtLn = "\n" @@ -97,33 +102,36 @@ func readMailcapFile(f *os.File,ln int) (Cap, int) { continue } if ln >= 0 { - fields["lineno"] = ln + fields["lineno"] = string(ln) ln += 1 } types := strings.Split(key, "/") - for t := range types { - t = strings.TrimSpace(t) + for i, t := range types { + types[i] = strings.TrimSpace(t) } key = strings.Join(types, "/") key = strings.ToLower(key) - if _, ok := caps[key] { - append(caps[key], fields) + if _, ok := caps[key]; ok { + caps[key] = append(caps[key], fields) } else { - caps[key] = fields + var outputfield Fields + caps[key] = outputfield + caps[key] = append(caps[key], fields) } return caps, ln } } -func parseLine(ln) (string, Entry, error) { +func parseLine(ln string) (string, Entry, error) { outputFields := Entry{} i := 0 n := len(ln) fields := make([]string, 0, 10) + var field string for ;i < n; { field, i = parseField(ln, i, n) - append(fields, field) + fields = append(fields, field) i += 1 } if len(fields) < 2 { @@ -135,9 +143,9 @@ func parseLine(ln) (string, Entry, error) { if len(fields) > 2 { rest = fields[2:] } - for f := range rest { + for _, f := range rest { var fkey, fvalue string - i = string.Index(f, r"=") + i = strings.Index(f, "=") if i < 0 { fkey = f fvalue = "" @@ -166,6 +174,6 @@ func parseField(ln string, i, n int) (string, int) { i += 1 } } - return strings.TrimSpace(line[start:i]), i + return strings.TrimSpace(ln[start:i]), i }