Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ctype.h>
- #include <stdlib.h>
- #include <proto/dos.h>
- #include <proto/exec.h>
- #include <stdio.h>
- #include <string.h>
- #include <exec/memory.h>
- #include <machine/limits.h>
- #include <libraries/filehandler.h>
- /*added for colours*/
- #include <proto/intuition.h>
- #include <proto/graphics.h>
- #include <proto/gadtools.h>
- #include <proto/layers.h>
- #define MYTEXT_LEFT (10)
- #define MYTEXT_TOP (10)
- /*window*/
- struct Window *mywindow;
- /*text for window*/
- struct DrawInfo *drawinfo;
- struct IntuiText myIText;
- struct TextAttr myTextAttr;
- ULONG myTEXTPEN;
- ULONG myBACKGROUNDPEN;
- struct Region *win_reg;
- struct Region *win_oldreg;
- struct Rectangle win_rect;
- unsigned long oldwin_width, oldwin_height;
- int numcolours=0, white=1, black=2;
- int colour_red=1,colour_green=1,colour_yellow=1; /*in real code calculated to be reddest, greenest etc colour*/
- int loop_again=0;
- struct IntuiText Ftext=
- {
- 1,0, /*front pen, backpen*/
- JAM2, /*draw mode*/
- 15,0, /*left edge, top edge*/
- NULL, /*font standard*/
- (UBYTE*) "System programming on the Amiga",
- NULL /*Next text*/
- };
- struct Screen *screen;
- unsigned char screenName[] = "Workbench";
- unsigned long colorTable[256 *3 ];
- struct ViewPort *viewPort;
- struct ColorMap *colorMap;
- unsigned long red,green,blue;
- struct RastPort *mywindowrastport;
- unsigned char *win_buffer; /*used for lines*/
- unsigned char *win_buffer_part; /*used for colours*/
- static unsigned int win_buffer_len;
- struct window_keeper
- {
- struct window_keeper *next;
- char* line;
- int full;
- int linetype;
- unsigned int lineno;
- };
- struct window_keeper *winhead, *wintail, *wintemp;
- static unsigned int winline=0;
- static unsigned int maxlinelen=0;
- /* example output which is generated in real code*/
- static char *lines[]={"Unit DOS Size Used Free Full Errors Status Name",\
- "SMBFS0: DOS0 488Gb 223Gb 264Gb 45% 0 Read & Write PCbackup",\
- "PC0: MSD0 720Kb 11Kb 709Kb 1% 0 Read only EMPTY",\
- "CF0: No disk in drive",\
- "RAM: DOS0 702Kb 702Kb 121Mb 0% 0 Read & Write Ram Disk",\
- "DH0: PFS3 94Mb 93Mb 652Kb 99% 0 Read & Write WB",\
- "DF0: PC Disk",\
- "CC0: No disk in drive",\
- "DF1: DOS0 837Kb 789Kb 48Kb 94% 0 Read & Write EdWordPro_2",\
- "DH1: PFS3 3471Mb 3354Mb 117Mb 96% 0 Read & Write Games",\
- "DH2: PFS3 3567Mb 3487Mb 80Mb 97% 0 Read & Write Aps",\
- "Available Volumes:",\
- "PCbackup Mounted",\
- "EMPTY Mounted",\
- "Ram Disk Mounted",\
- "Games1 Mounted",\
- "Aps Mounted",\
- "EdWordPro_2 Mounted",\
- "WB Mounted"};
- int findchar(char string[], char letter)
- {
- int result=-1;
- int i=0;
- while (string[i]!='\0')
- {
- if (string[i]==letter)
- result=i;
- i++;
- }
- return result;
- }
- int midstr(char str1[], char str2[],int start,int last)
- {
- int count,count2;
- count=start;count2=0;
- if (last!=NULL)
- {
- while ((str2[count]!='\0') && (count<=last))
- {
- str1[count2]=str2[count];
- count++;
- count2++;
- }
- }
- else
- {
- while ((str2[count]!='\0'))
- {
- str1[count2]=str2[count];
- count++;
- count2++;
- }
- }
- str1[count2]='\0';
- return count2;
- }
- int leftstr(char str1[],char str2[],int last)
- {
- return midstr(str1,str2,0,last);
- }
- void clearstr(char str1[],unsigned int last)
- {
- unsigned int i=0;
- for (i=0;i<=last;i++)
- str1[i]='\0';
- }
- long finddoscol(char str[])
- {
- int i=0;
- while((str[i]!='\0') && (str[i]!=' '))
- i++;
- if (str[i]=='\0')
- return i;
- while ((str[i]==' ') && (str[i]!='\0'))
- i++;
- return i;
- }
- int min(int a,int b)
- {
- if (a<b)
- return a;
- else if (b<a)
- return b;
- return a;
- }
- int max(int a,int b)
- {
- if (a>b)
- return a;
- else if (b>a)
- return b;
- return a;
- }
- int open_window(int scrnwidth,int scrnheight)
- {
- int topleftx=0,toplefty=0;
- int width=200,height=200;
- int tempw=0,temph=0;
- unsigned long maxchars=0;
- struct TextFont *font;
- UWORD font_width=0;
- /*calculate 1 quarter of screen width*/
- if (mywindow)
- return 0; /*opened already*/
- tempw=scrnwidth/4;
- /*calculate 1 5th screen height*/
- temph=scrnheight/5;
- topleftx=tempw;
- toplefty=temph;
- width=scrnwidth-(tempw*2);
- height=scrnheight-(temph*2);
- mywindow = OpenWindowTags(NULL, WA_Left, topleftx, WA_Top, toplefty,\
- WA_InnerWidth, width, WA_InnerHeight, height,\
- WA_MinWidth,90,WA_MinHeight, 40, WA_MaxWidth, scrnwidth-20, WA_MaxHeight, scrnheight-20,\
- WA_IDCMP,IDCMP_CLOSEWINDOW | IDCMP_DISKINSERTED | IDCMP_DISKREMOVED | IDCMP_NEWSIZE | IDCMP_REFRESHWINDOW,\
- WA_Flags, WFLG_SIZEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_ACTIVATE,\
- WA_Title, (ULONG)"Info64", WA_PubScreenName, (ULONG)"WorkBench", TAG_DONE);
- if (mywindow)
- {
- myIText.FrontPen = myTEXTPEN;
- myIText.BackPen = myBACKGROUNDPEN;
- myIText.DrawMode = JAM2;
- myIText.LeftEdge = MYTEXT_LEFT;
- myIText.TopEdge = MYTEXT_TOP;
- myIText.ITextFont = &myTextAttr;
- myIText.IText = "Hello, World. ;-)";
- myIText.NextText = NULL;
- mywindowrastport=mywindow->RPort;
- oldwin_width=mywindow->Width;
- oldwin_height=mywindow->Height;
- /*open line buffers*/
- font=mywindow->RPort->Font;
- font_width=font->tf_XSize;
- maxchars=(scrnwidth/font_width)+1;
- win_buffer=malloc((maxchars+2)*sizeof(char)); /*make memory buffers for line plus null char*/
- win_buffer_part=malloc((maxchars+2)*sizeof(char));
- win_buffer_len=maxchars;
- win_rect.MinX = mywindow->BorderLeft;
- win_rect.MinY = mywindow->BorderTop;
- win_rect.MaxX = (mywindow->Width-mywindow->BorderRight)-3;
- win_rect.MaxY = (mywindow->Height-mywindow->BorderBottom)-3;
- if (win_reg = NewRegion())
- {
- OrRectRegion(win_reg, &win_rect);
- win_oldreg = InstallClipRegion(mywindow->WLayer, win_reg);
- }
- return 0;
- }
- else
- return 1;
- }
- int write_win()
- {
- /* struct textattr TextAttr;*/
- struct TextFont *font;
- UWORD font_width=0;
- long win_width=0,win_height=0;
- long line_len=0,doscol=0,currentdoscol;
- long numpix=0, avpix=0, fitchar=0,tempfitchar=0;
- struct window_keeper *currentline=NULL;
- unsigned int charpos=0, percentpos=0;
- int zz=0;
- Forbid();
- win_width=mywindow->Width-mywindow->BorderRight;
- win_height=mywindow->Height-mywindow->BorderBottom;
- /*reset buffers*/
- clearstr((char *)win_buffer,win_buffer_len-1);
- clearstr((char *)win_buffer_part,win_buffer_len-1);
- font=mywindow->RPort->Font;
- font_width=font->tf_XSize;
- /*find how many chars will fit into window*/
- numpix=font_width;
- fitchar=(win_width/numpix) -4; /* -4 for safety*/
- printf("number of pix %d width %d max=%d\n",numpix,win_width,fitchar);
- if (fitchar==0) /*cant get any so give up*/
- {
- Permit();
- return 0;
- }
- if (winhead) /*if we have something*/
- {
- if (currentline==NULL)
- currentline=winhead;
- }
- else
- return 0; /*nothing saved!*/
- while ((currentline) && ((10*currentline->lineno)<win_height)) /*now dump saved text rough attempt stopping at end of data or window*/
- {
- printf("line no%d type %d\n",currentline->lineno,currentline->linetype);
- switch (currentline->linetype)
- {
- case 1:
- myIText.FrontPen = white; /*<<<< calculated to be whitest in real code*/
- doscol=finddoscol(currentline->line);
- break;
- case 2:
- charpos=findchar(currentline->line,':');
- printf("charpos=%d",charpos);
- currentdoscol=finddoscol(currentline->line);
- if (charpos!=-1)
- {
- myIText.FrontPen = white;
- leftstr((char*)win_buffer_part,(char*)currentline->line,charpos);
- printf(" win_buffer_part -%s-\n",(char*)win_buffer_part);
- myIText.IText=win_buffer_part;
- PrintIText(mywindow->RPort,&myIText,10,10*currentline->lineno);
- printf("OK - %s\n",win_buffer_part);
- /*now the rest*/
- myIText.FrontPen = black;
- midstr(win_buffer,currentline->line,currentdoscol,strlen(currentline->line)); /*tempfitchar-(currentdoscol));*/
- /*now look for %*/
- percentpos=findchar(currentline->line,'%');
- printf("percentpos=%d ",percentpos);
- if (percentpos!=-1)
- {
- percentpos=percentpos-3;
- /*dump up to percent*/
- midstr(win_buffer_part,currentline->line,currentdoscol,percentpos);
- myIText.IText=win_buffer_part;
- printf(" before percent win_buffer_part -%s-\n",win_buffer_part);
- PrintIText(mywindow->RPort,&myIText,10+(font_width*doscol),10*currentline->lineno);
- printf("OK - %s\n",win_buffer_part);
- /*colour for percent*/
- myIText.FrontPen = white;
- midstr(win_buffer_part,currentline->line,percentpos,percentpos+3);
- myIText.IText=win_buffer_part;
- printf("percent win_buffer_part -%s-\n",win_buffer_part);
- if (currentline->full>90)
- myIText.FrontPen = max(1,colour_red);
- else if (currentline->full <40)
- {
- printf("GREEN=%d\n",colour_green);
- myIText.FrontPen = max(1,colour_green);
- }
- else
- {
- printf("YELLOW=%d\n",colour_yellow);
- myIText.FrontPen = max(1,colour_yellow);
- }
- PrintIText(mywindow->RPort,&myIText,10+(font_width*percentpos),10*currentline->lineno);
- printf("OK - %s\n",win_buffer_part);
- myIText.FrontPen = black;
- /*set up to print remainder - do we need to check size?*/
- printf("OK set colour to black\n");
- midstr(win_buffer,currentline->line,percentpos+4,strlen(currentline->line));
- printf("OK midstr(win_buffer,currentline->line,percentpos+4\n");
- myIText.IText=win_buffer;
- printf("OK set myIText to win_buffer\n");
- printf(" after percent win_buffer -%s-\n",win_buffer);
- charpos=percentpos+3;
- PrintIText(mywindow->RPort,&myIText,10+(font_width*(charpos+1)),10*currentline->lineno);
- printf("OK - %s\n",win_buffer);
- }
- else
- {
- /*now print out*/
- printf("no percent-win_buffer -%s%\n",win_buffer);
- myIText.IText=win_buffer;
- PrintIText(mywindow->RPort,&myIText,10+(font_width*doscol),10*currentline->lineno);
- printf("OK\n");
- }
- }
- else /* cant find so dump*/
- {
- myIText.FrontPen = black;
- myIText.IText=currentline->line;
- PrintIText(mywindow->RPort,&myIText,10,10*currentline->lineno);
- }
- break;
- case 3:
- myIText.FrontPen = white;
- break;
- default:
- myIText.FrontPen = black;
- break;
- }
- if (currentline->linetype!=2)
- {
- myIText.IText=currentline->line;
- PrintIText(mywindow->RPort,&myIText,10,10*currentline->lineno);
- }
- currentline=currentline->next;
- }
- Permit();
- return 0;
- }
- /*only refresh the bits of the window we need to*/
- int refresh_window()
- {
- printf("START REFRESH\n");
- if ((oldwin_width!=mywindow->Width) || (oldwin_height!=mywindow->Height))
- {
- BeginRefresh(mywindow);
- write_win();
- EndRefresh(mywindow,TRUE);
- }
- printf("END REFRESH\n");
- return 0;
- }
- /*handle window messages*/
- BOOL handleIDCMP(struct Window *win, BOOL done)
- {
- struct IntuiMessage *message;
- USHORT code;
- SHORT mousex, mousey;
- ULONG class;
- printf("inside message handler\n");
- while (NULL != (message = (struct IntuiMessage *)GetMsg(win->UserPort)))
- {
- printf("Message handler!!!\n");
- class = message->Class;
- code = message->Code;
- mousex = message->MouseX;
- mousey = message->MouseY;
- ReplyMsg((struct Message *)message);
- /* The class contains the IDCMP type of the message. */
- switch (class)
- {
- case IDCMP_CLOSEWINDOW:
- done = TRUE;
- break;
- case IDCMP_VANILLAKEY:
- printf("IDCMP_VANILLAKEY (%lc)\n",code);
- break;
- case IDCMP_RAWKEY:
- printf("IDCMP_RAWKEY\n");
- break;
- case IDCMP_DISKINSERTED:
- loop_again=TRUE;
- break;
- case IDCMP_DISKREMOVED:
- loop_again=TRUE;
- break;
- case IDCMP_NEWSIZE:
- if (win_reg)
- {
- InstallClipRegion(mywindow->WLayer, win_oldreg);
- DisposeRegion(win_reg);
- win_rect.MinX = mywindow->BorderLeft;
- win_rect.MinY = mywindow->BorderTop;
- win_rect.MaxX = mywindow->Width-mywindow->BorderRight-1;
- win_rect.MaxY = mywindow->Height-mywindow->BorderBottom-1;
- if (win_reg = NewRegion())
- {
- OrRectRegion(win_reg, &win_rect);
- win_oldreg = InstallClipRegion(mywindow->WLayer, win_reg);
- }
- }
- /*fall through to refresh*/
- case IDCMP_REFRESHWINDOW:
- done=refresh_window();
- break;
- default:
- printf("Unknown IDCMP message\n");
- done=TRUE;
- break;
- }
- }
- printf("LEAVING message handler\n");
- return(done);
- }
- int main()
- {
- int i,return_code,ctrlc=0,finish=0,zz=0;
- int error=0;
- int scrnwidth=0,scrnheight=0;
- unsigned long signals;
- screen = LockPubScreen(screenName);
- if (screen) /*locked the screen so we can now read info */
- {
- if (drawinfo=GetScreenDrawInfo(screen))
- {
- myTEXTPEN = drawinfo->dri_Pens[TEXTPEN];
- myBACKGROUNDPEN = drawinfo->dri_Pens[BACKGROUNDPEN];
- /* create a TextAttr that matches the specified font. */
- myTextAttr.ta_Name = drawinfo->dri_Font->tf_Message.mn_Node.ln_Name;
- myTextAttr.ta_YSize = drawinfo->dri_Font->tf_YSize;
- myTextAttr.ta_Style = drawinfo->dri_Font->tf_Style;
- myTextAttr.ta_Flags = drawinfo->dri_Font->tf_Flags;
- FreeScreenDrawInfo(screen,drawinfo);
- }
- viewPort = &screen->ViewPort;
- colorMap = viewPort->ColorMap;
- GetRGB32(colorMap,0,colorMap->Count, colorTable);
- UnlockPubScreen(NULL,screen);
- numcolours=colorMap->Count;
- printf("width= %d height=%d\n",screen->Width,screen->Height);
- scrnwidth=screen->Width;
- scrnheight=screen->Height;
- }
- error=open_window(scrnwidth,scrnheight);
- if (error==0)
- {
- for(i=0;i<19;i++)
- {
- if ((wintemp = AllocVec(sizeof(struct window_keeper), MEMF_CLEAR|MEMF_ANY))==NULL)
- {
- Printf("Cant allocate memory\n"); /*MSG_ERROR_MEM*/
- return 1;
- }
- /*allocate memory and save string*/
- wintemp->line = (char*)malloc((strlen(lines[i])+1)*sizeof(char));
- sprintf(wintemp->line,"%s",lines[i]);
- if (winhead==NULL)
- {
- winhead = wintail = wintemp;
- /*printf("llhead mem= %d\n",&llhead);*/
- /*printf("-----llhead->next = %d\n", llhead->next);*/
- }
- else
- {
- wintail->next = wintemp;
- wintail = wintemp;
- /*printf("lltail mem =%d\n",&lltail);*/
- }
- winline++;
- wintemp->lineno=winline;
- wintemp->linetype=1; /*<<< in real code this varies from 1 to 4 depending on type of line*/
- wintemp->full=100; /*<<< in real code this is calculated*/
- }
- do
- {
- error=write_win();
- ctrlc=FALSE;
- finish=FALSE;
- while ((error==0) && (ctrlc==FALSE) && (finish==FALSE))
- {
- printf("waiting/n");
- signals = Wait (1L << mywindow->UserPort->mp_SigBit | SIGBREAKF_CTRL_C);
- printf("have signal %d\n",signals);
- if (CheckSignal(SIGBREAKF_CTRL_C))
- ctrlc=TRUE;
- printf("about to check signal\n");
- if (signals & (1L << mywindow->UserPort->mp_SigBit))
- finish=handleIDCMP(mywindow,finish);
- }
- printf("BEFORE CLEAR WINDOW STORE space or a abort\n");
- zz=0;
- while ((zz!=32) && (zz!='a'))
- {
- zz=getchar();
- if (zz=='a')
- return 0;
- putchar(zz);
- }
- while(winhead)
- {
- wintemp=winhead->next;
- free (winhead->line);
- printf("FREED winhead->line\n");
- FreeVec (winhead);
- printf("FREED WINHEAD\n");
- winhead=wintemp;
- }
- /* clear window*/
- SetRast(mywindow->RPort,0); /*0 is pen colour to fill window with*/
- } while (loop_again);
- } /*end if error*/
- /*clean up*/
- free(win_buffer); /*clear the line buffers*/
- free(win_buffer_part);
- if (win_reg)
- {
- InstallClipRegion(mywindow->WLayer, win_oldreg);
- DisposeRegion(win_reg);
- }
- CloseWindow(mywindow); /*close window if open */
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement