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

📄 lyprint.c

📁 基于rtos开发的浏览器!
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "HTUtils.h"#include "tcp.h"#include "HTAccess.h"#include "HTList.h"#include "HTAlert.h"#include "HTFile.h"#include "LYCurses.h"#include "GridText.h"#include "LYUtils.h"#include "LYPrint.h"#include "LYGlobalDefs.h"#include "LYSignal.h"#include "LYStrings.h"#include "LYClean.h"#include "LYGetFile.h"#include "LYHistory.h"#include "LYSystem.h"#include "LYList.h"#include "LYCharSets.h"  /* To get current charset for mail header. */#ifdef VMS#include "HTVMSUtils.h"#endif /* VMS */#ifdef DOSPATH#include "HTDOS.h"#endif#include "LYLeaks.h"#define FREE(x) if (x) {free(x); x = NULL;}/* *  printfile prints out the current file minus the links and targets *  to a veriaty of places *//* it parses an incoming link that looks like * *  LYNXPRINT://LOCAL_FILE/lines=## *  LYNXPRINT://MAIL_FILE/lines=## *  LYNXPRINT://TO_SCREEN/lines=## *  LYNXPRINT://PRINTER/lines=##/number=# */#define TO_FILE   1#define TO_SCREEN 2#define MAIL	  3#define PRINTER   4#ifdef VMSPRIVATE int remove_quotes PARAMS((char *string));#endif /* VMS */PUBLIC int printfile ARGS1(	document *,	newdoc){    static char tempfile[256];    static BOOLEAN first = TRUE;    char buffer[LINESIZE];    char filename[LINESIZE];    char user_response[256];    int lines_in_file = 0;    int printer_number = 0;    int pages = 0;    int type = 0, c, len;    FILE *outfile_fp;    char *cp = NULL;    lynx_printer_item_type *cur_printer;    char *sug_filename = NULL;    char *link_info = NULL;    DocAddress WWWDoc;    int pagelen = 0;    int ch, recall;    int FnameTotal;    int FnameNum;    BOOLEAN FirstRecall = TRUE;    char *content_base = NULL, *content_location = NULL;    HTFormat format;    HTAtom *encoding;    BOOL use_mime, use_cte, use_type;    CONST char *disp_charset;    static BOOLEAN first_mail_preparsed = TRUE;    char *envbuffer = NULL;#ifdef VMS    BOOLEAN isPMDF = FALSE;    char hdrfile[256];    FILE *hfd;    if (!strncasecomp(system_mail, "PMDF SEND", 9)) {	isPMDF = TRUE;    }#endif /* VMS */    /*     *	Extract useful info from URL.     */    StrAllocCopy(link_info, newdoc->address+12);    /*     *	Reload the file we want to print into memory.     */    LYpop(newdoc);    WWWDoc.address = newdoc->address;    WWWDoc.post_data = newdoc->post_data;    WWWDoc.post_content_type = newdoc->post_content_type;    WWWDoc.bookmark = newdoc->bookmark;    WWWDoc.isHEAD = newdoc->isHEAD;    WWWDoc.safe = newdoc->safe;    if (!HTLoadAbsolute(&WWWDoc))	return(NOT_FOUND);    /*     *	If we have an explicit content-base, we may use it even     *	if not in source mode. - kw     */    if (HText_getContentBase()) {	StrAllocCopy(content_base, HText_getContentBase());	collapse_spaces(content_base);	if (!(content_base && *content_base)) {	    FREE(content_base);	}    }    /*     *	If document is source, load the content_base     *	and content_location strings. - FM     */    if (HTisDocumentSource()) {	if (HText_getContentLocation()) {	    StrAllocCopy(content_location, HText_getContentLocation());	    collapse_spaces(content_location);	    if (!(content_location && *content_location)) {		FREE(content_location);	    }	}	if (!content_base) {	    if ((content_location) && is_url(content_location)) {		StrAllocCopy(content_base, content_location);	    } else {		StrAllocCopy(content_base, newdoc->address);	    }	}	if (!content_location) {	    StrAllocCopy(content_location, newdoc->address);	}    }    /*     *	Load the suggested filename string. - FM     */    if (HText_getSugFname() != NULL)	StrAllocCopy(sug_filename, HText_getSugFname()); /* must be freed */    else	StrAllocCopy(sug_filename, newdoc->address); /* must be freed */    /*     *	Strip any gzip or compress suffix, if present. - FM     */    cp = NULL;    if (strlen(sug_filename) > 3) {	cp = (char *)&sug_filename[(strlen(sug_filename) - 3)];	if ((*cp == '.' || *cp == '-' || *cp == '_') &&	    !strcasecomp((cp + 1), "gz")) {	    *cp = '\0';	} else {	    cp = NULL;	}    }    if ((cp == NULL) && strlen(sug_filename) > 2) {	cp = (char *)&sug_filename[(strlen(sug_filename) - 2)];	if ((*cp == '.' || *cp == '-' || *cp == '_') &&	    !strcasecomp((cp + 1), "Z")) {	    *cp = '\0';	}    }    cp = NULL;    /*     *	Get the number of lines in the file.     */    if ((cp = (char *)strstr(link_info, "lines=")) != NULL) {	/*	 *  Terminate prev string here.	 */	*cp = '\0';	/*	 *  Number of characters in "lines=".	 */	cp += 6;	lines_in_file = atoi(cp);	pages = lines_in_file/66;    }    /*     *	Determine the type.     */    if (strstr(link_info, "LOCAL_FILE")) {	type = TO_FILE;    } else if (strstr(link_info, "TO_SCREEN")) {	type = TO_SCREEN;    } else if (strstr(link_info, "MAIL_FILE")) {	type = MAIL;    } else if (strstr(link_info, "PRINTER")) {	type = PRINTER;	if ((cp = (char *)strstr(link_info, "number=")) != NULL) {	    /* number of characters in "number=" */	    cp += 7;	    printer_number = atoi(cp);	}	if ((cp = (char *)strstr(link_info, "pagelen=")) != NULL) {	    /* number of characters in "pagelen=" */	    cp += 8;	    pagelen = atoi(cp);	} else {	    /* default to 66 lines */	    pagelen = 66;	}    }    /*     *	Set up the sug_filenames recall buffer.     */    FnameTotal = (sug_filenames ? HTList_count(sug_filenames) : 0);    recall = ((FnameTotal >= 1) ? RECALL : NORECALL);    FnameNum = FnameTotal;    /*     *	Act on the request. - FM     */    switch (type) {	case TO_FILE:#if defined(__DJGPP__) || defined(_WINDOWS)		_fmode = O_TEXT;#endif /* __DJGPP__  or _WINDOWS */		_statusline(FILENAME_PROMPT);	retry:	strcpy(filename, sug_filename);  /* add suggestion info */		/* make the sug_filename conform to system specs */		change_sug_filename(filename);		if (!(HTisDocumentSource()) &&		    (cp = strrchr(filename, '.')) != NULL) {		    format = HTFileFormat(filename, &encoding, NULL);		    if (!strcasecomp(format->name, "text/html") ||			!IsUnityEnc(encoding)) {			*cp = '\0';			strcat(filename, ".txt");		    }		}		if (lynx_save_space && *lynx_save_space) {		    strcpy(buffer, lynx_save_space);		    strcat(buffer, filename);		    strcpy(filename, buffer);		}	check_recall:		if ((ch = LYgetstr(filename, VISIBLE,				   sizeof(filename), recall)) < 0 ||		    *filename == '\0' || ch == UPARROW || ch == DNARROW) {		    if (recall && ch == UPARROW) {			if (FirstRecall) {			    FirstRecall = FALSE;			    /*			     *	Use the last Fname in the list. - FM			     */			    FnameNum = 0;			} else {			    /*			     *	Go back to the previous Fname			     *	in the list. - FM			     */			    FnameNum++;			}			if (FnameNum >= FnameTotal) {			    /*			     *	Reset the FirstRecall flag,			     *	and use sug_file or a blank. - FM			     */			    FirstRecall = TRUE;			    FnameNum = FnameTotal;			    _statusline(FILENAME_PROMPT);			    goto retry;			} else if ((cp = (char *)HTList_objectAt(							sug_filenames,							FnameNum)) != NULL) {			    strcpy(filename, cp);			    if (FnameTotal == 1) {				_statusline(EDIT_THE_PREV_FILENAME);			    } else {				_statusline(EDIT_A_PREV_FILENAME);			    }			    goto check_recall;			}		    } else if (recall && ch == DNARROW) {			if (FirstRecall) {			    FirstRecall = FALSE;			    /*			     * Use the first Fname in the list. - FM			     */			    FnameNum = FnameTotal - 1;			} else {			    /*			     * Advance to the next Fname in the list. - FM			     */			    FnameNum--;			}			if (FnameNum < 0) {			    /*			     *	Set the FirstRecall flag,			     *	and use sug_file or a blank. - FM			     */			    FirstRecall = TRUE;			    FnameNum = FnameTotal;			    _statusline(FILENAME_PROMPT);			    goto retry;			} else if ((cp = (char *)HTList_objectAt(							sug_filenames,							FnameNum)) != NULL) {			    strcpy(filename, cp);			    if (FnameTotal == 1) {				_statusline(EDIT_THE_PREV_FILENAME);			    } else {				_statusline(EDIT_A_PREV_FILENAME);			    }			    goto check_recall;			}		    }		    /*		     *	Save cancelled.		     */		    _statusline(SAVE_REQUEST_CANCELLED);		    sleep(InfoSecs);		    break;		}		if (no_dotfiles || !show_dotfiles) {		    if (*filename == '.' ||#ifdef VMS			((cp = strrchr(filename, ':')) && *(cp+1) == '.') ||			((cp = strrchr(filename, ']')) && *(cp+1) == '.') ||#endif /* VMS */			((cp = strrchr(filename, '/')) && *(cp+1) == '.')) {			HTAlert(FILENAME_CANNOT_BE_DOT);			_statusline(NEW_FILENAME_PROMPT);			FirstRecall = TRUE;			FnameNum = FnameTotal;			goto retry;		    }		}		/*		 *  Cancel if the user entered "/dev/null" on Unix,		 *  or an "nl:" path (case-insensitive) on VMS. - FM		 */#ifdef VMS		if (!strncasecomp(filename, "nl:", 3) ||		    !strncasecomp(filename, "/nl/", 4))#else		if (!strcmp(filename, "/dev/null"))#endif /* VMS */		{		    _statusline(SAVE_REQUEST_CANCELLED);		    sleep(InfoSecs);		    break;		}		if ((cp = strchr(filename, '~'))) {		    *(cp++) = '\0';		    strcpy(buffer, filename);		    if ((len=strlen(buffer)) > 0 && buffer[len-1] == '/')			buffer[len-1] = '\0';#ifdef DOSPATH		    strcat(buffer, HTDOS_wwwName((char *)Home_Dir()));#else#ifdef VMS		    strcat(buffer, HTVMS_wwwName((char *)Home_Dir()));#else		    strcat(buffer, Home_Dir());#endif /* VMS */#endif /* DOSPATH */		    strcat(buffer, cp);		    strcpy(filename, buffer);		}#ifdef VMS		if (strchr(filename, '/') != NULL) {		    strcpy(buffer, HTVMS_name("", filename));		    strcpy(filename, buffer);		}		if (filename[0] != '/' && strchr(filename, ':') == NULL) {		    strcpy(buffer, "sys$disk:");		    if (strchr(filename, ']') == NULL)		    strcat(buffer, "[]");		    strcat(buffer, filename);		} else {		    strcpy(buffer, filename);		}#else		if (*filename != '/')		    cp = getenv("PWD");		else		    cp = NULL;		if (cp)#ifdef DOSPATH		    sprintf(buffer, "%s/%s", cp, HTDOS_name(filename));#else		    sprintf(buffer, "%s/%s", cp, filename);#endif		else#ifdef DOSPATH		    strcpy(buffer, HTDOS_name(filename));#else		    strcpy(buffer, filename);#endif#endif /* VMS */		/*		 *  See if it already exists.		 */		if ((outfile_fp = fopen(buffer, "r")) != NULL) {		    fclose(outfile_fp);#ifdef VMS		    _statusline(FILE_EXISTS_HPROMPT);#else		    _statusline(FILE_EXISTS_OPROMPT);#endif /* VMS */		    c = 0;		    while (TOUPPER(c)!='Y' && TOUPPER(c)!='N' &&			   c != 7 && c != 3)			c = LYgetch();#ifdef VMS		    if (HadVMSInterrupt) {			HadVMSInterrupt = FALSE;			_statusline(SAVE_REQUEST_CANCELLED);			sleep(InfoSecs);			break;		    }#endif /* VMS */		    if (c == 7 || c == 3) { /* Control-G or Control-C */			_statusline(SAVE_REQUEST_CANCELLED);			sleep(InfoSecs);			break;		    }		    if (TOUPPER(c) == 'N') {			_statusline(NEW_FILENAME_PROMPT);			FirstRecall = TRUE;			FnameNum = FnameTotal;			goto retry;		    }		}		if ((outfile_fp = LYNewTxtFile(buffer)) == NULL) {		    HTAlert(CANNOT_WRITE_TO_FILE);		    _statusline(NEW_FILENAME_PROMPT);		    FirstRecall = TRUE;		    FnameNum = FnameTotal;		    goto retry;		}		if (LYPrependBaseToSource && HTisDocumentSource()) {		    /*		     *	Added the document's base as a BASE tag

⌨️ 快捷键说明

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