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  }