Skip to content

Commit

Permalink
Improve Buffer usability with CD_Buffer(Add|Remove)Format.
Browse files Browse the repository at this point in the history
  • Loading branch information
meh committed Feb 28, 2011
1 parent 2e0678c commit d077760
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 43 deletions.
46 changes: 42 additions & 4 deletions include/craftd/Buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,26 @@ int CD_BufferDrain (CDBuffer* self, size_t length);

void CD_BufferAdd (CDBuffer* self, CDPointer data, size_t length);

void CD_BufferAddBuffer (CDBuffer* self, CDBuffer* data);
/**
* Add data to a buffer with data from the given format.
*
* Format types:
* b: MCByte
* s: MCShort
* i: MCInteger
* l: MCLong
*
* f: MCFloat
* d: MCDouble
*
* B: MCBoolean
* S: MCString
*
* @param format The format string
*/
void CD_BufferAddFormat (CDBuffer* self, const char* format, ...);

void CD_BufferAddBoolean (CDBuffer* self, MCBoolean data);
void CD_BufferAddBuffer (CDBuffer* self, CDBuffer* data);

void CD_BufferAddByte (CDBuffer* self, MCByte data);

Expand All @@ -82,13 +99,32 @@ void CD_BufferAddFloat (CDBuffer* self, MCFloat data);

void CD_BufferAddDouble (CDBuffer* self, MCDouble data);

void CD_BufferAddBoolean (CDBuffer* self, MCBoolean data);

void CD_BufferAddString (CDBuffer* self, MCString data);

CDPointer CD_BufferRemove (CDBuffer* self, size_t length);

CDBuffer* CD_BufferRemoveBuffer (CDBuffer* self);
/**
* Remove data from a buffer with data from the given format.
*
* Format types:
* b: MCByte
* s: MCShort
* i: MCInteger
* l: MCLong
*
* f: MCFloat
* d: MCDouble
*
* B: MCBoolean
* S: MCString
*
* @param format The format string
*/
void CD_BufferRemoveFormat (CDBuffer* self, const char* format, ...);

MCBoolean CD_BufferRemoveBoolean (CDBuffer* self);
CDBuffer* CD_BufferRemoveBuffer (CDBuffer* self);

MCByte CD_BufferRemoveByte (CDBuffer* self);

Expand All @@ -102,6 +138,8 @@ MCFloat CD_BufferRemoveFloat (CDBuffer* self);

MCDouble CD_BufferRemoveDouble (CDBuffer* self);

MCBoolean CD_BufferRemoveBoolean (CDBuffer* self);

MCString CD_BufferRemoveString (CDBuffer* self);

#endif
69 changes: 63 additions & 6 deletions src/Buffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,19 +94,40 @@ CD_BufferAdd (CDBuffer* self, CDPointer data, size_t length)
}

void
CD_BufferAddBuffer (CDBuffer* self, CDBuffer* data)
CD_BufferAddFormat (CDBuffer* self, const char* format, ...)
{
CDPointer stuff = CD_BufferContent(data);
va_list ap;

evbuffer_add(self->raw, (void*) stuff, CD_BufferLength(data));
va_start(ap, format);

CD_free((void*) stuff);
while (*format != '\0') {
switch (*format) {
case 'b': CD_BufferAddByte(self, va_arg(ap, int)); break;
case 's': CD_BufferAddShort(self, va_arg(ap, int)); break;
case 'i': CD_BufferAddInteger(self, va_arg(ap, int)); break;
case 'l': CD_BufferAddLong(self, va_arg(ap, long)); break;

case 'f': CD_BufferAddFloat(self, va_arg(ap, double)); break;
case 'd': CD_BufferAddDouble(self, va_arg(ap, double)); break;

case 'B': CD_BufferAddBoolean(self, va_arg(ap, int)); break;
case 'S': CD_BufferAddString(self, va_arg(ap, CDString*)); break;
}

format++;
}

va_end(ap);
}

