/*********************************************************************/ /* */ /* FREE Copyright 1987 by Tom Smythe */ /* RealTime Asc. Seattle, Wa. */ /* (206)-547-7292 */ /* (206)-774-4735 */ /* */ /* Returns free bytes of memory available from specified drives */ /* */ /* */ /*********************************************************************/ #include #include #include cc #include #include #define OFFSET 0x2eL #define ARGS "bad arguments\n" #define IN "need full path\n" #define READ "list too long ?\n" #define WRITE "write error\n" #define CLEAR "list cleared\n" #define DONE "list updated\n" #define BUFF "out of memory\n" #define STOP "Real" #define FREE "Time" #define USAGE "FREE Copyright 1987 by Tom Smythe\n\ RealTime Asc. Seattle, Wa.\n\ (206)-547-7292\n\ (206)-774-4735 bbs\n\n\ FREE returns available memory.\n\ /FREE -x updates list.\n\ /FREE -x clears list.\n" struct FileHandle * output = NULL; struct FileHandle * comfile = NULL; struct Lock * lock = NULL; struct Lock * mylock = NULL; char * buf = NULL; char * msg = NULL; char outline[256] = NULL; char *drive[7] = {"DF0:","DF1:","VD0:",FREE,FREE,FREE,STOP}; /***************************/ main(argc,argv) int argc; char *argv[]; { char * getfree(); char * control(); output = Output(); if (*(argv[1]) == '?') Write(output,USAGE,250L); else if (argc == 1) getfree(outline); else strcpy(outline,control(argc,argv)); Write(output,outline,(long)strlen(outline)); } /***************************/ char * itos(ord) long ord; { static char ostring[10]; int next = 9; if (!ord) ostring[next--] = '0'; while ((ord+9)/10) { ostring[next--] = ord % 10 + 0x30; ord /= 10; } while (next+1) ostring[next--] = 0x20; return(ostring); } /* ************************* */ long avail(disk) struct Lock * *disk; { struct InfoData * info; long bytes = 0L; info = AllocMem((long)sizeof(struct InfoData),MEMF_PUBLIC); Info(disk,info); bytes = (info->id_NumBlocks - info->id_NumBlocksUsed) * info->id_BytesPerBlock; FreeMem(info,(long)sizeof(struct InfoData)); return(bytes); } /* ************************* */ char * getfree(outline) char * outline; { long dfree = 0L; long cfree = 0L; long ffree = 0L; int i = -1; Forbid(); cfree = AvailMem(MEMF_CHIP); ffree = AvailMem(MEMF_FAST); Permit(); strcat(outline,"Chip"); strcat(outline,itos(cfree)); if (ffree) { strcat(outline," Fast"); strcat(outline,itos(ffree)); } strcat(outline,"\n"); while (*(drive[++i] +3) == ':') { if (lock = Lock(drive[i],ACCESS_READ)) { dfree = avail(lock); UnLock(lock); if (!dfree) { if (!strcmp(drive[i],"RAM:")) dfree = ffree + cfree; if (!strcmp(drive[i],"ram:")) dfree = ffree + cfree; } strcat(outline,""); strcat(outline,drive[i]); strcat(outline,""); strcat(outline,itos(dfree)); strcat(outline,"\n"); } } } /* ************************* */ char * control(Argc,Argv) int Argc; char * Argv[]; { char * cleanup(); char * msg = NULL; int i; if (strcmp(Argv[1],"-x")) return(ARGS); if (Argc > 2) for (i=Argc;i>2;i--) if (*(Argv[i-1]+3) != ':') return(ARGS); if (!(mylock = Lock(Argv[0],ACCESS_READ))) return(IN); if (!(comfile = Open(Argv[0],MODE_OLDFILE))) return(cleanup(IN)); if (!(buf = (char *)AllocMem(4L,MEMF_CHIP|MEMF_CLEAR))) return(cleanup(BUFF)); Seek(comfile,OFFSET,OFFSET_BEGINNING); if (Argc == 2) { while ((Read(comfile,buf,4L) == 4L) && (strcmp(buf,STOP))) { Seek(comfile,-4L,OFFSET_CURRENT); Write(comfile,FREE,4L); Seek(comfile,1L,OFFSET_CURRENT); } return(cleanup(strcmp(buf,STOP) ? READ : CLEAR)); } while (Argv[i]) { if ((Read(comfile,buf,4L) != 4L) || (!(strcmp(buf,STOP)))) return(cleanup(READ)); if (!strcmp(buf,FREE)) { Seek(comfile,-4L,OFFSET_CURRENT); if (Write(comfile,Argv[i],4L) != 4L) return(cleanup(WRITE)); i++; } Seek(comfile,1L,OFFSET_CURRENT); } return(cleanup(DONE)); } /***************************/ char * cleanup(err) char *err; { if (comfile) Close(comfile); if (mylock) UnLock(mylock); if (buf) FreeMem(buf,4L); return(err); } /***************************/