#include <stdlib.h>
#include <stdio.h>
typedef struct{
void(*Repaint)(void *);
int X, Y;
} Component;
void *new_Component(int x, int y){
Component
*this
= malloc(sizeof(Component
)); this->X = x;
this->Y = y;
return this;
}
void delete_Component(Component *this){
}
typedef struct{
Component *Base;
const char *Text;
} Label;
void Label_Repaint(void *voidthis){
Label *this = voidthis;
Component *base = this->Base;
printf("Label \"%s\" at {%d, %d}", this
->Text
, base
->X
, base
->Y
); }
void *new_Label(int x, int y, const char *text){
Label
*this
= malloc(sizeof(Label
)); this->Base = new_Component(x, y);
this->Base->Repaint = Label_Repaint;
this->Text = text;
return this;
}
void delete_Label(Label *this){
delete_Component(this->Base);
}
int main(void){
Label *l = new_Label(1, 2, "Patrick Bateman");
l->Base->Repaint(l);
delete_Label(l);
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCnR5cGVkZWYgc3RydWN0ewoJdm9pZCgqUmVwYWludCkodm9pZCAqKTsKCWludCBYLCBZOwp9ICBDb21wb25lbnQ7Cgp2b2lkICpuZXdfQ29tcG9uZW50KGludCB4LCBpbnQgeSl7CglDb21wb25lbnQgKnRoaXMgPSBtYWxsb2Moc2l6ZW9mKENvbXBvbmVudCkpOwoJdGhpcy0+WCA9IHg7Cgl0aGlzLT5ZID0geTsKCXJldHVybiB0aGlzOwp9CnZvaWQgZGVsZXRlX0NvbXBvbmVudChDb21wb25lbnQgKnRoaXMpewoJZnJlZSh0aGlzKTsKfQoKdHlwZWRlZiBzdHJ1Y3R7CglDb21wb25lbnQgKkJhc2U7Cgljb25zdCBjaGFyICpUZXh0Owp9IExhYmVsOwp2b2lkIExhYmVsX1JlcGFpbnQodm9pZCAqdm9pZHRoaXMpewoJTGFiZWwgKnRoaXMgPSB2b2lkdGhpczsKCUNvbXBvbmVudCAqYmFzZSA9IHRoaXMtPkJhc2U7CglwcmludGYoIkxhYmVsIFwiJXNcIiBhdCB7JWQsICVkfSIsIHRoaXMtPlRleHQsIGJhc2UtPlgsIGJhc2UtPlkpOwp9CnZvaWQgKm5ld19MYWJlbChpbnQgeCwgaW50IHksIGNvbnN0IGNoYXIgKnRleHQpewoJTGFiZWwgKnRoaXMgPSBtYWxsb2Moc2l6ZW9mKExhYmVsKSk7Cgl0aGlzLT5CYXNlID0gbmV3X0NvbXBvbmVudCh4LCB5KTsKCXRoaXMtPkJhc2UtPlJlcGFpbnQgPSBMYWJlbF9SZXBhaW50OwoJdGhpcy0+VGV4dCA9IHRleHQ7CglyZXR1cm4gdGhpczsKfQp2b2lkIGRlbGV0ZV9MYWJlbChMYWJlbCAqdGhpcyl7CglkZWxldGVfQ29tcG9uZW50KHRoaXMtPkJhc2UpOwoJZnJlZSh0aGlzKTsKfQoKaW50IG1haW4odm9pZCl7CglMYWJlbCAqbCA9IG5ld19MYWJlbCgxLCAyLCAiUGF0cmljayBCYXRlbWFuIik7CglsLT5CYXNlLT5SZXBhaW50KGwpOwoJZGVsZXRlX0xhYmVsKGwpOwoJcmV0dXJuIDA7Cn0K