NOTE:
These are a little sketchy...I'll fill in details 'soon'.
read block while (read succeeded) { dynamic allocate enough space copy block to dynamic space read block }
read block while (read succeeded) { if (no previous block) { dynamic allocate enough space copy block to dynamic space } else { dynamic allocate enough space for both new and prior blocks copy prior block to dynamic space concatenate new block to dynamic space deallocate prior block (which was dynamic) } read block }
while (!strm.getline(block,MAX)) { strm.clear(); if (no previous block) { dyn = new char [strm.gcount()+1]; strcpy(dyn,block); } else { dyn = new char [strm.gcount()+strlen(block)+1]; strcpy(dyn,old_dyn); strcat(dyn,block); delete [] old_dyn; } }
old_dyn = nullptr; // loop to get full blocks while (!strm.getline(block,MAX)) { strm.clear(); if (old_dyn == nullptr) { dyn = new char [strm.gcount()+1]; strcpy(dyn,block); } else { dyn = new char [strm.gcount()+strlen(block)+1]; strcpy(dyn,old_dyn); strcat(dyn,block); delete [] old_dyn; } old_dyn = dyn; } // process any final incomplete blocks if (old_dyn == nullptr) { dyn = new char [strm.gcount()+1]; strcpy(dyn,block); } else { dyn = new char [strm.gcount()+strlen(block)+1]; strcpy(dyn,old_dyn); strcat(dyn,block); delete [] old_dyn; } old_dyn = dyn;
destroy(); string = old_dyn; length = strlen(string);
old_dyn = nullptr; had = 0; // loop to get full blocks while (!strm.getline(block,MAX)) { strm.clear(); if (old_dyn == nullptr) { dyn = new char [strm.gcount()+1]; strcpy(dyn,block); had = strm.gcount(); } else { dyn = new char [strm.gcount()+had+1]; strcpy(dyn,old_dyn); strcat(dyn,block); delete [] old_dyn; had += strm.gcount(); } old_dyn = dyn; } // process any final incomplete blocks if (old_dyn == nullptr) { dyn = new char [strm.gcount()+1]; strcpy(dyn,block); had = strm.gcount(); } else { dyn = new char [strm.gcount()+had+1]; strcpy(dyn,old_dyn); strcat(dyn,block); delete [] old_dyn; had += strm.gcount(); } old_dyn = dyn; destroy(); string = old_dyn; length = had;
new_and_cat(&old, block, &had, just_read) { if (old == nullptr) { dyn = new char [just_read+1]; strcpy(dyn,block); had = just_read; } else { dyn = new char [just_read+had+1]; strcpy(dyn,old); strcat(dyn,block); delete [] old; had += just_read; } return dyn; }
old_dyn = nullptr; had = 0; // loop to get full blocks while (!strm.getline(block,MAX)) { strm.clear(); old_dyn = new_and_cat(old_dyn, block, had, strm.gcount()); } // process any final incomplete blocks old_dyn = new_and_cat(old_dyn, block, had, strm.gcount()); destroy(); string = old_dyn; length = had;
new_and_cat(&old, block, &had, just_read) { if (old == nullptr) { dyn = new char [just_read+1]; if (dyn != nullptr) { strcpy(dyn,block); had = just_read; } } else { dyn = new char [just_read+had+1]; if (dyn != nullptr) { strcpy(dyn,old); strcat(dyn,block); delete [] old; had += just_read; } } return dyn; }
new_and_cat(&old, block, &had, just_read) { if (old == nullptr) { dyn = new char [had+just_read+1]; if (dyn != nullptr) { // don't strcpy(dyn,old); since old is nullptr // don't delete [] old; since old is nullptr dyn[0] = '\0'; strcat(dyn,block); had += just_read; } } else { dyn = new char [had+just_read+1]; if (dyn != nullptr) { strcpy(dyn,old); delete [] old; strcat(dyn,block); had += just_read; } } return dyn; }
new_and_cat(&old, block, &had, just_read) { dyn = new char [had+just_read+1]; if (dyn != nullptr) { if (old != nullptr) { strcpy(dyn,old); delete [] old; old = nullptr; } else { dyn[0] = '\0'; } strcat(dyn,block); had += just_read; } return dyn; }
char * new_and_cat(char * &old, const char block[], long &had, long just_read) { char * dyn = new char [had+just_read+1]; if (dyn != nullptr) { if (old != nullptr) { strcpy(dyn,old); delete [] old; old = nullptr; } else { dyn[0] = '\0'; } strcat(dyn,block); had += just_read; } return dyn; } long String::getline(istream &strm) { const long MAX = 400; long had; char * old_dyn; char block[MAX]; old_dyn = nullptr; had = 0; // loop to get full blocks while (!strm.getline(block,MAX)) { strm.clear(); old_dyn = new_and_cat(old_dyn, block, had, strm.gcount()); } // process any final incomplete block old_dyn = new_and_cat(old_dyn, block, had, strm.gcount()); destroy(); string = old_dyn; length = had; return length; }
istream & operator >>(istream & strm, String & me) { const long MAX = 400; long had; char * old_dyn; char block[MAX]; old_dyn = nullptr; had = 0; // loop to get full blocks strm >> setw(MAX) >> block; while (strlen(block) == (MAX-1)) { old_dyn = new_and_cat(old_dyn, block, had, strlen(block)); strm >> setw(MAX) >> block; } // process any final incomplete block old_dyn = new_and_cat(old_dyn, block, had, strlen(block)); me.destroy(); me.string = old_dyn; me.length = had; return strm; }
istream & operator >>(istream & strm, String & me) { const long MAX = 400; long had, read; char * old_dyn; char block[MAX]; old_dyn = nullptr; had = 0; // loop to get full blocks strm >> setw(MAX) >> block; while ((read = strlen(block)) == (MAX-1)) { old_dyn = new_and_cat(old_dyn, block, had, read); strm >> setw(MAX) >> block; } // process any final incomplete block old_dyn = new_and_cat(old_dyn, block, had, read); me.destroy(); me.string = old_dyn; me.length = had; return strm; }