home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mod201j.zip / modula2.exe / os2demo / animals / ldog.mod < prev    next >
Text File  |  1995-05-26  |  7KB  |  274 lines

  1. IMPLEMENTATION MODULE LDOG;
  2.  
  3. (*$XL+       Modula-2 extenmsions: '_' in symbol names, OOP facilities  *)
  4. (*$CDECL+    C-style procedures                                         *)
  5. (*$A         default alignment for record fields                        *)
  6.  
  7. (*$LINK
  8.   LIBRARY
  9.     INITINSTANCE
  10.   DESCRIPTION
  11.     'LittleDog class DLL, compiled with Modula-2.  (c) Juergen Neuhoff'
  12.   PROTMODE
  13.   DATA
  14.     MULTIPLE NONSHARED LOADONCALL
  15. *)
  16.  
  17.  
  18. IMPORT SOM;      (* basic SOM module *)
  19. IMPORT DOG;      (* module with parent class *)
  20. FROM   SOMMISC IMPORT somDebug, somWriteString, somWriteLn;
  21.  
  22.  
  23. (*************************************************************************
  24.    Passthru lines "before" if any
  25. **************************************************************************)
  26.  
  27. IMPORT OS2DEF;
  28. IMPORT Conversions;
  29. IMPORT Strings;
  30. FROM   SYSTEM IMPORT currentFile;
  31. FROM   SYSTEM IMPORT currentLine;
  32.  
  33. TYPE PDog = DOG.PDog;
  34.  
  35.  
  36.  
  37. (*************************************************************************
  38.    Passthru lines "after"  if any
  39. **************************************************************************)
  40.  
  41.  
  42.  
  43.  
  44. (*************************************************************************
  45.    Implementation header for SOM class LittleDog
  46. **************************************************************************)
  47.  
  48. CONST
  49.   LittleDog_MaxNoMethods = 0;                (* number of new methods *)
  50.   LittleDogDebug         = FALSE;            (* enable/disable method debugging *)
  51.  
  52.  
  53.  
  54. (*
  55.  * Declare the C specific class data structure
  56.  *)
  57. TYPE
  58.   LittleDogCClassDataStructure  = RECORD
  59.     parentMtab                    : SOM.somMethodTabs;
  60.     instanceDataToken             : SOM.somDToken;
  61.                                   END;
  62. VAR
  63.   LittleDogCClassData           : LittleDogCClassDataStructure;
  64.  
  65.  
  66.  
  67. (*
  68.  * Temporary class data structure used only in class creation
  69.  *)
  70. VAR
  71.   LittleDogtempClassData        : SOM.somClassDataStructure;
  72.  
  73.  
  74.  
  75. (*
  76.  * Internal instance data
  77.  *)
  78. TYPE
  79.   LittleDogData    = RECORD
  80.                      END;
  81.   PLittleDogData   = POINTER TO LittleDogData;
  82.  
  83.  
  84.  
  85. (*
  86.  *   <class>GetData function
  87.  *)
  88. PROCEDURE LittleDogGetData( Self : PLittleDog ) : PLittleDogData;
  89. BEGIN
  90.   RETURN SOM.somDataResolve( Self, LittleDogCClassData.instanceDataToken );
  91. END LittleDogGetData;
  92.  
  93.  
  94.  
  95.  
  96. (*
  97.  *  SOM identifiers for all the new and overridden methods
  98.  *)
  99. VAR
  100.   somId_talk               : SOM.somId;
  101.  
  102.  
  103.  
  104. (*
  105.  *  Apply stubs for new methods if any
  106.  *)
  107.  
  108.  
  109.  
  110.  
  111. (*
  112.  *  Redispatch stubs for new methods if any
  113.  *)
  114.  
  115.  
  116.  
  117.  
  118. (*
  119.  *  forward declared private methods (not declared in this DEF-module)
  120.  *)
  121.  
  122.  
  123.  
  124.  
  125. (*
  126.  * class initialization
  127.  *)
  128. PROCEDURE LittleDogsomInitializeClass;
  129. VAR
  130.   m  : LittleDog;         (* needed for static method references *)
  131.   c  : SOM.PSOMClass;
  132.   md : SOM.somId;
  133. BEGIN
  134.  
  135.   c := LittleDogtempClassData.classObject;
  136.   md := SOM.somIdFromString( "----" );
  137.  
  138.   (* Add new methods, if any, to SOM class LittleDog *)
  139.   (* ---- *)
  140.  
  141.   (* Override inherited methods, if any *)
  142.   c^.somOverrideSMethod( somId_talk, m.talk );
  143.  
  144. END LittleDogsomInitializeClass;
  145.  
  146.  
  147.  
  148.  
  149. (*
  150.  *  class creation procedure
  151.  *)
  152. PROCEDURE LittleDogsomCreateClass
  153. (
  154.   pClsObj    : SOM.PSOMClass;
  155.   mClsObj    : SOM.PSOMClass
  156. );
  157. VAR
  158.   classObject : SOM.PSOMClass;
  159. BEGIN
  160.   classObject := mClsObj^.somNew();
  161.   LittleDogtempClassData.classObject := classObject;
  162.   classObject^.somInitClass
  163.   (
  164.     "LittleDog",
  165.     pClsObj,
  166.     SIZE( LittleDogData ),
  167.     LittleDog_MaxNoMethods,
  168.     LittleDog_MajorVersion,
  169.     LittleDog_MinorVersion
  170.   );
  171.   LittleDogCClassData.instanceDataToken := classObject^.somGetInstanceToken();
  172.   LittleDogsomInitializeClass();
  173.   LittleDogCClassData.parentMtab := classObject^.somGetPClsMtab();
  174.   classObject^.somSetClassData( SYSTEM.ADR( LittleDogClassData ) );
  175.   classObject^.somClassReady();
  176.   (* make newly created class object visible *)
  177.   LittleDogClassData.classObject := classObject;
  178. END LittleDogsomCreateClass;
  179.  
  180.  
  181.  
  182.  
  183. (*
  184.  *   public NewClass-procedure
  185.  *)
  186. PROCEDURE LittleDogNewClass
  187. (
  188.   majorVersion  : SOM.INTEGER4;
  189.   minorVersion  : SOM.INTEGER4
  190. )               : SOM.PSOMClass;
  191. VAR
  192.   pClsObj       : SOM.PSOMClass;
  193.   mClsObj       : SOM.PSOMClass;
  194.   line          : LONGCARD;
  195.   b             : BOOLEAN;
  196. BEGIN
  197.   (* Check the version numbers *)
  198.   IF ((majorVersion <> 0) AND (majorVersion <> LittleDog_MajorVersion)) OR
  199.      ((minorVersion <> 0) AND (minorVersion > LittleDog_MinorVersion)) THEN
  200.     somWriteString( "LittleDogNewClass: Error, bad version numbers." );
  201.     somWriteLn();
  202.     b := Conversions.StrToLongCard( currentLine(), line );
  203.     SOM.SOMError( SOM.SOMERROR_BadVersion, currentFile(), line );
  204.   END;
  205.  
  206.   (* Don't do anything if class object is already created. *)
  207.   IF LittleDogClassData.classObject <> NIL THEN
  208.     RETURN LittleDogClassData.classObject;
  209.   END;
  210.  
  211.   (* Make sure the environment is initialized. *)
  212.   IF SOM.SOMClassMgrObject = NIL THEN
  213.     SOM.SOMClassMgrObject := SOM.somEnvironmentNew();
  214.     IF SOM.SOMClassMgrObject = NIL THEN
  215.       b := Conversions.StrToLongCard( currentLine(), line );
  216.       SOM.SOMError( SOM.SOMERROR_CouldNotStartup, currentFile(), line );
  217.     END;
  218.     somWriteString( "LittleDogNewClass: SOMClassMgrObject initalized..." );
  219.     somWriteLn();
  220.   END;
  221.  
  222.   (* Get the parent class object. *)
  223.   pClsObj := DOG.DogNewClass( 0, 0 );       (* static reference *)
  224.   pClsObj := SOM.SOMClassMgrObject^.somFindClass
  225.   ( SOM.somIdFromString( "Dog" ), 0, 0 );
  226.   IF pClsObj = NIL THEN
  227.     b := Conversions.StrToLongCard( currentLine(), line );
  228.     SOM.SOMError( SOM.SOMERROR_NoParentClass, currentFile(), line );
  229.   END;
  230.  
  231.   (* Use parent's metaclass *)
  232.   mClsObj := pClsObj^.mtab^.classObject;
  233.  
  234.   SOM.somConstructClass
  235.   ( LittleDogsomCreateClass, pClsObj, mClsObj, SYSTEM.ADR( LittleDogtempClassData ) );
  236.  
  237.   RETURN LittleDogClassData.classObject;
  238. END LittleDogNewClass;
  239.  
  240.  
  241.  
  242. (*************************************************************************
  243.    method implementations for SOM class LittleDog
  244. **************************************************************************)
  245.  
  246. PROCEDURE( Self : PLittleDog ) talk();
  247. VAR
  248.   somThis   : PLittleDogData;
  249. BEGIN
  250.   somThis := LittleDogGetData( Self );
  251.   IF LittleDogDebug THEN
  252.     somDebug( "LittleDog", "talk", currentFile(), currentLine() );
  253.   END;
  254.   somWriteString( "woof woof" );
  255.   somWriteLn();
  256.   somWriteString( "woof woof" );
  257.   somWriteLn();
  258. END talk;
  259.  
  260.  
  261.  
  262.  
  263. BEGIN
  264.   IF SOM.SOMClassMgrObject = NIL THEN
  265.     SOM.SOMClassMgrObject := SOM.somEnvironmentNew();
  266.   END;
  267.  
  268.   LittleDogCClassData.parentMtab := NIL;
  269.   LittleDogClassData.classObject := NIL;
  270.  
  271.   somId_talk            := SOM.somIdFromString( "talk"           );
  272.  
  273. END LDOG.
  274.