sprintf(line, gettext("No matches for: %s"), arg); PUTS(line);
HTSprintf0(&msg, gettext("No matches for: %s"), arg); PUTS(msg);
PRIVATE int read_list ARGS1(char *, arg){    char line[LINE_LENGTH+1];    char *p;    BOOL done = NO;    BOOL head = NO;    BOOL tail = NO;    BOOL skip_this_line = NO;    BOOL skip_rest_of_line = NO;    int listing = 0;    char *pattern = NULL;    int len = 0;    /*    **	Support head or tail matches for groups to list. - FM    */    if (arg && strlen(arg) > 1) {	if (*arg == '*') {	    tail = YES;	    StrAllocCopy(pattern, (arg+1));	} else if (arg[strlen(arg)-1] == '*') {	    head = YES;	    StrAllocCopy(pattern, arg);	    pattern[strlen(pattern)-1] = '\0';	}	if (tail || head) {	   len = strlen(pattern);	}    }    /*    **	Read the server's reply.    **    **	The lines are scanned for newsgroup    **	names and descriptions.    */    START(HTML_HEAD);    PUTC('\n');    START(HTML_TITLE);    PUTS("Newsgroups");    END(HTML_TITLE);    PUTC('\n');    END(HTML_HEAD);    PUTC('\n');    START(HTML_H1);    PUTS( "Newsgroups");    END(HTML_H1);    PUTC('\n');    p = line;    START(HTML_DLC);    PUTC('\n');    while (!done) {	int ich = NEXT_CHAR;	char ch = ich;	if (ich == EOF) {	    if (interrupted_in_htgetcharacter) {		interrupted_in_htgetcharacter = 0;		CTRACE(tfp, "HTNews: Interrupted on read, closing socket %d\n",			    s);		NEWS_NETCLOSE(s);		s = -1;		return(HT_INTERRUPTED);	    }	    abort_socket();	/* End of file, close socket */	    FREE(pattern);	    return(HT_LOADED);	/* End of file on response */	} else if (skip_this_line) {	    if (ch == LF) {		skip_this_line = skip_rest_of_line = NO;		p = line;	    }	    continue;	} else if (skip_rest_of_line) {	    if (ch != LF) {		continue;	    }	} else if (p == &line[LINE_LENGTH]) {	    CTRACE(tfp, "b %.*s%c[...]\n", (LINE_LENGTH), line, ch);	    *p = '\0';	    if (ch == LF) {		;		/* Will be dealt with below */	    } else if (WHITE(ch)) {		ch = LF;	/* May treat as line without description */		skip_this_line = YES; /* ...and ignore until LF */	    } else if (strchr(line, ' ') == NULL &&		       strchr(line, '\t') == NULL) {		/* No separator found */		CTRACE(tfp, "HTNews..... group name too long, discarding.\n");		skip_this_line = YES; /* ignore whole line */		continue;	    } else {		skip_rest_of_line = YES; /* skip until ch == LF found */	    }	} else {	    *p++ = ch;	}	if (ch == LF) {	    skip_rest_of_line = NO;	/* done, reset flag */	    *p = '\0';			/* Terminate the string */	    CTRACE(tfp, "B %s", line);	    if (line[0] == '.') {		/*		**  End of article?		*/		if ((unsigned char)line[1] < ' ') {		    done = YES;		    break;		} else {			/* Line starts with dot */		    START(HTML_DT);		    PUTS(&line[1]);		    MAYBE_END(HTML_DT);		}	    } else if (line[0] == '#') {	/* Comment? */		p = line;			/* Restart at beginning */		continue;	    } else {		/*		**  Normal lines are scanned for references to newsgroups.		*/		int i = 0;		/* find whitespace if it exits */		for (; line[i] != '\0' && !WHITE(line[i]); i++)		    ;  /* null body */		if (line[i] != '\0') {		    line[i] = '\0';		    if ((head && strncasecomp(line, pattern, len)) ||			(tail && (i < len ||				  strcasecomp((line + (i - len)), pattern)))) {			p = line;	/* Restart at beginning */			continue;		    }		    START(HTML_DT);		    write_anchor(line, line);		    listing++;		    MAYBE_END(HTML_DT);		    PUTC('\n');		    START(HTML_DD);		    PUTS(&line[i+1]); /* put description */		    MAYBE_END(HTML_DD);		} else {		    if ((head && strncasecomp(line, pattern, len)) ||			(tail && (i < len ||				  strcasecomp((line + (i - len)), pattern)))) {			p = line;	/* Restart at beginning */			continue;		    }		    START(HTML_DT);		    write_anchor(line, line);		    MAYBE_END(HTML_DT);		    listing++;		}	    } /* if not dot */	    p = line;			/* Restart at beginning */	} /* if end of line */    } /* Loop over characters */    if (!listing) {	START(HTML_DT);	sprintf(line, gettext("No matches for: %s"), arg);	PUTS(line);	MAYBE_END(HTML_DT);    }    END(HTML_DLC);    PUTC('\n');    FREE(pattern);    return(HT_LOADED);}