rem: if (fp->fp) { fwrite(s,1,slen,fp->fp); } else { stuff: if (fp->len + slen < fp->limit) { memcpy(fp->s+fp->len,s,slen); fp->len += slen; return; } else if (fp->alloc) { fp->limit = fp->limit + OFILE_REALLOC_SIZE; if (OFILE_REALLOC_SIZE <= slen) fp->limit += slen; if (fp->s) fp->s = realloc(fp->s,fp->limit); else fp->s = malloc(fp->limit); if (fp->s) goto stuff; } if (fp->alloc) free(fp->s); fp->s = 0; fp->fail = 1;
add: for (i=0; i<slen; i++) { appendcOFile(fp,s[i]);
context: static void appendsOFile(OFile *fp, const char *s){    int slen;    if (fp->fail) return;    slen  = strlen(s);    if (fp->fp) {	fwrite(s,1,slen,fp->fp);	}    else {stuff:	if (fp->len + slen < fp->limit) {	    memcpy(fp->s+fp->len,s,slen);	    fp->len += slen;	    return;	    }	else if (fp->alloc) {	    fp->limit = fp->limit + OFILE_REALLOC_SIZE;	    if (OFILE_REALLOC_SIZE <= slen) fp->limit += slen;	    if (fp->s)	      fp->s = realloc(fp->s,fp->limit);	    else	      fp->s = malloc(fp->limit);	    if (fp->s) goto stuff;	    }	if (fp->alloc)	    free(fp->s);	fp->s = 0;	fp->fail = 1;	}}