/* * MemSnap.c * * Just like MeMeter (a program I've been using for ages now). * Why write it? The MeMeter I've been using crashes under 2.0, * and I thought I'd take the time to learn (a bit) about 2.0 * by programming with it. Nothing groundbreaking here, though. * * Martin W Scott, 3/92. */ #include #include #include #include #include #include #include "wintext.h" /* font-independent positioning of text */ char version_str[] = "$VER: MemSnap 1.0 (" __DATE__ ")"; #define CHARS_ACROSS 32 /* max chars across for window texts */ #define CHARS_DOWN 4 /* how many rows of text in window */ WINTEXT wtexts[] = { { &wtexts[1], " Current", 6, 0, 3, JAM2 }, { &wtexts[2], "Snapshot", 15, 0, 3, JAM2 }, { &wtexts[3], " Used", 24, 0, 3, JAM2 }, { &wtexts[4], " Chip", 0, 1, 2, JAM2 }, { &wtexts[5], " Fast", 0, 2, 2, JAM2 }, { NULL, "Total", 0, 3, 2, JAM2 } }; char cbuf[3][9], sbuf[3][9], ubuf[3][9]; WINTEXT ctexts[] = { { &ctexts[1], &cbuf[0][0], 6, 1, 1, JAM2 }, { &ctexts[2], &cbuf[1][0], 6, 2, 1, JAM2 }, { NULL, &cbuf[2][0], 6, 3, 1, JAM2 } }; WINTEXT stexts[] = { { &stexts[1], &sbuf[0][0], 15, 1, 1, JAM2 }, { &stexts[2], &sbuf[1][0], 15, 2, 1, JAM2 }, { NULL, &sbuf[2][0], 15, 3, 1, JAM2 } }; WINTEXT utexts[] = { { &utexts[1], &ubuf[0][0], 24, 1, 1, JAM2 }, { &utexts[2], &ubuf[1][0], 24, 2, 1, JAM2 }, { NULL, &ubuf[2][0], 24, 3, 1, JAM2 } }; /* back to normal stuff */ struct Gadget biggadget; /* this will be snapshot gadget */ #define LEFTEDGE 40 /* window coordinates */ #define TOPEDGE 20 struct NewWindow nw = { LEFTEDGE,TOPEDGE,0,0,-1,-1, /* dimension, pens */ CLOSEWINDOW | GADGETUP | NEWSIZE, /* IDCMP flags */ WFLG_CLOSEGADGET | WFLG_DRAGBAR /* window flags */ | WFLG_DEPTHGADGET | WFLG_SMART_REFRESH, &biggadget, NULL, /* gadgets, checkmark */ "MemSnap", /* title */ NULL, NULL, /* screen, bitmap */ 0,0,0,0, /* extrema of dimensions */ WBENCHSCREEN /* screen to open onto */ }; WORD zipdata[4] = {LEFTEDGE, TOPEDGE}; struct TagItem wtags[] = { { WA_Zoom, (LONG)&zipdata[0] }, { TAG_DONE } }; struct TextFont *font; /* screen's default font (and so ours) */ struct Window *w; /* screen pointer */ struct GfxBase *GfxBase; /* graphics pointer */ struct IntuitionBase *IntuitionBase; /* intuition pointer */ WINTEXTINFO wtinfo; #define DELAY_TIME 10L /******************************************************************************/ /* My stub for dos.library's VPrintf - amiga.lib one doesn't work for me */ /******************************************************************************/ #include LONG __stdargs DosPrintf(char *s, ...); LONG __stdargs DosPrintf(char *s, ...) { va_list ap; va_start(ap,s); return VPrintf(s, (long *)ap); } /******************************************************************************/ /* prototypes for general routines */ void _main(char *); BOOL OpenLibs(void); void CloseAll(void), main(int, char **); BOOL long2str(LONG, char *, UWORD); BOOL OpenLibs() /* open required libraries */ { if ((GfxBase = (void *)OpenLibrary("graphics.library", 0L)) && (IntuitionBase = (void *)OpenLibrary("intuition.library", 37L))) return TRUE; CloseAll(); return FALSE; } void CloseAll() /* close opened libraries */ { if (font) CloseFont(font); if (w) CloseWindow(w); if (GfxBase) CloseLibrary(GfxBase); if (IntuitionBase) CloseLibrary(IntuitionBase); } /* and this one is rather specific to this program... */ BOOL long2str(LONG n, char *s, UWORD len) /* long to string, right-adjusted */ { /* will NOT null-terminate */ /* len is space in buffer (excl. '\0') */ /* also, prints nothin if zero */ short sign; /* minus sign required? */ char *t = &s[len-1]; /* get last space in string */ if (n < 0) /* get sign of n */ { n = -n; sign = -1; len--; /* reduce space (we'll need it for '-') */ } else sign = 0; while (n && len) /* work to do and space to do it */ { *t = '0' + (n % 10); /* get rightmost digit */ t--; /* mave back up string */ len--; n /= 10; } if (sign) *t-- = '-'; /* put sign in now */ while (len--) /* fill remainder with spaces */ *t-- = ' '; if (n) return FALSE; /* failure */ return TRUE; } /******************************************************************************/ /* Memory data management/manipulation routines */ void getmem(ULONG *), submem(ULONG *, ULONG *, ULONG *), updatemem(ULONG *, WINTEXT *); #define CHIP 0 #define FAST 1 #define TOTAL 2 #define clearmem(mem) mem[CHIP] = mem[FAST] = mem[TOTAL] = 0L void getmem(ULONG *mem) /* store current memory */ { mem[TOTAL] = mem[CHIP] = AvailMem(MEMF_CHIP); mem[TOTAL] += (mem[FAST] = AvailMem(MEMF_FAST)); } void submem(ULONG *to, ULONG *from, ULONG *howmuch) /* to = from - howmuch */ { to[CHIP] = from[CHIP] - howmuch[CHIP]; to[FAST] = from[FAST] - howmuch[FAST]; to[TOTAL] = from[TOTAL] - howmuch[TOTAL]; } void updatemem(ULONG *mem, WINTEXT *memtext) /* update specified display */ { long2str(mem[CHIP], memtext[CHIP].text, 8); long2str(mem[FAST], memtext[FAST].text, 8); long2str(mem[TOTAL], memtext[TOTAL].text, 8); RenderWinTexts(&wtinfo, memtext); } /******************************************************************************/ void _main(char *args) /* provide a memory 'meter' */ { struct IntuiMessage *msg; /* our window messages */ ULONG cmem[3],smem[3],umem[3]; /* storage of memory information */ ULONG class; /* message class */ BOOL iconified = FALSE; /* are we iconified? */ if (!OpenLibs()) /* failure => under 1.3 */ { if (Output()) /* got a CLI */ Write(Output(), "Needs KS 2.0\n", -1); } else if (InitWinTextInfo(&wtinfo)) { /* size window to fit screen font */ nw.Height = CHARS_DOWN*wtinfo.font_y + wtinfo.toffset + wtinfo.boffset; nw.Width = CHARS_ACROSS*wtinfo.font_x + wtinfo.loffset + wtinfo.roffset; zipdata[2] = 20*wtinfo.font_x; zipdata[3] = wtinfo.toffset; /* and set up big gadget */ biggadget.LeftEdge = wtinfo.loffset; biggadget.TopEdge = wtinfo.toffset; biggadget.Width = CHARS_ACROSS*wtinfo.font_x; biggadget.Height = wtinfo.font_y; biggadget.Flags = GADGHCOMP; biggadget.Activation = RELVERIFY; if (w = OpenWindowTagList(&nw, wtags)) { wtinfo.window = w; if (!(font = OpenFont(wtinfo.tattr))) { DosPrintf("Can't get screen's font!\n"); CloseAll(); /* unlikely event... */ } SetFont(w->RPort, font); RenderWinTexts(&wtinfo, wtexts); /* draw initial texts */ clearmem(smem); /* initialize memory display */ for (;;) /* main event loop */ { while (msg = (struct IntuiMessage *)GetMsg(w->UserPort)) { class = msg->Class; ReplyMsg((struct Message *)msg); if (class == GADGETUP) { /* new snapshot */ getmem(smem); updatemem(smem, stexts); } else if (class == NEWSIZE) { if (iconified) { iconified = FALSE; RenderWinTexts(&wtinfo, wtexts); RenderWinTexts(&wtinfo, stexts); } else iconified = TRUE; } else /* class == CLOSEWINDOW */ { CloseAll(); return; } } /* while */ if (iconified) Wait(1 <UserPort->mp_SigBit); else { getmem(cmem); submem(umem, smem, cmem); updatemem(cmem, ctexts); updatemem(umem, utexts); Delay(DELAY_TIME); } } /* for */ } else DosPrintf("Can't open window\n"); } else DosPrintf("Can't get screen info\n"); CloseAll(); } /* main */