home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 632.lha / ParM_v3.6 / ParM_Src.lzh / ParM_Src / Misc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-23  |  5.0 KB  |  240 lines

  1. /*
  2.  *    Misc.c - Copyright © 1991 by S.R. & P.C.
  3.  *
  4.  *    Created:    04 Apr 1991  17:39:43
  5.  *    Modified:    22 Mar 1992  23:32:51
  6.  *
  7.  *    Make>> make
  8.  */
  9.  
  10. #include "ParMBase.h"
  11.  
  12. BPTR DosOpen(const char *name, long accessMode);
  13. #pragma amicall(DOSBase, 0x1e, DosOpen(d1,d2))
  14.  
  15. long DosRead(BPTR file, char *buffer, long length);
  16. #pragma amicall(DOSBase, 0x2a, DosRead(d1,d2,d3))
  17.  
  18. void DosClose(BPTR file);
  19. #pragma amicall(DOSBase, 0x24, DosClose(d1))
  20.  
  21. extern struct ExecBase *SysBase;
  22.  
  23. static char *StrErr[] = {
  24.     "No default dir",
  25.     "Object in use",
  26.     "Object already exists",
  27.     "Directory not found",
  28.     "Object not found",
  29.     "Bad stream name",
  30.     "Object too large",
  31.     "Unknown error",
  32.     "Unknown action",
  33.     "Stream name component invalid",
  34.     "Invalid lock",
  35.     "Wrong object type",
  36.     "Disk not validated",
  37.     "Disk write protected",
  38.     "Attempt to rename across devices",
  39.     "Directory not empty",
  40.     "Too many levels",
  41.     "Device not mounted",
  42.     "Seek error",
  43.     "Comment too big",
  44.     "Disk full",
  45.     "Object delete protected",
  46.     "Object write protected",
  47.     "Object read protected",
  48.     "Not a dos disk",
  49.     "No disk in drive"
  50. };
  51.  
  52.  
  53. /* Warn user of a load error */
  54.  
  55. char *DosError(long err)
  56. {
  57.     char *str;
  58.     short e = (short)err;
  59.  
  60.     switch(e) {
  61.     case 0:
  62.         str = "Error 0, no error!";
  63.         break;
  64.     case ERROR_NO_FREE_STORE:
  65.         str = "Not enough memory";
  66.         break;
  67.     case ERROR_TASK_TABLE_FULL:
  68.         str = "Task table full";
  69.         break;
  70.     case ERROR_LINE_TOO_LONG:
  71.         str = "Line too long";
  72.         break;
  73.     case ERROR_FILE_NOT_OBJECT:
  74.         str = "File is not an object module";
  75.         break;
  76.     case ERROR_INVALID_RESIDENT_LIBRARY:
  77.         str = "Invalid resident library";
  78.         break;
  79.     default:
  80.         if (e>=201 && e<=226)
  81.             str = StrErr[e-201];
  82.         else
  83.             str = "Unknown error";
  84.     }
  85.     return str;
  86. }
  87.  
  88.  
  89. char *StrIoErr(void)
  90. {
  91.     return DosError(IoErr());
  92. }
  93.  
  94.  
  95. /*****  make (and allocate) a copy of the passed string *****/
  96.  
  97. char *CopyStr(char *str)
  98. {
  99.     char *newstr;
  100.  
  101.     if (newstr = AllocMem(strlen(str)+1, MEMF_PUBLIC))
  102.         strcpy(newstr, str);
  103.     return newstr;
  104. }
  105.  
  106.  
  107. void FreeStr(char *str)
  108. {
  109.     if (str)
  110.         FreeMem(str, strlen(str)+1);
  111. }
  112.  
  113.  
  114. void NewMinList(struct MinList *MinList)
  115. {
  116.     MinList->mlh_Head = (struct MinNode *)&MinList->mlh_Tail;
  117.     MinList->mlh_Tail = NULL;
  118.     MinList->mlh_TailPred = (struct MinNode *)MinList;
  119. }
  120.  
  121.  
  122. ULONG MakeMenuShortCut(struct Menu *M, ULONG c)
  123. {
  124.     struct MenuItem *MI, *SI;
  125.     short menu, item, sub;
  126.  
  127.     c = Toupper(c);
  128.     for( menu=0 ; M ; M=M->NextMenu, menu++ ) {
  129.         for( MI=M->FirstItem, item=0 ; MI ; MI=MI->NextItem, item++ ) {
  130.             if (SI=MI->SubItem) {
  131.                 for( sub=0 ; SI ; SI=SI->NextItem, sub++ ) {
  132.                     if ((SI->Flags & COMMSEQ) && c == Toupper(SI->Command)) {
  133.                         SI->NextSelect = MENUNULL;
  134.                         return (sub<<11)|(item<<5)|menu;
  135.                     }
  136.                 }
  137.             }
  138.             else if ((MI->Flags & COMMSEQ) && c == Toupper(MI->Command)) {
  139.                 MI->NextSelect = MENUNULL;
  140.                 return (NOSUB<<11)|(item<<5)|menu;
  141.             }
  142.         }
  143.     }
  144.     return MENUNULL;
  145. }
  146.  
  147.  
  148. void InitDefaults(struct ParMConfig *PCfg)
  149. {
  150.     strcpy(PCfg->CmdWindow, DEFAULT_CMD_WINDOW);
  151.     strcpy(PCfg->ShellWindow, DEFAULT_SHELL_WINDOW);
  152.     strcpy(PCfg->ShellCmd, DEFAULT_SHELL_CMD);
  153.     strcpy(PCfg->WaitCmd, DEFAULT_WAIT_CMD);
  154.     strcpy(PCfg->TmpDir, DEFAULT_TMP_DIR);
  155.     PCfg->DefaultStack = 4000;
  156. }
  157.  
  158.  
  159. /* See if some wb messages have been replied, and free them */
  160.  
  161. void FreeRepliedWBMessages(void)
  162. {
  163.     struct ParMBase *ParMBase;
  164.     struct Extended_WBStartup *EWBS;
  165.     
  166.     Forbid();
  167.     while(EWBS = (struct Extended_WBStartup *)GetMsg(&ParMBase->pb_MsgPort)) {
  168.         ParMBase->pb_MsgCnt--;
  169.         WBFree(EWBS);
  170.     }
  171.     Permit();
  172. }
  173.  
  174.  
  175. long IsHidden(struct Window *W)
  176. {
  177.     long Hidden = FALSE;
  178.     struct Layer *L1, *L2;
  179.  
  180.     LockLayerInfo(&W->WScreen->LayerInfo);
  181.     L1 = WhichLayer(&W->WScreen->LayerInfo, W->LeftEdge, W->TopEdge);
  182.     L2 = WhichLayer(&W->WScreen->LayerInfo, W->LeftEdge + W->Width-1, W->TopEdge + W->Height-1);
  183.     if (W != (struct Window *)L1->Window || W != (struct Window *)L2->Window)
  184.         Hidden = TRUE;
  185.     UnlockLayerInfo(&W->WScreen->LayerInfo);
  186.     return Hidden;
  187. }
  188.  
  189.  
  190. /***** get CLI window ptr *****/
  191.  
  192. struct Window *GetWindow(void)
  193. {
  194.     struct Process *pp;
  195.     struct InfoData *infodata;
  196.     struct Window *win;
  197.     long args[7];
  198.  
  199.     pp = (struct Process *)SysBase->ThisTask;
  200.     infodata = AllocMem((long) sizeof(struct InfoData), MEMF_CLEAR | MEMF_PUBLIC);
  201.     args[0] = (long)infodata >> 2;
  202.     SendPacket(ACTION_DISK_INFO, args, (struct MsgPort *)pp->pr_ConsoleTask);
  203.     win = (struct Window *)infodata->id_VolumeNode;
  204.     FreeMem(infodata, (long)sizeof(struct InfoData));
  205.     return win;
  206. }
  207.  
  208.  
  209. struct IORequest *CreateExtIO(struct MsgPort *ioReplyPort, long size)
  210. {
  211.     struct IORequest *ioReq;
  212.  
  213.     if (ioReq = AllocMem(size, MEMF_PUBLIC|MEMF_CLEAR)) {
  214.         ioReq->io_Message.mn_Node.ln_Type = NT_MESSAGE;
  215.         ioReq->io_Message.mn_Length = size;
  216.         ioReq->io_Message.mn_ReplyPort = ioReplyPort;
  217.     }
  218.     return ioReq;
  219. }
  220.  
  221.  
  222. BOOL LoadMouseOpt(char *MouseOptFileName, struct MouseOpt *MouseOpt)
  223. {
  224.     struct MouseOpt TmpOpt;
  225.     BPTR fh;
  226.     short bytes;
  227.  
  228.     if (fh = DosOpen(MouseOptFileName, MODE_OLDFILE)) {
  229.         bytes = DosRead(fh, (char *)&TmpOpt, sizeof(struct MouseOpt));
  230.         DosClose(fh);
  231.         if (bytes == sizeof(struct MouseOpt) && TmpOpt.Version == MOUSEOPT_VERSION) {
  232.             *MouseOpt = TmpOpt;
  233.             return TRUE;
  234.         }
  235.     }
  236.     return FALSE;
  237. }
  238.  
  239.  
  240.