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

📄 gridtext.c

📁 基于rtos开发的浏览器!
💻 C
📖 第 1 页 / 共 5 页
字号:
/* turn the TITLE style off */    LynxChangeStyle(s_title, ABS_OFF, 0);#endif /* USE_COLOR_STYLE */    lynx_stop_title_color ();    return;}/*	Output a page**	-------------*/PRIVATE void display_page ARGS3(	HText *,	text,	int,		line_number,	char *,		target){    HTLine * line = NULL;    int i;    char *cp, tmp[7];    int last_screen;    TextAnchor *Anchor_ptr = NULL;    FormInfo *FormInfo_ptr;    BOOL display_flag = FALSE;    HTAnchor *link_dest;    HTAnchor *link_dest_intl = NULL;    static int last_nlinks = 0;    static int charset_last_displayed = -1;    lynx_mode = NORMAL_LYNX_MODE;    if (text == NULL) {	/*	 *  Check whether to force a screen clear to enable scrollback,	 *  or as a hack to fix a reverse clear screen problem for some	 *  curses packages. - shf@access.digex.net & seldon@eskimo.com	 */	if (enable_scrollback) {	    addch('*');	    refresh();	    clear();	}	addstr("\n\nError accessing document!\nNo data available!\n");	refresh();	nlinks = 0;  /* set number of links to 0 */	return;    }    tmp[0] = tmp[1] = tmp[2] = '\0';    text->page_has_target = NO;    last_screen = text->Lines - (display_lines - 2);    line = text->last_line->prev;    /*     *  Constrain the line number to be within the document.     */    if (text->Lines < (display_lines))	line_number = 0;    else if (line_number > text->Lines)	line_number = last_screen;    else if (line_number < 0)	line_number = 0;    for (i = 0, line = text->last_line->next;		/* Find line */	 i < line_number && (line != text->last_line);	 i++, line = line->next) {			/* Loop */#ifndef VMS	if (!LYNoCore) {	    assert(line->next != NULL);	} else if (line->next == NULL) {	    if (enable_scrollback) {		addch('*');		refresh();		clear();	    }	    addstr("\n\nError drawing page!\nBad HText structure!\n");	    refresh();	    nlinks = 0;  /* set number of links to 0 */	    return;	}#else	assert(line->next != NULL);#endif /* !VMS */    }    if (LYlowest_eightbit[current_char_set] <= 255 &&	(current_char_set != charset_last_displayed) &&	/*	 *  current_char_set has changed since last invocation,	 *  and it's not just 7-bit.	 *  Also we don't want to do this for -dump and -source etc.	 */	LYCursesON) {	charset_last_displayed = current_char_set;#ifdef EXP_CHARTRANS_AUTOSWITCH#ifdef LINUX	/*	 *  Currently implemented only for LINUX	 */	stop_curses();	UCChangeTerminalCodepage(current_char_set,				 &LYCharSet_UC[current_char_set]);	start_curses();#endif /* LINUX */#endif /* EXP_CHARTRANS_AUTOSWITCH */    }    /*     *  Check whether to force a screen clear to enable scrollback,     *  or as a hack to fix a reverse clear screen problem for some     *  curses packages. - shf@access.digex.net & seldon@eskimo.com     */    if (enable_scrollback) {	addch('*');	refresh();	clear();    }    text->top_of_screen = line_number;    display_title(text);  /* will move cursor to top of screen */    display_flag=TRUE;    /*     *  Output the page.     */    if (line) {	char *data;	int offset, HitOffset, LenNeeded;	for (i = 0; i < (display_lines); i++)  {	    /*	     *  Verify and display each line.	     */#ifndef VMS	    if (!LYNoCore) {		assert(line != NULL);	    } else if (line == NULL) {		if (enable_scrollback) {		    addch('*');		    refresh();		    clear();		}		addstr("\n\nError drawing page!\nBad HText structure!\n");		refresh();		nlinks = 0;  /* set number of links to 0 */		return;	    }#else	    assert(line != NULL);#endif /* !VMS */	    display_line(line, text);#if defined(FANCY_CURSES) || defined(USE_SLANG)	    /*	     *  If the target is on this line, recursively	     *  seek and emphasize it. - FM	     */	    data = (char *)line->data;	    offset = (int)line->offset;	    while ((target && *target) &&		   (case_sensitive ?		    (cp = LYno_attr_mbcs_strstr(data,						target,						text->T.output_utf8,						&HitOffset,						&LenNeeded)) != NULL :		    (cp = LYno_attr_mbcs_case_strstr(data,						     target,						text->T.output_utf8,						&HitOffset,						&LenNeeded)) != NULL) &&		   ((int)line->offset + LenNeeded) < LYcols) {		int itmp = 0;		int written = 0;		int x_pos = offset + (int)(cp - data);		int len = strlen(target);		size_t utf_extra = 0;		int y;		text->page_has_target = YES;		/*		 *  Start the emphasis.		 */		LYstartTargetEmphasis();		/*		 *  Output the target characters.		 */		for (;		     written < len && (tmp[0] = data[itmp]) != '\0';		     itmp++)  {		    if (IsSpecialAttrChar(tmp[0])) {			/*			 *  Ignore special characters.			 */			x_pos--;		    } else if (cp == &data[itmp]) {			/*			 *  First printable character of target.			 */			move((i + 1), x_pos);			if (text->T.output_utf8 && !isascii(tmp[0])) {			    if ((*tmp & 0xe0) == 0xc0) {				utf_extra = 1;			    } else if ((*tmp & 0xf0) == 0xe0) {				utf_extra = 2;			    } else if ((*tmp & 0xf8) == 0xf0) {				utf_extra = 3;			    } else if ((*tmp & 0xfc) == 0xf8) {				utf_extra = 4;			    } else if ((*tmp & 0xfe) == 0xfc) {				utf_extra = 5;			    } else {				/*				 *  Garbage.				 */				utf_extra = 0;			    }			    if (strlen(&line->data[itmp+1]) < utf_extra) {				/*				 *  Shouldn't happen.				 */				utf_extra = 0;			    }			}			if (utf_extra) {			    strncpy(&tmp[1], &line->data[itmp+1], utf_extra);			    tmp[utf_extra+1] = '\0';			    itmp += utf_extra;			    addstr(tmp);			    tmp[1] = '\0';			    written += (utf_extra + 1);			    utf_extra = 0;			} else if (HTCJK != NOCJK && !isascii(tmp[0])) {			    /*			     *  For CJK strings, by Masanobu Kimura.			     */			    tmp[1] = data[++itmp];			    addstr(tmp);			    tmp[1] = '\0';			    written += 2;			} else {			    addstr(tmp);			    written++;			}		    } else if (&data[itmp] > cp) {			/*			 *  Output all the other printable target chars.			 */			if (text->T.output_utf8 && !isascii(tmp[0])) {			    if ((*tmp & 0xe0) == 0xc0) {				utf_extra = 1;			    } else if ((*tmp & 0xf0) == 0xe0) {				utf_extra = 2;			    } else if ((*tmp & 0xf8) == 0xf0) {				utf_extra = 3;			    } else if ((*tmp & 0xfc) == 0xf8) {				utf_extra = 4;			    } else if ((*tmp & 0xfe) == 0xfc) {				utf_extra = 5;			    } else {				/*				 *  Garbage.				 */				utf_extra = 0;			    }			    if (strlen(&line->data[itmp+1]) < utf_extra) {				/*				 *  Shouldn't happen.				 */				utf_extra = 0;			    }			}			if (utf_extra) {			    strncpy(&tmp[1], &line->data[itmp+1], utf_extra);			    tmp[utf_extra+1] = '\0';			    itmp += utf_extra;			    addstr(tmp);			    tmp[1] = '\0';			    written += (utf_extra + 1);			    utf_extra = 0;			} else if (HTCJK != NOCJK && !isascii(tmp[0])) {			    /*			     *  For CJK strings, by Masanobu Kimura.			     */			    tmp[1] = data[++itmp];			    addstr(tmp);			    tmp[1] = '\0';			    written += 2;			} else {			    addstr(tmp);			    written++;			}		    }		}		/*		 *  Stop the emphasis, and reset the offset and		 *  data pointer for our current position in the		 *  line. - FM		 */		LYstopTargetEmphasis();		LYGetYX(y, offset);		data = (char *)&data[itmp];		/*		 *  Adjust the cursor position, should we be at		 *  the end of the line, or not have another hit		 *  in it. - FM		 */		move((i + 2), 0);	    }#endif /* FANCY CURSES || USE_SLANG */	    /*	     *  Stop if this is the last line.  Otherwise, make sure	     *  display_flag is set and process the next line. - FM	     */	    if (line == text->last_line) {		/*		 *  Clear remaining lines of display.		 */		for (i++; i < (display_lines); i++) {		    move((i + 1), 0);		    clrtoeol();		}		break;	    }	    display_flag = TRUE;	    line = line->next;	}    }    text->next_line = line;	/* Line after screen */    text->stale = NO;		/* Display is up-to-date */    /*     *  Add the anchors to Lynx structures.     */    nlinks = 0;    for (Anchor_ptr=text->first_anchor;  Anchor_ptr != NULL &&		Anchor_ptr->line_num <= line_number+(display_lines);					    Anchor_ptr = Anchor_ptr->next) {	if (Anchor_ptr->line_num >= line_number &&		Anchor_ptr->line_num < line_number+(display_lines)) {	    /*	     *  Load normal hypertext anchors.	     */	    if (Anchor_ptr->show_anchor && Anchor_ptr->hightext &&			strlen(Anchor_ptr->hightext) > 0 &&			(Anchor_ptr->link_type & HYPERTEXT_ANCHOR)) {		links[nlinks].hightext	= Anchor_ptr->hightext;		links[nlinks].hightext2 = Anchor_ptr->hightext2;		links[nlinks].hightext2_offset = Anchor_ptr->hightext2offset;		links[nlinks].inUnderline = Anchor_ptr->inUnderline;		links[nlinks].anchor_number = Anchor_ptr->number;		links[nlinks].anchor_line_num = Anchor_ptr->line_num;		link_dest = HTAnchor_followMainLink(					     (HTAnchor *)Anchor_ptr->anchor);		{		    /*		     *	Memory leak fixed 05-27-94		     *	Garrett Arch Blythe		     */	            auto char *cp_AnchorAddress = NULL;		    if (traversal)		        cp_AnchorAddress = stub_HTAnchor_address(link_dest);		    else {#ifndef DONT_TRACK_INTERNAL_LINKS			if (Anchor_ptr->link_type == INTERNAL_LINK_ANCHOR) {			    link_dest_intl = HTAnchor_followTypedLink(				(HTAnchor *)Anchor_ptr->anchor, LINK_INTERNAL);			    if (link_dest_intl && link_dest_intl != link_dest) {				if (TRACE)				    fprintf(stderr,				    "display_page: unexpected typed link to %s!\n",					    link_dest_intl->parent->address);				link_dest_intl = NULL;			    }			} else			    link_dest_intl = NULL;			if (link_dest_intl) {			    char *cp2 = HTAnchor_address(link_dest_intl);			    cp_AnchorAddress = cp2;			} else#endif			    cp_AnchorAddress = HTAnchor_address(link_dest);		    }		    FREE(links[nlinks].lname);		    if (cp_AnchorAddress != NULL)			links[nlinks].lname = cp_AnchorAddress;		    else			StrAllocCopy(links[nlinks].lname, empty_string);		}		links[nlinks].lx = Anchor_ptr->line_pos;		links[nlinks].ly = ((Anchor_ptr->line_num + 1) - line_number);		if (link_dest_intl)		    links[nlinks].type = WWW_INTERN_LINK_TYPE;		else		    links[nlinks].type = WWW_LINK_TYPE;		links[nlinks].target = empty_string;		links[nlinks].form = NULL;	        nlinks++;		display_flag = TRUE;	    } else if (Anchor_ptr->link_type == INPUT_ANCHOR			&& Anchor_ptr->input_field->type != F_HIDDEN_TYPE) {		/*		 *  Handle form fields.		 */		lynx_mode = FORMS_LYNX_MODE;		FormInfo_ptr = Anchor_ptr->input_field;		links[nlinks].anchor_number = Anchor_ptr->number;		links[nlinks].anchor_line_num = Anchor_ptr->line_num;		links[nlinks].form = FormInfo_ptr;		links[nlinks].lx = Anchor_ptr->line_pos;		links[nlinks].ly = ((Anchor_ptr->line_num + 1) - line_number);		links[nlinks].type = WWW_FORM_LINK_TYPE;		links[nlinks].inUnderline = Anchor_ptr->inUnderline;		links[nlinks].target = empty_string;		StrAllocCopy(links[nlinks].lname, empty_string);		if (FormInfo_ptr->type == F_RADIO_TYPE) {		    if (FormInfo_ptr->num_value)			links[nlinks].hightext = checked_radio;		    else			links[nlinks].hightext = unchecked_radio;		} else if (FormInfo_ptr->type == F_CHECKBOX_TYPE) {		    if (FormInfo_ptr->num_value)			links[nlinks].hightext = checked_box;		    else			links[nlinks].hightext = unchecked_box;		} else if (FormInfo_ptr->type == F_PASSWORD_TYPE) {		    links[nlinks].hightext = STARS(strlen(FormInfo_ptr->value));		} else {  /* TEXT type */		    links[nlinks].hightext = FormInfo_ptr->value;		}		/*		 *  Never a second line on form types.		 */		links[nlinks].hightext2 = NULL;		links[nlinks].hightext2_offset = 0;		nlinks++;	        /*		 *  Bold the link after incrementing nlinks.		 */		highlight(OFF, (nlinks - 1), target);		display_flag = TRUE;	    } else {		/*		 *  Not showing anchor.		 */		if (TRACE &&		    Anchor_ptr->hightext && *Anchor_ptr->hightext)		    fprintf(stderr,			    "\nGridText: Not showing link, hightext=%s\n",			    Anchor_ptr->hightext);	    }	}	if (Anchor_ptr == text->last_anchor)	    /*	     *  No more links in document. - FM	     */	    break;	if (nlinks == MAXLINKS) {	    /*	     *  Links array is full.  If interactive, tell user	     *  to use half-page or two-line scrolling. - FM	     */	    if (LYCursesON) {		_statusline(MAXLINKS_REACHED);		sleep(AlertSecs);	    }	    if (TRACE)	        fprintf(stderr, "\ndisplay_page: MAXLINKS reached.\n");	    break;	}    }    /*     *  Free any un-reallocated links[] entries     *  from the previous page draw. - FM     */    for (i = nlinks; i < last_nlinks; i++)	FREE(links[i].lname);

⌨️ 快捷键说明

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