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

📄 format.c

📁 aee是一种易使用的文本编辑器。你可以不用说明书来使用它。它提供终端接口和本地的X-windows接口。它的特性包括即弹的菜单
💻 C
字号:
/* |	format.c | |	$Header: /home/hugh/sources/aee/RCS/format.c,v 1.11 1998/10/11 17:02:14 hugh Exp $ */ /* |	Copyright (c) 1987, 1988, 1989, 1991, 1994, 1995, 1996 Hugh Mahon. */#include "aee.h"int Blank_Line(test_line)	/* test if line has any non-space characters	*/struct text *test_line;{	char *line;	int length;	if (test_line == NULL)		return(TRUE);	length = 0;	line = test_line->line;		/*	 |	to handle troff/nroff documents, consider a line with a 	 |	period ('.') in the first column to be blank	 */	if ((*line == '.') || (*line == '>'))		return(TRUE);	while ((*line != (char) NULL) && ((*line == ' ') || (*line == '\t')) && (length <= curr_buff->curr_line->line_length))	{		length++;		line++;	}	if (*line != (char) NULL)		return(FALSE);	else		return(TRUE);}void Format()	/* format the paragraph according to set margins	*/{	struct text *temp_line;	struct text *start_line;	int count;	int orig_count;	int temp_pos;	int string_count;	int offset;	int temp_case;	int temp_forward;	int temp_literal;	int temp_indent;	int temp_over;	int temp_af;	int counter;	char *line;	char *tmp_srchstr;	char *temp1, *temp2;	char *temp_dword;	char temp_d_char = d_char;/* |	if observ_margins is not set, the current line is blank, or text  |	marking is on, do not format the current paragraph */	if ((!observ_margins) || (Blank_Line(curr_buff->curr_line)) || (mark_text))		return;	clr_cmd_line = TRUE;/* |	save the currently set flags, and clear them */	temp_indent = indent;	indent = FALSE;	temp_literal = literal;	literal = TRUE;	temp_af = auto_format;	auto_format = FALSE;	wmove(com_win, 0, 0);	wclrtoeol(com_win);	wprintw(com_win, fmting_par_msg);	wrefresh(com_win);/* |	get current position in paragraph, so after formatting, the cursor  |	will be in the same relative position */	temp_line = curr_buff->curr_line;	temp_pos = offset = curr_buff->position;	if (curr_buff->position != 1)		prev_word();	temp_dword = d_word;	d_word = NULL;	temp_forward = forward;	forward = TRUE;	temp_case = case_sen;	case_sen = TRUE;	temp_over = overstrike;	overstrike = FALSE;	tmp_srchstr = srch_str;	temp2 = srch_str = (char *) xalloc(curr_buff->curr_line->line_length - curr_buff->position);	if ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))		adv_word();	offset -= curr_buff->position;	line = temp1 = curr_buff->pointer;	counter = curr_buff->position;	while ((*temp1 != (char) NULL) && (*temp1 != ' ') && (*temp1 != '\t') && (counter < curr_buff->curr_line->line_length))	{		*temp2 = *temp1;		temp2++;		temp1++;		counter++;	}	*temp2 = (char) NULL;	if (curr_buff->position != 1)		bol();	while (!Blank_Line(curr_buff->curr_line->prev_line))		bol();	start_line = curr_buff->curr_line;	string_count = 0;	while (line != curr_buff->pointer)	{		search(TRUE, curr_buff->curr_line, curr_buff->position, curr_buff->pointer, 0, FALSE, FALSE);		string_count++;	}	wmove(com_win, 0, 0);	wclrtoeol(com_win);	wprintw(com_win, fmting_par_msg);	wrefresh(com_win);/* |	now get back to the start of the paragraph to start formatting */	if (curr_buff->position != 1)		bol();	while (!Blank_Line(curr_buff->curr_line->prev_line))		bol();	observ_margins = FALSE;/* |	Start going through lines, putting spaces at end of lines if they do  |	not already exist.  Append lines together to get one long line, and  |	eliminate spacing at begin of lines. */	while (!Blank_Line(curr_buff->curr_line->next_line))	{		eol();		left(TRUE);		if (*curr_buff->pointer != ' ')		{			right(TRUE);			insert(' ');		}		else			right(TRUE);		del_char(FALSE);		if ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))			del_word(FALSE);	}/* |	Now there is one long line.  Eliminate extra spaces within the line. */	bol();/* |	At the start of the paragraph allow indendentation, so don't  |	automatically delete space(s) or tab(s). */	if ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))		adv_word();	while (curr_buff->position < curr_buff->curr_line->line_length)	{		if ((*curr_buff->pointer == ' ') && (*(curr_buff->pointer + 1) == ' '))			del_char(FALSE);		else			right(TRUE);	}/* |	Now make sure there are two spaces after a '.'. */	bol();	while (curr_buff->position < curr_buff->curr_line->line_length)	{		if ((*curr_buff->pointer == '.') && (*(curr_buff->pointer + 1) == ' '))		{			right(TRUE);			insert(' ');			insert(' ');			while (*curr_buff->pointer == ' ')				del_char(FALSE);		}		right(TRUE);	}	observ_margins = TRUE;	bol();	wmove(com_win, 0, 0);	wclrtoeol(com_win);	wprintw(com_win, fmting_par_msg);	wrefresh(com_win);/* |	make sure that left margin is properly set for start of paragraph */	if ((curr_buff->position < left_margin) && (*curr_buff->pointer != ' ') && (*curr_buff->pointer != '\t'))	{		insert(' ');		delete(TRUE);	}	if (*curr_buff->pointer == ' ')	{		adv_word();		if (curr_buff->scr_pos < left_margin)		{			insert(' ');			delete(TRUE);		}	}	if (*curr_buff->pointer == '\t')	{		insert(' ');		delete(TRUE);		adv_word();	}/* |	create lines between margins */	while (curr_buff->position < curr_buff->curr_line->line_length)	{		while ((curr_buff->scr_pos < right_margin) && (curr_buff->position < curr_buff->curr_line->line_length))			right(TRUE);		if (curr_buff->position < curr_buff->curr_line->line_length)		{			prev_word();			if (curr_buff->position == 1)				adv_word();			insert_line(TRUE);		}	}/* |	go back to begin of paragraph */	bol();	while (!Blank_Line(curr_buff->curr_line->prev_line))		bol();	while (!Blank_Line(curr_buff->curr_line->next_line))	{		eol();/* |	eliminate blanks at end of line */		while (curr_buff->pointer[-1] == ' ')			delete(TRUE);/* |	justify right margin */		orig_count = count = right_margin - curr_buff->scr_pos;		while ((right_justify) && (count > 0) && (!Blank_Line(curr_buff->curr_line->next_line)))		{			while ((count > 0) && (curr_buff->scr_pos > left_margin))			{				prev_word();				if (curr_buff->scr_pos > left_margin)				{					insert(' ');					count--;				}			}			if ((count >= 0) && (curr_buff->scr_pos <= left_margin))				eol();			/*			 |	if there was no place to insert a ' '			 */			if (count == orig_count)				count = 0;		}/* |	position cursor at end of line so that cursor will go to the end  |	of the next line at the top of the loop when eol() is called */		if (curr_buff->curr_line->line_length != curr_buff->position)			eol();	}/* |	put cursor back to original position */	bol();	while (!Blank_Line(curr_buff->curr_line->prev_line))		bol();/* |	find word cursor was in */	while (string_count > 0)	{		search(TRUE, curr_buff->curr_line, curr_buff->position, curr_buff->pointer, 0, FALSE, FALSE);		string_count--;	}/* |	offset the cursor to where it was before from the start of the word */	while (offset > 0)	{		offset--;		right(TRUE);	}/* |	reset flags and strings to what they were before formatting */	if (d_word != NULL)		free(d_word);	d_word = temp_dword;	forward = temp_forward;	case_sen = temp_case;	free(srch_str);	srch_str = tmp_srchstr;	indent = temp_indent;	overstrike = temp_over;	literal = temp_literal;	d_char = temp_d_char;	auto_format = temp_af;	midscreen(curr_buff->scr_vert, curr_buff->position);}intfirst_word_len(test_line)struct text *test_line;{	int counter;	char *pnt;	if (test_line == NULL)		return(0);	pnt = test_line->line;	if ((pnt == NULL) || (*pnt == (char) NULL) || (*pnt == '.') || 	    (*pnt == '>'))		return(0);	if ((*pnt == ' ') || (*pnt == '\t'))	{		pnt = next_word(pnt);	}	if (*pnt == (char) NULL)		return(0);	counter = 0;	while ((*pnt != (char) NULL) && ((*pnt != ' ') && (*pnt != '\t')))	{		pnt++;		counter++;	}	while ((*pnt != (char) NULL) && ((*pnt == ' ') || (*pnt == '\t')))	{		pnt++;		counter++;	}	return(counter);}void Auto_Format()	/* format the paragraph according to set margins	*/{	int string_count;	int offset;	int temp_case;	int word_len;	int temp_dwl;	int leave_loop = FALSE;	int status;	int counter;	int tmp_d_line_length;	char temp_literal;	char *line;	char *tmp_srchstr;	char *temp1, *temp2;	char *temp_dword;	char temp_d_char = d_char;	char *tmp_d_line;	char temp_forward;	char not_blank;/* |	if line_wrap is not set, or the current line is blank,  |	do not format the current paragraph */	if ((!observ_margins) || (Blank_Line(curr_buff->curr_line)) || (mark_text))		return;/* |	get current position in paragraph, so after formatting, the cursor  |	will be in the same relative position */	temp_literal = literal;	literal = TRUE;	tmp_d_line = d_line;	tmp_d_line_length = dlt_line->line_length;	d_line = NULL;	auto_format = FALSE;	temp_forward = forward;	forward = TRUE;	offset = curr_buff->position;	if ((curr_buff->position != 1) && ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t') || (curr_buff->position == curr_buff->curr_line->line_length) || (*curr_buff->pointer == (char) NULL)))		prev_word();	temp_dword = d_word;	temp_dwl = d_wrd_len;	d_wrd_len = 0;	d_word = NULL;	temp_case = case_sen;	case_sen = TRUE;	tmp_srchstr = srch_str;	temp2 = srch_str = (char *) xalloc(1 + curr_buff->curr_line->line_length - curr_buff->position);	if ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))		adv_word();	offset -= curr_buff->position;	counter = curr_buff->position;	line = temp1 = curr_buff->pointer;	while ((*temp1 != (char) NULL) && (*temp1 != ' ') && (*temp1 != '\t') && (counter < curr_buff->curr_line->line_length))	{		*temp2 = *temp1;		temp2++;		temp1++;		counter++;	}	*temp2 = (char) NULL;	if (curr_buff->position != 1)		bol();	while (!Blank_Line(curr_buff->curr_line->prev_line))		bol();	string_count = 0;	status = TRUE;	while ((line != curr_buff->pointer) && (status))	{		status = search(TRUE, curr_buff->curr_line, curr_buff->position, curr_buff->pointer, 0, FALSE, FALSE);		string_count++;	}/* |	now get back to the start of the paragraph to start checking */	if (curr_buff->position != 1)		bol();	while (!Blank_Line(curr_buff->curr_line->prev_line))		bol();/* |	Start going through lines, putting spaces at end of lines if they do  |	not already exist.  Check line length, and move words to the next line  |	if they cross the margin.  Then get words from the next line if they  |	will fit in before the margin.  Also count the number of lines that  |	are in the paragraph. */	counter = 0;	while (!leave_loop)	{		/*		 |	make sure that it fits in the left margin		 */		if (left_margin > 0)		{			if (curr_buff->position != 1)			{				bol();			}			if ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))				adv_word();			if (curr_buff->scr_pos < left_margin)			{				insert(' ');				delete(TRUE);			}		}		if (curr_buff->position != curr_buff->curr_line->line_length)			eol();		left(TRUE);		if (*curr_buff->pointer != ' ')		{			right(TRUE);			insert(' ');		}		else			right(TRUE);		not_blank = FALSE;		/*		 |	fill line if first word on next line will fit 		 |	in the line without crossing the margin		 */		while (((word_len = first_word_len(curr_buff->curr_line->next_line)) > 0) 		      && ((curr_buff->scr_pos + word_len) < right_margin))		{			adv_line();			if ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))				adv_word();			del_word(FALSE);			if (curr_buff->position != 1)				bol();			/*			 |	We know this line was not blank before, so 			 |	make sure that it doesn't have one of the 			 |	leading characters that indicate the line 			 |	should not be modified.			 |			 |	We also know that this character should not 			 |	be left as the first character of this line.			 */			if ((Blank_Line(curr_buff->curr_line)) && 			    (curr_buff->curr_line->line[0] != '.') && 			    (curr_buff->curr_line->line[0] != '>'))			{				del_line(FALSE);				not_blank = FALSE;			}			else				not_blank = TRUE;			/*			 |   go to end of previous line			 */			left(TRUE);			undel_word();			eol();			/*			 |   make sure there's a space at the end of the line			 */			left(TRUE);			if (*curr_buff->pointer != ' ')			{				right(TRUE);				insert(' ');			}			else				right(TRUE);		}		/*		 |	make sure line does not cross right margin		 */		while (right_margin <= curr_buff->scr_pos)		{			prev_word();			if (curr_buff->position != 1)			{				del_word(FALSE);				if (Blank_Line(curr_buff->curr_line->next_line))					insert_line(TRUE);				else					adv_line();				if ((*curr_buff->pointer == ' ') || (*curr_buff->pointer == '\t'))					adv_word();				undel_word();				not_blank = TRUE;				if (curr_buff->position != 1)					bol();				left(TRUE);			}		}		if ((!Blank_Line(curr_buff->curr_line->next_line)) || (not_blank))		{			adv_line();			counter++;		}		else			leave_loop = TRUE;	}/* |	go back to begin of paragraph, put cursor back to original position */	if (curr_buff->position != 1)		bol();	while ((counter-- > 0) || (!Blank_Line(curr_buff->curr_line->prev_line)))		bol();/* |	find word cursor was in */	status = TRUE;	while ((status) && (string_count > 0))	{		status = search(TRUE, curr_buff->curr_line, curr_buff->position, curr_buff->pointer, 0, FALSE, FALSE);		string_count--;	}/* |	offset the cursor to where it was before from the start of the word */	while (offset > 0)	{		offset--;		right(TRUE);	}	if ((string_count > 0) && (offset < 0))	{		while (offset < 0)		{			offset++;			left(TRUE);		}	}/* |	reset flags and strings to what they were before formatting */	if (d_word != NULL)		free(d_word);	d_word = temp_dword;	d_wrd_len = temp_dwl;	case_sen = temp_case;	free(srch_str);	srch_str = tmp_srchstr;	d_char = temp_d_char;	auto_format = TRUE;	dlt_line->line_length = tmp_d_line_length;	d_line = tmp_d_line;	forward = temp_forward;	formatted = TRUE;	literal = temp_literal;}

⌨️ 快捷键说明

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