home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / trialva / ibmcppw / samples / som / somk / c / animals / animals.c next >
Encoding:
C/C++ Source or Header  |  1996-01-24  |  11.3 KB  |  386 lines

  1.  
  2. #include "nlsutil.h"
  3. #include "msgid.h"
  4.  
  5. #define SOM_Module_animals_Source
  6. #include <animals.ih>
  7.  
  8. #ifndef lint
  9. static char *sccsid = "%Z% %I% %W% %G% %U% [%H% %T%] (c)IBM Corp. 1993";
  10. #endif
  11.  
  12. #include <animals.ih>
  13.  
  14. #define BUFFER_INCREMENT_COUNT 20
  15. #define BUFFER_INCREMENT_SIZE  (BUFFER_INCREMENT_COUNT * sizeof (Animals_Animal *))
  16.  
  17. /*
  18.  *  The name of the animal.
  19.  */
  20.  
  21. SOM_Scope void  SOMLINK a__set_name (Animals_Animal *somSelf, Environment *ev,
  22.         string myName)
  23. {
  24.     Animals_AnimalData *somThis = Animals_AnimalGetData(somSelf);
  25.     Animals_AnimalMethodDebug("Animals_Animal","a__set_name");
  26.  
  27.     if (_name)
  28.         SOMFree(_name);
  29.     if (myName) {
  30.         _name = (string) SOMMalloc(strlen(myName) + 1);
  31.         strcpy(_name, myName);
  32.     } else
  33.     _name = (string) NULL;
  34. }
  35.  
  36. /*
  37.  *  The kind of sound that an animal makes.
  38.  */
  39.  
  40. SOM_Scope void  SOMLINK a__set_sound (Animals_Animal *somSelf, Environment *ev,
  41.         string mySound)
  42. {
  43.     Animals_AnimalData *somThis = Animals_AnimalGetData(somSelf);
  44.     Animals_AnimalMethodDebug("Animals_Animal","a__set_sound");
  45.  
  46.     if (_sound)
  47.         SOMFree(_sound);
  48.     if (mySound) {
  49.     _sound = (string) SOMMalloc(strlen(mySound) + 1);
  50.         strcpy(_sound, mySound);
  51.     } else
  52.     _sound = (string) NULL;
  53. }
  54.  
  55. /*
  56.  *  The genus of animal.
  57.  *  The "_get_" method for this attribute should be overridden
  58.  *  by derived classes.  The default version here just gives
  59.  *  "<unknown>" as the genus.
  60.  */
  61.  
  62. SOM_Scope string  SOMLINK a__get_genus(Animals_Animal *somSelf, Environment *ev)
  63. {
  64.     Animals_AnimalMethodDebug("Animals_Animal","a__get_genus");
  65.  
  66.     return (NlsMsgAlloc(UnknownId));
  67. }
  68.  
  69. /*
  70.  *  The species of animal.
  71.  *  The "_get" method for this attribute should be overridden
  72.  *  by derived classes.  The default version here just gives
  73.  *  "<unknown>" as the species.
  74.  */
  75.  
  76. SOM_Scope string  SOMLINK a__get_species(Animals_Animal *somSelf, Environment *ev)
  77. {
  78.     Animals_AnimalMethodDebug("Animals_Animal","a__get_species");
  79.  
  80.     return (NlsMsgAlloc(UnknownId));
  81. }
  82.  
  83. /*
  84.  *  Ask the animal to talk.  Normally this just prints out the
  85.  *  string corresponding to the sound attribute, but it can be
  86.  *  overridden to do something else.
  87.  */
  88.  
  89. SOM_Scope void  SOMLINK a_talk(Animals_Animal *somSelf, Environment *ev)
  90. {
  91.     Animals_AnimalData *somThis = Animals_AnimalGetData(somSelf);
  92.     Animals_AnimalMethodDebug("Animals_Animal","a_talk");
  93.  
  94.     somPrintf("\t%s\n", _sound ? _sound : NlsMsgGet(UnknownId));
  95. }
  96.  
  97. /*
  98.  *  Displays an animal.    Derived classes should override this to
  99.  *  display new derived information, and then call their parent
  100.  *  version. Note: this method makes use of talk() to describe what
  101.  *  the animal says.
  102.  */
  103.  
  104. SOM_Scope void  SOMLINK a_display(Animals_Animal *somSelf, Environment *ev)
  105. {
  106.     Animals_AnimalMethodDebug("Animals_Animal","a_display");
  107.  
  108.     somPrintf (NlsMsgGet(AnimalNameId), __get_name (somSelf, ev));
  109.     somPrintf (NlsMsgGet(GenusId), __get_genus (somSelf, ev));
  110.     somPrintf (NlsMsgGet(SpeciesId), __get_species (somSelf, ev));
  111.     _talk (somSelf, ev);
  112. }
  113.  
  114. SOM_Scope void  SOMLINK a_somFree(Animals_Animal *somSelf)
  115. {
  116.     Environment *ev = somGetGlobalEnvironment ();
  117.     Animals_AnimalMethodDebug("Animals_Animal","a_somFree");
  118.  
  119.     /* Reduce the animal population */
  120.     _deleteInstance (_Animals_Animal, ev, somSelf);
  121.     Animals_Animal_parent_SOMObject_somFree (somSelf);
  122. }
  123.  
  124. SOM_Scope void  SOMLINK a_somInit(Animals_Animal *somSelf)
  125. {
  126.     Animals_AnimalData *somThis = Animals_AnimalGetData(somSelf);
  127.     Animals_AnimalMethodDebug("Animals_Animal","a_somInit");
  128.  
  129.     Animals_Animal_parent_SOMObject_somInit (somSelf);
  130.     _sound = (string) NULL;
  131. }
  132.  
  133. SOM_Scope void  SOMLINK a_somUninit(Animals_Animal *somSelf)
  134. {
  135.     Animals_AnimalData *somThis = Animals_AnimalGetData(somSelf);
  136.     Animals_AnimalMethodDebug("Animals_Animal","a_somUninit");
  137.  
  138.     if (_sound)
  139.         SOMFree (_sound);
  140.     Animals_Animal_parent_SOMObject_somUninit (somSelf);
  141. }
  142.  
  143. SOM_Scope void  SOMLINK a_somDumpSelfInt(Animals_Animal *somSelf,
  144.         long level)
  145. {
  146.     Animals_AnimalData *somThis = Animals_AnimalGetData(somSelf);
  147.     Animals_AnimalMethodDebug("Animals_Animal","a_somDumpSelfInt");
  148.  
  149.     _display (somSelf, somGetGlobalEnvironment());
  150.     Animals_Animal_parent_SOMObject_somDumpSelfInt (somSelf, level);
  151. }
  152.  
  153. /*
  154.  *  Create an instance of an Animals_Animal with a specific sound.
  155.  */
  156.  
  157. SOM_Scope Animals_Animal*  SOMLINK ma_newAnimal (Animals_M_Animal *somSelf, 
  158.     Environment *ev, string name, string sound)
  159. {
  160.     Animals_Animal *animal;
  161.     Animals_M_AnimalData *somThis = Animals_M_AnimalGetData(somSelf);
  162.     Animals_M_AnimalMethodDebug("Animals_M_Animal","ma_newAnimal");
  163.  
  164.     animal = (Animals_Animal *) 
  165.     Animals_M_Animal_parent_SOMClass_somNew (somSelf);
  166.     /* Bump animal population */
  167.     /* _Animals_Animal, not somSelf! */
  168.     _addInstance (_Animals_Animal, ev, animal); 
  169.     __set_name (animal, ev, name);
  170.     __set_sound (animal, ev, sound);
  171.     return (animal);
  172. }
  173.  
  174. /*
  175.  *  Used to add an new instance to the instances sequence.
  176.  */
  177.  
  178. SOM_Scope void SOMLINK ma_addInstance (Animals_M_Animal *somSelf, 
  179.     Environment *ev, Animals_Animal *obj)
  180. {
  181.     int i;
  182.     Animals_Animal **newbuf;
  183.     Animals_M_AnimalData *somThis = Animals_M_AnimalGetData(somSelf);
  184.     Animals_M_AnimalMethodDebug("Animals_M_Animal","ma_addInstance");
  185.  
  186.     if (_instances._length < _instances._maximum)
  187.     _instances._buffer[_instances._length++] = obj;
  188.     else {
  189.         _instances._maximum += BUFFER_INCREMENT_COUNT;
  190.     if (newbuf = (Animals_Animal **) SOMRealloc (_instances._buffer,
  191.         BUFFER_INCREMENT_SIZE)) {
  192.             _instances._buffer = newbuf;
  193.             _instances._buffer[_instances._length++] = obj;
  194.         }
  195.     }
  196. }
  197.  
  198. /*
  199.  *  Used to remove an instance from the instances sequence.
  200.  */
  201.  
  202. SOM_Scope void SOMLINK ma_deleteInstance (Animals_M_Animal *somSelf, 
  203.     Environment *ev, Animals_Animal *obj)
  204. {
  205.     int i;
  206.     Animals_M_AnimalData *somThis = Animals_M_AnimalGetData(somSelf);
  207.     Animals_M_AnimalMethodDebug("Animals_M_Animal","ma_deleteInstance");
  208.     
  209.     for (i=0; i<_instances._length; i++) {
  210.         if (obj == _instances._buffer[i]) {
  211.         _instances._buffer[i] = _instances._buffer[--_instances._length];
  212.         break;
  213.         }
  214.     }
  215. }
  216.  
  217. SOM_Scope SOMObject*  SOMLINK ma_somNew(Animals_M_Animal *somSelf)
  218. {
  219.     Animals_M_AnimalMethodDebug("Animals_M_Animal","ma_somNew");
  220.  
  221.     return _newAnimal (somSelf, somGetGlobalEnvironment (), 
  222.     NlsMsgAlloc(UnnamedId), (string) NULL);
  223. }
  224.  
  225. SOM_Scope void  SOMLINK ma_somInit(Animals_M_Animal *somSelf)
  226. {
  227.     Animals_M_AnimalData *somThis = Animals_M_AnimalGetData(somSelf);
  228.     Animals_M_AnimalMethodDebug("Animals_M_Animal","ma_somInit");
  229.  
  230.     _instances._buffer = (Animals_Animal **) SOMMalloc (BUFFER_INCREMENT_SIZE);
  231.     _instances._maximum = BUFFER_INCREMENT_COUNT;
  232.     _instances._length = 0;
  233.     Animals_M_Animal_parent_SOMClass_somInit (somSelf);
  234. }
  235.  
  236. SOM_Scope void  SOMLINK ma_somUninit(Animals_M_Animal *somSelf)
  237. {
  238.     Animals_M_AnimalData *somThis = Animals_M_AnimalGetData(somSelf);
  239.     Animals_M_AnimalMethodDebug("Animals_M_Animal","ma_somUninit");
  240.  
  241.     if (_instances._buffer)
  242.     SOMFree (_instances._buffer);
  243.     _instances._length = _instances._maximum = 0;
  244.     Animals_M_Animal_parent_SOMClass_somInit (somSelf);
  245. }
  246.  
  247. /*
  248.  *  The breed of this Dog.
  249.  */
  250.  
  251. SOM_Scope void  SOMLINK d__set_breed (Animals_Dog *somSelf, Environment *ev,
  252.         string myBreed)
  253. {
  254.     Animals_DogData *somThis = Animals_DogGetData(somSelf);
  255.     Animals_DogMethodDebug("Animals_Dog","d__set_breed");
  256.  
  257.     if (_breed)
  258.         SOMFree (_breed);
  259.     if (myBreed) {
  260.         _breed = (string) SOMMalloc (strlen (myBreed) + 1);
  261.         strcpy (_breed, myBreed);
  262.     } else
  263.     _breed = (string) NULL;
  264. }
  265.  
  266. /*
  267.  *  The color of this Dog.
  268.  */
  269.  
  270. SOM_Scope void  SOMLINK d__set_color (Animals_Dog *somSelf, Environment *ev,
  271.         string myColor)
  272. {
  273.     Animals_DogData *somThis = Animals_DogGetData(somSelf);
  274.     Animals_DogMethodDebug("Animals_Dog","d__set_color");
  275.  
  276.     if (_color)
  277.         SOMFree (_color);
  278.     if (myColor) {
  279.         _color = (string) SOMMalloc (strlen (myColor) + 1);
  280.         strcpy (_color, myColor);
  281.     } else
  282.     _color = (string) NULL;
  283. }
  284.  
  285. SOM_Scope string  SOMLINK d__get_genus (Animals_Dog *somSelf, Environment *ev)
  286. {
  287.     Animals_DogMethodDebug("Animals_Dog","d__get_genus");
  288.  
  289.     return (NlsMsgAlloc(CanisId));
  290. }
  291.  
  292. SOM_Scope string  SOMLINK d__get_species (Animals_Dog *somSelf, Environment *ev)
  293. {
  294.     Animals_DogMethodDebug("Animals_Dog","d__get_species");
  295.  
  296.     return (NlsMsgAlloc(FamiliarisId));
  297. }
  298.  
  299. SOM_Scope void  SOMLINK d_display (Animals_Dog *somSelf, Environment *ev)
  300. {
  301.     Animals_DogMethodDebug("Animals_Dog","d_display");
  302.  
  303.     Animals_Dog_parent_Animals_Animal_display (somSelf, ev);
  304.     somPrintf(NlsMsgGet(BreedMsgId), __get_breed (somSelf, ev));
  305.     somPrintf(NlsMsgGet(ColorMsgId), __get_color (somSelf, ev));
  306. }
  307.  
  308. SOM_Scope void  SOMLINK d_somInit(Animals_Dog *somSelf)
  309. {
  310.     Animals_DogData *somThis = Animals_DogGetData(somSelf);
  311.     Animals_DogMethodDebug("Animals_Dog","d_somInit");
  312.  
  313.     Animals_Dog_parent_Animals_Animal_somInit (somSelf);
  314.     _color = (string) NULL;
  315.     _breed = (string) NULL;
  316. }
  317.  
  318. SOM_Scope void  SOMLINK d_somUninit(Animals_Dog *somSelf)
  319. {
  320.     Animals_DogData *somThis = Animals_DogGetData(somSelf);
  321.     Animals_DogMethodDebug("Animals_Dog","d_somUninit");
  322.  
  323.     if (_color)
  324.         SOMFree(_color);
  325.     if (_breed)
  326.         SOMFree(_breed);
  327.     Animals_Dog_parent_Animals_Animal_somUninit (somSelf);
  328. }
  329.  
  330. SOM_Scope void  SOMLINK d_somDumpSelfInt(Animals_Dog *somSelf, long level)
  331. {
  332.     Animals_DogMethodDebug("Animals_Dog","d_somDumpSelfInt");
  333.  
  334.     Animals_Dog_parent_Animals_Animal_somDumpSelfInt (somSelf, level);
  335. }
  336.  
  337. /*
  338.  *  Create an instance of a Animals_Dog with a specific name,
  339.  *  sound, breed, & color.
  340.  */
  341.  
  342. SOM_Scope Animals_Dog*  SOMLINK md_newDog(Animals_M_Dog *somSelf, 
  343.     Environment *ev, string name, string sound, string breed, string color)
  344. {
  345.     Animals_M_DogData *somThis = Animals_M_DogGetData(somSelf);
  346.     Animals_Dog *dog;
  347.     Animals_M_DogMethodDebug("Animals_M_Dog","md_newDog");
  348.  
  349.     dog = _newAnimal (somSelf, ev, name, sound);
  350.     __set_breed (dog, ev, breed);
  351.     __set_color (dog, ev, color);
  352.     return (dog);
  353. }
  354.  
  355. SOM_Scope SOMObject*  SOMLINK md_somNew(Animals_M_Dog *somSelf)
  356. {
  357.     Animals_M_DogData *somThis = Animals_M_DogGetData(somSelf);
  358.     Animals_M_DogMethodDebug("Animals_M_Dog","md_somNew");
  359.  
  360.     return (Animals_M_Dog_parent_Animals_M_Animal_somNew (somSelf));
  361. }
  362.  
  363. SOM_Scope void  SOMLINK bd_talk(Animals_BigDog *somSelf, Environment *ev)
  364. {
  365.     string sound;
  366.     Animals_BigDogMethodDebug("Animals_BigDog","bd_talk");
  367.  
  368.     somPrintf (NlsMsgGet(WOOFId));
  369.     somPrintf (NlsMsgGet(WOOFId));
  370.     somPrintf (NlsMsgGet(WOOFId));
  371.     somPrintf (NlsMsgGet(WOOFId));
  372.     if (sound = __get_sound (somSelf, ev))
  373.     somPrintf (NlsMsgGet(SoundMsgId), sound);
  374. }
  375.  
  376. SOM_Scope void  SOMLINK ld_talk(Animals_LittleDog *somSelf, Environment *ev)
  377. {
  378.     string sound;
  379.     Animals_LittleDogMethodDebug("Animals_LittleDog","ld_talk");
  380.  
  381.     somPrintf (NlsMsgGet(woofId));
  382.     somPrintf (NlsMsgGet(woofId));
  383.     if (sound = __get_sound (somSelf, ev))
  384.     somPrintf (NlsMsgGet(SoundMsgId), sound);
  385. }
  386.