- do {
- read = fread(buf, 1, sizeof(buf), in);
- if(ferror(in))
+ while(1) {
+ chlen = 0;
+ r = 0;
+ while(1) {
+ c = biogetc(in);
+ if(c == 10) {
+ if(!r)
+ return(-1);
+ break;
+ } else if(c == 13) {
+ } else if((c >= '0') && (c <= '9')) {
+ chlen = (chlen << 4) + (c - '0');
+ r = 1;
+ } else if((c >= 'A') && (c <= 'F')) {
+ chlen = (chlen << 4) + (c + 10 - 'A');
+ r = 1;
+ } else if((c >= 'a') && (c <= 'f')) {
+ chlen = (chlen << 4) + (c + 10 - 'a');
+ r = 1;
+ } else {
+ /* XXX: Technically, there may be chunk extensions to
+ * be read, but since that will likely never actually
+ * happen in practice, I can just as well add support
+ * for that if it actually does become relevant. */
+ return(-1);
+ }
+ }
+ if(chlen == 0)
+ break;
+ while(chlen > 0) {
+ if((read = biordata(in)) > 0) {
+ if((read = biowritesome(out, in->rbuf.b + in->rh, min(read, chlen))) < 0)
+ return(-1);
+ in->rh += read;
+ chlen -= read;
+ }
+ if(biorspace(in) && (biordata(in) < chlen) && (biofillsome(in) <= 0))
+ return(-1);
+ }
+ if((biogetc(in) != 13) || (biogetc(in) != 10))