quakeforge/ruamoko/lib/Protocol.r

85 lines
1.9 KiB
R

#include "Protocol.h"
struct obj_protocol_list {
struct obj_protocol_list [] next;
integer count;
Protocol[] [1] list;
};
struct obj_method_description_list {
integer count;
struct obj_method_description [1] list;
};
@implementation Protocol
- (string) name
{
return protocol_name;
}
- (BOOL) conformsTo: (Protocol [])aProtocolObject
{
local integer i;
local struct obj_protocol_list [] proto_list;
if (aProtocolObject.protocol_name == protocol_name)
return YES;
for (proto_list = protocol_list; proto_list;
proto_list = proto_list.next) {
for (i = 0; i < proto_list.count; i++) {
if ([proto_list.list[i] conformsTo: aProtocolObject])
return YES;
}
}
return NO;
}
- (struct obj_method_description []) descriptionForInstanceMethod: (SEL)aSel
{
local integer i;
local struct obj_protocol_list [] proto_list;
local string name = sel_get_name (aSel);
local struct obj_method_description [] result;
for (i = 0; i < instance_methods.count; i++) {
if (instance_methods.list[i].name == name)
return &instance_methods.list[i];
}
for (proto_list = protocol_list; proto_list;
proto_list = proto_list.next) {
for (i = 0; i < proto_list.count; i++) {
if ((result = [proto_list.list[i]
descriptionForInstanceMethod: aSel]))
return result;
}
}
return NIL;
}
- (struct obj_method_description []) descriptionForClassMethod: (SEL)aSel
{
local integer i;
local struct obj_protocol_list [] proto_list;
local string name = sel_get_name (aSel);
local struct obj_method_description [] result;
for (i = 0; i < class_methods.count; i++) {
if (class_methods.list[i].name == name)
return &class_methods.list[i];
}
for (proto_list = protocol_list; proto_list;
proto_list = proto_list.next) {
for (i = 0; i < proto_list.count; i++) {
if ((result = [proto_list.list[i]
descriptionForClassMethod: aSel]))
return result;
}
}
return NIL;
}
@end