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;
}