#ifndef ANISCRL_H
#define ANISCRL_H
#define ANIMAXPAGES 50
#ifndef __IOSTREAM_H
#include<iostream.h>
#endif
#ifndef __CONIO_H
#include<conio.h>
#endif
#ifndef __STRING_H
#include<string.h>
#endif
#ifndef __STDLIB_H
#include<stdlib.h>
#endif
class aniscroll
{
int pos,page,totpage;int upd,esc;int index[ANIMAXPAGES];
char *data;
int display(int tot=0); public:
aniscroll()
{
pos=0;
page=0;
totpage=0;
data=NULL;
index[0]=0;
upd=0;
esc=0;
}
~aniscroll()
{
if(data!=NULL)
free(data);
}
friend aniscroll& operator<< (aniscroll& obj,const char *text);
friend aniscroll& operator<< (aniscroll& obj,int no);
friend aniscroll& operator<< (aniscroll& obj,char ch);
friend aniscroll& operator<< (aniscroll& obj,aniscroll& (*funcptr)(aniscroll&));
friend aniscroll& endl(aniscroll& os);
int prevpage();
int nextpage();
void lastpage();
void view();
void flush(void);
int size()
{
return strlen(data);
}
const char *getdata(void)
{
return data;
}
int currpage()
{
return page;
}
int totpages()
{
return totpage;
}
};
aniscroll& operator<< (aniscroll& obj,const char *text)
{
if(obj.data==NULL)
{obj.data=strdup(text);
clrscr();
}
else
{obj.pos=strlen(obj.data);
obj.data=(char *)realloc(obj.data,strlen(obj.data)+1+strlen(text)+1);
strcat(obj.data,text);
}
while(obj.pos<strlen(obj.data))
{
if(wherey()>=24)
{obj.index[++obj.page]=obj.pos;
obj.totpage++;
if(obj.esc!=27)
obj.esc=obj.display();
clrscr();
}
else
cout << obj.data[obj.pos++];
}
return obj;
};
aniscroll& operator<< (aniscroll& obj,int no)
{
char temp[6];
itoa(no,temp,10);
if(obj.data==NULL)
{
obj.data=strdup(temp);
clrscr();
}
else
{obj.pos=strlen(obj.data);
obj.data=(char *)realloc(obj.data,strlen(obj.data)+1+strlen(temp)+1);
strcat(obj.data,temp);}
while(obj.pos<strlen(obj.data))
{
if(wherey()>=24)
{obj.index[++obj.page]=obj.pos;
obj.totpage++;
if(obj.esc!=27)
obj.esc=obj.display();
clrscr();
}
else
cout << obj.data[obj.pos++];
}
return obj;
};
aniscroll& operator<< (aniscroll& obj,char ch)
{
char temp[2];
temp[0]=ch;
temp[1]='\0';
if(obj.data==NULL)
{obj.data=strdup(temp);
clrscr();
}
else
{obj.data=(char *)realloc(obj.data,strlen(obj.data)+1+2);
strcat(obj.data,temp);
}
while(obj.pos<strlen(obj.data))
{
if(wherey()>=24)
{
obj.index[++obj.page]=obj.pos;
obj.totpage++;
if(obj.esc!=27)
obj.esc=obj.display();
clrscr();
}
else
cout << obj.data[obj.pos++];
}
return obj;
};
aniscroll& operator<< (aniscroll& obj,aniscroll& (*funcptr)(aniscroll&))
{
funcptr(obj);
return obj;
};
int aniscroll::prevpage()
{
if(page==1) return 0;
if(page==2)
{
pos=0;
}
if(page>2)
{pos=index[page-2];
}
page--;
clrscr();
while(pos<index[page])
{
cout << data[pos++];
}
cout << endl << "||More|| (Page: " << page << "/" <<totpage;
cout << ")Prev Page:PageUp Next Page: PageDown";
return 1;
}
int aniscroll::nextpage()
{
int lim=0;
if(page>=totpage) return 0;
pos=index[page];
page++;
if(page==totpage) {lim=size();}
else lim=index[page];
clrscr();
while(pos<lim)
{
if((wherey())==24)
break; cout << data[pos++];
}
cout << endl << "||More|| (Page: " << page << "/" <<totpage;
cout << ")Previous Page:PageUp Next Page: PageDown";
return 1;
}
int aniscroll::display(int tot)
{int ch=13;
if(!upd)
{
if(tot)
{cout << endl << "||More|| (Page: " << page << "/" <<totpage;
cout << ")Prev Page:PageUp Next Page: PageDown";}
else
{cout << endl << "||More|| (Page: " << page << ")";
cout << "Prev Page:PageUp Next Page: PageDown";}
} while(ch!=27)
{
ch=getch();
if(ch==73)
{prevpage();}
if(ch==13||ch==81)
{if(nextpage()==0) break;
}
}
return ch;
}
void aniscroll::lastpage()
{
int ch;
page++;
totpage++;
upd=0;
do{
ch=display(1);
if(ch==81) upd=1; else upd=0;
}
while(ch!=13&&ch!=27);
}
void aniscroll::view()
{
int ch;
pos=0;
page=1;
while(pos<index[page])
cout << data[pos++];
upd=0;
do{
ch=display(1);
if(ch==81) upd=1; else upd=0;
}
while(ch!=13&&ch!=27);
}
void aniscroll::flush(void)
{
free(data);
pos=0;
page=0;
totpage=0;
data=NULL;
index[0]=0;
upd=0;
esc=0;
}
aniscroll& endl(aniscroll& os) {
os << "\n";
return os;
}
#endif