home *** CD-ROM | disk | FTP | other *** search
/ Aminet 15 / Aminet 15 - Nov 1996.iso / Aminet / dev / misc / BST_SystemDocs.lha / BeastV1 / Examples / BST_System / BST_Example4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-03  |  5.8 KB  |  219 lines

  1.  
  2. /****h* Beast/BST_Example4.c [1.0] **************
  3. *
  4. *    NAME
  5. *      BST_Example4 --
  6. *
  7. *    COPYRIGHT
  8. *      Maverick Software Development
  9. *
  10. *    FUNCTION
  11. *
  12. *    AUTHOR
  13. *      Jacco van Weert
  14. *
  15. *    CREATION DATE
  16. *      25-Mar-96
  17. *
  18. *    MODIFICATION HISTORY
  19. *
  20. *    NOTES
  21. *
  22. ****************************************************
  23. */
  24. #include <BEAST:Include/proto/beast.h>
  25. #include <proto/exec.h>
  26. #include <stdio.h>
  27.  
  28. struct Library *BeastBase;
  29.  
  30. struct TagItem EmptyList[] =
  31. {  {TAG_DONE, 0}
  32. };
  33.  
  34.  
  35. /************************************************************
  36.  ***** my class instance definition, only used for sizeof()!!
  37.  *****/
  38. struct Double_Instance
  39. {
  40.     LONG    N;
  41. };
  42.  
  43.  
  44. /***********************
  45.  **** OBM_GETATTR method
  46.  ****/
  47. __geta4 rfcall (Dbl_GetAttr, BST_MethodFlags MethodFlags, struct BST_Object *Object, struct TagItem *TagList)
  48. {
  49.   struct Double_Instance *Instance = Macro_GetInstance;
  50.  
  51.   struct TagItem *cur_ti, *numberof_ti = NULL;
  52.   ULONG  the_tag, nr_attr = 0xFFFFFFFF;
  53.  
  54.   /*******************************
  55.    **** Check for the BTA_NumberOf
  56.    ****/
  57.   if (numberof_ti = BST_FindTagItem( BTA_NumberOf, TagList ))
  58.       {    nr_attr = numberof_ti->ti_Data; }
  59.  
  60.  
  61.   /************************
  62.    **** Get every attribute
  63.    ****/
  64.   for (cur_ti = TagList; ( cur_ti->ti_Tag != TAG_DONE ) &
  65.                ( nr_attr >  0  )       ; cur_ti = BST_NextTagItem( cur_ti ))
  66.     {
  67.       the_tag         = cur_ti->ti_Tag;
  68.       cur_ti->ti_Tag |= BTF_Ignore;
  69.       nr_attr--;
  70.       switch( the_tag )
  71.         {
  72.                 /**************************
  73.                  **** Resolve the Double
  74.                  ****/
  75.       case BTA_LongNumber:  cur_ti->ti_Data = Instance->N;
  76.                 struct TagItem TL_GetN[] =
  77.                   { {BTA_NumberOf,   1},
  78.                     {BTA_LongNumber, Instance->N / 2},
  79.                     {TAG_DONE, 0}
  80.                   };
  81.                 /****************************************************
  82.                  **** If the tag wasn't found... BTA_NumberOf still 1
  83.                  ****/
  84.                 OBJ_MethodToParent( Object, OBM_GETATTR, TL_GetN, MTHF_DOPARENTS );
  85.                 printf( "=== Double %ld = %ld\n", Instance->N, TL_GetN[1].ti_Data );
  86.                   break;
  87.           default            :     nr_attr++;
  88.                       cur_ti->ti_Tag  &= ~BTF_Ignore; break;
  89.         }
  90.     }
  91.  
  92.   /****************************************************
  93.    **** Reset the MethodFlags if all attributes are set
  94.    ****/
  95.   if (  numberof_ti )
  96.     if (!(numberof_ti->ti_Data = nr_attr))
  97.     MethodFlags &= ~( MTHF_DOPARENTS | MTHF_DOCHILDREN | MTHF_PASSTOCHILD );
  98.  
  99.   return( MethodFlags );
  100. }
  101.  
  102.  
  103. /***********************
  104.  **** OBM_SETATTR method
  105.  ****/
  106. __geta4 rfcall (Dbl_SetAttr, BST_MethodFlags MethodFlags, struct BST_Object *Object, struct TagItem *TagList)
  107. {
  108.   struct Double_Instance *Instance = Macro_GetInstance;
  109.  
  110.   struct TagItem *cur_ti, *numberof_ti = NULL;
  111.   ULONG  the_tag, nr_attr = 0xFFFFFFFF;
  112.  
  113.   /*******************************
  114.    **** Check for the BTA_NumberOf
  115.    ****/
  116.   if (numberof_ti = BST_FindTagItem( BTA_NumberOf, TagList ))
  117.       {    nr_attr = numberof_ti->ti_Data; }
  118.  
  119.  
  120.   /************************
  121.    **** Set every attribute
  122.    ****/
  123.   for (cur_ti = TagList; ( cur_ti->ti_Tag != TAG_DONE ) &
  124.                ( nr_attr >  0  )       ; cur_ti = BST_NextTagItem( cur_ti ))
  125.     {
  126.       the_tag         = cur_ti->ti_Tag;
  127.       cur_ti->ti_Tag |= BTF_Ignore;
  128.       nr_attr--;
  129.       switch( the_tag )
  130.         {
  131.                 /******************************************
  132.                  **** Set also the N number at the children
  133.                  ****/
  134.       case BTA_LongNumber:     Instance->N     = cur_ti->ti_Data;
  135.                 cur_ti->ti_Data = cur_ti->ti_Data * 2;
  136.                 nr_attr++;
  137.                       cur_ti->ti_Tag  &= ~BTF_Ignore;
  138.                   break;
  139.  
  140.           default           :     nr_attr++;
  141.                       cur_ti->ti_Tag  &= ~BTF_Ignore;
  142.                       break;
  143.  
  144.         }
  145.     }
  146.  
  147.   /****************************************************
  148.    **** Reset the MethodFlags if all attributes are set
  149.    ****/
  150.   if (  numberof_ti )
  151.     if (!(numberof_ti->ti_Data = nr_attr))
  152.     MethodFlags &= ~( MTHF_DOPARENTS | MTHF_DOCHILDREN | MTHF_PASSTOCHILD );
  153.  
  154.   return( MethodFlags );
  155. }
  156.  
  157.  
  158.  
  159. /*********************************/
  160. /**** M A I N - P R O G R A M ****/
  161. /*********************************/
  162. main()
  163. {
  164.   struct BST_Class  *my_DoubleClass;
  165.   struct BST_Object *my_DblObj1, *my_DblObj2, *my_DblObj3, *my_DblObj4;
  166.  
  167.   printf("*** Beast OO Example4 START ***\n");
  168.   if (BeastBase = (struct Library *)OpenLibrary("beast.library", 1 ))
  169.     {
  170.       my_DoubleClass = BST_MakeClass( "my_DoubleClass", sizeof( struct Double_Instance ));
  171.       CLSS_AddMethod( my_DoubleClass, &Dbl_SetAttr, OBM_SETATTR );
  172.       CLSS_AddMethod( my_DoubleClass, &Dbl_GetAttr, OBM_GETATTR );
  173.       BST_AddClass(   my_DoubleClass );
  174.  
  175.       if       (my_DblObj1 = OBJ_NewObject( NULL, "my_DoubleClass", NULL       ))
  176.         if     (my_DblObj2 = OBJ_NewObject( NULL, "my_DoubleClass", my_DblObj1 ))
  177.           if   (my_DblObj3 = OBJ_NewObject( NULL, "my_DoubleClass", my_DblObj2 ))
  178.             if (my_DblObj4 = OBJ_NewObject( NULL, "my_DoubleClass", my_DblObj3 ))
  179.           {
  180.         struct TagItem TL_SetN[] =
  181.           { {BTA_NumberOf,   1},
  182.             {BTA_LongNumber, 4},
  183.             {TAG_DONE, 0}
  184.           };
  185.         OBJ_DoMethod( my_DblObj1, OBM_SETATTR, TL_SetN, MTHF_PASSTOCHILD );
  186.  
  187.         {
  188.         struct TagItem TL_GetN[] =
  189.           { {BTA_NumberOf,   1},
  190.             {BTA_LongNumber, 0},
  191.             {TAG_DONE, 0}
  192.           };
  193.         OBJ_DoMethod( my_DblObj4, OBM_GETATTR, TL_GetN, MTHF_DOPARENTS );
  194.         printf( "--- BTA_NumberOf   = %ld\n", TL_GetN[0].ti_Data );
  195.         printf( "--- BTA_LongNumber = %ld\n", TL_GetN[1].ti_Data );
  196.         }
  197.  
  198.         {
  199.         struct TagItem TL_GetN[] =
  200.           { {BTA_NumberOf,   1},
  201.             {BTA_LongNumber, 0},
  202.             {TAG_DONE, 0}
  203.           };
  204.         OBJ_DoMethod( my_DblObj2, OBM_GETATTR, TL_GetN, MTHF_DOPARENTS );
  205.         printf( "--- BTA_NumberOf   = %ld\n", TL_GetN[0].ti_Data );
  206.         printf( "--- BTA_LongNumber = %ld\n", TL_GetN[1].ti_Data );
  207.         }
  208.  
  209.           }
  210.  
  211.       OBJ_DisposeObject( my_DblObj1 );
  212.       BST_RemoveClass(   my_DoubleClass );
  213.       BST_FreeClass(     my_DoubleClass );
  214.  
  215.       CloseLibrary( BeastBase );
  216.     }
  217.   printf("*** Beast OO Example4 END ***\n");
  218. }
  219.