9fans.net/go@v0.0.7/cmd/sam/multi.go (about) 1 // #include "sam.h" 2 3 package main 4 5 import "path/filepath" 6 7 var file []*File 8 var tag int 9 10 func newfile() *File { 11 f := fileopen() 12 file = append(file, f) 13 f.tag = tag 14 tag++ 15 if downloaded { 16 outTs(Hnewname, f.tag) 17 } 18 /* already sorted; file name is "" */ 19 return f 20 } 21 22 func whichmenu(f *File) int { 23 for i := range file { 24 if file[i] == f { 25 return i 26 } 27 } 28 return -1 29 } 30 31 func delfile(f *File) { 32 w := whichmenu(f) 33 if w < 0 { /* e.g. x/./D */ 34 return 35 } 36 if downloaded { 37 outTs(Hdelname, f.tag) 38 } 39 delfilelist(w) 40 fileclose(f) 41 } 42 43 func delfilelist(w int) { 44 copy(file[w:], file[w+1:]) 45 file = file[:len(file)-1] 46 } 47 48 func fullname(name *String) { 49 debug("curwd %v", &curwd) 50 if len(name.s) > 0 && name.s[0] != '/' && name.s[0] != 0 { 51 Strinsert(name, &curwd, Posn(0)) 52 debug("post %v", name) 53 } 54 } 55 56 func fixname(name *String) { 57 debug("fixnmae %s\n", name) 58 fullname(name) 59 debug("fixfull %s\n", name) 60 s := Strtoc(name) 61 if len(s) > 0 { 62 s = filepath.Clean(s) 63 } 64 t := tmpcstr(s) 65 Strduplstr(name, t) 66 // free(s) 67 freetmpstr(t) 68 69 if Strispre(&curwd, name) { 70 Strdelete(name, 0, len(curwd.s)) 71 } 72 } 73 74 func sortname(f *File) { 75 w := whichmenu(f) 76 dupwarned := false 77 delfilelist(w) 78 var i int 79 if f == cmd { 80 i = 0 81 } else { 82 for i = 0; i < len(file); i++ { // NOT range - must end with i = len(file) 83 cmp := Strcmp(&f.name, &file[i].name) 84 if cmp == 0 && !dupwarned { 85 dupwarned = true 86 warn_S(Wdupname, &f.name) 87 } else if cmp < 0 && (i > 0 || cmd == nil) { 88 break 89 } 90 } 91 } 92 insfilelist(i, f) 93 if downloaded { 94 outTsS(Hmovname, f.tag, &f.name) 95 } 96 } 97 98 func insfilelist(i int, f *File) { 99 file = append(file, nil) 100 copy(file[i+1:], file[i:]) 101 file[i] = f 102 } 103 104 func state(f *File, cleandirty State) { 105 if f == cmd { 106 return 107 } 108 f.unread = false 109 if downloaded && whichmenu(f) >= 0 { /* else flist or menu */ 110 if f.mod && cleandirty != Dirty { 111 outTs(Hclean, f.tag) 112 } else if !f.mod && cleandirty == Dirty { 113 outTs(Hdirty, f.tag) 114 } 115 } 116 if cleandirty == Clean { 117 f.mod = false 118 } else { 119 f.mod = true 120 } 121 } 122 123 func lookfile(s *String) *File { 124 for _, f := range file { 125 if Strcmp(&f.name, s) == 0 { 126 return f 127 } 128 } 129 return nil 130 }