ref: c3ba64f6935322f09b6de5c2285544fd471c605d
dir: /sys/src/cmd/sam/multi.c/
#include "sam.h" List file = { 'p' }; ushort tag; File * newfile(void) { File *f; f = fileopen(); inslist(&file, 0, f); f->tag = tag++; if(downloaded) outTs(Hnewname, f->tag); /* already sorted; file name is "" */ return f; } int whichmenu(File *f) { int i; for(i=0; i<file.nused; i++) if(file.filepptr[i]==f) return i; return -1; } void delfile(File *f) { int w = whichmenu(f); if(w < 0) /* e.g. x/./D */ return; if(downloaded) outTs(Hdelname, f->tag); dellist(&file, w); fileclose(f); } void fullname(String *name) { if(name->n > 0 && name->s[0]!='/' && name->s[0]!=0) Strinsert(name, &curwd, (Posn)0); } void fixname(String *name) { String *t; char *s; fullname(name); s = Strtoc(name); if(strlen(s) > 0) s = cleanname(s); t = tmpcstr(s); Strduplstr(name, t); free(s); freetmpstr(t); if(Strispre(&curwd, name)) Strdelete(name, 0, curwd.n); } void sortname(File *f) { int i, cmp, w; int dupwarned; w = whichmenu(f); dupwarned = FALSE; dellist(&file, w); if(f == cmd) i = 0; else{ for(i=0; i<file.nused; i++){ cmp = Strcmp(&f->name, &file.filepptr[i]->name); if(cmp==0 && !dupwarned){ dupwarned = TRUE; warn_S(Wdupname, &f->name); }else if(cmp<0 && (i>0 || cmd==0)) break; } } inslist(&file, i, f); if(downloaded) outTsS(Hmovname, f->tag, &f->name); } void state(File *f, int cleandirty) { if(f == cmd) return; f->unread = FALSE; if(downloaded && whichmenu(f)>=0){ /* else flist or menu */ if(f->mod && cleandirty!=Dirty) outTs(Hclean, f->tag); else if(!f->mod && cleandirty==Dirty) outTs(Hdirty, f->tag); } if(cleandirty == Clean) f->mod = FALSE; else f->mod = TRUE; } File * lookfile(String *s) { int i; for(i=0; i<file.nused; i++) if(Strcmp(&file.filepptr[i]->name, s) == 0) return file.filepptr[i]; return 0; }