void
CD_BufferAddBoolean (CDBuffer* self, MCBoolean data)
CD_BufferAddBuffer (CDBuffer* self, CDBuffer* data)
{
evbuffer_add(self->raw, &data, MCBooleanSize);
CDPointer stuff = CD_BufferContent(data);

evbuffer_add(self->raw, (void*) stuff, CD_BufferLength(data));

CD_free((void*) stuff);
}

void
Expand Down Expand Up @@ -155,6 +176,12 @@ CD_BufferAddDouble (CDBuffer* self, MCDouble data)
evbuffer_add(self->raw, &data, MCDoubleSize);
}

void
CD_BufferAddBoolean (CDBuffer* self, MCBoolean data)
{
evbuffer_add(self->raw, &data, MCBooleanSize);
}

void
CD_BufferAddString (CDBuffer* self, CDString* data)
{
Expand All @@ -174,6 +201,36 @@ CD_BufferRemove (CDBuffer* self, size_t length)
return result;
}

void
CD_BufferRemoveFormat (CDBuffer* self, const char* format, ...)
{
va_list ap;

va_start(ap, format);

while (*format != '\0') {
CDPointer pointer = va_arg(ap, CDPointer);

switch (*format) {
case 'b': *((MCByte*) pointer) = CD_BufferRemoveByte(self); break;
case 's': *((MCShort*) pointer) = CD_BufferRemoveShort(self); break;
case 'i': *((MCInteger*) pointer) = CD_BufferRemoveInteger(self); break;
case 'l': *((MCLong*) pointer) = CD_BufferRemoveLong(self); break;

case 'f': *((MCFloat*) pointer) = CD_BufferRemoveFloat(self); break;
case 'd': *((MCDouble*) pointer) = CD_BufferRemoveDouble(self); break;

case 'B': *((MCBoolean*) pointer) = CD_BufferRemoveBoolean(self); break;
case 'S': *((MCString*) pointer) = CD_BufferRemoveString(self); break;
}

format++;
}

va_end(ap);
}


