1
0
mirror of https://github.com/CPunch/Laika.git synced 2024-11-24 13:31:05 +00:00

Added laikaS_readInt() & laikaS_writeInt()

- new member for the sLaika_sock struct, 'flipEndian'
This commit is contained in:
CPunch 2022-01-24 20:50:14 -06:00
parent 7cec181f61
commit ed3efdaf11
5 changed files with 51 additions and 6 deletions

View File

@ -7,7 +7,6 @@
#define laikaM_malloc(sz) laikaM_realloc(NULL, sz) #define laikaM_malloc(sz) laikaM_realloc(NULL, sz)
#define laikaM_free(buf) laikaM_realloc(buf, 0) #define laikaM_free(buf) laikaM_realloc(buf, 0)
#define laikaM_free(buf) laikaM_realloc(buf, 0)
#define laikaM_growarray(type, buf, count, capacity) \ #define laikaM_growarray(type, buf, count, capacity) \
if (count >= capacity || buf == NULL) { \ if (count >= capacity || buf == NULL) { \

View File

@ -7,16 +7,16 @@
#include "lpolllist.h" #include "lpolllist.h"
struct sLaika_peer { struct sLaika_peer {
struct sLaika_socket sock; struct sLaika_socket sock; /* DO NOT MOVE THIS. this member HAS TO BE FIRST so that typecasting sLaika_peer* to sLaika_sock* works as intended */
struct sLaika_pollList *pList; /* pollList we're active in */ struct sLaika_pollList *pList; /* pollList we're active in */
void (*pktHandler)(struct sLaika_peer *peer, LAIKAPKT_ID id); void (*pktHandler)(struct sLaika_peer *peer, LAIKAPKT_ID id);
size_t pktSize; /* current pkt size */ size_t pktSize; /* current pkt size */
LAIKAPKT_ID pktID; /* current pkt ID */ LAIKAPKT_ID pktID; /* current pkt ID */
size_t *pktSizeTable; /* const table to pull pkt size data from */ size_t *pktSizeTable; /* const table to pull pkt size data from */
bool setPollOut; /* if EPOLLOUT/POLLOUT is set on sock's pollfd */ bool setPollOut; /* is EPOLLOUT/POLLOUT is set on sock's pollfd ? */
}; };
struct sLaika_peer *laikaS_newPeer(void (*pktHandler)(struct sLaika_peer *peer, LAIKAPKT_ID id), struct sLaika_pollList *pList, size_t *pktSizeTable); struct sLaika_peer *laikaS_newPeer(void (*pktHandler)(struct sLaika_peer *peer, LAIKAPKT_ID id), size_t *pktSizeTable, struct sLaika_pollList *pList);
void laikaS_freePeer(struct sLaika_peer *peer); void laikaS_freePeer(struct sLaika_peer *peer);
bool laikaS_handlePeerIn(struct sLaika_peer *peer); bool laikaS_handlePeerIn(struct sLaika_peer *peer);

View File

@ -62,10 +62,20 @@ struct sLaika_socket {
int inCount; int inCount;
int outCap; int outCap;
int inCap; int inCap;
bool flipEndian
}; };
#define laikaS_isAlive(arg) (arg->sock != INVALID_SOCKET) #define laikaS_isAlive(arg) (arg->sock != INVALID_SOCKET)
inline bool laikaS_isBigEndian(void) {
union {
uint32_t i;
uint8_t c[4];
} _indxint = {0xDEADB33F};
return _indxint.c[0] == 0xDE;
}
void laikaS_init(void); void laikaS_init(void);
void laikaS_cleanUp(void); void laikaS_cleanUp(void);
@ -79,9 +89,10 @@ bool laikaS_setNonBlock(struct sLaika_socket *sock);
void laikaS_read(struct sLaika_socket *sock, void *buf, size_t sz); /* reads from inBuf */ void laikaS_read(struct sLaika_socket *sock, void *buf, size_t sz); /* reads from inBuf */
void laikaS_write(struct sLaika_socket *sock, void *buf, size_t sz); /* writes to outBuf */ void laikaS_write(struct sLaika_socket *sock, void *buf, size_t sz); /* writes to outBuf */
void laikaS_writeByte(struct sLaika_socket *sock, uint8_t data); void laikaS_writeByte(struct sLaika_socket *sock, uint8_t data);
uint8_t laikaS_readByte(struct sLaika_socket *sock); uint8_t laikaS_readByte(struct sLaika_socket *sock);
void laikaS_readInt(struct sLaika_socket *sock, void *buf, size_t sz); /* reads INT, respecting endianness */
void laikaS_writeInt(struct sLaika_socket *sock, void *buf, size_t sz); /* writes INT, respecting endianness */
RAWSOCKCODE laikaS_rawRecv(struct sLaika_socket *sock, size_t sz, int *processed); RAWSOCKCODE laikaS_rawRecv(struct sLaika_socket *sock, size_t sz, int *processed);
RAWSOCKCODE laikaS_rawSend(struct sLaika_socket *sock, size_t sz, int *processed); RAWSOCKCODE laikaS_rawSend(struct sLaika_socket *sock, size_t sz, int *processed);

View File

@ -2,7 +2,7 @@
#include "lmem.h" #include "lmem.h"
#include "lpeer.h" #include "lpeer.h"
struct sLaika_peer *laikaS_newPeer(void (*pktHandler)(struct sLaika_peer *peer, LAIKAPKT_ID id), struct sLaika_pollList *pList, size_t *pktSizeTable) { struct sLaika_peer *laikaS_newPeer(void (*pktHandler)(struct sLaika_peer *peer, LAIKAPKT_ID id), size_t *pktSizeTable, struct sLaika_pollList *pList) {
struct sLaika_peer *peer = laikaM_malloc(sizeof(struct sLaika_peer)); struct sLaika_peer *peer = laikaM_malloc(sizeof(struct sLaika_peer));
laikaS_initSocket(&peer->sock); laikaS_initSocket(&peer->sock);

View File

@ -1,3 +1,5 @@
#include <alloca.h>
#include "lerror.h" #include "lerror.h"
#include "lmem.h" #include "lmem.h"
#include "lpolllist.h" #include "lpolllist.h"
@ -34,6 +36,7 @@ void laikaS_initSocket(struct sLaika_socket *sock) {
sock->outBuf = NULL; sock->outBuf = NULL;
sock->outCap = ARRAY_START; sock->outCap = ARRAY_START;
sock->outCount = 0; sock->outCount = 0;
sock->flipEndian = false;
laikaS_init(); laikaS_init();
return sock; return sock;
@ -186,6 +189,38 @@ uint8_t laikaS_readByte(struct sLaika_socket *sock) {
return tmp; return tmp;
} }
void laikaS_readInt(struct sLaika_socket *sock, void *buf, size_t sz) {
if (sock->flipEndian) {
uint8_t tmp[sz]; /* allocate tmp buffer to hold data while we switch endianness */
int k;
laikaS_read(sock, (void*)tmp, sz);
/* copy tmp buffer to user buffer, flipping endianness */
for (k = 0; k < sz; k++)
*(uint8_t*)(buf + k) = tmp[sz - k - 1];
} else {
/* just a wrapper for laikaS_read */
laikaS_read(sock, buf, sz);
}
}
void laikaS_writeInt(struct sLaika_socket *sock, void *buf, size_t sz) {
if (sock->flipEndian) {
uint8_t tmp[sz]; /* allocate tmp buffer to hold data while we switch endianness */
int k;
/* copy user buffer to tmp buffer, flipping endianness */
for (k = 0; k < sz; k++)
tmp[k] = *(uint8_t*)(buf + (sz - k - 1));
laikaS_write(sock, (void*)tmp, sz);
} else {
/* just a wrapper for laikaS_write */
laikaS_write(sock, buf, sz);
}
}
RAWSOCKCODE laikaS_rawRecv(struct sLaika_socket *sock, size_t sz, int *processed) { RAWSOCKCODE laikaS_rawRecv(struct sLaika_socket *sock, size_t sz, int *processed) {
RAWSOCKCODE errCode = RAWSOCK_OK; RAWSOCKCODE errCode = RAWSOCK_OK;
int rcvd, start = sock->inCount; int rcvd, start = sock->inCount;