*p = ich;
*p = (char) ich;
PRIVATE int parse_cso_fields ARGS2(	char *,		buf,	int,		size){    int ich;    char *p = buf;    int i, code = 0, prev_code;    size_t alen;    char *indx, *name;    CSOfield_info *last, *new;    last = CSOfields = (CSOfield_info *) 0;    prev_code = -2555;    buf[0] = '\0';    /*    **	Start grabbing chars from the network.    */    while ((ich = NEXT_CHAR) != EOF) {	if (interrupted_in_htgetcharacter) {	    CTRACE(tfp, "HTLoadCSO: Interrupted in HTGetCharacter, apparently.\n");	    free_CSOfields();	    buf[0] = '\0';	    return HT_INTERRUPTED;	}	if ((char)ich != LF) {	    *p = ich;		/* Put character in buffer */	    if (p < &buf[size-1]) {		p++;	    }	} else {	    *p = '\0';		/* Terminate line */	    p = buf;		/* Scan it to parse it */	    /* OK we now have a line in 'p' lets parse it.	     */	    /*	    **	Break on line that begins with a 2.	    **	It's the end of data.	    */	    if (*p == '2')		break;	    /*	    **	Lines beginning with 5 are errors.	    **	Print them and quit.	    */	    if (*p == '5') {		strcpy (buf, p);		return 5;	    }	    if (*p == '-') {		/*		**  Data lines look like  -200:#:		**  where # is the search result number and can be		**  multiple digits (infinite?).		*/	    /*	    **	Check status, ignore any non-success.	    */	    if (p[1] != '2' )		continue;	    /*	    **	Parse fields within returned line into status, ndx, name, data.	    */	    indx = NULL;	    name = NULL;	    for (i = 0; p[i]; i++)		if (p[i] == ':' ) {		    p[i] = '\0';		    if (!indx) {			indx = (char *)&p[i+1];			code = atoi (indx);		    } else if (!name) {			name = (char *)&p[i+1];		    } else {		       i++;		       break;		    }		}		/*		**  Add data to field structure.		*/		if (name) {		    if (code == prev_code) {			/*			**  Remaining data are description.			**  Save in current info block.			*/			alen = strlen((char *)&p[i]) + 1;			if (alen > sizeof(last->desc_buf)) {			    if (last->description != last->desc_buf)				FREE(last->description);			    if (!(last->description = (char *)malloc(alen))) {				outofmem(__FILE__, "HTLoadCSO");			    }			}			strcpy(last->description, (char *)&p[i]);		    } else {			/*			**  Initialize new block, append to end of list			**  to preserve order.			*/			new = (CSOfield_info *)calloc(1, sizeof(CSOfield_info));			if (!new) {			    outofmem(__FILE__, "HTLoadCSO");			}			if (last)			    last->next = new;			else			    CSOfields = new;			last = new;			new->next = (CSOfield_info *) 0;			new->name = new->name_buf;			alen = strlen(name) + 1;			if (alen > sizeof(new->name_buf)) {			    if (!(new->name = (char *)malloc(alen))) {				outofmem(__FILE__, "HTLoadCSO");			    }			}			strcpy (new->name, name);			new->attributes = new->attr_buf;			alen = strlen((char *)&p[i]) + 2;			if (alen > sizeof(new->attr_buf)) {			    if (!(new->attributes = (char *)malloc(alen))) {				outofmem(__FILE__, "HTLoadCSO");			    }			}			strcpy(new->attributes, (char *)&p[i]);			strcpy((char *)&new->attributes[alen-2], " ");			new->description = new->desc_buf;			new->desc_buf[0] = '\0';			new->id = atoi(indx);			/*			**  Scan for keywords.			*/			parse_cso_field_info(new);		    }		    prev_code = code;		} else		    break;	    } /* end if *p == '-' */	} /* if end of line */    } /* Loop over characters */    /* end the text block */    if (buf[0] == '\0') {	return -1; /* no response */    }    buf[0] = '\0';    return 0;  /* all done */} /* end of procedure */