CDBuffer*
CD_BufferRemoveBuffer (CDBuffer* self)
{
Expand Down
88 changes: 55 additions & 33 deletions src/Packet.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,37 +177,45 @@ CD_GetPacketDataFromBuffer (CDPacket* self, CDBuffer* input)
case CDLogin: {
CDPacketLogin* packet = (CDPacketLogin*) CD_malloc(sizeof(CDPacketLogin));

packet->request.version = CD_BufferRemoveInteger(input);
packet->request.username = CD_BufferRemoveString(input);
packet->request.password = CD_BufferRemoveString(input);
packet->request.mapSeed = CD_BufferRemoveLong(input);
packet->request.dimension = CD_BufferRemoveByte(input);
CD_BufferRemoveFormat(input, "iSSlb",
&packet->request.version,
&packet->request.username,
&packet->request.password,
&packet->request.mapSeed,
&packet->request.dimension
);

return (CDPointer) packet;
}

case CDHandshake: {
CDPacketHandshake* packet = (CDPacketHandshake*) CD_malloc(sizeof(CDPacketHandshake));

packet->request.username = CD_BufferRemoveString(input);
CD_BufferRemoveFormat(input, "S",
&packet->request.username
);

return (CDPointer) packet;
}

case CDChat: {
CDPacketChat* packet = (CDPacketChat*) CD_malloc(sizeof(CDPacketChat));

packet->request.message = CD_BufferRemoveString(input);
CD_BufferRemoveFormat(input, "S",
&packet->request.message
);

return (CDPointer) packet;
}

case CDUseEntity: {
CDPacketUseEntity* packet = (CDPacketUseEntity*) CD_malloc(sizeof(CDPacketUseEntity));

packet->request.user = CD_BufferRemoveInteger(input);
packet->request.target = CD_BufferRemoveInteger(input);
packet->request.leftClick = CD_BufferRemoveByte(input);
CD_BufferRemoveFormat(input, "iib",
&packet->request.user,
&packet->request.target,
&packet->request.leftClick
);

return (CDPointer) packet;
}
Expand All @@ -219,43 +227,51 @@ CD_GetPacketDataFromBuffer (CDPacket* self, CDBuffer* input)
case CDOnGround: {
CDPacketOnGround* packet = (CDPacketOnGround*) CD_malloc(sizeof(CDPacketOnGround));

packet->request.onGround = CD_BufferRemoveBoolean(input);
CD_BufferRemoveFormat(input, "B",
&packet->request.onGround
);

return (CDPointer) packet;
}

case CDPlayerPosition: {
CDPacketPlayerPosition* packet = (CDPacketPlayerPosition*) CD_malloc(sizeof(CDPacketPlayerPosition));

packet->request.position.x = CD_BufferRemoveDouble(input);
packet->request.position.y = CD_BufferRemoveDouble(input);
packet->request.stance = CD_BufferRemoveDouble(input);
packet->request.position.z = CD_BufferRemoveDouble(input);
packet->request.is.onGround = CD_BufferRemoveBoolean(input);
CD_BufferRemoveFormat(input, "ddddb",
&packet->request.position.x,
&packet->request.position.y,
&packet->request.stance,
&packet->request.position.z,
&packet->request.is.onGround
);

return (CDPointer) packet;
}

case CDPlayerLook: {
CDPacketPlayerLook* packet = (CDPacketPlayerLook*) CD_malloc(sizeof(CDPacketPlayerLook));

packet->request.yaw = CD_BufferRemoveFloat(input);
packet->request.pitch = CD_BufferRemoveFloat(input);
packet->request.is.onGround = CD_BufferRemoveBoolean(input);
CD_BufferRemoveFormat(input, "ffb",
&packet->request.yaw,
&packet->request.pitch,
&packet->request.is.onGround
);

return (CDPointer) packet;
}

case CDPlayerMoveLook: {
CDPacketPlayerMoveLook* packet = (CDPacketPlayerMoveLook*) CD_malloc(sizeof(CDPacketPlayerMoveLook));

packet->request.position.x = CD_BufferRemoveDouble(input);
packet->request.stance = CD_BufferRemoveDouble(input);
packet->request.position.y = CD_BufferRemoveDouble(input);
packet->request.position.z = CD_BufferRemoveDouble(input);
packet->request.yaw = CD_BufferRemoveFloat(input);
packet->request.pitch = CD_BufferRemoveFloat(input);
packet->request.is.onGround = CD_BufferRemoveBoolean(input);
CD_BufferRemoveFormat(input, "ddddffb",
&packet->request.position.x,
&packet->request.stance,
&packet->request.position.y,
&packet->request.position.z,
&packet->request.yaw,
&packet->request.pitch,
&packet->request.is.onGround
);

return (CDPointer) packet;
}
Expand Down Expand Up @@ -284,23 +300,29 @@ CD_PacketToBuffer (CDPacket* self)
case CDLogin: {
CDPacketLogin* packet = (CDPacketLogin*) self->data;

CD_BufferAddInteger(data, packet->response.id);
CD_BufferAddString(data, packet->response.serverName);
CD_BufferAddString(data, packet->response.motd);
CD_BufferAddLong(data, packet->response.mapSeed);
CD_BufferAddByte(data, packet->response.dimension);
CD_BufferAddFormat(data, "iSSlb",
packet->response.id,
packet->response.serverName,
packet->response.motd,
packet->response.mapSeed,
packet->response.dimension
);
} break;

case CDHandshake: {
CDPacketHandshake* packet = (CDPacketHandshake*) self->data;

CD_BufferAddString(data, packet->response.hash);
CD_BufferAddFormat(data, "S",
packet->response.hash
);
} break;

case CDChat: {
CDPacketChat* packet = (CDPacketChat*) self->data;

CD_BufferAddString(data, packet->response.message);
CD_BufferAddFormat(data, "S",
packet->response.message
);
} break;
}
} break;
Expand Down

0 comments on commit d077760

Please sign in to comment.