Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct monkey
- {
- float age;
- bool is_male;
- int happiness;
- };
- void monkey_dance(struct monkey *monkey)
- {
- /* do a little dance */
- }
- struct base
- {
- /* base class members */
- };
- struct derived
- {
- struct base super;
- /* derived class members */
- };
- struct derived d;
- struct base *base_ptr = (struct base *)&d; // upcast
- struct derived derived_ptr = (struct derived *)base_ptr; // downcast
- struct base;
- struct base_vtable
- {
- void (*dance)(struct base *);
- void (*jump)(struct base *, int how_high);
- };
- struct base
- {
- struct base_vtable *vtable;
- /* base members */
- };
- void base_dance(struct base *b)
- {
- b->vtable->dance(b);
- }
- void base_jump(struct base *b, int how_high)
- {
- b->vtable->jump(b, how_high);
- }
- struct derived1
- {
- struct base super;
- /* derived1 members */
- };
- void derived1_dance(struct derived1 *d)
- {
- /* implementation of derived1's dance function */
- }
- void derived1_jump(struct derived1 *d, int how_high)
- {
- /* implementation of derived 1's jump function */
- }
- /* global vtable for derived1 */
- struct base_vtable derived1_vtable =
- {
- &derived1_dance, /* you might get a warning here about incompatible pointer types */
- &derived1_jump /* you can ignore it, or perform a cast to get rid of it */
- };
- void derived1_init(struct derived1 *d)
- {
- d->super.vtable = &derived1_vtable;
- /* init base members d->super.foo */
- /* init derived1 members d->foo */
- }
- struct derived2
- {
- struct base super;
- /* derived2 members */
- };
- void derived2_dance(struct derived2 *d)
- {
- /* implementation of derived2's dance function */
- }
- void derived2_jump(struct derived2 *d, int how_high)
- {
- /* implementation of derived2's jump function */
- }
- struct base_vtable derived2_vtable =
- {
- &derived2_dance,
- &derived2_jump
- };
- void derived2_init(struct derived2 *d)
- {
- d->super.vtable = &derived2_vtable;
- /* init base members d->super.foo */
- /* init derived1 members d->foo */
- }
- int main(void)
- {
- /* OK! We're done with our declarations, now we can finally do some
- polymorphism in C */
- struct derived1 d1;
- derived1_init(&d1);
- struct derived2 d2;
- derived2_init(&d2);
- struct base *b1_ptr = (struct base *)&d1;
- struct base *b2_ptr = (struct base *)&d2;
- base_dance(b1_ptr); /* calls derived1_dance */
- base_dance(b2_ptr); /* calls derived2_dance */
- base_jump(b1_ptr, 42); /* calls derived1_jump */
- base_jump(b2_ptr, 42); /* calls derived2_jump */
- return 0;
- }
- struct vehicle {
- int power;
- int weight;
- }
- struct van {
- struct vehicle base;
- int cubic_size;
- }
- struct van my_van;
- struct vehicle *something = &my_van;
- vehicle_function( something );
- String s = "hi";
- System.out.println(s.length());
- string s = "hi";
- printf(length(s)); // pass in s, as an implicit this
- #include <limits.h>
- #include <string.h>
- #include <stdlib.h>
- static void dtb_xlt(void *dst, const void *src, vint len, const byte *tbl);
- DTABUF *dtb_crt(vint minsiz,vint incsiz,vint maxsiz) {
- DTABUF *dbp;
- if(!minsiz) { return NULL; }
- if(!incsiz) { incsiz=minsiz; }
- if(!maxsiz || maxsiz<minsiz) { maxsiz=minsiz; }
- if(minsiz+incsiz>maxsiz) { incsiz=maxsiz-minsiz; }
- if((dbp=(DTABUF*)malloc(sizeof(*dbp))) == NULL) { return NULL; }
- memset(dbp,0,sizeof(*dbp));
- dbp->min=minsiz;
- dbp->inc=incsiz;
- dbp->max=maxsiz;
- dbp->siz=minsiz;
- dbp->cur=0;
- if((dbp->dta=(byte*)malloc((vuns)minsiz)) == NULL) { free(dbp); return NULL; }
- return dbp;
- }
- DTABUF *dtb_dlt(DTABUF *dbp) {
- if(dbp) {
- free(dbp->dta);
- free(dbp);
- }
- return NULL;
- }
- vint dtb_adddta(DTABUF *dbp,const byte *xlt256,const void *dtaptr,vint dtalen) {
- if(!dbp) { errno=EINVAL; return -1; }
- if(dtalen==-1) { dtalen=(vint)strlen((byte*)dtaptr); }
- if((dbp->cur + dtalen) > dbp->siz) {
- void *newdta;
- vint newsiz;
- if((dbp->siz+dbp->inc)>=(dbp->cur+dtalen)) { newsiz=dbp->siz+dbp->inc; }
- else { newsiz=dbp->cur+dtalen; }
- if(newsiz>dbp->max) { errno=ETRUNC; return -1; }
- if((newdta=realloc(dbp->dta,(vuns)newsiz))==NULL) { return -1; }
- dbp->dta=newdta; dbp->siz=newsiz;
- }
- if(dtalen) {
- if(xlt256) { dtb_xlt(((byte*)dbp->dta+dbp->cur),dtaptr,dtalen,xlt256); }
- else { memcpy(((byte*)dbp->dta+dbp->cur),dtaptr,(vuns)dtalen); }
- dbp->cur+=dtalen;
- }
- return 0;
- }
- static void dtb_xlt(void *dst,const void *src,vint len,const byte *tbl) {
- byte *sp,*dp;
- for(sp=(byte*)src,dp=(byte*)dst; len; len--,sp++,dp++) { *dp=tbl[*sp]; }
- }
- vint dtb_addtxt(DTABUF *dbp,const byte *xlt256,const byte *format,...) {
- byte textÝ501¨;
- va_list ap;
- vint len;
- va_start(ap,format); len=sprintf_len(format,ap)-1; va_end(ap);
- if(len<0 || len>=sizeof(text)) { sprintf_safe(text,sizeof(text),"STRTOOLNG: %s",format); len=(int)strlen(text); }
- else { va_start(ap,format); vsprintf(text,format,ap); va_end(ap); }
- return dtb_adddta(dbp,xlt256,text,len);
- }
- vint dtb_rmvdta(DTABUF *dbp,vint len) {
- if(!dbp) { errno=EINVAL; return -1; }
- if(len > dbp->cur) { len=dbp->cur; }
- dbp->cur-=len;
- return 0;
- }
- vint dtb_reset(DTABUF *dbp) {
- if(!dbp) { errno=EINVAL; return -1; }
- dbp->cur=0;
- if(dbp->siz > dbp->min) {
- byte *newdta;
- if((newdta=(byte*)realloc(dbp->dta,(vuns)dbp->min))==NULL) {
- free(dbp->dta); dbp->dta=null; dbp->siz=0;
- return -1;
- }
- dbp->dta=newdta; dbp->siz=dbp->min;
- }
- return 0;
- }
- void *dtb_elmptr(DTABUF *dbp,vint elmidx,vint elmlen) {
- if(!elmlen || (elmidx*elmlen)>=dbp->cur) { return NULL; }
- return ((byte*)dbp->dta+(elmidx*elmlen));
- }
- typedef _Packed struct {
- vint min; /* initial size */
- vint inc; /* increment size */
- vint max; /* maximum size */
- vint siz; /* current size */
- vint cur; /* current data length */
- void *dta; /* data pointer */
- } DTABUF;
- #define dtb_dtaptr(mDBP) (mDBP->dta)
- #define dtb_dtalen(mDBP) (mDBP->cur)
- DTABUF *dtb_crt(vint minsiz,vint incsiz,vint maxsiz);
- DTABUF *dtb_dlt(DTABUF *dbp);
- vint dtb_adddta(DTABUF *dbp,const byte *xlt256,const void *dtaptr,vint dtalen);
- vint dtb_addtxt(DTABUF *dbp,const byte *xlt256,const byte *format,...);
- vint dtb_rmvdta(DTABUF *dbp,vint len);
- vint dtb_reset(DTABUF *dbp);
- void *dtb_elmptr(DTABUF *dbp,vint elmidx,vint elmlen);
Add Comment
Please, Sign In to add comment