home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_08_02 / 8n02053a < prev    next >
Text File  |  1990-03-01  |  7KB  |  208 lines

  1.  
  2.  
  3. *****Listing 6*****
  4.  
  5. 001  #include <stdio.h>
  6. 002  #include <stdlib.h>
  7. 003  #include <stdarg.h>
  8. 004  #include "utility.h"
  9. 005  #include "obj.h"
  10. 006  
  11. 007  /* methods for graphical_object, circle, double_circle, square */
  12. 008  #define INIT 0
  13. 009  #define DRAW 1
  14. 010  #define MOVE 2
  15. 011  
  16. 012  /********************************************************/
  17. 013  /* CLASS GRAPHICAL OBJECT */
  18. 014  
  19. 015  struct graph_obj_s {
  20. 016      int y;
  21. 017      int x;
  22. 018  };
  23. 019  
  24. 020  typedef struct graph_obj_s GRAPH_OBJ_T;
  25. 021  #define GRAPH_OBJ_SIZE sizeof(GRAPH_OBJ_T)
  26. 022  #define GRAPH_OBJ_OFFSET 0
  27. 023  
  28. 024  /* graph_obj_init(object, y_position, x_position); */
  29. 025  void graph_obj_init(OBJECT *obj, va_list arg_ptr)
  30. 026  {
  31. 027      GRAPH_OBJ_T *g;
  32. 028      g = (GRAPH_OBJ_T *)((unsigned char *)obj->data +
  33. 029        GRAPH_OBJ_OFFSET);
  34. 030      g->y = va_arg(arg_ptr, int);
  35. 031      g->x = va_arg(arg_ptr, int);
  36. 032  }
  37. 033  
  38. 034  /* graph_obj_move(object, distance_y, distance_x); */
  39. 035  void graph_obj_move(OBJECT *obj, va_list arg_ptr)
  40. 036  {
  41. 037      GRAPH_OBJ_T *g;
  42. 038      g = (GRAPH_OBJ_T *)((unsigned char *)obj->data +
  43. 039        GRAPH_OBJ_OFFSET);
  44. 040      message(obj, DRAW, g_black);
  45. 041      g->y += va_arg(arg_ptr, int);
  46. 042      g->x += va_arg(arg_ptr, int);
  47. 043      message(obj, DRAW, g_white);
  48. 044  }
  49. 045  
  50. 046  /********************************************************/
  51. 047  /* CLASS CIRCLE */
  52. 048  
  53. 049  struct circle_s {
  54. 050      int radius;
  55. 051  };
  56. 052  
  57. 053  typedef struct circle_s CIRCLE_T;
  58. 054  #define CIRCLE_SIZE sizeof(CIRCLE_T) + GRAPH_OBJ_SIZE
  59. 055  #define CIRCLE_OFFSET sizeof(GRAPH_OBJ_T)
  60. 056  
  61. 057  /* circle_init(object, y_position, x_position, radius); */
  62. 058  void circle_init(OBJECT *obj, va_list arg_ptr)
  63. 059  {
  64. 060      CIRCLE_T *c;
  65. 061      graph_obj_init(obj, arg_ptr);
  66. 062      (void)va_arg(arg_ptr, int);
  67. 063      (void)va_arg(arg_ptr, int);
  68. 064      c = (CIRCLE_T *)((unsigned char *)obj->data + CIRCLE_OFFSET);
  69. 065      c->radius = va_arg(arg_ptr, int);
  70. 066      message(obj, DRAW, g_white);
  71. 067  }
  72. 068  
  73. 069  /* circle_draw(object, color); */
  74. 070  void circle_draw(OBJECT *obj, va_list arg_ptr)
  75. 071  {
  76. 072      int color;
  77. 073      CIRCLE_T *c;
  78. 074      GRAPH_OBJ_T *g;
  79. 075      c = (CIRCLE_T *)((unsigned char *)obj->data + CIRCLE_OFFSET);
  80. 076      g = (GRAPH_OBJ_T *)((unsigned char *)obj->data +
  81. 077        GRAPH_OBJ_OFFSET);
  82. 078      color = va_arg(arg_ptr, int);
  83. 079      /* g_circle(g->y, g->x, c->radius, va_arg(arg_ptr, int)); */
  84. 080      g_circle(g->y, g->x, c->radius, color);
  85. 081  }
  86. 082  
  87. 083  /********************************************************/
  88. 084  /* CLASS SQUARE (very similar to CIRCLE) */
  89. 085  
  90. 086  struct square_s {
  91. 087      int size;
  92. 088  };
  93. 089  
  94. 090  typedef struct square_s SQUARE_T;
  95. 091  #define SQUARE_SIZE sizeof(SQUARE_T) + GRAPH_OBJ_SIZE
  96. 092  #define SQUARE_OFFSET sizeof(GRAPH_OBJ_T)
  97. 093  
  98. 094  /* square_init(object, y_position, x_position, size); */
  99. 095  void square_init(OBJECT *obj, va_list arg_ptr)
  100. 096  {
  101. 097      SQUARE_T *s;
  102. 098      graph_obj_init(obj, arg_ptr);
  103. 099      (void)va_arg(arg_ptr, int);
  104. 100      (void)va_arg(arg_ptr, int);
  105. 101      s = (SQUARE_T *)((unsigned char *)obj->data + SQUARE_OFFSET);
  106. 102      s->size = va_arg(arg_ptr, int);
  107. 103      message(obj, DRAW, g_white);
  108. 104  }
  109. 105  
  110. 106  /* square_draw(object, color); */
  111. 107  void square_draw(OBJECT *obj, va_list arg_ptr)
  112. 108  {
  113. 109      SQUARE_T *s;
  114. 110      GRAPH_OBJ_T *g;
  115. 111      s = (SQUARE_T *)((unsigned char *)obj->data + SQUARE_OFFSET);
  116. 112      g = (GRAPH_OBJ_T *)((unsigned char *)obj->data +
  117. 113        GRAPH_OBJ_OFFSET);
  118. 114      g_square(g->y, g->x, s->size, va_arg(arg_ptr, int));
  119. 115  }
  120. 116  
  121. 117  /********************************************************/
  122. 118  /* CLASS DOUBLE CIRCLE (sub-class of CIRCLE) */
  123. 119  
  124. 120  #define DOUBLE_CIRCLE_SIZE CIRCLE_SIZE
  125. 121  
  126. 122  /* double_circle_draw(object, color); */
  127. 123  void double_circle_draw(OBJECT *obj, va_list arg_ptr)
  128. 124  {
  129. 125      int color;
  130. 126      CIRCLE_T *c;
  131. 127      GRAPH_OBJ_T *g;
  132. 128      c = (CIRCLE_T *)((unsigned char *)obj->data + CIRCLE_OFFSET);
  133. 129      g = (GRAPH_OBJ_T *)((unsigned char *)obj->data +
  134. 130        GRAPH_OBJ_OFFSET);
  135. 131      color = va_arg(arg_ptr, int);
  136. 132      g_circle(g->y, g->x, c->radius, color);
  137. 133      g_circle(g->y, g->x, c->radius - 2, color);
  138. 134  }
  139. 135  
  140. 136  /********************************************************/
  141. 137  
  142. 138  int main(int argc, char **argv);
  143. 139  int main(int argc, char **argv)
  144. 140  {
  145. 141      int x;
  146. 142  
  147. 143      CLASS graph_obj;
  148. 144      CLASS circle;
  149. 145      CLASS square;
  150. 146      CLASS double_circle;
  151. 147  
  152. 148      OBJECT c1;
  153. 149      OBJECT s1;
  154. 150      OBJECT dc1;
  155. 151  
  156. 152      g_init();
  157. 153      
  158. 154      /* make class graphical object */
  159. 155      new_class(&graph_obj, NULL, 3, GRAPH_OBJ_SIZE);
  160. 156      reg_method(&graph_obj, INIT, graph_obj_init);
  161. 157      reg_method(&graph_obj, MOVE, graph_obj_move);
  162. 158  
  163. 159      /* make class circle */
  164. 160      new_class(&circle, &graph_obj, 3, CIRCLE_SIZE);
  165. 161      reg_method(&circle, INIT, circle_init);
  166. 162      reg_method(&circle, DRAW, circle_draw);
  167. 163  
  168. 164      /* make class square */
  169. 165      new_class(&square, &graph_obj, 3, SQUARE_SIZE);
  170. 166      reg_method(&square, INIT, square_init);
  171. 167      reg_method(&square, DRAW, square_draw);
  172. 168  
  173. 169      /* make class double_circle */
  174. 170      new_class(&double_circle, &circle, 3, DOUBLE_CIRCLE_SIZE);
  175. 171      reg_method(&double_circle, DRAW, double_circle_draw);
  176. 172  
  177. 173      /* make a circle object */
  178. 174      new_object(&c1, &circle);
  179. 175      message(&c1, INIT, 40, 40, 20);
  180. 176  
  181. 177      /* make a square object */
  182. 178      new_object(&s1, &square);
  183. 179      message(&s1, INIT, 40, 100, 20);
  184. 180  
  185. 181      /* make a double circle object */
  186. 182      new_object(&dc1, &double_circle);
  187. 183      message(&dc1, INIT, 40, 160, 20);
  188. 184  
  189. 185      for (x = 0; x < 100; ++x) {
  190. 186          message(&c1, MOVE, 1, 1);
  191. 187          message(&s1, MOVE, 1, 0);
  192. 188          message(&dc1, MOVE, 0, -1);
  193. 189      }
  194. 190  
  195. 191      free_object(&c1);
  196. 192      free_object(&s1);
  197. 193      free_object(&dc1);
  198. 194  
  199. 195      free_class(&graph_obj);
  200. 196      free_class(&circle);
  201. 197      free_class(&square);
  202. 198      free_class(&double_circle);
  203. 199  
  204. 200      cleanup();
  205. 201  
  206. 202      return (0);
  207. 203  }
  208.