home *** CD-ROM | disk | FTP | other *** search
- /* at_putdata.c */
- /*************************************************************************
- *** AskTask PutData Module ***
- *** Date begun: 2/4/89. ***
- *** Last modified: 2/4/89. ***
- *************************************************************************/
- /*** This contains supplementary display functions cut from asktask.c ***
- *************************************************************************/
-
- #include "asktask.h"
-
- extern struct Window *Window;
- extern struct Task *task[NUM_TASKS];
- extern char tnames[NUM_TASKS*TNAMESIZE];
- extern char *tnp[NUM_TASKS];
- extern int numtasks,page,ct;
-
- extern void input(struct Window *,char *,char *,char *,int,int,int,int,int);
-
- char thbuf[21];
- char tlbuf[21];
- struct IntuiText taskhead = {1,0,JAM2,4,11,NULL,&thbuf[0],NULL};
- struct IntuiText taskline = {3,0,JAM1,0,0,NULL,&tlbuf[0],NULL};
- char dhbuf[51];
- struct IntuiText datatask = {3,2,JAM1,218,11,NULL,&dhbuf[0],NULL};
- struct IntuiText datahead = {1,2,JAM1,170,11,NULL,"Task: ",&datatask};
-
- struct IntuiText msgline = {1,2,JAM1,4,135,NULL,NULL,NULL};
- struct IntuiText notask = {0,3,JAM1,0,0,NULL,"No current task",NULL};
-
- struct IntuiText datafixd = {1,2,JAM1,170,105,NULL,"E:",NULL};
- struct IntuiText datafixc = {1,2,JAM1,170,97,NULL,"R:",&datafixd};
- struct IntuiText datafixb = {1,2,JAM1,170,89,NULL,"W:",&datafixc};
- struct IntuiText datafixa = {1,2,JAM1,170,81,NULL,"A:",&datafixb};
- struct IntuiText datafix9 = {1,2,JAM1,220,71,NULL,"Signals",&datafixa};
- struct IntuiText datafix8 = {1,2,JAM1,358,65,NULL,"Rm",&datafix9};
- struct IntuiText datafix7 = {1,2,JAM1,358,57,NULL,"Sz",&datafix8};
- struct IntuiText datafix6 = {1,2,JAM1,358,49,NULL,"Up",&datafix7};
- struct IntuiText datafix5 = {1,2,JAM1,358,41,NULL,"Lw",&datafix6};
- struct IntuiText datafix4 = {1,2,JAM1,358,33,NULL,"Rg",&datafix5};
- struct IntuiText datafix3 = {1,2,JAM1,386,23,NULL,"Stack",&datafix4};
- struct IntuiText datafix2 = {1,2,JAM1,170,39,NULL,"Flag:",&datafix3};
- struct IntuiText datafix1 = {1,2,JAM1,170,31,NULL,"State:",&datafix2};
- struct IntuiText datafix = {1,2,JAM1,170,23,NULL,"Priority:",&datafix1};
- char dvbuf[41];
- struct IntuiText datavar = {0,2,JAM1,0,0,NULL,&dvbuf[0],NULL};
-
- char *anon = "---- Anonymous ----";
- char *state[8] = {
- "TS_INVALID", "TS_ADDED", "TS_RUN", "TS_READY",
- "TS_WAIT", "TS_EXCEPT", "TS_REMOVED", "BEYOND ME!"};
- char *flag[9] = {
- "TB_PROCTIME", "NOTHING", "NOTHING", "NOTHING",
- "TB_STACKCHK", "TB_EXCEPT", "TB_SWITCH", "TB_LAUNCH",
- "BEYOND ME!"};
-
- unsigned long bitsput(char *); /* Convert bit string to ULONG */
- void putbits(char *,unsigned long); /* Convert ULONG to bit string */
- void prevpage(); /* Previous task page */
- void nextpage(); /* Next task page */
- void puttname(int,int); /* Put task name n at line y */
- void puttasks(); /* Display current task page */
- void puttaskdata(); /* Display current task's data */
- void setupwindow(); /* Draws boxes and things */
- void putmessage(char *,int); /* Display a message line */
- char getchfromw(); /* Get a character from Window */
- int yesno(); /* Return user's yes or no */
-
- unsigned long bitsput(cp) /*=============================================*/
- char *cp; /* Converts bit string cp to unsigned long. If */
- { /* string is too small, the missing bits are */
- unsigned long r; /* left as zero. */
- int i;
- r = 0; i = 31;
- while (*cp && (i > -1)) {
- if (*cp == '1') r = r + (1L << i);
- i--; cp++;
- }
- return(r);
- }
-
- void putbits(cp,l) /*=================================================*/
- char *cp; /* Converts ULONG l into a 32-bit string cp. Uses */
- unsigned long l; /* 33 characters including the zero string ender. */
- {
- int j;
- for (j = 0; j < 32; j++) cp[j] = (l & (1L << (31-j))) ? '1':'0';
- cp[32] = 0;
- }
-
- void prevpage() /*====================================================*/
- { /* Display previous task page. */
- putmessage("",1);
- if (page == 0) {
- putmessage("There's no previous task page!",3);
- return;
- }
- page--;
- puttasks();
- }
-
- void nextpage() /*====================================================*/
- { /* Display next task page */
- putmessage("",1);
- if (numtasks <= (page + 1)*14) {
- putmessage("There's no next task page!",3);
- return;
- }
- page++;
- puttasks();
- }
-
- void puttname(n,y) /*=================================================*/
- int n,y;
- {
- if (tnp[n][0]) sprintf(tlbuf,"%-.20s",tnp[n]);
- else strcpy(tlbuf,anon);
- PrintIText(Window->RPort,&taskline,4,21+y*8);
- }
-
- void puttasks() /*====================================================*/
- { /* Write the current page of task names */
- int i,j;
- putmessage("",1);
- while (numtasks < page * 14) page--;
- sprintf(thbuf," Task (page %.1d/%.1d) ",1 + page,1 + (numtasks-1)/14);
- PrintIText(Window->RPort,&taskhead,0,0);
- SetAPen(Window->RPort,0);
- RectFill(Window->RPort,4,21,165,132);
- j = page * 14; i = 0;
- while ((j < numtasks) && (i < 14)) {
- puttname(j,i);
- i++; j++;
- }
- }
-
- void puttaskdata() /*=================================================*/
- { /* Display the current task's data */
- int s;
- long stack[3];
- unsigned long sigs[4];
- putmessage("",1);
- if (ct < 0) {
- SetAPen(Window->RPort,1);
- RectFill(Window->RPort,168,10,471,132);
- SetAPen(Window->RPort,2);
- RectFill(Window->RPort,176,14,463,128);
- SetAPen(Window->RPort,3);
- RectFill(Window->RPort,289,22,350,120);
- RectFill(Window->RPort,229,52,410,80);
- PrintIText(Window->RPort,¬ask,260,62);
- return;
- }
- SetAPen(Window->RPort,2);
- RectFill(Window->RPort,168,10,471,132);
- SetAPen(Window->RPort,1);
- Move(Window->RPort,170,19); Draw(Window->RPort,469,19);
- if (tnp[ct][0]) strcpy(dhbuf,tnp[ct]);
- else strcpy(dhbuf,anon);
- PrintIText(Window->RPort,&datahead,0,0);
- PrintIText(Window->RPort,&datafix,0,0);
- Move(Window->RPort,376,31);
- Draw(Window->RPort,444,31); Draw(Window->RPort,444,73);
- Draw(Window->RPort,376,73); Draw(Window->RPort,376,31);
- Move(Window->RPort,375,31); Draw(Window->RPort,375,73);
- Move(Window->RPort,445,31); Draw(Window->RPort,445,73);
- Move(Window->RPort,188,79);
- Draw(Window->RPort,448,79); Draw(Window->RPort,448,113);
- Draw(Window->RPort,188,113); Draw(Window->RPort,188,79);
- Move(Window->RPort,187,79); Draw(Window->RPort,187,113);
- Move(Window->RPort,449,79); Draw(Window->RPort,449,113);
- s = (int)task[ct]->tc_Node.ln_Pri;
- sprintf(dvbuf,"%3d",s); PrintIText(Window->RPort,&datavar,250,23);
- s = (int)task[ct]->tc_State;
- if ((s < 0) || (s > 7)) s = 7;
- strcpy(dvbuf,state[s]); PrintIText(Window->RPort,&datavar,226,31);
- s = (int)task[ct]->tc_Flags;
- if ((s < 0) || ( s > 8)) s = 8;
- strcpy(dvbuf,flag[s]); PrintIText(Window->RPort,&datavar,226,39);
- SetAPen(Window->RPort,0);
- RectFill(Window->RPort,377,32,443,72);
- if (tnp[ct][0]) {
- datavar.FrontPen = 2;
- Disable();
- stack[0] = (long)(task[ct]->tc_SPReg);
- stack[1] = (long)(task[ct]->tc_SPLower);
- stack[2] = (long)(task[ct]->tc_SPUpper);
- Enable();
- sprintf(dvbuf,"%08lx",stack[0]);
- PrintIText(Window->RPort,&datavar,378,33);
- sprintf(dvbuf,"%08lx",stack[1]);
- PrintIText(Window->RPort,&datavar,378,41);
- sprintf(dvbuf,"%08lx",stack[2]);
- PrintIText(Window->RPort,&datavar,378,49);
- sprintf(dvbuf,"%08lx",stack[2]-stack[1]);
- PrintIText(Window->RPort,&datavar,378,57);
- sprintf(dvbuf,"%08lx",stack[0]-stack[1]);
- PrintIText(Window->RPort,&datavar,378,65);
- datavar.FrontPen = 0;
- }
- Disable();
- sigs[0] = task[ct]->tc_SigAlloc; sigs[1] = task[ct]->tc_SigWait;
- sigs[2] = task[ct]->tc_SigRecvd; sigs[3] = task[ct]->tc_SigExcept;
- Enable();
- putbits(dvbuf,sigs[0]); PrintIText(Window->RPort,&datavar,190,81);
- putbits(dvbuf,sigs[1]); PrintIText(Window->RPort,&datavar,190,89);
- putbits(dvbuf,sigs[2]); PrintIText(Window->RPort,&datavar,190,97);
- putbits(dvbuf,sigs[3]); PrintIText(Window->RPort,&datavar,190,105);
- }
-
- void setupwindow() /*=================================================*/
- { /* Draw boxes and things. */
- SetAPen(Window->RPort,1);
- Move(Window->RPort,166,10); Draw(Window->RPort,166,132);
- Move(Window->RPort,167,10); Draw(Window->RPort,167,132);
- Move(Window->RPort,472,10); Draw(Window->RPort,472,132);
- Move(Window->RPort,473,10); Draw(Window->RPort,473,132);
- PrintIText(Window->RPort,&taskhead,0,0);
- Move(Window->RPort,4,19); Draw(Window->RPort,163,19);
- Move(Window->RPort,2,133); Draw(Window->RPort,637,133);
- SetAPen(Window->RPort,2);
- RectFill(Window->RPort,2,134,636,143);
- }
-
- void putmessage(cp,c) /*==============================================*/
- char *cp; /* Display a message line cp, in color c. */
- int c;
- {
- SetAPen(Window->RPort,2);
- RectFill(Window->RPort,4,135,636,142);
- msgline.IText = cp;
- msgline.FrontPen = (UBYTE)c;
- PrintIText(Window->RPort,&msgline,0,0);
- }
-
- char getchfromw() /*==================================================*/
- { /* Return a character from the Window. */
- struct IntuiMessage *msg;
- int loop;
- char ch;
- loop = 1;
- while (loop) {
- Wait(1<<Window->UserPort->mp_SigBit);
- while (msg = (struct IntuiMessage *)GetMsg(Window->UserPort)) {
- if (msg->Class != RAWKEY) {
- ReplyMsg((struct Message *)msg);
- continue;
- }
- ch = (char)msg->Code; loop = 0;
- ReplyMsg((struct Message *)msg);
- }
- }
- return(ch);
- }
-
- int yesno() /*=======================================================*/
- { /* Get a y/n answer from the window. */
- char ch;
- while (1) {
- ch = getchfromw();
- if ((ch == 0x15)||(ch == 0x36)||(ch == 0x45)) break;
- }
- return((ch == 0x15)? 1:0);
- }
-