1 // Larbin 2 // Sebastien Ailleret 3 // 10-12-01 -> 10-12-01 4 5 // use dynamic buffers when downloading specific pages 6 initSpecific()7void initSpecific () { } 8 9 #define newSpec() ((void) 0) 10 #define endOfInput() 0 11 pipeSpec()12bool html::pipeSpec () { 13 if (dynbuf == NULL) { 14 if (pos > nearlyFullPage) { 15 // need a dyn buf (big file) 16 szDyn = 2*maxPageSize; 17 dynbuf = new char[szDyn]; 18 nbSpec = buffer + pos - posParse; 19 memcpy(dynbuf, posParse, nbSpec); 20 dynbuf[nbSpec] = 0; 21 pos = posParse - buffer; 22 } 23 return false; 24 } else { 25 int nb = buffer + pos - posParse; 26 int newnb = nbSpec + nb; 27 if (newnb >= maxSpecSize) { 28 errno = tooBig; 29 return true; 30 } 31 if (newnb >= szDyn) { 32 // resize buffer 33 szDyn *= 2; 34 char *tmp = new char[szDyn]; 35 memcpy(tmp, dynbuf, nbSpec); 36 delete[] dynbuf; 37 dynbuf = tmp; 38 } 39 memcpy(dynbuf+nbSpec, posParse, nb); 40 nbSpec = newnb; 41 dynbuf[nbSpec] = 0; 42 pos = posParse - buffer; 43 return false; 44 } 45 } 46 getContent()47char * html::getContent() { 48 if (dynbuf != NULL) 49 return dynbuf; 50 else 51 return contentStart; 52 } 53 getSize()54int html::getSize() { 55 if (dynbuf != NULL) { 56 return nbSpec; 57 } else { 58 return (buffer + pos - contentStart); 59 } 60 } 61 62 #define constrSpec() dynbuf = NULL 63 64 #define destructSpec() if (dynbuf != NULL) { delete[] dynbuf; } 65