multi.c - 9base - revived minimalist port of Plan 9 userland to Unix
 (HTM) git clone git://git.suckless.org/9base
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       multi.c (1844B)
       ---
            1 #include "sam.h"
            2 
            3 List        file = { 'p' };
            4 ushort        tag;
            5 
            6 File *
            7 newfile(void)
            8 {
            9         File *f;
           10 
           11         f = fileopen();
           12         inslist(&file, 0, f);
           13         f->tag = tag++;
           14         if(downloaded)
           15                 outTs(Hnewname, f->tag);
           16         /* already sorted; file name is "" */
           17         return f;
           18 }
           19 
           20 int
           21 whichmenu(File *f)
           22 {
           23         int i;
           24 
           25         for(i=0; i<file.nused; i++)
           26                 if(file.filepptr[i]==f)
           27                         return i;
           28         return -1;
           29 }
           30 
           31 void
           32 delfile(File *f)
           33 {
           34         int w = whichmenu(f);
           35 
           36         if(w < 0)        /* e.g. x/./D */
           37                 return;
           38         if(downloaded)
           39                 outTs(Hdelname, f->tag);
           40         dellist(&file, w);
           41         fileclose(f);
           42 }
           43 
           44 void
           45 fullname(String *name)
           46 {
           47         if(name->n > 0 && name->s[0]!='/' && name->s[0]!=0)
           48                 Strinsert(name, &curwd, (Posn)0);
           49 }
           50 
           51 void
           52 fixname(String *name)
           53 {
           54         String *t;
           55         char *s;
           56 
           57         fullname(name);
           58         s = Strtoc(name);
           59         if(strlen(s) > 0)
           60                 s = cleanname(s);
           61         t = tmpcstr(s);
           62         Strduplstr(name, t);
           63         free(s);
           64         freetmpstr(t);
           65 
           66         if(Strispre(&curwd, name))
           67                 Strdelete(name, 0, curwd.n);
           68 }
           69 
           70 void
           71 sortname(File *f)
           72 {
           73         int i, cmp, w;
           74         int dupwarned;
           75 
           76         w = whichmenu(f);
           77         dupwarned = FALSE;
           78         dellist(&file, w);
           79         if(f == cmd)
           80                 i = 0;
           81         else{
           82                 for(i=0; i<file.nused; i++){
           83                         cmp = Strcmp(&f->name, &file.filepptr[i]->name);
           84                         if(cmp==0 && !dupwarned){
           85                                 dupwarned = TRUE;
           86                                 warn_S(Wdupname, &f->name);
           87                         }else if(cmp<0 && (i>0 || cmd==0))
           88                                 break;
           89                 }
           90         }
           91         inslist(&file, i, f);
           92         if(downloaded)
           93                 outTsS(Hmovname, f->tag, &f->name);
           94 }
           95 
           96 void
           97 state(File *f, int cleandirty)
           98 {
           99         if(f == cmd)
          100                 return;
          101         f->unread = FALSE;
          102         if(downloaded && whichmenu(f)>=0){        /* else flist or menu */
          103                 if(f->mod && cleandirty!=Dirty)
          104                         outTs(Hclean, f->tag);
          105                 else if(!f->mod && cleandirty==Dirty)
          106                         outTs(Hdirty, f->tag);
          107         }
          108         if(cleandirty == Clean)
          109                 f->mod = FALSE;
          110         else
          111                 f->mod = TRUE;
          112 }
          113 
          114 File *
          115 lookfile(String *s)
          116 {
          117         int i;
          118 
          119         for(i=0; i<file.nused; i++)
          120                 if(Strcmp(&file.filepptr[i]->name, s) == 0)
          121                         return file.filepptr[i];
          122         return 0;
          123 }