home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d03xx / d0326.lha / VSnap / openclose.c < prev    next >
C/C++ Source or Header  |  1990-03-05  |  6KB  |  212 lines

  1. #include "snap.h"
  2.  
  3. IMPORT LONGBITS startsignal, insertsignal, cancelsignal, donesignal;
  4. IMPORT LONGBITS movesignal, clicksignal, timersignal, initsignal;
  5. IMPORT ULONG startsignum, insertsignum, cancelsignum, donesignum;
  6. IMPORT ULONG movesignum, clicksignum, timersignum, initsignum;
  7.  
  8. /* program */
  9. IMPORT struct MsgPort *port;
  10. IMPORT struct Task *MyTask;
  11.  
  12. /* Snap state machine */
  13. IMPORT WORD action;
  14. IMPORT WORD state;
  15.  
  16. /* clipboard */
  17. IMPORT struct IOClipReq *ClipReq;
  18. IMPORT struct MsgPort *ClipPort;
  19.  
  20. /* input device */
  21. IMPORT struct MsgPort *inputDevPort;
  22. IMPORT struct Interrupt handlerStuff;
  23. IMPORT struct IOStdReq *inputRequestBlock;
  24. IMPORT WORD Priority;
  25.  
  26. IMPORT UBYTE *CharData;
  27.  
  28. /* console */
  29. IMPORT struct MsgPort *ConPort;
  30. IMPORT struct IOStdReq *ConIOR;
  31. IMPORT struct KeyMap keymap;
  32.  
  33. /* windows */
  34. IMPORT struct MsgPort *Sharedport;
  35. IMPORT SHORT Sharedrefs;
  36.  
  37. /* libraries */
  38. IMPORT struct IntuitionBase *IntuitionBase;
  39. IMPORT struct GfxBase       *GfxBase;
  40. IMPORT struct LayersBase    *LayersBase;
  41.  
  42. /* graphics */
  43. IMPORT struct RastPort TempRp;
  44. IMPORT struct BitMap TempBM;
  45. IMPORT UBYTE *TempRaster;
  46.  
  47. VOID CloseStuff()
  48. {
  49.     SafeRestore();
  50.     if (TempRaster)         FreeRaster(TempRaster, 16L, 16L);
  51.     if (CharData)           FreeMem(CharData, 256L*32);
  52.     if (inputRequestBlock) {
  53.         if (inputRequestBlock->io_Device) {
  54.             inputRequestBlock->io_Command = IND_REMHANDLER;  /* Remove handler */
  55.             inputRequestBlock->io_Data    = (APTR)&handlerStuff;
  56.             DoIO(inputRequestBlock);
  57.             CloseDevice(inputRequestBlock);
  58.         }
  59.         DeleteStdIO(inputRequestBlock);
  60.     }
  61.     if (inputDevPort)       DeletePort(inputDevPort);
  62.     if (ConIOR) {
  63.         CloseDevice(ConIOR);
  64.         DeleteStdIO(ConIOR);
  65.     }
  66.     if (ConPort)            DeletePort(ConPort);
  67.     if (ClipReq) {
  68.         CloseDevice(ClipReq);
  69.         FreeMem(ClipReq, (LONG)sizeof(*ClipReq));
  70.     }
  71.     if (ClipPort)           DeletePort(ClipPort);
  72.     if (startsignum != -1)  FreeSignal(startsignum);
  73.     if (donesignum != -1)   FreeSignal(donesignum);
  74.     if (cancelsignum != -1) FreeSignal(cancelsignum);
  75.     if (movesignum != -1)   FreeSignal(movesignum);
  76.     if (insertsignum != -1) FreeSignal(insertsignum);
  77.     if (clicksignum != -1)  FreeSignal(clicksignum);
  78.     if (timersignum != -1)  FreeSignal(timersignum);
  79.     if (initsignum != -1)   FreeSignal(initsignum);
  80.     if (port) {
  81.         DeletePort(port);
  82.     }
  83.     if (IntuitionBase)      CloseLibrary(IntuitionBase);
  84.     if (GfxBase)            CloseLibrary(GfxBase);
  85.     if (LayersBase)         CloseLibrary(LayersBase);
  86.  
  87.     _exit(0L);
  88. }
  89.  
  90. VOID OpenStuff()
  91. {
  92.     action = noaction;
  93.     state  = waiting;
  94.     inputRequestBlock = NULL;
  95.  
  96.     Sharedrefs = 0;
  97.     Sharedport = NULL;
  98.  
  99.     Forbid();
  100.     if (port = FindPort(SNAPPORT)) {
  101.         Signal(port->mp_SigTask, SIGBREAKF_CTRL_C);
  102.         Permit();
  103.         port = NULL;  /* Don't touch his port */
  104.         CloseStuff();
  105.     }
  106.  
  107.     Permit();
  108.  
  109.     /* OK, we're here to stay. Set up everything we need. */
  110.  
  111.     /* libraries */
  112.  
  113.     if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L)))
  114.         CloseStuff();
  115.     if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L)))
  116.         CloseStuff();
  117.     if (!(LayersBase = (struct LayersBase *)OpenLibrary("layers.library", 0L)))
  118.         CloseStuff();
  119.  
  120.     /* public port */
  121.  
  122.     if (!(port = CreatePort(SNAPPORT, 0L)))
  123.         CloseStuff();
  124.  
  125.     /* signals */
  126.  
  127.     if ((startsignum = AllocSignal(-1L)) == -1L)
  128.         CloseStuff();
  129.     if ((insertsignum = AllocSignal(-1L)) == -1L)
  130.         CloseStuff();
  131.     if ((cancelsignum = AllocSignal(-1L)) == -1L)
  132.         CloseStuff();
  133.     if ((donesignum = AllocSignal(-1L)) == -1L)
  134.         CloseStuff();
  135.     if ((movesignum = AllocSignal(-1L)) == -1L)
  136.         CloseStuff();
  137.     if ((clicksignum = AllocSignal(-1L)) == -1L)
  138.         CloseStuff();
  139.     if ((timersignum = AllocSignal(-1L)) == -1L)
  140.         CloseStuff();
  141.     if ((initsignum = AllocSignal(-1L)) == -1L)
  142.         CloseStuff();
  143.     MyTask = FindTask(0L);                   /* Find myself to Signal me.  */
  144.     startsignal  = 1L << startsignum;         /* No good to use bit numbers */
  145.     insertsignal = 1L << insertsignum;
  146.     cancelsignal = 1L << cancelsignum;
  147.     donesignal   = 1L << donesignum;
  148.     movesignal   = 1L << movesignum;
  149.     clicksignal  = 1L << clicksignum;
  150.     timersignal  = 1L << timersignum;
  151.     initsignal   = 1L << initsignum;
  152.  
  153.     /* input devive */
  154.  
  155.     if (!(inputDevPort = CreatePort(0L, 0L)))
  156.         CloseStuff();
  157.     if (!(inputRequestBlock = CreateStdIO(inputDevPort)))
  158.         CloseStuff();
  159.     if (OpenDevice("input.device", 0L, inputRequestBlock, 0L))
  160.         CloseStuff();
  161.  
  162.     /* clipboard device */
  163.  
  164.     if (!(ClipPort = CreatePort(0L, 0L)))
  165.         CloseStuff();
  166.     if (!(ClipReq = AllocMem((LONG)sizeof(*ClipReq), MEMF_PUBLIC|MEMF_CLEAR)))
  167.         CloseStuff();
  168.     if (OpenDevice("clipboard.device", 0L, ClipReq, 0L))
  169.         CloseStuff();
  170.     ClipReq->io_Message.mn_ReplyPort = ClipPort;
  171.     ClipReq->io_ClipID = 0L;
  172.  
  173.     /* console device */
  174.  
  175.     if (!(ConPort = CreatePort(0L, 0L)))
  176.         CloseStuff();
  177.     if (!(ConIOR = CreateStdIO(ConPort)))
  178.         CloseStuff();
  179.     if (OpenDevice("console.device", -1L, ConIOR, 0L))
  180.         CloseStuff();
  181.  
  182.     /* temporary raster */
  183.  
  184.     if (!(TempRaster = AllocRaster(16L, 16L)))
  185.         CloseStuff();
  186.     InitRastPort(&TempRp);                   /* Init RastPort used for */
  187.     InitBitMap(&TempBM, 1L, 16L, 16L);       /* Locating position of   */
  188.     TempBM.Planes[0] = TempRaster;           /* first character.       */
  189.     TempRp.BitMap = &TempBM;
  190.  
  191.  
  192.     /* Aligned font bitmap to use when matching */
  193.  
  194.     CharData = AllocRaster(16L, 256L*16);
  195.     if (!CharData) {
  196.         CloseStuff();
  197.     }
  198.  
  199.  
  200.     /* input handler */
  201.  
  202.     handlerStuff.is_Data = 3;             /* Set up for installation of */
  203.     handlerStuff.is_Code = myhandler;        /* myhandler.                 */
  204.     handlerStuff.is_Node.ln_Pri = Priority;  /* Ahead of intuition, please */
  205.  
  206.     inputRequestBlock->io_Command = IND_ADDHANDLER;
  207.     inputRequestBlock->io_Data    = (APTR)&handlerStuff;
  208.  
  209.     DoIO(inputRequestBlock);  /* Add me. */
  210.  
  211. }
  212.