home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / rox.zip / rox.INF (.txt) < prev    next >
OS/2 Help File  |  1994-04-14  |  19KB  |  746 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Rox - REXX Object eXtensions ΓòÉΓòÉΓòÉ
  3.  
  4. by Patrick Mueller (pmuellr@vnet.ibm.com)
  5.  
  6. (c) Copyright International Business Machines Corporation 1994.
  7. All Rights Reserved.
  8.  
  9. IBMers: support via the ROX FORUM on the IBMPC conference.
  10. non-IBMers: post to comp.lang.rexx or personal note
  11.  
  12.  
  13. ΓòÉΓòÉΓòÉ 2. What is Rox? ΓòÉΓòÉΓòÉ
  14.  
  15. Rox is a function package for REXX that allows for object oriented (OO) 
  16. programming in REXX.  You should have some basic familiarity with OO 
  17. programming before diving into Rox. 
  18.  
  19. Rox allows classes to be defined.  The classes have a number of features. 
  20.  
  21.  1. they may inherit from other classes 
  22.  
  23.  2. they specify variables that will be maintained for each object created of 
  24.     the given class 
  25.  
  26.  3. they specify methods written as REXX code 
  27.  
  28. Classes are defined in files with an extension of .rox.  See Format of .rox 
  29. Files for the format of the .rox files. 
  30.  
  31. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  32.  
  33.  
  34. What Rox isn't 
  35.  
  36. Rox is not a new language - it is simply a function package that can be used 
  37. from the OS/2 REXX language providing some OO capabilities. 
  38.  
  39. Rox provides NO facilities for interacting with other object oriented systems 
  40. such as SOM or Smalltalk. 
  41.  
  42. Rox has no distributed (cross-process, or cross-platform) capabilities. 
  43.  
  44. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  45.  
  46.  
  47. Object creation 
  48.  
  49. Objects are created and destroyed with the RoxCreate() and RoxDestroy() 
  50. functions, described in object lifecycle functions  The RoxCreate() function 
  51. takes the name of the class to create the object from, and any number of 
  52. additional parameters to initialize the object.  The RoxCreate() function 
  53. returns an object reference.  This object reference is a regular REXX string, 
  54. with a particular value which the Rox functions can use to dereference the 
  55. object.  This object reference is used as the first parameter for method 
  56. invocation. 
  57.  
  58. When an object is created, the 'init' method for the class is invoked. 
  59. Likewise, when an object is destroyed, the 'deinit' method for the class is 
  60. invoked.  If the 'init' or 'deinit' methods are not defined in the class, they 
  61. will be searched for in inherited classes. 
  62.  
  63. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  64.  
  65.  
  66. Method invocation 
  67.  
  68. Once an object is created, you can invoke methods on it.  To invoke a method, 
  69. use REXX function call invocation.  The name of the function is the name of the 
  70. method, prefixed by ".".  The first parameter to the function is an object 
  71. reference, and any other method specific parameters can be passed as well. 
  72.  
  73. It's time for a short example.  In this example, we create an object of class 
  74. 'dog', passing an additional parameter on the RoxCreate() function which is the 
  75. name of the dog. The 'init' method of the dog class will be invoked, passing 
  76. the name as the first parameter. Next, the 'bark' method of the dog class is 
  77. invoked, in both function invocation formats available in REXX.  Both 
  78. invocations do the same thing. 
  79.  
  80. jackson = RoxCreate("dog","Jackson")
  81. call .bark jackson
  82. g = .bark(jackson)
  83.  
  84. As noted before, during object creation, the 'init' message is sent to the 
  85. object.  In order to allow an object's inherited classes to initialize 
  86. themselves, the init and deinit methods may be invoked as functions whose names 
  87. are a class name and the method name, concatenated together, with a "." in 
  88. between them. For example, assuming the dog class inherits from the animal 
  89. class, the dog init method can call the animal init method by invoking the 
  90. function "animal.init". 
  91.  
  92. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  93.  
  94.  
  95. Variables 
  96.  
  97. Classes specify both the methods that can be used onan object and the state 
  98. variables associated with the object.  The variables are plain old REXX 
  99. variables, whose values are available to methods of the classes. The variables 
  100. are non-stem variables, such as "name", "size", etc,. Stem variables are 
  101. handled via per-instance variables (see below).  Any number of variables may be 
  102. associated with a class (and thus an object). 
  103.  
  104. Per-instance variables are variables that can be added to an object in an ad 
  105. hoc manner.  For instance, one object of class X might have object variables 
  106. "x.0", "x.1", "x.2", where another object of class might have object variables 
  107. "x.0", "x.1".  Per-instance variables are added to an object with the function 
  108. RoxAddVar(). Per-instance variables are the only way to store stem variables 
  109. with an object - stem variables can NOT be defined with a class. 
  110.  
  111. When a method is invoked, the variables of the object will be available to the 
  112. REXX code of the method.  If the value of a variable changes in the method, the 
  113. changed value will be saved with the object. 
  114.  
  115. It's time for another example.  In this example, we'll describe a simple class 
  116. in the format acceptable for .rox files.  The class is dog, and it has two 
  117. variables - name and breed.  They will be used to hold the name of the dog, and 
  118. the dog's breed.  We also define three methods - name, breed and describe.  The 
  119. name and breed functions either set or return the current value of the 
  120. variable, depending on whether any parameters are passed to them.  The describe 
  121. method prints a line describing the dog. 
  122.  
  123. :class dog
  124. :vars name breed
  125. :method name
  126.    if (arg() = 1) then
  127.       name = arg(1)
  128.    return name
  129. :method breed
  130.    if (arg() = 1) then
  131.       breed = arg(1)
  132.    return breed
  133. :method describe
  134.    say "The dog's name is" name".  It is a" breed"."
  135.    return ""
  136.  
  137. Below is some REXX code that uses the class dog.  The result of the method 
  138. describe invocation is that the line "The dog's name is Jackson.  It is a 
  139. Chocolate Labrador Retriever." will be printed on the screen. 
  140.  
  141.    Jackson = RoxCreate("dog")
  142.    x = .name(Jackson,"Jackson")
  143.    x = .breed(Jackson,"Chocolate Labrador Retriever")
  144.    x = .describe(Jackson)
  145.  
  146. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  147.  
  148.  
  149. Class Inheritance 
  150.  
  151. Classes can inherit other classes in their definitions.  This technique expands 
  152. the variables and methods available to the class to the set of variables and 
  153. methods defined in any inherited classes. A class can inherit from more than 
  154. one class.  Rox has no scoping facility, so if classes are inherited that have 
  155. the same method, the method will be available in the derived class (the one 
  156. that inherits the other classes), but the actual method invoked is undefined. 
  157. One of the methods will be invoked, but it's not possible to determine which 
  158. one. 
  159.  
  160. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  161.  
  162.  
  163. self and super 
  164.  
  165. Two special variables are available to all methods.  They are 'self' and 
  166. 'super'.  self refers to the receiver of the method (the object which the 
  167. methods was invoked on).  super also refers to the receiver of the method, 
  168. however, if super is used as the receiver of a method, the method to be invoked 
  169. will be searched for starting at the inherited classes of the class of the 
  170. method currently running. self and super are similiar to the self and super 
  171. variables in Smalltalk. 
  172.  
  173.  
  174. ΓòÉΓòÉΓòÉ 3. Installation and Removal ΓòÉΓòÉΓòÉ
  175.  
  176. The Rox REXX function package is contained in the file rox.dll.  This file 
  177. needs to be placed in a directory along your LIBPATH.  To get access to the 
  178. functions in the Rox function package, execute the following REXX code: 
  179.  
  180.    rc = RxFuncAdd("RoxLoadFuncs","rox","RoxLoadFuncs")
  181.    rc = RoxLoadFuncs()
  182.  
  183. To unload the DLL, you should first call the RoxDropFuncs() function, then exit 
  184. all CMD.EXE shells.  After exiting all the command shells, the DLL will be 
  185. dropped by OS/2 and can be deleted or replaced. 
  186.  
  187.  
  188. ΓòÉΓòÉΓòÉ 4. Function Reference ΓòÉΓòÉΓòÉ
  189.  
  190. The functions provided by the Rox function package fall into the following 
  191. categories: 
  192.  
  193. o function package functions 
  194.  
  195. o class definition functions 
  196.  
  197. o object lifecycle functions 
  198.  
  199.  
  200. ΓòÉΓòÉΓòÉ 4.1. Function Package Functions ΓòÉΓòÉΓòÉ
  201.  
  202. The following functions load, drop and query the version number of the Rox 
  203. function package. 
  204.  
  205. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  206.  
  207. RoxLoadFuncs - load the Rox function package 
  208.  
  209. rc = RoxLoadFuncs()
  210.  
  211. Loads all the functions in the Rox package. 
  212.  
  213. If ANY parameters are passed to this function, it will bypass the 
  214. program/author/copyright information normally displayed. All parameters are 
  215. ignored (except to determine whether or not to bypass displaying the 
  216. information). 
  217.  
  218. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  219.  
  220. RoxDropFuncs - drop the Rox function package 
  221.  
  222. rc = RoxDropFuncs()
  223.  
  224. Drops all the functions in the Rox package. 
  225.  
  226. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  227.  
  228. RoxVersion - returns version number of the Rox function package 
  229.  
  230. vers = RoxVersion()
  231.  
  232. Returns the current version number of the Rox package. 
  233.  
  234. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  235.  
  236. RoxStats - generates execution profile info 
  237.  
  238. rc = RoxStats(<parm>)
  239.  
  240. This function can be used to generate profile information on stderr. A 
  241. parameter should be passed to start profile information, no parameter should be 
  242. passed to stop profile information.  For example: 
  243.  
  244. rc = RoxStats("") /* start profiling */
  245. rc = RoxStats()   /* end profiling */
  246.  
  247. The profile information can be analyzed with the RoxProf.cmd utility. 
  248.  
  249. Returns "". 
  250.  
  251.  
  252. ΓòÉΓòÉΓòÉ 4.2. Class Definition Functions ΓòÉΓòÉΓòÉ
  253.  
  254. The following functions are used to add class definitions to the system. 
  255. Generally you will only need to use RoxLoad() and RoxQueryClassLoaded().  The 
  256. other functions are used by RoxLoad() to to load .rox files. 
  257.  
  258. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  259.  
  260. RoxLoad - load class definitions in a .rox file 
  261.  
  262. rc = RoxLoad(roxFileName)
  263.  
  264. This function loads the named file as a class definition.  See the section of 
  265. .rox file definitions for the layout of the file. 
  266.  
  267. This function is implemented as a REXX .cmd file. 
  268.  
  269. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  270.  
  271. RoxQueryClassLoaded - query whether a class has been loaded 
  272.  
  273. bool = RoxQueryClassLoaded(className)
  274.  
  275. Returns 1 if the class named className is available in the system. Returns 0 
  276. otherwise. 
  277.  
  278. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  279.  
  280. RoxAddClass - add a class 
  281.  
  282. rc = RoxAddClass(className)
  283.  
  284. This function adds the named class to the system. 
  285.  
  286. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  287.  
  288. RoxClassAddInherit - add an inherited class to a class definition 
  289.  
  290. rc = RoxClassAddInherit(className,inheritedClassName)
  291.  
  292. This function specifies that the class named className should inherit from the 
  293. class named inheritedClassName. 
  294.  
  295. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  296.  
  297. RoxClassAddMethod - add a method to a class definition 
  298.  
  299. rc = RoxClassAddMethod(className,methodName,methodCode)
  300.  
  301. This function adds the named method, with the REXX code for the method to the 
  302. named class. 
  303.  
  304. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  305.  
  306. RoxClassAddMethodDll - add a method (in a DLL) to a class definition 
  307.  
  308. rc = RoxClassAddMethod(className,methodName,dllName,entryPoint)
  309.  
  310. This function loads the dll, gets the address of the function given with the 
  311. name entryPoint, and adds this to the named class. 
  312.  
  313. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  314.  
  315. RoxClassAddVar - add an instance variable to a class definition 
  316.  
  317. rc = RoxClassAddVar(className,varName)
  318.  
  319. This function adds the named instance variable to the named class. 
  320.  
  321.  
  322. ΓòÉΓòÉΓòÉ 4.3. Object Lifecycle Functions ΓòÉΓòÉΓòÉ
  323.  
  324. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  325.  
  326. RoxCreate - create an object 
  327.  
  328. object = RoxCreate(className<,parm1<,parm2<...>>>)
  329.  
  330. This function creates an object of the class named className. Any number of 
  331. parameters, specific to the class, can be passed. 
  332.  
  333. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  334.  
  335. RoxDestroy - destroy an object 
  336.  
  337. rc = RoxDestroy(object)
  338.  
  339. This function destroys an object. 
  340.  
  341. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  342.  
  343. RoxSend - send a message to an object 
  344.  
  345. result = RoxSend(messageName,object,<,parm1<,parm2<...>>>)
  346.  
  347. This function sends the named message to the object specified. Any number of 
  348. parameters, specific to the message and class, can be passed. 
  349.  
  350. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  351.  
  352. RoxSendThread - send a message to an object 
  353.  
  354. result = RoxSendThread(messageName,object,<,parm1<,parm2<...>>>)
  355.  
  356. Same as RoxSend(), but starts a new thread to process the message. No useful 
  357. return value is returned. 
  358.  
  359. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  360.  
  361. RoxClass - return class of given object 
  362.  
  363. class = RoxClass(object)
  364.  
  365. This function returns the name of the class of the object. 
  366.  
  367. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  368.  
  369. RoxAddVar - add a variable to an object 
  370.  
  371. result = RoxAddVar(object,varName)
  372.  
  373. This function will the named variable to the set of instance variables 
  374. associated with the object.  Be careful not to add extra blanks to varName when 
  375. passing it in.  The characters in the variable name, up to the first ".", will 
  376. be uppercased, to conform with REXX variable conventions.  The remainder of the 
  377. variable name is left as is. 
  378.  
  379.  
  380. ΓòÉΓòÉΓòÉ 5. Format of .rox Files ΓòÉΓòÉΓòÉ
  381.  
  382. Classes are defined in files with an extension of .rox.  A .rox file may 
  383. contain one or more class definitions. 
  384.  
  385. Classes defined in .rox files may be loaded by using the RoxLoad function (see 
  386. Utilities Provided). 
  387.  
  388. The format of .rox files is a tagged file.  The character ':' in column one 
  389. incates a tag.  The rest of the line after the ':' indicates the type of tag. 
  390.  
  391. The characters ':*', when located in column one, indicate a comment. 
  392.  
  393. The following tags may be used in a .rox file: 
  394.  
  395. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  396.  
  397.  
  398. :include <file> 
  399.  
  400. This tag indicates that the file specified in the tag should be loaded as a 
  401. .rox file.  Useful for including inherited class definitions from separate 
  402. files. 
  403.  
  404. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  405.  
  406.  
  407. :class 
  408.  
  409. This tag indicates the start of a new class definitions.  Any :inherits, :vars, 
  410. and :method tags following this tag, up to the end of the current .rox file, 
  411. are associated with this class. 
  412.  
  413. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  414.  
  415.  
  416. :inherits <class> <class> ... 
  417.  
  418. This tag indicates the classes that should be inherited from.  More than one 
  419. class may be specified.  This tag may be used more than once within a class 
  420. definition. 
  421.  
  422. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  423.  
  424.  
  425. :vars <var> <var> ... 
  426.  
  427. This tag indicates the variables associated with the class.  More than one 
  428. variable may be specified.  This tag may be used more than once within a class 
  429. definition.  Note stem variables may NOT be used.  Use RoxAddVar() to add stem 
  430. variables to an object. 
  431.  
  432. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  433.  
  434.  
  435. :method <methodName> 
  436.  
  437. This tag indicates that the code for the method named <methodName> follows. 
  438. The code for the method ends at the next tag (including :* comment), or end of 
  439. file. 
  440.  
  441.  
  442. ΓòÉΓòÉΓòÉ 6. C Programming Interface ΓòÉΓòÉΓòÉ
  443.  
  444. ROX methods can be implemented in compiled languages, such as C, via a DLL. 
  445. The function RoxClassAddMethodDll() adds a method to a class that points to a 
  446. function in a DLL.  The function in the DLL must have the following signature: 
  447.  
  448. /*------------------------------------------------------------------
  449.  * typedef for function that handles method invocation
  450.  *------------------------------------------------------------------*/
  451. typedef ULONG APIENTRY RoxMethodHandlerType(
  452.    void      *object,
  453.    PUCHAR     name,
  454.    ULONG      argc,
  455.    PRXSTRING  argv,
  456.    PRXSTRING  retString
  457.    );
  458.  
  459. The parameters passed to the method are: 
  460.  
  461. object              a pointer to the ROX object receiver 
  462.  
  463. name                the name of the method 
  464.  
  465. argc                the number of arguments passed to the method 
  466.  
  467. argv                array of RXSTRINGs that make up the parameters 
  468.  
  469. retString           pointer to the return value 
  470.  
  471. Most of these parameters will be familiar to those of you who have written 
  472. external functions for REXX in C.  The only new one is the object parameter. 
  473. It can be used in the following functions: 
  474.  
  475. ULONG RoxVariableGet(
  476.    void      *object,
  477.    PRXSTRING  name,
  478.    PRXSTRING  value
  479.    );
  480.  
  481. ULONG RoxVariableSet(
  482.    void      *object,
  483.    PRXSTRING  name,
  484.    PRXSTRING  value
  485.    );
  486.  
  487. The functions above are used to query and set variables for an object. The 
  488. functions return 0 when successful, !0 when not successful. The data pointed to 
  489. by the value parameter returned from RoxVariableGet() must not be modified. 
  490.  
  491. A sample of a compiled class is provided in roxsem.c. 
  492.  
  493. A DLL can provide a self-loading function named RoxDllEntryPoint, with the 
  494. following function signature. 
  495.  
  496. ULONG APIENTRY RoxDllEntryPoint(
  497.    ULONG init
  498.    )
  499.  
  500. Currently the init parameter is ignored. 
  501.  
  502. This function gets called when the REXX function RoxLoadDLL() is invoked.  This 
  503. function takes the name of the DLL (usually sans ".DLL", although you may 
  504. specify an absolute path, including the ".DLL" suffix) and calls the 
  505. RoxDllEntryPoint function. 
  506.  
  507. This function in the DLL can call any of the functions defined in the ROX 
  508. function package through their C bindings.  The call is made as if the call was 
  509. being made to a REXX external function.  For example, to call RoxAddClass(), 
  510. you invoke it in C as: 
  511.  
  512.    RXSTRING parm, result;
  513.  
  514.    parm.strptr = "myClassName";
  515.    parm.strlength = strlen(parm.strptr);
  516.  
  517.    RoxAddClass(NULL,1,&parm,NULL,&result);
  518.  
  519. Note that the function name and queue name (first and fourth parameters) may be 
  520. passed as NULL. 
  521.  
  522. Be careful how the return value is freed.  See the sample roxsem.c code for 
  523. examples. 
  524.  
  525. Two 'platform' independent functions are provided to allocate and free memory. 
  526. The functions are: 
  527.  
  528. void APIENTRY *osMalloc(
  529.    int size
  530.    );
  531.  
  532. void APIENTRY osFree(
  533.    void *ptr
  534.    );
  535.  
  536. The include file "roxapi.h" prototypes these functions, and the library 
  537. "rox.lib" contains them. 
  538.  
  539.  
  540. ΓòÉΓòÉΓòÉ 7. Utilities Provided ΓòÉΓòÉΓòÉ
  541.  
  542. The following utilities are provided with Rox: 
  543.  
  544. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  545.  
  546.  
  547. RoxLoad.cmd 
  548.  
  549. This program can only be used as a REXX function.  It can not be called from 
  550. the OS/2 command line.  One parameter must be passed to the function - the name 
  551. of a .rox file to load.  The file will be searched for in the current 
  552. directory, and then the directories specified in the ROXPATH environment 
  553. variable. 
  554.  
  555. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  556.  
  557.  
  558. RoxInfo.cmd 
  559.  
  560. Prints a short reference of the class definitions in .rox files. Multiple .rox 
  561. files may be passed as parameters, and wildcards may be specified.  For every 
  562. class in the .rox file, the following information will be provided: 
  563.  
  564. o Classes inherited by the class.  These classes will be listed in an 
  565.   indentation style which indicates the 'tree' of class inheritance. 
  566. o Variables defined and inherited by the class.  Inherited variables are marked 
  567.   with a prefix of '*'. 
  568. o Methods defined and inherited by the class.  Inherited methods are marked 
  569.   with a prefix of '*'. 
  570.  
  571. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  572.  
  573.  
  574. RoxProf.cmd 
  575.  
  576. Analyzes the profile information generated by RoxStats(). Use "RoxProf ?" for 
  577. help. 
  578.  
  579.  
  580. ΓòÉΓòÉΓòÉ 8. Classes and Testers Provided ΓòÉΓòÉΓòÉ
  581.  
  582. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  583.  
  584.  
  585. list.rox 
  586.  
  587. Implements a simple list class. The program testcoll.cmd tests this class, by 
  588. passing it a parameter of 'list'. The list class inherits the collection class 
  589. in collect.rox. 
  590.  
  591. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  592.  
  593.  
  594. wordlist.rox 
  595.  
  596. Implements a simple list class, similiar to the list class.  The difference is 
  597. that the list class can contain arbitrary strings, whereas the wordlist class 
  598. can only contain strings with no blanks in them. The program testcoll.cmd tests 
  599. this class, by passing it a parameter of 'wordlist'. The wordlist class 
  600. inherits the collection class in collect.rox. 
  601.  
  602. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  603.  
  604.  
  605. set.rox 
  606.  
  607. Implements a simple set class. The program testcoll.cmd tests this class, by 
  608. passing it a parameter of 'set'. The set class inherits the collection class in 
  609. collect.rox. 
  610.  
  611. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  612.  
  613.  
  614. collect.rox 
  615.  
  616. Implements a simple collection class, that can be inherited by other, more 
  617. specific collection classes, and will provide additional capabilities. 
  618.  
  619. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  620.  
  621.  
  622. sessions.rox 
  623.  
  624. This file implements some of the classes from Roger Sessions book on OO with C 
  625. and C++ (reference included in the .rox file). The program sessions.cmd tests 
  626. the classes. 
  627.  
  628. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  629.  
  630.  
  631. spinner.rox 
  632.  
  633. This class implements a character spinner, which can be used as a progress 
  634. indicator.  Also uses roxsem.dll.  This class is tested with testspin.cmd.  The 
  635. demo shows code testing a collection along with a spinner running independently 
  636. in another thread. 
  637.  
  638. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  639.  
  640.  
  641. testthrd.cmd 
  642.  
  643. This program tests the thread capabilities of Rox. 
  644.  
  645. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  646.  
  647.  
  648. cmdline.cmd 
  649.  
  650. This program uses cmdline.rox as a command line reader with history.  Use the 
  651. up and down arrows to cycle through previous lines entered. 
  652.  
  653. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  654.  
  655.  
  656. roxsocks.cmd & roxsockc.cmd 
  657.  
  658. These programs demonstrate tcp/ip server and client programs using the Rox 
  659. socket class (in socket.rox). 
  660.  
  661.  
  662. ΓòÉΓòÉΓòÉ 9. History ΓòÉΓòÉΓòÉ
  663.  
  664. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  665.  
  666.  
  667. 04/14/94 - version 1.8 
  668.  
  669. o fixed problem with super calls 
  670. o removed RoxVarSynch() ... added RoxAddVar() and per-instance variables 
  671. o cut execution time in half with new memory management scheme 
  672. o added RoxStats() and RoxProf.cmd 
  673.  
  674. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  675.  
  676.  
  677. 01/06/94 - version 1.7 
  678.  
  679. o minor documentation cleanup 
  680. o cleanup of internal structure of Rox - no external changes - most notably, no 
  681.   performance changes 
  682.  
  683. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  684.  
  685.  
  686. 10/22/93 - version 1.6 
  687.  
  688. o fixed infinite loop when no variables set in an init method - 
  689.   ObjectSaveState/RoxStemSynch ping-ponged.  Reported by Zvi Weiss as a problem 
  690.   when a syntax error occurred in an init method. 
  691. o changed compiled classes/methods stuff to have just one type of class, and 
  692.   either compiled or REXX macros.  Compiled macros added with 
  693.   RoxClassAddMethodCompiled(). 
  694.  
  695. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  696.  
  697.  
  698. 09/14/93 - version 1.5 
  699.  
  700. o more thread reentrancy fixes 
  701. o added compiled class capability 
  702.  
  703. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  704.  
  705.  
  706. 08/31/93 - version 1.4 
  707.  
  708. o added RoxSendThread() function 
  709. o first attempt at making everything thread reentrant (still some more to go). 
  710.  
  711. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  712.  
  713.  
  714. 08/27/93 - version 1.3 
  715.  
  716. o print error when invalid object reference is passed to a method 
  717. o added exception handling, to try to catch method invocation on objects which 
  718.   are no longer alive 
  719.  
  720. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  721.  
  722.  
  723. 08/24/93 - version 1.2 
  724.  
  725. o fixed problems with re-adding and re-registering classes and methods 
  726.  
  727. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  728.  
  729.  
  730. 08/22/93 - version 1.1 
  731.  
  732. o fixed super behaviour 
  733. o added multiple inheritance capability 
  734. o added class-specific init and deinit methods 
  735. o added RoxStemSynch() - requires user notify the system when stem variables 
  736.   are added or dropped as instance variables 
  737. o added RoxInfo.cmd utility 
  738. o documentation turned into .inf file and enhanced 
  739.  
  740. ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ 
  741.  
  742.  
  743. 08/18/93 - version 1.0 
  744.  
  745. o initial release 
  746.