rem: ks = fs = NULL;
add: ts = ks = fs = NULL;
context: ParseMultiInput(Conn *connPtr, char *start, char *end){    Tcl_Encoding encoding = connPtr->encoding;    Tcl_DString kds, vds;    char *s, *e, *ks, *ke, *fs, *fe, save, saveend;    char *key, *value, buf[100];    Tcl_DStringInit(&kds);    Tcl_DStringInit(&vds);    /*     * Trim off the trailing \r\n and null terminate the input.     */    if (end > start && end[-1] == '\n') --end;    if (end > start && end[-1] == '\r') --end;    saveend = *end;    *end = '\0';    /*     * Scan non-blank lines for the content-disposition header.     */    ks = fs = NULL;    while ((e = strchr(start, '\n')) != NULL) {	s = start;	start = e + 1;	if (e > s && e[-1] == '\r') {	    --e;	}	if (s == e) {	    break;	}	save = *e;	*e = '\0';	if (strncasecmp(s, "content-disposition", 19) == 0	    && (ks = Ns_StrCaseFind(s+19, "name=")) != NULL) {	    /*	     * Save the key name and filename.	     */	    ks += 5;	    AttEnd(&ks, &ke);	    if ((fs = Ns_StrCaseFind(s+19, "filename=")) != NULL) {		fs += 9;		AttEnd(&fs, &fe);	    }	}	*e = save;    }    /*     * Save the key/value and file contents if found.     */    if (ks != NULL) {	key = Ext2Utf(&kds, ks, ke-ks, encoding);	if (fs == NULL) {	    value = Ext2Utf(&vds, start, end-start, encoding);	} else {	    value = Ext2Utf(&vds, fs, fe-fs, encoding);	    sprintf(buf, "%d %d", start - connPtr->reqPtr->content, end - start);	    Tcl_DStringAppendElement(&connPtr->files, key);	    Tcl_DStringAppendElement(&connPtr->files, buf);	}	Ns_SetPut(connPtr->query, key, value);    }    /*     * Restore the end marker.     */    *end = saveend;    Tcl_DStringFree(&kds);    Tcl_DStringFree(&vds);}