xref: /plan9/sys/src/cmd/sam/multi.c (revision 73e742d79f6b0cfc24f3b01d7ade790955db63c2)
13e12c5d1SDavid du Colombier #include "sam.h"
23e12c5d1SDavid du Colombier 
3*73e742d7SDavid du Colombier List	file = { 'p' };
43e12c5d1SDavid du Colombier ushort	tag;
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier File *
newfile(void)73e12c5d1SDavid du Colombier newfile(void)
83e12c5d1SDavid du Colombier {
93e12c5d1SDavid du Colombier 	File *f;
103e12c5d1SDavid du Colombier 
117dd7cddfSDavid du Colombier 	f = fileopen();
12*73e742d7SDavid du Colombier 	inslist(&file, 0, f);
133e12c5d1SDavid du Colombier 	f->tag = tag++;
143e12c5d1SDavid du Colombier 	if(downloaded)
153e12c5d1SDavid du Colombier 		outTs(Hnewname, f->tag);
163e12c5d1SDavid du Colombier 	/* already sorted; file name is "" */
173e12c5d1SDavid du Colombier 	return f;
183e12c5d1SDavid du Colombier }
193e12c5d1SDavid du Colombier 
203e12c5d1SDavid du Colombier int
whichmenu(File * f)213e12c5d1SDavid du Colombier whichmenu(File *f)
223e12c5d1SDavid du Colombier {
233e12c5d1SDavid du Colombier 	int i;
243e12c5d1SDavid du Colombier 
253e12c5d1SDavid du Colombier 	for(i=0; i<file.nused; i++)
263e12c5d1SDavid du Colombier 		if(file.filepptr[i]==f)
273e12c5d1SDavid du Colombier 			return i;
283e12c5d1SDavid du Colombier 	return -1;
293e12c5d1SDavid du Colombier }
303e12c5d1SDavid du Colombier 
313e12c5d1SDavid du Colombier void
delfile(File * f)323e12c5d1SDavid du Colombier delfile(File *f)
333e12c5d1SDavid du Colombier {
343e12c5d1SDavid du Colombier 	int w = whichmenu(f);
353e12c5d1SDavid du Colombier 
363e12c5d1SDavid du Colombier 	if(w < 0)	/* e.g. x/./D */
373e12c5d1SDavid du Colombier 		return;
383e12c5d1SDavid du Colombier 	if(downloaded)
393e12c5d1SDavid du Colombier 		outTs(Hdelname, f->tag);
403e12c5d1SDavid du Colombier 	dellist(&file, w);
417dd7cddfSDavid du Colombier 	fileclose(f);
427dd7cddfSDavid du Colombier }
437dd7cddfSDavid du Colombier 
447dd7cddfSDavid du Colombier void
fullname(String * name)457dd7cddfSDavid du Colombier fullname(String *name)
467dd7cddfSDavid du Colombier {
477dd7cddfSDavid du Colombier 	if(name->n > 0 && name->s[0]!='/' && name->s[0]!=0)
487dd7cddfSDavid du Colombier 		Strinsert(name, &curwd, (Posn)0);
497dd7cddfSDavid du Colombier }
507dd7cddfSDavid du Colombier 
517dd7cddfSDavid du Colombier void
fixname(String * name)527dd7cddfSDavid du Colombier fixname(String *name)
537dd7cddfSDavid du Colombier {
547dd7cddfSDavid du Colombier 	String *t;
557dd7cddfSDavid du Colombier 	char *s;
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier 	fullname(name);
587dd7cddfSDavid du Colombier 	s = Strtoc(name);
597dd7cddfSDavid du Colombier 	if(strlen(s) > 0)
607dd7cddfSDavid du Colombier 		s = cleanname(s);
617dd7cddfSDavid du Colombier 	t = tmpcstr(s);
627dd7cddfSDavid du Colombier 	Strduplstr(name, t);
637dd7cddfSDavid du Colombier 	free(s);
647dd7cddfSDavid du Colombier 	freetmpstr(t);
657dd7cddfSDavid du Colombier 
667dd7cddfSDavid du Colombier 	if(Strispre(&curwd, name))
677dd7cddfSDavid du Colombier 		Strdelete(name, 0, curwd.n);
683e12c5d1SDavid du Colombier }
693e12c5d1SDavid du Colombier 
703e12c5d1SDavid du Colombier void
sortname(File * f)713e12c5d1SDavid du Colombier sortname(File *f)
723e12c5d1SDavid du Colombier {
733e12c5d1SDavid du Colombier 	int i, cmp, w;
743e12c5d1SDavid du Colombier 	int dupwarned;
753e12c5d1SDavid du Colombier 
763e12c5d1SDavid du Colombier 	w = whichmenu(f);
773e12c5d1SDavid du Colombier 	dupwarned = FALSE;
783e12c5d1SDavid du Colombier 	dellist(&file, w);
793e12c5d1SDavid du Colombier 	if(f == cmd)
803e12c5d1SDavid du Colombier 		i = 0;
817dd7cddfSDavid du Colombier 	else{
827dd7cddfSDavid du Colombier 		for(i=0; i<file.nused; i++){
833e12c5d1SDavid du Colombier 			cmp = Strcmp(&f->name, &file.filepptr[i]->name);
843e12c5d1SDavid du Colombier 			if(cmp==0 && !dupwarned){
853e12c5d1SDavid du Colombier 				dupwarned = TRUE;
863e12c5d1SDavid du Colombier 				warn_S(Wdupname, &f->name);
873e12c5d1SDavid du Colombier 			}else if(cmp<0 && (i>0 || cmd==0))
883e12c5d1SDavid du Colombier 				break;
893e12c5d1SDavid du Colombier 		}
907dd7cddfSDavid du Colombier 	}
91*73e742d7SDavid du Colombier 	inslist(&file, i, f);
923e12c5d1SDavid du Colombier 	if(downloaded)
933e12c5d1SDavid du Colombier 		outTsS(Hmovname, f->tag, &f->name);
943e12c5d1SDavid du Colombier }
953e12c5d1SDavid du Colombier 
963e12c5d1SDavid du Colombier void
state(File * f,int cleandirty)973e12c5d1SDavid du Colombier state(File *f, int cleandirty)
983e12c5d1SDavid du Colombier {
993e12c5d1SDavid du Colombier 	if(f == cmd)
1003e12c5d1SDavid du Colombier 		return;
1017dd7cddfSDavid du Colombier 	f->unread = FALSE;
1023e12c5d1SDavid du Colombier 	if(downloaded && whichmenu(f)>=0){	/* else flist or menu */
1037dd7cddfSDavid du Colombier 		if(f->mod && cleandirty!=Dirty)
1043e12c5d1SDavid du Colombier 			outTs(Hclean, f->tag);
1057dd7cddfSDavid du Colombier 		else if(!f->mod && cleandirty==Dirty)
1063e12c5d1SDavid du Colombier 			outTs(Hdirty, f->tag);
1073e12c5d1SDavid du Colombier 	}
1087dd7cddfSDavid du Colombier 	if(cleandirty == Clean)
1097dd7cddfSDavid du Colombier 		f->mod = FALSE;
1107dd7cddfSDavid du Colombier 	else
1117dd7cddfSDavid du Colombier 		f->mod = TRUE;
1123e12c5d1SDavid du Colombier }
1133e12c5d1SDavid du Colombier 
1143e12c5d1SDavid du Colombier File *
lookfile(String * s)1153e12c5d1SDavid du Colombier lookfile(String *s)
1163e12c5d1SDavid du Colombier {
1173e12c5d1SDavid du Colombier 	int i;
1183e12c5d1SDavid du Colombier 
1193e12c5d1SDavid du Colombier 	for(i=0; i<file.nused; i++)
1203e12c5d1SDavid du Colombier 		if(Strcmp(&file.filepptr[i]->name, s) == 0)
1213e12c5d1SDavid du Colombier 			return file.filepptr[i];
1223e12c5d1SDavid du Colombier 	return 0;
1233e12c5d1SDavid du Colombier }
124