code_junkie

Object-Orientation in C

Nov 13th, 2011
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.91 KB | None | 0 0
  1. struct monkey
  2. {
  3. float age;
  4. bool is_male;
  5. int happiness;
  6. };
  7.  
  8. void monkey_dance(struct monkey *monkey)
  9. {
  10. /* do a little dance */
  11. }
  12.  
  13. struct base
  14. {
  15. /* base class members */
  16. };
  17.  
  18. struct derived
  19. {
  20. struct base super;
  21. /* derived class members */
  22. };
  23.  
  24. struct derived d;
  25. struct base *base_ptr = (struct base *)&d; // upcast
  26. struct derived derived_ptr = (struct derived *)base_ptr; // downcast
  27.  
  28. struct base;
  29. struct base_vtable
  30. {
  31. void (*dance)(struct base *);
  32. void (*jump)(struct base *, int how_high);
  33. };
  34.  
  35. struct base
  36. {
  37. struct base_vtable *vtable;
  38. /* base members */
  39. };
  40.  
  41. void base_dance(struct base *b)
  42. {
  43. b->vtable->dance(b);
  44. }
  45.  
  46. void base_jump(struct base *b, int how_high)
  47. {
  48. b->vtable->jump(b, how_high);
  49. }
  50.  
  51. struct derived1
  52. {
  53. struct base super;
  54. /* derived1 members */
  55. };
  56.  
  57. void derived1_dance(struct derived1 *d)
  58. {
  59. /* implementation of derived1's dance function */
  60. }
  61.  
  62. void derived1_jump(struct derived1 *d, int how_high)
  63. {
  64. /* implementation of derived 1's jump function */
  65. }
  66.  
  67. /* global vtable for derived1 */
  68. struct base_vtable derived1_vtable =
  69. {
  70. &derived1_dance, /* you might get a warning here about incompatible pointer types */
  71. &derived1_jump /* you can ignore it, or perform a cast to get rid of it */
  72. };
  73.  
  74. void derived1_init(struct derived1 *d)
  75. {
  76. d->super.vtable = &derived1_vtable;
  77. /* init base members d->super.foo */
  78. /* init derived1 members d->foo */
  79. }
  80.  
  81. struct derived2
  82. {
  83. struct base super;
  84. /* derived2 members */
  85. };
  86.  
  87. void derived2_dance(struct derived2 *d)
  88. {
  89. /* implementation of derived2's dance function */
  90. }
  91.  
  92. void derived2_jump(struct derived2 *d, int how_high)
  93. {
  94. /* implementation of derived2's jump function */
  95. }
  96.  
  97. struct base_vtable derived2_vtable =
  98. {
  99. &derived2_dance,
  100. &derived2_jump
  101. };
  102.  
  103. void derived2_init(struct derived2 *d)
  104. {
  105. d->super.vtable = &derived2_vtable;
  106. /* init base members d->super.foo */
  107. /* init derived1 members d->foo */
  108. }
  109.  
  110. int main(void)
  111. {
  112. /* OK! We're done with our declarations, now we can finally do some
  113. polymorphism in C */
  114. struct derived1 d1;
  115. derived1_init(&d1);
  116.  
  117. struct derived2 d2;
  118. derived2_init(&d2);
  119.  
  120. struct base *b1_ptr = (struct base *)&d1;
  121. struct base *b2_ptr = (struct base *)&d2;
  122.  
  123. base_dance(b1_ptr); /* calls derived1_dance */
  124. base_dance(b2_ptr); /* calls derived2_dance */
  125.  
  126. base_jump(b1_ptr, 42); /* calls derived1_jump */
  127. base_jump(b2_ptr, 42); /* calls derived2_jump */
  128.  
  129. return 0;
  130. }
  131.  
  132. struct vehicle {
  133. int power;
  134. int weight;
  135. }
  136.  
  137. struct van {
  138. struct vehicle base;
  139. int cubic_size;
  140. }
  141.  
  142. struct van my_van;
  143. struct vehicle *something = &my_van;
  144. vehicle_function( something );
  145.  
  146. String s = "hi";
  147. System.out.println(s.length());
  148.  
  149. string s = "hi";
  150. printf(length(s)); // pass in s, as an implicit this
  151.  
  152. #include <limits.h>
  153. #include <string.h>
  154. #include <stdlib.h>
  155.  
  156. static void dtb_xlt(void *dst, const void *src, vint len, const byte *tbl);
  157.  
  158. DTABUF *dtb_crt(vint minsiz,vint incsiz,vint maxsiz) {
  159. DTABUF *dbp;
  160.  
  161. if(!minsiz) { return NULL; }
  162. if(!incsiz) { incsiz=minsiz; }
  163. if(!maxsiz || maxsiz<minsiz) { maxsiz=minsiz; }
  164. if(minsiz+incsiz>maxsiz) { incsiz=maxsiz-minsiz; }
  165. if((dbp=(DTABUF*)malloc(sizeof(*dbp))) == NULL) { return NULL; }
  166. memset(dbp,0,sizeof(*dbp));
  167. dbp->min=minsiz;
  168. dbp->inc=incsiz;
  169. dbp->max=maxsiz;
  170. dbp->siz=minsiz;
  171. dbp->cur=0;
  172. if((dbp->dta=(byte*)malloc((vuns)minsiz)) == NULL) { free(dbp); return NULL; }
  173. return dbp;
  174. }
  175.  
  176. DTABUF *dtb_dlt(DTABUF *dbp) {
  177. if(dbp) {
  178. free(dbp->dta);
  179. free(dbp);
  180. }
  181. return NULL;
  182. }
  183.  
  184. vint dtb_adddta(DTABUF *dbp,const byte *xlt256,const void *dtaptr,vint dtalen) {
  185. if(!dbp) { errno=EINVAL; return -1; }
  186. if(dtalen==-1) { dtalen=(vint)strlen((byte*)dtaptr); }
  187. if((dbp->cur + dtalen) > dbp->siz) {
  188. void *newdta;
  189. vint newsiz;
  190.  
  191. if((dbp->siz+dbp->inc)>=(dbp->cur+dtalen)) { newsiz=dbp->siz+dbp->inc; }
  192. else { newsiz=dbp->cur+dtalen; }
  193. if(newsiz>dbp->max) { errno=ETRUNC; return -1; }
  194. if((newdta=realloc(dbp->dta,(vuns)newsiz))==NULL) { return -1; }
  195. dbp->dta=newdta; dbp->siz=newsiz;
  196. }
  197. if(dtalen) {
  198. if(xlt256) { dtb_xlt(((byte*)dbp->dta+dbp->cur),dtaptr,dtalen,xlt256); }
  199. else { memcpy(((byte*)dbp->dta+dbp->cur),dtaptr,(vuns)dtalen); }
  200. dbp->cur+=dtalen;
  201. }
  202. return 0;
  203. }
  204.  
  205. static void dtb_xlt(void *dst,const void *src,vint len,const byte *tbl) {
  206. byte *sp,*dp;
  207.  
  208. for(sp=(byte*)src,dp=(byte*)dst; len; len--,sp++,dp++) { *dp=tbl[*sp]; }
  209. }
  210.  
  211. vint dtb_addtxt(DTABUF *dbp,const byte *xlt256,const byte *format,...) {
  212. byte textÝ501¨;
  213. va_list ap;
  214. vint len;
  215.  
  216. va_start(ap,format); len=sprintf_len(format,ap)-1; va_end(ap);
  217. if(len<0 || len>=sizeof(text)) { sprintf_safe(text,sizeof(text),"STRTOOLNG: %s",format); len=(int)strlen(text); }
  218. else { va_start(ap,format); vsprintf(text,format,ap); va_end(ap); }
  219. return dtb_adddta(dbp,xlt256,text,len);
  220. }
  221.  
  222. vint dtb_rmvdta(DTABUF *dbp,vint len) {
  223. if(!dbp) { errno=EINVAL; return -1; }
  224. if(len > dbp->cur) { len=dbp->cur; }
  225. dbp->cur-=len;
  226. return 0;
  227. }
  228.  
  229. vint dtb_reset(DTABUF *dbp) {
  230. if(!dbp) { errno=EINVAL; return -1; }
  231. dbp->cur=0;
  232. if(dbp->siz > dbp->min) {
  233. byte *newdta;
  234. if((newdta=(byte*)realloc(dbp->dta,(vuns)dbp->min))==NULL) {
  235. free(dbp->dta); dbp->dta=null; dbp->siz=0;
  236. return -1;
  237. }
  238. dbp->dta=newdta; dbp->siz=dbp->min;
  239. }
  240. return 0;
  241. }
  242.  
  243. void *dtb_elmptr(DTABUF *dbp,vint elmidx,vint elmlen) {
  244. if(!elmlen || (elmidx*elmlen)>=dbp->cur) { return NULL; }
  245. return ((byte*)dbp->dta+(elmidx*elmlen));
  246. }
  247.  
  248. typedef _Packed struct {
  249. vint min; /* initial size */
  250. vint inc; /* increment size */
  251. vint max; /* maximum size */
  252. vint siz; /* current size */
  253. vint cur; /* current data length */
  254. void *dta; /* data pointer */
  255. } DTABUF;
  256.  
  257. #define dtb_dtaptr(mDBP) (mDBP->dta)
  258. #define dtb_dtalen(mDBP) (mDBP->cur)
  259.  
  260. DTABUF *dtb_crt(vint minsiz,vint incsiz,vint maxsiz);
  261. DTABUF *dtb_dlt(DTABUF *dbp);
  262. vint dtb_adddta(DTABUF *dbp,const byte *xlt256,const void *dtaptr,vint dtalen);
  263. vint dtb_addtxt(DTABUF *dbp,const byte *xlt256,const byte *format,...);
  264. vint dtb_rmvdta(DTABUF *dbp,vint len);
  265. vint dtb_reset(DTABUF *dbp);
  266. void *dtb_elmptr(DTABUF *dbp,vint elmidx,vint elmlen);
Add Comment
Please, Sign In to add comment