⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fv.file.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
		window_set(editsw,			WIN_DESIRED_WIDTH, WIN_EXTEND_TO_EDGE,			WIN_DESIRED_HEIGHT, WIN_EXTEND_TO_EDGE,			WIN_CONSUME_EVENTS, LOC_WINENTER, LOC_WINEXIT, LOC_DRAG, 0,			0);#endif		(void)sprintf(buf, "%s/%s", Fv_path[1] == 0 ? "" : Fv_path, name);		read_file(editframe, editsw, buf, FALSE);		if (pattern)		{			/* Textedit can be told to do pattern matching;			 * however textedit can't understand regular 			 * expressions...  so ignore any errors.  Set 			 * selection.			 */			if (textsw_find_bytes(editsw, &first, &last_plus_one,				pattern, strlen(pattern), 0) != -1)			{				textsw_normalize_view(editsw, first);				textsw_set_selection(editsw, first,					last_plus_one, 1);			}		}	}	else#endif	{		if (x != EMPTY)		{			(void)sprintf(xpos, "%d", x);			(void)sprintf(ypos, "%d", y);			argv[argc++] = "-Wi";			argv[argc++] = "-WP";			argv[argc++] = xpos;			argv[argc++] = ypos;		}		argv[argc++] = "-WL";		argv[argc++] = name;		if (Fv_editor == FV_VI)			argv[argc++] = "vi";		argv[argc++] = name;		argv[argc] = 0;		fv_execit(argv[0], argv);	}}#ifdef SV1staticload_file(id)	int id;{	register int i;	char buf[MAXPATH];	for (i = 0; i< Edit_no; i++)	{		if (id == Edit_id[i])		{			(void)sprintf(buf, "%s/%s", Fv_path[1] == 0 ? "" : Fv_path,				Fv_file[fv_getselectedfile()]->name);			read_file(Edit_fr[i], Edit_sw[i], buf, TRUE);			return(0);		}	}	return(-1);}#endif#ifndef SV1Notify_valueeditsw_event(win, evnt, arg, type)	Vu_Window win;	Event *evnt;	Notify_arg arg;	Notify_event_type type;{	char buf[MAXPATH];	if (event_action(evnt) == ACTION_DRAG_LOAD)	{		Seln_holder holder;		Seln_request *sbuf;		holder = seln_inquire(SELN_PRIMARY);		if (holder.state == SELN_NONE)			fv_putmsg(TRUE, "No selection!", 0, 0);		else {			sbuf = seln_ask(&holder, SELN_REQ_CONTENTS_ASCII, 0, 0);			read_file(window_get(win, WIN_FRAME), win, 				sbuf->data+sizeof(Seln_attribute), TRUE);		}	}	return(notify_next_event_func(win, evnt, arg, type));}#endiffv_quit_frames(){	register int i;	for (i = 0; i < Edit_no; i++)		if (Edit_fr[i])			window_destroy(Edit_fr[i]);	for (i = 0; i < Nfolders; i++)		if (Folder_frame[i])			window_destroy(Folder_frame[i]);}static read_file(frame, editsw, name, old)	Frame frame;	Textsw editsw;	char *name;	BOOLEAN old;{	Textsw_status tstatus;			/* Error code from textsw */	char buf[255];	if (old)		if (window_get(editsw, TEXTSW_MODIFIED))			if (!alert_edit(editsw))				return;	window_set(editsw, TEXTSW_STATUS, &tstatus,		TEXTSW_FILE, name,		TEXTSW_FIRST, 0,		0);	if (tstatus != TEXTSW_STATUS_OKAY )	{		fv_putmsg(TRUE, "Can't read %s: %s", (int)name, 			(int)sys_errlist[errno]);		return;	}#ifdef SV1	fv_name_icon(frame, strrchr(name, '/')+1);#else	{	char *b_p = strrchr(name, '/')+1;	/* View2 bug */	vu_set(vu_get(frame, FRAME_ICON), ICON_LABEL, b_p, 0);	}#endif	(void)strcpy(Last_edited, name);	(void)sprintf(buf, "fileview: %s", name);	window_set(frame, FRAME_LABEL, buf, WIN_SHOW, TRUE, 0);}staticalert_edit(editsw)	Textsw editsw;{	char buf[MAXPATH];	int result;	(void)sprintf(buf, "'%s' has been edited, what do you wish to do?",		Last_edited);	result = alert_prompt(editsw, NULL,		ALERT_MESSAGE_STRINGS, buf, 0,		ALERT_BUTTON, "Save edits", 1,		ALERT_BUTTON, "Discard edits", 2,		ALERT_BUTTON, "Cancel", 3,		0);	if (result==1)		textsw_save(editsw, 0, 0);	else if (result==2)		textsw_reset(editsw, 0, 0);	else		return(FALSE);	return(TRUE);}static Notify_valuetextsw_recover(frame, status)		/* Recover space in Edit array */	Frame frame;	Destroy_status status;{	register int i;	if (status == DESTROY_CHECKING)	{		for (i = 0; i < Edit_no; i++)			if (Edit_fr[i] == frame)				break;		while (i<Edit_no)			Edit_fr[i] = Edit_fr[i+1], i++;		Edit_no--;	}	return(notify_next_destroy_func(frame, status));}fv_gotofile(name, pattern)	/* Open file from FIND list box */	register char *name;		/* Filename */	char *pattern;			/* String pattern matched in file */{	register int i;			/* Index into File array */	register int y;			/* Coordinate */	int top;			/* Current top of screen */	/* XXX We could probably do a binary search here as long as it was	 * sorted alphabetically...	 */	for (i=0; i<Fv_nfiles; i++)		if (strcmp(Fv_file[i]->name, name) == 0)			break;	if (i>=Fv_nfiles || (access(Fv_file[i]->name, F_OK) == -1))	{		fv_putmsg(TRUE, Fv_message[MEFIND], (int)name, 0);		return;	}	/* Found the file; scroll it into view... */	y = trans(i);	top = GET_SCROLL_VIEW_START;	if (y<top || y>(top+(int)window_get(Fv_foldr.canvas, WIN_HEIGHT)))		scrollbar_scroll_to(Fv_foldr.vsbar, y>GLYPH_HEIGHT ? y-GLYPH_HEIGHT : 0);	fv_file_open(i, FALSE, Fv_file[i]->type == FV_IDOCUMENT ? pattern : NULL, FALSE);}static voidstop_editing(){	int l;				/* Length of text */	FV_TNODE *t_p;			/* Tree pointer */	char *new_name;			/* New name */	FV_FILE *f_p = Fv_file[Renamed_file];	new_name = (char *)panel_get(Text_item, PANEL_VALUE);	window_set(Text_panel, WIN_SHOW, FALSE, 0);	if (strlen(new_name) && strcmp(f_p->name, new_name))		if (access(new_name, F_OK) == 0)		{			fv_putmsg(TRUE, Fv_message[MEEXIST],				(int)new_name, 0);		}		else if (rename(f_p->name, new_name) == -1)			fv_putmsg(TRUE, Fv_message[MERENAME],				(int)sys_errlist[errno], f_p->name);		else		{			char *m_p;			/* Change name in tree */			if (f_p->type == FV_IFOLDER)			{				for (t_p = Fv_current->child; t_p; t_p = t_p->sibling)					if (strcmp(t_p->name, f_p->name) == 0)						break;				if (t_p)				{					if (strlen(new_name) > strlen(t_p->name))					{						m_p = fv_malloc((unsigned)strlen(new_name)+1);						free(t_p->name);						t_p->name = m_p;					}					(void)strcpy(t_p->name, new_name);					fv_sort_children(t_p->parent);				}				if (Fv_treeview)					fv_drawtree(FALSE);			}			m_p = fv_malloc((unsigned)strlen(new_name)+1);			if (m_p)			{				free(f_p->name);				f_p->name = m_p;				(void)strcpy(f_p->name, new_name);				Fv_current->mtime = time((time_t *)0);			}			/* Recalculate string width */			l = fv_strlen(new_name);			if (l > Widest_name)				Widest_name = l;			f_p->width = l;			fv_display_folder(FV_STYLE_FOLDER);			fv_match_files(new_name);		}}/* Select files which match pattern */fv_match_files(pattern)	char *pattern;{	register FV_FILE **f_p, **l_p;	/* Files array pointers */	register int i;			/* Index */	register int y = EMPTY;	int top;	fv_treedeselect();		/* Turn off old selections */	for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles, i=0; 		f_p != l_p; f_p++, i++)		if (fv_match((*f_p)->name, pattern) == 1)		{			if (!(*f_p)->selected)				fv_reverse(i);			(*f_p)->selected = TRUE;			if (y == EMPTY)				y = i;		}		else if ((*f_p)->selected)		{			/* Turn off old selections */			fv_reverse(i);			(*f_p)->selected = FALSE;		}	if (y != EMPTY)	{		y = trans(y);		top = GET_SCROLL_VIEW_START;		if (y<top || y+GLYPH_HEIGHT>(top+			(int)window_get(Fv_foldr.canvas, WIN_HEIGHT)))		{			/* File is either before or after view window */			if ((i = y-GLYPH_HEIGHT)<0)				i = 0;#ifndef SV1			else if (i+window_get(Fv_foldr.canvas, WIN_HEIGHT) > 				window_get(Fv_foldr.canvas, CANVAS_HEIGHT))				i = window_get(Fv_foldr.canvas, CANVAS_HEIGHT) -				     window_get(Fv_foldr.canvas, WIN_HEIGHT);			i /= Scroll_increment;#endif			scrollbar_scroll_to(Fv_foldr.vsbar, i);		}	}	else		fv_putmsg(TRUE, Fv_message[MEFIND], (int)pattern, 0);}/* Return currently selected filename */fv_getselectedfile(){	register FV_FILE **f_p, **l_p;	/* Files array pointers */	register int i;	/* Stop at first selection */	for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles, i=0; f_p != l_p; f_p++, i++)		if ((*f_p)->selected)			return(i);	return(EMPTY);}fv_select_all(){	register FV_FILE **f_p, **l_p;	/* Files array pointers */	register int i;			/* Index */	for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles, i=0; 		f_p != l_p; f_p++, i++)		if (!(*f_p)->selected)		{			(*f_p)->selected = TRUE;			fv_reverse(i);		}	if (Fv_tselected)	{		/* Turn off tree selection.  Only 1 window		 * can have selected objects...		 */		fv_treedeselect();	}}/* Deselect any selected objects */fv_filedeselect(){	register FV_FILE **f_p, **l_p;	/* Files array pointers */	register int i;			/* Index */	for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles, i=0; 		f_p != l_p; f_p++, i++)		if ((*f_p)->selected)		{			(*f_p)->selected = FALSE;			fv_reverse(i);		}}fv_apply_color(code)	int code;{	register FV_FILE **f_p, **l_p;	/* Files array pointers */	register int i;			/* Index */	register FILE *fp;	for (i=0, f_p=Fv_file, l_p=Fv_file+Fv_nfiles; f_p != l_p; f_p++, i++)		if ((*f_p)->selected)		{			(*f_p)->color = (SBYTE)code;			pw_rop(Fv_foldr.pw, (*f_p)->x, 				trans(i),				GLYPH_WIDTH, GLYPH_HEIGHT, 				PIX_SRC | PIX_COLOR((*f_p)->color),			       (*f_p)->icon>EMPTY && Fv_bind[(*f_p)->icon].icon 				? Fv_bind[(*f_p)->icon].icon				: Fv_icon[(*f_p)->type], 0, 0);			fv_reverse(i);		}	if (fp = fopen(COLOR_FILE, "w"))	{		/* Ensure names are sorted alphabetically */		if (Fv_sortby != FV_SORTALPHA)			qsort((char *)Fv_file, Fv_nfiles, sizeof(FV_FILE *),				Compare_fn[FV_SORTALPHA]);		for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles; 			f_p != l_p; f_p++)			if ((*f_p)->color > BLACK)			{				(void)fputc((*f_p)->color+'0', fp);				fputs((*f_p)->name, fp);				(void)fputc('\n', fp);			}		(void)fclose(fp);		/* Resort to old sort */		if (Fv_sortby != FV_SORTALPHA && Fv_sortby != FV_NOSORT)			qsort((char *)Fv_file, Fv_nfiles, sizeof(FV_FILE *),				Compare_fn[Fv_sortby]);	}	else		fv_putmsg(TRUE, Fv_message[MECREAT], (int)COLOR_FILE, 0);}staticstore_colors()			/* Store filename,color pair in ..colors */{	static int ncolors = 0;	char buf[256];	register FILE *fp;	register int i;	register unsigned l;	/* Free up old color association array */	i = ncolors;	while (i)	{		i--;		free(Color_fname[i]);	}	/* Read in new... */	if ((fp=fopen(COLOR_FILE, "r"))==NULL)		return;	while (fgets(buf, 255, fp) && ncolors < MAXFILES)	{		Color_code[i] = buf[0] - '0';		l = (unsigned)strlen(buf);		buf[l-1] = NULL;		Color_fname[i] = malloc(l);		(void)strcpy(Color_fname[i], buf+1);		i++;	}	(void)fclose(fp);	Ncolors = ncolors = i;}static int m1[] = { 1, S_IREAD>>0, 'r', '-' };static int m2[] = { 1, S_IWRITE>>0, 'w', '-' };static int m3[] = { 3, S_ISUID|(S_IEXEC>>0), 's', S_IEXEC>>0, 'x', S_ISUID, 'S', '-' };static int m4[] = { 1, S_IREAD>>3, 'r', '-' };static int m5[] = { 1, S_IWRITE>>3, 'w', '-' };static int m6[] = { 3, S_ISGID|(S_IEXEC>>3), 's', S_IEXEC>>3, 'x', S_ISGID, 'S', '-' };static int m7[] = { 1, S_IREAD>>6, 'r', '-' };static int m8[] = { 1, S_IWRITE>>6, 'w', '-' };static int m9[] = { 2, S_ISVTX, 't', S_IEXEC>>6, 'x', '-' };static int *m[] = { m1, m2, m3, m4, m5, m6, m7, m8, m9};static char *fmtmode(lp, flags)	char *lp;	int flags;{	int **mp;	for (mp = &m[0]; mp < &m[sizeof(m)/sizeof(m[0])]; ) {		register int *pairp = *mp++;		register int n = *pairp++;		while (n-- > 0) {			if ((flags&*pairp) == *pairp) {				pairp++;				break;			} else				pairp += 2;		}					*lp++ = *pairp;	}	return (lp);}staticcheck_bind(f_p)	register FV_FILE *f_p;{	register int j;	struct stat fstatus;		/* File status */	for (j=Fv_nappbind; j<Fv_nbind; j++)		if (*Fv_bind[j].pattern)		{			/* Name regular expression */			if (fv_match(f_p->name, Fv_bind[j].pattern)==1)			{				f_p->icon = j;				break;			}		}		else		{			/* Magic number */			stat(f_p->name, &fstatus);			if (fv_magic(f_p->name, Fv_bind[j].magic, &fstatus))			{				f_p->icon = j;				break;			}		}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -