1 #include "sam.h"
2 
3 List	file = { 'p' };
4 ushort	tag;
5 
6 File *
newfile(void)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
whichmenu(File * f)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
delfile(File * f)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
fullname(String * name)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
fixname(String * name)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
sortname(File * f)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
state(File * f,int cleandirty)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 *
lookfile(String * s)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 }
124