home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / UFUNCOBJ.C < prev   
C/C++ Source or Header  |  1990-08-24  |  3KB  |  129 lines

  1. /*
  2.     ufuncobj.c
  3.  
  4.     % ufunc_Class(), ufunc_Open()
  5.  
  6.     User function objects
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1988, by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.     11/20/88 jmd    add ID to objects
  15.     12/11/88 jmd    removed GETPOS and GETSIZE message handling
  16.                     added idata to _od
  17.     04/23/89 jdc    added full support
  18.  
  19.     11/06/89 jmd    removed DoRaw Macro
  20.     11/21/89 ted    Renamed ufunc xd and od bob kernels from cd to bd.
  21.     12/08/89 jmd    added OGLOBAL
  22.      3/28/90 jmd    ansi-fied
  23.      8/24/90 jdc    added classhandle macros
  24. */
  25.  
  26. #include "sed.h"
  27. #include "ufuncobj.h"
  28.  
  29. #include "ufuncod.h"
  30.  
  31. /* The ufunc bob class */
  32.  
  33. OGLOBAL objreq_fptr ufuncreq_loadfptr = objreq_Null;
  34. OGLOBAL objreq_fptr ufuncreq_savefptr = objreq_Null;
  35.  
  36. int ufunc_Class(VOID *objdata, int msg, VOID *indata, VOID *outdata)
  37. /*
  38.     Dispatch function for ufunc.
  39. */
  40. {
  41.     ufunc_od              *ufuncd;
  42.     ufuncopen_struct   *ufuncopen;
  43.     obj_type            ufunc;
  44.  
  45.     ufuncd = (ufunc_od *) objdata;
  46.  
  47.     if (msg != OBJM_GETDATASIZE) {
  48.         ufunc = ufuncod_GetSelf(ufuncd);
  49.     }
  50.  
  51.     switch (msg) {
  52.  
  53.     case OBJM_LOAD:
  54.         return((*ufuncreq_loadfptr)(objdata, msg, indata, outdata));
  55.     case OBJM_SAVE:
  56.         return((*ufuncreq_savefptr)(objdata, msg, indata, outdata));
  57.  
  58.     case OBJM_GETDATASIZE:
  59.         ((ogds_struct *) outdata)->odsize = sizeof(ufunc_od);
  60.         ((ogds_struct *) outdata)->xdsize = sizeof(ufunc_xd);
  61.         ((ogds_struct *) outdata)->id = ID_UFUNC;
  62.         break;
  63.  
  64.     case OBJM_OPEN:
  65.         bob_SetDepend(ufunc, FALSE);            /* ufuncs MUST be independent */
  66.         bob_SetParent(ufunc, NULL); 
  67.         obj_SetClassHandle(ufunc, -1); 
  68.         break;
  69.  
  70.     case OBJM_INIT:
  71.         /* Initialize the ufuncbob_od (passed a ufuncopen_struct *) */
  72.         ufuncd->ufunc = ((ufuncopen_struct *) indata)->ufunc;
  73.         ufuncd->idata = ((ufuncopen_struct *) indata)->idata;
  74.         break;
  75.  
  76.     case OBJM_WHO:
  77.         /* Identify ourselves */
  78.         return (*((int *) indata) == ID_UFUNC || *((int *) indata) == ID_BOB);
  79.  
  80.     case WINM_GOREQ:
  81.         /* indata is a VOID *, outdata is an int * return code */
  82.  
  83.         if (ufuncd->ufunc == FNULL) {
  84.             /* if our ufunc is FNULL, simply return idata */
  85.             *((int *) outdata) = ufuncd->idata;
  86.         }
  87.         else {
  88.             /* call the user func */
  89.             *((int *) outdata) = (*(ufuncd->ufunc))(indata, ufuncd->idata);
  90.         }
  91.         break;
  92.  
  93.     case UFUNCBM_GETUFUNC:
  94.         /* outdata is a (ufuncopen_struct *) */
  95.         ufuncopen = (ufuncopen_struct *) outdata;
  96.         ufuncopen->ufunc = ufuncd->ufunc;
  97.         ufuncopen->idata = ufuncd->idata;
  98.         break;
  99.  
  100.     default:
  101.         return(bob_Class(&(ufuncd->bd), msg, indata, outdata));
  102.     }
  103.  
  104.     return(TRUE);
  105. }
  106.  
  107. /* Auxillary Functions */
  108.  
  109. obj_type ufunc_Open(ufunc_fptr ufunc, int idata)
  110. /*
  111.     Create an object from a ufunc.
  112. */
  113. {
  114.     ufuncopen_struct ufuncopen;
  115.     bob_type bob;
  116.  
  117.     if ((bob = obj_Open(ufunc_Class, NULL)) != NULL) {
  118.  
  119.         ufuncopen.ufunc = ufunc;
  120.         ufuncopen.idata = idata;
  121.         bob_Do(bob, OBJM_INIT, &ufuncopen, NULL);
  122.  
  123.         ufuncbob_SetFuncHandle(bob, -1);            /* initialize */
  124.     }
  125.  
  126.     return(bob);
  127. }
  128.  
  129.