about summary refs log tree commit diff stats
path: root/src/LYReadCFG.c
diff options
context:
space:
mode:
authorThomas E. Dickey <dickey@invisible-island.net>1996-09-02 19:39:24 -0400
committerThomas E. Dickey <dickey@invisible-island.net>1996-09-02 19:39:24 -0400
commite087f6d44e87f489fcb3056e86319ebba4218156 (patch)
treed045b58011bfbbf5186d34c4fed9e0dedb363275 /src/LYReadCFG.c
downloadlynx-snapshots-e087f6d44e87f489fcb3056e86319ebba4218156.tar.gz
snapshot of project "lynx", label v2_6
Diffstat (limited to 'src/LYReadCFG.c')
-rw-r--r--src/LYReadCFG.c990
1 files changed, 990 insertions, 0 deletions
diff --git a/src/LYReadCFG.c b/src/LYReadCFG.c
new file mode 100644
index 00000000..bc9f6c0e
--- /dev/null
+++ b/src/LYReadCFG.c
@@ -0,0 +1,990 @@
+#include "HTUtils.h"
+#include "tcp.h"
+#include "HTFile.h"
+#include "LYUtils.h"
+#include "LYStrings.h"
+#include "LYStructs.h"
+#include "LYGlobalDefs.h"
+#include "LYCharSets.h"
+#include "LYKeymap.h"
+#include "LYJump.h"
+#include "LYGetFile.h"
+#include "LYCgi.h"
+#include "LYCurses.h"
+#include "LYSignal.h"
+
+#ifdef DIRED_SUPPORT
+#include "LYLocal.h"
+#endif /* DIRED_SUPPORT */
+
+#include "LYexit.h"
+#include "LYLeaks.h"
+
+#define FREE(x) if (x) {free(x); x = NULL;}
+
+extern int HTNewsMaxChunk;  /* Max news articles before chunking (HTNews.c) */
+extern int HTNewsChunkSize; /* Number of news articles per chunk (HTNews.c) */
+
+PUBLIC BOOLEAN have_read_cfg=FALSE;
+PUBLIC BOOLEAN LYUseNoviceLineTwo=TRUE;
+
+#ifdef VMS
+#define DISPLAY "DECW$DISPLAY"
+#else
+#define DISPLAY "DISPLAY"
+#endif /* VMS */
+
+/*
+ *  Translate a TRUE/FALSE field in a string buffer.
+ */
+PRIVATE int is_true ARGS1(
+	char *,	string)
+{
+    if(!strncasecomp(string,"TRUE",4))
+	return(TRUE);
+    else
+	return(FALSE);
+}
+
+/*
+ *  Find an unescaped colon in a string buffer.
+ */
+PRIVATE char *find_colon ARGS1(
+	char *,	buffer)
+{
+    char ch, *buf = buffer;
+
+    if (buf == NULL)
+        return NULL;
+
+    while ((ch = *buf) != 0) {
+	if (ch == ':')
+	    return buf;
+	if (ch == '\\') {
+	     buf++;
+	     if (*buf == 0)
+	       break;
+	}
+	buf++;
+    }
+    return NULL;
+}
+
+/*
+ *  Function for freeing the DOWNLOADER and UPLOADER menus list. - FM
+ */
+PRIVATE void free_item_list NOARGS
+{
+    lynx_html_item_type *cur;
+    lynx_html_item_type *next;
+
+    cur = downloaders;
+    while (cur) {
+        next = cur->next;
+    	FREE(cur->name);
+    	FREE(cur->command);
+	FREE(cur);
+        cur = next;
+    }
+    downloaders = NULL;
+
+#ifdef DIRED_SUPPORT
+    cur = uploaders;
+    while (cur) {
+        next = cur->next;
+    	FREE(cur->name);
+    	FREE(cur->command);
+	FREE(cur);
+        cur = next;
+    }
+    uploaders = NULL;
+#endif /* DIRED_SUPPORT */
+
+    return;
+}
+
+/*
+ *  Process string buffer fields for DOWNLOADER or UPLOADER menus.
+ */
+PRIVATE void add_item_to_list ARGS2(
+	char *,			buffer,
+	lynx_html_item_type **,	list_ptr)
+{
+    char *colon, *next_colon;
+    lynx_html_item_type *cur_item, *prev_item;
+
+    /*
+     *  Make a linked list
+     */
+    if (*list_ptr == NULL) {
+    	/*
+	 *  First item.
+	 */
+        cur_item = (lynx_html_item_type *)calloc(sizeof(lynx_html_item_type),1);
+        if (cur_item == NULL)
+	    perror("Out of memory in read_cfg");
+	*list_ptr = cur_item;
+	atexit(free_item_list);
+    } else {
+        /*
+	 *  Find the last item.
+	 */
+	for (prev_item = *list_ptr;
+	     prev_item->next != NULL;
+	     prev_item = prev_item->next)
+	    ;  /* null body */
+	cur_item = (lynx_html_item_type *)calloc(sizeof(lynx_html_item_type),1);
+        if (cur_item == NULL)
+	    perror("Out of memory in read_cfg");
+	else
+	    prev_item->next = cur_item;
+    }
+    cur_item->next = NULL;
+    cur_item->name = NULL;
+    cur_item->command = NULL;
+    cur_item->always_enabled = FALSE;
+
+    /*
+     *  Find first unescaped colon and process fields
+     */
+    if ((colon = find_colon(buffer)) != NULL) {
+        /*
+	 *  Process name field
+	 */
+        cur_item->name = (char *)calloc((colon-buffer+1),sizeof(char));
+	if(cur_item->name == NULL)
+	    perror("Out of memory in read_cfg");
+	LYstrncpy(cur_item->name, buffer, (int)(colon-buffer));	
+	remove_backslashes(cur_item->name);
+
+	/*
+	 *  Process TRUE/FALSE field
+	 */
+	if ((next_colon = find_colon(colon+1)) != NULL) {
+	    cur_item->command = (char *)calloc(next_colon-colon, sizeof(char));
+	    if (cur_item->command == NULL)
+	        perror("Out of memory in read_cfg");
+	    LYstrncpy(cur_item->command, colon+1, (int)(next_colon-(colon+1)));
+	    remove_backslashes(cur_item->command);
+	    cur_item->always_enabled = is_true(next_colon+1);
+	}
+    }
+}
+
+
+/*
+ *  Function for freeing the PRINTER menus list. - FM
+ */
+PRIVATE void free_printer_item_list NOARGS
+{
+    lynx_printer_item_type *cur = printers;
+    lynx_printer_item_type *next;
+
+    while (cur) {
+        next = cur->next;
+    	FREE(cur->name);
+    	FREE(cur->command);
+	FREE(cur);
+        cur = next;
+    }
+    printers = NULL;
+
+    return;
+}
+
+/*
+ *  Process string buffer fields for PRINTER menus.
+ */
+PRIVATE void add_printer_to_list ARGS2(
+	char *,				buffer,
+	lynx_printer_item_type **,	list_ptr)
+{
+    char *colon, *next_colon;
+    lynx_printer_item_type *cur_item, *prev_item;
+
+    /*
+     *  Make a linked list.
+     */
+    if (*list_ptr == NULL) {
+        /*
+	 *  First item.
+	 */
+	cur_item = (lynx_printer_item_type *)calloc(sizeof(lynx_printer_item_type),1);
+	if (cur_item == NULL)
+	    perror("Out of memory in read_cfg");
+	*list_ptr = cur_item;
+	atexit(free_printer_item_list);
+    } else {
+        /*
+	 *  Find the last item.
+	 */
+	for (prev_item = *list_ptr;
+	     prev_item->next != NULL;
+	     prev_item = prev_item->next)
+	    ;  /* null body */
+
+	cur_item = (lynx_printer_item_type *)calloc(sizeof(lynx_printer_item_type),1);
+	if (cur_item == NULL)
+	    perror("Out of memory in read_cfg");
+	else
+	    prev_item->next = cur_item;
+    }
+    cur_item->next = NULL;
+    cur_item->name = NULL;
+    cur_item->command = NULL;
+    cur_item->always_enabled = FALSE;
+
+    /*
+     *  Find first unescaped colon and process fields.
+     */
+    if ((colon = find_colon(buffer)) != NULL) {
+        /*
+	 *  Process name field.
+	 */
+        cur_item->name = (char *)calloc((colon-buffer+1),sizeof(char));
+	if(cur_item->name == NULL)
+	    perror("Out of memory in read_cfg");
+        LYstrncpy(cur_item->name, buffer, (int)(colon-buffer));	
+        remove_backslashes(cur_item->name);
+
+	/*
+	 *  Process TRUE/FALSE field.
+	 */
+	if ((next_colon = find_colon(colon+1)) != NULL) {
+	    cur_item->command = (char *)calloc(next_colon-colon, sizeof(char));
+	    if (cur_item->command == NULL)
+	        perror("Out of memory in read_cfg");
+	    LYstrncpy(cur_item->command, colon+1, (int)(next_colon-(colon+1)));
+	    remove_backslashes(cur_item->command);
+	    cur_item->always_enabled = is_true(next_colon+1);
+	}
+
+	/*
+	 *  Process pagelen field.
+	 */
+	if ((next_colon = find_colon(next_colon+1)) != NULL) {
+	    cur_item->pagelen = atoi(next_colon+1);
+	} else {
+	    /* default to 66 lines */
+	    cur_item->pagelen = 66;
+	}
+    }
+}
+
+#ifdef USE_SLANG
+static char *Color_Strings[16] =
+{
+    "black",
+    "red",
+    "green",
+    "brown",
+    "blue",
+    "magenta",
+    "cyan",
+    "lightgray",
+    "gray",
+    "brightred",
+    "brightgreen",
+    "yellow",
+    "brightblue",
+    "brightmagenta",
+    "brightcyan",
+    "white"
+};
+
+/*
+ *  Validator for COLOR fields.
+ */
+PRIVATE int check_color ARGS1(
+	char *,	color)
+{
+    int i;
+
+    for (i = 0; i < 16; i++) {
+	if (!strcmp(color, Color_Strings[i]))
+	    return 0;
+    }
+    return -1;
+}
+
+/*
+ *  Exit routine for failed COLOR parsing.
+ */
+PRIVATE void exit_with_color_syntax NOARGS
+{
+    unsigned int i;
+    fprintf (stderr, "\
+Syntax Error parsing COLOR in configuration file:\n\
+The line must be of the form:\n\
+COLOR:INTEGER:FOREGROUND:BACKGROUND\n\
+\n\
+Here FOREGROUND and BACKGROUND must be one of:\n"
+	    );
+    for (i = 0; i < 16; i += 4) {
+	fprintf(stderr, "%16s %16s %16s %16s\n",
+		Color_Strings[i], Color_Strings[i + 1], 
+		Color_Strings[i + 2], Color_Strings[i + 3]);
+    }
+
+    (void) signal(SIGHUP, SIG_DFL);
+    (void) signal(SIGTERM, SIG_DFL);
+#ifndef VMS
+    (void) signal(SIGINT, SIG_DFL);
+#endif /* !VMS */
+#ifdef SIGTSTP
+    if (no_suspend)
+	(void) signal(SIGTSTP,SIG_DFL);
+#endif /* SIGTSTP */
+    exit(-1);
+}
+
+/*
+ *  Process string buffer fields for COLOR setting.
+ */
+PRIVATE void parse_color ARGS1(
+	char *,	buffer)
+{
+    int color;
+    char *fg, *bg;
+
+    /*
+     *  We are expecting a line of the form: 
+     *    INTEGER:FOREGROUND:BACKGROUND
+     */
+    color = atoi (buffer);
+    if (NULL == (fg = find_colon(buffer)))
+        exit_with_color_syntax();
+    *fg++ = 0;
+
+    if (NULL == (bg = find_colon(fg)))
+        exit_with_color_syntax();
+    *bg++ = 0;
+
+    if ((-1 == check_color(fg)) ||
+        (-1 == check_color(bg)))
+	exit_with_color_syntax();
+
+    SLtt_set_color(color, NULL, fg, bg);
+}
+#endif /* USE_SLANG */
+
+/*
+ * Process the configuration file (lynx.cfg).
+ */
+PUBLIC void read_cfg ARGS1(
+	char *,	cfg_filename)
+{
+    FILE *fp;
+    char buffer[501];
+    char temp[501];
+    char *line_feed;
+    int i, j, len;
+
+    /*
+     *  Locate and open the file.
+     */
+    if (!cfg_filename || strlen(cfg_filename) == 0) {
+	if(TRACE)
+	    fprintf(stderr,"No filename following -cfg switch!\n");
+	return;
+    }
+    if((fp = fopen(cfg_filename,"r")) == NULL) {
+	if(TRACE)
+	    fprintf(stderr,"lynx.cfg file not found as %s\n",cfg_filename);
+	return;
+    }
+    have_read_cfg=TRUE;
+
+    /*
+     *  Process each line in the file.
+     */
+    while (fgets(buffer, 500, fp) != NULL) {
+	/*
+	 *  Strip off \n at the end.
+	 */
+	if((line_feed = (char *)strchr(buffer,'\n')) != NULL)
+	    *line_feed = '\0';
+	
+	/*
+	 *  Strip off trailing white space
+	 */
+	len = strlen(buffer);
+	while (len && isspace(buffer[len-1])) {
+	    len--;
+	    buffer[len] = '\0';
+	}
+
+	/*
+	 *  Skip any comment or blank lines.
+	 */
+	if (buffer[0] == '\0' || buffer[0] == '#')
+	    continue;
+
+        /*
+	 * Process the string buffer.
+	 */
+        if (!strncasecomp(buffer,"SUFFIX:",7)) {
+	    char *extention;
+	    char *mime_type;
+
+	    if (strlen(buffer) > 9) {
+	        extention = buffer + 7;
+	        if ((mime_type = strchr(extention, ':')) != NULL) {
+		    *mime_type++ = '\0';
+		    for (i = 0, j = 0; mime_type[i]; i++) {
+		        if (mime_type[i] != ' ') {
+		            mime_type[j++] = TOLOWER(mime_type[i]);
+			}
+		    }
+		    mime_type[j] = '\0';
+		    if (strstr(mime_type, "tex") != NULL ||
+		        strstr(mime_type, "postscript") != NULL ||
+			strstr(mime_type, "sh") != NULL ||
+			strstr(mime_type, "troff") != NULL ||
+			strstr(mime_type, "rtf") != NULL)
+			HTSetSuffix(extention, mime_type, "8bit", 1.0);
+		    else
+		        HTSetSuffix(extention, mime_type, "binary", 1.0);
+		}
+	    }
+
+        } else if (!strncasecomp(buffer,"VIEWER:",7)) {
+	    char *mime_type;
+	    char *viewer;
+	    char *environment;
+
+	    if (strlen(buffer) > 9) {
+	        mime_type = buffer + 7;
+	        if ((viewer = strchr(mime_type, ':')) != NULL) {
+		    *viewer++ = '\0';
+		    for (i = 0, j = 0; mime_type[i]; i++) {
+		        if (mime_type[i] != ' ') {
+		            mime_type[j++] = TOLOWER(mime_type[i]);
+			}
+		    }
+		    mime_type[j] = '\0';
+		    environment = strrchr(viewer, ':');
+		    if ((environment != NULL) &&
+		        (strlen(viewer) > 1) && *(environment-1) != '\\') {
+			*environment++ = '\0';
+			remove_backslashes(viewer);
+			/*
+			 *  If environment equals xwindows then only
+			 *  assign the presentation if there is a display
+			 *  variable.
+			 */
+			if (!strcasecomp(environment,"XWINDOWS")) {
+			    if (getenv(DISPLAY)) 
+		      		HTSetPresentation(mime_type, viewer,
+						  1.0, 3.0, 0.0, 0);
+			} else if (!strcasecomp(environment,"NON_XWINDOWS")) {
+			    if (!getenv(DISPLAY)) 
+		      		HTSetPresentation(mime_type, viewer, 
+						  1.0, 3.0, 0.0, 0);
+			} else {
+		            HTSetPresentation(mime_type, viewer,
+						  1.0, 3.0, 0.0, 0);
+			}
+		    } else {
+		        remove_backslashes(viewer);
+		        HTSetPresentation(mime_type, viewer,
+						  1.0, 3.0, 0.0, 0);
+		    }
+		}
+	    }
+
+        } else if(!strncasecomp(buffer,"KEYMAP:",7)) {
+            char *key;
+            char *func;
+  
+            key = buffer + 7;
+            if ((func = strchr(key, ':')) != NULL)	{
+                *func++ = '\0';
+		/* Allow comments on the ends of key remapping lines. - DT */
+            	if (!remap(key, strtok(func, " \t\n#")))
+                    fprintf(stderr,
+		    	    "key remapping of %s to %s failed\n",key,func);
+		else if (!strcmp("TOGGLE_HELP", strtok(func, " \t\n#")))
+		    LYUseNoviceLineTwo = FALSE;
+	    }
+
+	} else if(!strncasecomp(buffer,"GLOBAL_MAILCAP:",15)) {
+
+	    StrAllocCopy(global_type_map, buffer+15);
+
+	} else if(!strncasecomp(buffer,"GLOBAL_EXTENSION_MAP:",21)) {
+
+	    StrAllocCopy(global_extension_map, buffer+21);
+
+	} else if(!strncasecomp(buffer,"PERSONAL_MAILCAP:",17)) {
+
+            StrAllocCopy(personal_type_map, buffer+17);
+
+        } else if(!strncasecomp(buffer,"PERSONAL_EXTENSION_MAP:",23)) {
+
+            StrAllocCopy(personal_extension_map, buffer+23);
+
+	} else if(!strncasecomp(buffer,"CHARACTER_SET:",14)) {
+	    for(i = 0; LYchar_set_names[i]; i++)
+		if(!strncmp(buffer+14,LYchar_set_names[i],strlen(buffer+14)))
+		{
+		    current_char_set=i;
+		    HTMLSetRawModeDefault(i);
+		    break;
+		}
+
+	} else if(!strncasecomp(buffer,"STARTFILE:",10)) {
+
+	    StrAllocCopy(startfile, buffer+10);
+
+	} else if(!strncasecomp(buffer,"HELPFILE:",9)) {
+
+	    StrAllocCopy(helpfile, buffer+9);
+
+	} else if(!strncasecomp(buffer,"DEFAULT_INDEX_FILE:",19)) {
+	    StrAllocCopy(indexfile, buffer+19);
+
+#if defined(EXEC_LINKS) || defined(EXEC_SCRIPTS)
+	} else if(!strncasecomp(buffer,
+				    "LOCAL_EXECUTION_LINKS_ALWAYS_ON:",32)) {
+	    local_exec = is_true(buffer+32);
+
+	} else if(!strncasecomp(buffer,
+			    "LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE:",40)) {
+	    local_exec_on_local_files = is_true(buffer+40);
+#endif /* defined(EXEC_LINKS) || defined(EXEC_SCRIPTS) */
+
+	} else if(!strncasecomp(buffer,"MAIL_SYSTEM_ERROR_LOGGING:",26)) {
+	    error_logging = is_true(buffer+26);
+
+	} else if(!strncasecomp(buffer,"CHECKMAIL:",10)) {
+	    check_mail = is_true(buffer+10);
+
+#ifdef VMS
+	} else if(!strncasecomp(buffer,"USE_FIXED_RECORDS:",18)) {
+	    UseFixedRecords = is_true(buffer+18);
+#endif /* VMS */
+
+	} else if(!strncasecomp(buffer,"VI_KEYS_ALWAYS_ON:",18)) {
+	    vi_keys = is_true(buffer+18);
+
+	} else if(!strncasecomp(buffer,"EMACS_KEYS_ALWAYS_ON:",21)) {
+	    emacs_keys = is_true(buffer+21);
+
+	} else if(!strncasecomp(buffer,
+			"DEFAULT_KEYPAD_MODE_IS_NUMBERS_AS_ARROWS:",41)) {
+	    if(is_true(buffer+41))
+		keypad_mode = NUMBERS_AS_ARROWS;
+	    else
+		keypad_mode = LINKS_ARE_NUMBERED;
+
+	} else if(!strncasecomp(buffer,"CASE_SENSITIVE_ALWAYS_ON:",25)) {
+	     case_sensitive = is_true(buffer+25);
+
+	} else if(!strncasecomp(buffer,"DEFAULT_USER_MODE:",18)) {
+		if(!strncasecomp(buffer+18,"NOVICE",5))
+		   user_mode = NOVICE_MODE;
+		else if(!strncasecomp(buffer+18,"INTER",5))
+		   user_mode = INTERMEDIATE_MODE;
+		else if(!strncasecomp(buffer+18,"ADVANCE",7))
+		   user_mode = ADVANCED_MODE;
+
+	} else if(!strncasecomp(buffer,"DEFAULT_BOOKMARK_FILE:",22)) {
+		StrAllocCopy(bookmark_page,buffer+22);
+
+	} else if(!system_editor && 
+		  !strncasecomp(buffer,"DEFAULT_EDITOR:",15)) {
+		StrAllocCopy(editor,buffer+15);
+
+	} else if(!strncasecomp(buffer,"GOTOBUFFER:",11)) {
+		goto_buffer = is_true(buffer+11);
+
+	} else if(!strncasecomp(buffer,"JUMPFILE:",9)) {
+		if (!LYJumpInit(buffer)) {
+		    if (TRACE)
+		        fprintf(stderr, "Failed to register %s\n", buffer);
+		}
+
+	} else if(!strncasecomp(buffer,"JUMP_PROMPT:",12)) {
+		StrAllocCopy(jumpprompt,buffer+12);
+
+	} else if(!strncasecomp(buffer,"JUMPBUFFER:",11)) {
+		jump_buffer = is_true(buffer+11);
+
+	} else if(!strncasecomp(buffer,"NO_DOT_FILES:",13)) {
+	    no_dotfiles = is_true(buffer+13);
+
+	} else if(!strncasecomp(buffer,"NO_FROM_HEADER:",15)) {
+	    LYNoFromHeader = is_true(buffer+15);
+
+	} else if(!strncasecomp(buffer,"NO_REFERER_HEADER:",18)) {
+	    LYNoRefererHeader = is_true(buffer+18);
+
+	} else if(!strncasecomp(buffer,"NO_FILE_REFERER:",16)) {
+	    no_filereferer = is_true(buffer+16);
+
+	} else if(!strncasecomp(buffer,"MAKE_LINKS_FOR_ALL_IMAGES:",26)) {
+	    clickable_images = is_true(buffer+26);
+
+	} else if(!strncasecomp(buffer,"MAKE_PSEUDO_ALTS_FOR_INLINES:",29)) {
+	    pseudo_inline_alts = is_true(buffer+29);
+
+	} else if(!strncasecomp(buffer,"BOLD_HEADERS:",13)) {
+		bold_headers = is_true(buffer+13);
+
+	} else if(!strncasecomp(buffer,"BOLD_H1:",8)) {
+		bold_H1 = is_true(buffer+8);
+
+	} else if(!strncasecomp(buffer,"BOLD_NAME_ANCHORS:",18)) {
+		bold_name_anchors = is_true(buffer+18);
+
+ 	} else if(!strncasecomp(buffer,"SYSTEM_EDITOR:",14)) {
+		StrAllocCopy(editor,buffer+14);
+ 		system_editor = TRUE;
+
+	} else if(!strncasecomp(buffer,"PREFERRED_LANGUAGE:",19)) {
+		StrAllocCopy(language,buffer+19);
+
+	} else if(!strncasecomp(buffer,"PREFERRED_CHARSET:",18)) {
+		StrAllocCopy(pref_charset,buffer+18);
+
+	} else if(!strncasecomp(buffer,"URL_DOMAIN_PREFIXES:",20)) {
+		StrAllocCopy(URLDomainPrefixes, buffer+20);
+
+	} else if(!strncasecomp(buffer,"URL_DOMAIN_SUFFIXES:",20)) {
+		StrAllocCopy(URLDomainSuffixes, buffer+20);
+
+	} else if(!strncasecomp(buffer,"INEWS:",6)) {
+		StrAllocCopy(inews_path,buffer+6);
+		if (*inews_path == '\0' || !strcasecomp(inews_path,"none"))
+		    no_newspost = TRUE;
+		else
+		    no_newspost = FALSE;
+
+	} else if(!strncasecomp(buffer,"SYSTEM_MAIL:",12)) {
+		StrAllocCopy(system_mail,buffer+12);
+
+#ifdef VMS
+	} else if(!strncasecomp(buffer,"MAIL_ADRS:",10)) {
+		StrAllocCopy(mail_adrs,buffer+10);
+#endif /* VMS */
+
+	} else if(!strncasecomp(buffer,"PRINTER:",8)) {
+	        add_printer_to_list (&buffer[8],&printers);
+
+	} else if(!strncasecomp(buffer,"DOWNLOADER:",11)) {
+	        add_item_to_list(&buffer[11],&downloaders);
+
+	} else if(!strncasecomp(buffer,"NNTPSERVER:",11)) {
+	    if(getenv("NNTPSERVER") == NULL) {
+#ifdef VMS
+		strcpy(temp, "NNTPSERVER");
+		Define_VMSLogical(temp, (char *)&buffer[11]);
+#else
+		strcpy(temp, "NNTPSERVER=");
+		StrAllocCopy(NNTPSERVER_putenv_cmd, temp);
+		StrAllocCat(NNTPSERVER_putenv_cmd, (char *)&buffer[11]);
+		putenv(NNTPSERVER_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"http_proxy:",11)) {
+	    if(getenv("http_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "http_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[11]);
+#else
+		strcpy(temp, "http_proxy=");
+		StrAllocCopy(http_proxy_putenv_cmd, temp);
+		StrAllocCat(http_proxy_putenv_cmd, (char *)&buffer[11]);
+		putenv(http_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"https_proxy:",12)) {
+	    if(getenv("https_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "https_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[12]);
+#else
+		strcpy(temp, "https_proxy=");
+		StrAllocCopy(https_proxy_putenv_cmd, temp);
+		StrAllocCat(https_proxy_putenv_cmd, (char *)&buffer[12]);
+		putenv(https_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"ftp_proxy:",10)) {
+	    if(getenv("ftp_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "ftp_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[10]);
+#else
+		strcpy(temp, "ftp_proxy=");
+		StrAllocCopy(ftp_proxy_putenv_cmd, temp);
+		StrAllocCat(ftp_proxy_putenv_cmd, (char *)&buffer[10]);
+		putenv(ftp_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"gopher_proxy:",13)) {
+	    if(getenv("gopher_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "gopher_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[13]);
+#else
+		strcpy(temp, "gopher_proxy=");
+		StrAllocCopy(gopher_proxy_putenv_cmd, temp);
+		StrAllocCat(gopher_proxy_putenv_cmd, (char *)&buffer[13]);
+		putenv(gopher_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"cso_proxy:",10)) {
+	    if(getenv("cso_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "cso_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[10]);
+#else
+		strcpy(temp, "cso_proxy=");
+		StrAllocCopy(cso_proxy_putenv_cmd, temp);
+		StrAllocCat(cso_proxy_putenv_cmd, (char *)&buffer[10]);
+		putenv(cso_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"news_proxy:",11)) {
+	    if(getenv("news_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "news_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[11]);
+#else
+		strcpy(temp, "news_proxy=");
+		StrAllocCopy(news_proxy_putenv_cmd, temp);
+		StrAllocCat(news_proxy_putenv_cmd, (char *)&buffer[11]);
+		putenv(news_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"snews_proxy:",12)) {
+	    if(getenv("snews_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "snews_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[12]);
+#else
+		strcpy(temp, "snews_proxy=");
+		StrAllocCopy(snews_proxy_putenv_cmd, temp);
+		StrAllocCat(snews_proxy_putenv_cmd, (char *)&buffer[12]);
+		putenv(snews_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"nntp_proxy:",11)) {
+	    if(getenv("nntp_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "nntp_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[11]);
+#else
+		strcpy(temp, "nntp_proxy=");
+		StrAllocCopy(nntp_proxy_putenv_cmd, temp);
+		StrAllocCat(nntp_proxy_putenv_cmd, (char *)&buffer[11]);
+		putenv(nntp_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"wais_proxy:",11)) {
+	    if(getenv("wais_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "wais_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[11]);
+#else
+		strcpy(temp, "wais_proxy=");
+		StrAllocCopy(wais_proxy_putenv_cmd, temp);
+		StrAllocCat(wais_proxy_putenv_cmd, (char *)&buffer[11]);
+		putenv(wais_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"finger_proxy:",13)) {
+	    if(getenv("finger_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "finger_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[13]);
+#else
+		strcpy(temp, "finger_proxy=");
+		StrAllocCopy(finger_proxy_putenv_cmd, temp);
+		StrAllocCat(finger_proxy_putenv_cmd, (char *)&buffer[13]);
+		putenv(finger_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+	} else if(!strncasecomp(buffer,"no_proxy:",9)) {
+	    if(getenv("no_proxy") == NULL) {
+#ifdef VMS
+		strcpy(temp, "no_proxy");
+		Define_VMSLogical(temp, (char *)&buffer[9]);
+#else
+		strcpy(temp, "no_proxy=");
+		StrAllocCopy(no_proxy_putenv_cmd, temp);
+		StrAllocCat(no_proxy_putenv_cmd, (char *)&buffer[9]);
+		putenv(no_proxy_putenv_cmd);
+#endif /* VMS */
+	    }
+
+#ifdef EXEC_LINKS
+	} else if(!strncasecomp(buffer,"TRUSTED_EXEC:",13)) {
+		add_trusted(&buffer[13], EXEC_PATH); /* Add exec path */
+
+	} else if(!strncasecomp(buffer,"ALWAYS_TRUSTED_EXEC:",20)) {
+		add_trusted(&buffer[20], ALWAYS_EXEC_PATH); /* Add exec path */
+#endif /* EXEC_LINKS */
+
+#ifdef LYNXCGI_LINKS
+	} else if(!strncasecomp(buffer,"TRUSTED_LYNXCGI:",16)) {
+		add_trusted(&buffer[16], CGI_PATH); /* Add CGI path */
+
+	} else if(!strncasecomp(buffer,"LYNXCGI_ENVIRONMENT:",20)) {
+		add_lynxcgi_environment(buffer+20);
+#endif /* LYNXCGI_LINKS */
+
+#ifdef DIRED_SUPPORT
+	} else if(!strncasecomp(buffer,"UPLOADER:",9)) {
+	        add_item_to_list(&buffer[9],&uploaders);
+
+	} else if(!strncasecomp(buffer,"DIRED_MENU:",11)) {
+	        add_menu_item(&buffer[11]);
+#endif /* DIRED_SUPPORT */
+
+	} else if(!strncasecomp(buffer,"LYNX_HOST_NAME:",15)) {
+		StrAllocCopy(LYHostName,buffer+15);
+
+	} else if(!strncasecomp(buffer,"LOCALHOST_ALIAS:",16)) {
+	        LYAddLocalhostAlias(buffer+16);
+
+	} else if(!strncasecomp(buffer,"LOCAL_DOMAIN:",13)) {
+		StrAllocCopy(LYLocalDomain,buffer+13);
+
+	} else if(!strncasecomp(buffer,"SUBSTITUTE_UNDERSCORES:",23)) {
+		use_underscore = is_true(buffer+23);
+
+	} else if(!strncasecomp(buffer,"HISTORICAL_COMMENTS:",20)) {
+		historical_comments = is_true(buffer+20);
+
+	} else if(!strncasecomp(buffer,"MINIMAL_COMMENTS:",17)) {
+		minimal_comments = is_true(buffer+17);
+
+	} else if(!strncasecomp(buffer,"SOFT_DQUOTES:",13)) {
+		soft_dquotes = is_true(buffer+13);
+
+	} else if(!strncasecomp(buffer,"ENABLE_SCROLLBACK:",18)) {
+		enable_scrollback = is_true(buffer+18);
+
+	} else if(!strncasecomp(buffer,"SCAN_FOR_BURIED_NEWS_REFS:",26)) {
+		scan_for_buried_news_references = is_true(buffer+26);
+
+	} else if(!strncasecomp(buffer,"INFOSECS:",9)) {
+		strcpy(temp, buffer+9);
+		for (i = 0; temp[i]; i++) {
+		    if (!isdigit(temp[i])) {
+		        temp[i] = '\0';
+			break;
+		    }
+		}
+		if (temp[0])
+		    InfoSecs = atoi(temp);
+
+	} else if(!strncasecomp(buffer,"MESSAGESECS:",12)) {
+		strcpy(temp, buffer+12);
+		for (i = 0; temp[i]; i++) {
+		    if (!isdigit(temp[i])) {
+		        temp[i] = '\0';
+			break;
+		    }
+		}
+		if (temp[0])
+		    MessageSecs = atoi(temp);
+
+	} else if(!strncasecomp(buffer,"ALERTSECS:",10)) {
+		strcpy(temp, buffer+10);
+		for (i = 0; temp[i]; i++) {
+		    if (!isdigit(temp[i])) {
+		        temp[i] = '\0';
+			break;
+		    }
+		}
+		if (temp[0])
+		    AlertSecs = atoi(temp);
+
+#ifndef VMS
+	} else if(!strncasecomp(buffer,"LIST_FORMAT:",12)) {
+		StrAllocCopy(list_format, buffer+12);
+#endif /* !VMS */
+
+	} else if(!strncasecomp(buffer,"ALWAYS_RESUBMIT_POSTS:",22)) {
+		LYresubmit_posts = is_true(buffer+22);
+
+	} else if(!strncasecomp(buffer,"SAVE_SPACE:",11)) {
+		StrAllocCopy(lynx_save_space, buffer+11);
+
+#ifdef USE_SLANG
+	} else if (!strncasecomp(buffer, "COLOR:", 6)) {
+		parse_color(buffer + 6);
+#endif /* USE_SLANG */
+
+	} else if (!strncasecomp(buffer, "LIST_NEWS_NUMBERS:", 18)) {
+		LYListNewsNumbers = is_true(buffer+18);
+
+	} else if (!strncasecomp(buffer, "LIST_NEWS_DATES:", 16)) {
+		LYListNewsDates = is_true(buffer+16);
+
+	} else if (!strncasecomp(buffer, "NEWS_CHUNK_SIZE:", 16)) {
+		HTNewsChunkSize = atoi(buffer+16);
+		/*
+		 * If the new HTNewsChunkSize exceeds the maximum,
+		 * increase HTNewsMaxChunk to this size. - FM
+		 */
+		if (HTNewsChunkSize > HTNewsMaxChunk) {
+		    HTNewsMaxChunk = HTNewsChunkSize; 
+		}
+
+	} else if (!strncasecomp(buffer, "NEWS_MAX_CHUNK:", 15)) {
+		HTNewsMaxChunk = atoi(buffer+15);
+		/*
+		 * If HTNewsChunkSize exceeds the new maximum,
+		 * reduce HTNewsChunkSize to this maximum. - FM
+		 */
+		if (HTNewsChunkSize > HTNewsMaxChunk) {
+		    HTNewsChunkSize = HTNewsMaxChunk;
+		}
+
+#if defined(VMS) && defined(VAXC) && !defined(__DECC)
+	} else if (!strncasecomp(buffer, "DEFAULT_VIRTUAL_MEMORY_SIZE:", 28)) {
+		HTVirtualMemorySize = atoi(buffer+28);
+#endif /* VMS && VAXC && !__DECC */
+
+	} else if (!strncasecomp(buffer, "DEFAULT_CACHE_SIZE:", 19)) {
+		HTCacheSize = atoi(buffer+19);
+
+        }  /* end of Huge if */
+    } /* end of while */
+    fclose(fp);
+
+    /*
+     * If any DOWNLOADER: commands have always_enabled set (:TRUE),
+     * make override_no_download TRUE, so that other restriction
+     * settings will not block presentation of a download menu
+     * with those always_enabled options still available. - FM
+     */
+    if (downloaders != NULL) {
+    	int count;
+	lynx_html_item_type *cur_download;
+
+        for(count=0, cur_download=downloaders; cur_download != NULL; 
+			    cur_download = cur_download->next, count++) {
+	    if (cur_download->always_enabled) {
+	        override_no_download = TRUE;
+		break;
+	    }
+	}
+    }
+}