aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2016-05-27 13:27:44 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2016-05-27 13:27:44 +0200
commitecdebd8f416b803b43ce93533666599e1442f62d (patch)
treeb6afeb478402efbfbba01247808da7ff70f8ae01
parent23abb2acd221762ec482985f91fa3eff1123fb9a (diff)
downloadzero-of-one-ecdebd8f416b803b43ce93533666599e1442f62d.zip
zero-of-one-ecdebd8f416b803b43ce93533666599e1442f62d.tar.bz2
Working on improving the network handling.
-rw-r--r--src/core/assimilate.c2
-rw-r--r--src/core/create_sentences.c116
-rw-r--r--src/core/knowledge.c48
-rw-r--r--src/core/knowledge.h38
-rw-r--r--src/core/main.c68
-rw-r--r--src/io/network.c417
-rw-r--r--src/io/network.h3
-rw-r--r--src/io/network_types.h10
-rw-r--r--src/tool/strings.c2
-rw-r--r--src/tool/strings.h2
10 files changed, 437 insertions, 269 deletions
diff --git a/src/core/assimilate.c b/src/core/assimilate.c
index eb6aa17..28f4dd4 100644
--- a/src/core/assimilate.c
+++ b/src/core/assimilate.c
@@ -5,6 +5,8 @@
#include "knowledge.h"
+/** Functions to assimilate sentences using a ZoO_knowledge structure *********/
+
static int link_to
(
ZoO_index links_count [const restrict static 1],
diff --git a/src/core/create_sentences.c b/src/core/create_sentences.c
index bc410e5..e999199 100644
--- a/src/core/create_sentences.c
+++ b/src/core/create_sentences.c
@@ -7,6 +7,17 @@
#include "knowledge.h"
+/** Functions to create sentences using a ZoO_knowledge structure *************/
+
+/*
+ * Returns the index of a element in {links} chosen randomly according
+ * to the distribution in {links_occurrences}.
+ * Pre:
+ * (!= occurrences 0).
+ * (== (length links_occurrences) (length links)).
+ * (== (sum links_occurrences) occurrences).
+ * (can_store ZoO_index (length links)).
+ */
static ZoO_index pick_an_index
(
ZoO_index const occurrences,
@@ -17,29 +28,40 @@ static ZoO_index pick_an_index
ZoO_index result, accumulator, random_number;
result = 0;
+
+ /*
+ * Safe:
+ * (> (length links_occurrences) 0).
+ */
accumulator = links_occurrences[0];
+
random_number = (((ZoO_index) rand()) % occurrences);
while (accumulator < random_number)
{
-
/*
- * Should be safe:
- * result overflowing <-> sum('links_occurrences') > 'occurrences'
- * and sum('links_occurrences') == 'occurrences'
+ * Safe:
+ * (->
+ * (and
+ * (== accumulator (sum links_occurrences[0:result]))
+ * (< accumulator random_number)
+ * (< random_number occurrences)
+ * (== occurrences (sum links_occurrences))
+ * (can_store ZoO_index (length links))
+ * (== (length links_occurrences) (length links))
+ * )
+ * (and
+ * (< result' (length links_occurrences))
+ * (can_store ZoO_index result')
+ * (=< accumulator' occurrences)
+ * )
+ * )
*/
result += 1;
-
- /*
- * Should be safe:
- * - sum('links_occurrences') == 'occurrences'.
- * - 'occurrences' is safe.
- * ----
- * 'accumulator' is safe.
- */
accumulator += links_occurrences[result];
}
+ /* Safe: (< result (length links)) */
return links[result];
}
@@ -330,7 +352,7 @@ static unsigned char * extend_right
int ZoO_knowledge_extend
(
struct ZoO_knowledge k [const static 1],
- const struct ZoO_strings string [const static 1],
+ const struct ZoO_strings string [const],
int const ignore_first_word,
ZoO_char * result [const static 1]
)
@@ -339,48 +361,56 @@ int ZoO_knowledge_extend
size_t sentence_size;
ZoO_index i, word_id, word_min_score, word_min_id, credits;
- word_found = 0;
credits = ZoO_MAX_REPLY_WORDS;
- if (ignore_first_word)
- {
- i = 1;
- }
- else
+ if (string != (struct ZoO_strings *) NULL)
{
- i = 0;
- }
+ word_found = 0;
- for (; i < string->words_count; ++i)
- {
- /* prevents k [restrict] */
- if (ZoO_knowledge_find(k, string->words[i], &word_min_id) == 0)
+ if (ignore_first_word)
{
- word_found = 1;
- word_min_score = k->words[word_min_id].occurrences;
+ i = 1;
+ }
+ else
+ {
+ i = 0;
+ }
- break;
+ for (; i < string->words_count; ++i)
+ {
+ /* prevents k [restrict] */
+ if (ZoO_knowledge_find(k, string->words[i], &word_min_id) == 0)
+ {
+ word_found = 1;
+ word_min_score = k->words[word_min_id].occurrences;
+
+ break;
+ }
}
- }
- if (word_found == 0)
- {
- word_min_id = (rand() % k->words_count);
- word_min_score = k->words[word_min_id].occurrences;
- }
+ if (word_found == 0)
+ {
+ word_min_id = (rand() % k->words_count);
+ word_min_score = k->words[word_min_id].occurrences;
+ }
- for (; i < string->words_count; ++i)
- {
- if
- (
- (ZoO_knowledge_find(k, string->words[i], &word_id) == 0)
- && (k->words[word_id].occurrences < word_min_score)
- )
+ for (; i < string->words_count; ++i)
{
- word_min_score = k->words[word_id].occurrences;
- word_min_id = word_id;
+ if
+ (
+ (ZoO_knowledge_find(k, string->words[i], &word_id) == 0)
+ && (k->words[word_id].occurrences < word_min_score)
+ )
+ {
+ word_min_score = k->words[word_id].occurrences;
+ word_min_id = word_id;
+ }
}
}
+ else
+ {
+ word_min_id = (rand() % k->words_count);
+ }
/* 3: 2 spaces + '\0' */
/* FIXME: not overflow-safe */
diff --git a/src/core/knowledge.c b/src/core/knowledge.c
index 31ccb97..9b4e250 100644
--- a/src/core/knowledge.c
+++ b/src/core/knowledge.c
@@ -6,6 +6,8 @@
#include "knowledge.h"
+/** Basic functions of the ZoO_knowledge structure ****************************/
+
/* XXX: are we as close to immutable as we want to be? */
unsigned int const ZoO_knowledge_punctuation_chars_count = 7;
const ZoO_char const ZoO_knowledge_punctuation_chars[7] =
@@ -33,6 +35,7 @@ const ZoO_char const ZoO_knowledge_forbidden_chars[8]=
'>'
};
+/* See "knowledge.h". */
int ZoO_knowledge_find
(
const struct ZoO_knowledge k [const restrict static 1],
@@ -54,7 +57,7 @@ int ZoO_knowledge_find
current_min = 0;
- /* overflow-safe: k->words_count >= 1 */
+ /* Safe: (>= k->words_count 1) */
current_max = (k->words_count - 1);
for (;;)
@@ -124,6 +127,18 @@ static void word_init (struct ZoO_knowledge_word w [const restrict static 1])
w->backward_links = (ZoO_index *) NULL;
}
+/*
+ * When returning 0:
+ * All punctuation symbols were added to {k}.
+ * When returning -1:
+ * The mandatory punctuation symbols have been added to {k}, but some of the
+ * additional ones did not. This does not prevent ZoO from working, but
+ * will result in some punctuation symbols to be handled exactly like
+ * common words.
+ * When returning -2:
+ * The mandatory punctuation symbols have not added to {k}. ZoO will not be
+ * able to work.
+ */
static int add_punctuation_nodes
(
struct ZoO_knowledge k [const static 1]
@@ -177,6 +192,7 @@ static int add_punctuation_nodes
return error;
}
+/* See "knowledge.h" */
int ZoO_knowledge_initialize (struct ZoO_knowledge k [const static 1])
{
k->words_count = 0;
@@ -193,6 +209,10 @@ int ZoO_knowledge_initialize (struct ZoO_knowledge k [const static 1])
return 0;
}
+/*
+ * Frees all the memory used by {w}, but not {w} itself.
+ * The values of {w}'s members are set to reflect the changes.
+ */
static void finalize_word
(
struct ZoO_knowledge_word w [const restrict static 1]
@@ -237,13 +257,13 @@ static void finalize_word
w->backward_links_count = 0;
}
+/* See "knowledge.h" */
void ZoO_knowledge_finalize (struct ZoO_knowledge k [const restrict static 1])
{
ZoO_index i;
for (i = 0; i < k->words_count; ++i)
{
- /* prevents k [restrict] */
finalize_word(k->words + i);
}
@@ -264,6 +284,7 @@ void ZoO_knowledge_finalize (struct ZoO_knowledge k [const restrict static 1])
}
}
+/* See "knowledge.h" */
int ZoO_knowledge_learn
(
struct ZoO_knowledge k [const static 1],
@@ -291,7 +312,7 @@ int ZoO_knowledge_learn
return -1;
}
- /* overflow-safe */
+ /* overflow-safe: (< k->words[*result].occurrences ZoO_INDEX_MAX) */
k->words[*result].occurrences += 1;
return 0;
@@ -310,7 +331,7 @@ int ZoO_knowledge_learn
(void *) k->words,
(
(
- /* overflow-safe: k->words_count < ZoO_INDEX_MAX */
+ /* overflow-safe: (< k->words_count ZoO_INDEX_MAX) */
(size_t) (k->words_count + 1)
)
* sizeof(struct ZoO_knowledge_word)
@@ -336,7 +357,7 @@ int ZoO_knowledge_learn
(void *) k->sorted_indices,
(
(
- /* overflow-safe: k->words_count < ZoO_INDEX_MAX */
+ /* overflow-safe: (< k->words_count ZoO_INDEX_MAX) */
(size_t) (k->words_count + 1)
)
* sizeof(ZoO_index)
@@ -359,22 +380,27 @@ int ZoO_knowledge_learn
k->sorted_indices = new_sorted_indices;
/* We can only move indices right of *result if they exist. */
- if (*result != k->words_count)
+ if (*result < k->words_count)
{
/* TODO: check if correct. */
memmove
(
/*
- * overflow-safe:
- * - k->words_count < ZoO_INDEX_MAX
- * - (k->sorted_indices + *result + 1) =< k->words_count
+ * Safe:
+ * (->
+ * (and
+ * (== (length k->sorted_indices) (+ k->words_count 1))
+ * (< *result k->words_count)
+ * )
+ * (< (+ *result 1) (length k->sorted_indices))
+ * )
*/
(void *) (k->sorted_indices + *result + 1),
- /* overflow-safe: see above */
+ /* Safe: see above */
(const void *) (k->sorted_indices + *result),
(
(
- /* overflow-safe: *result < k->words_count */
+ /* Safe: (< *result k->words_count) */
(size_t) (k->words_count - *result)
)
* sizeof(ZoO_index)
diff --git a/src/core/knowledge.h b/src/core/knowledge.h
index f20cb16..c9ea342 100644
--- a/src/core/knowledge.h
+++ b/src/core/knowledge.h
@@ -5,10 +5,35 @@
#include "knowledge_types.h"
+/*
+ * Initializes all of {k}'s members to sane values.
+ *
+ * When returning 0:
+ * Initial punctuation nodes (including the mandatory "START OF LINE" and
+ * "END OF LINE" ones) have successfully been added to {k}.
+ *
+ * When return -1:
+ * Something went wrong, leading to {k} not being safe for use.
+ * {k} has been finalized.
+ */
int ZoO_knowledge_initialize (struct ZoO_knowledge k [const static 1]);
+/*
+ * Frees all the memory used by {k}, but not {k} itself.
+ * The values of {k}'s members are set to reflect the changes.
+ */
void ZoO_knowledge_finalize (struct ZoO_knowledge k [const static 1]);
+/*
+ * When returning 0:
+ * {word} is in {k}.
+ * {word} is located at {k->words[*result]}.
+ *
+ * When returning -1:
+ * {word} is not in {k}.
+ * {*result} is where {word} was expected to be found in
+ * {k->sorted_indices}.
+ */
int ZoO_knowledge_find
(
const struct ZoO_knowledge k [const restrict static 1],
@@ -16,6 +41,17 @@ int ZoO_knowledge_find
ZoO_index result [const restrict static 1]
);
+/*
+ * When returning 0:
+ * {word} was either added to {k} or its representation in {k} has its
+ * occurrences count increased.
+ * {*result} indicates where {word} is in {k->words}.
+ *
+ * When returning -1:
+ * Something went wrong when adding the occurrence of {word} to {k}.
+ * {k} remains semantically unchanged.
+ * {*result} may or may not have been altered.
+ */
int ZoO_knowledge_learn
(
struct ZoO_knowledge k [const static 1],
@@ -34,7 +70,7 @@ int ZoO_knowledge_assimilate
int ZoO_knowledge_extend
(
struct ZoO_knowledge k [const static 1],
- const struct ZoO_strings string [const static 1],
+ const struct ZoO_strings string [const],
int const ignore_first_word,
ZoO_char * result [const static 1]
);
diff --git a/src/core/main.c b/src/core/main.c
index 40b3705..1a8a40f 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -150,6 +150,43 @@ static int should_reply
return (param->reply_rate >= (rand() % 100));
}
+static void handle_user_join
+(
+ struct ZoO_state s [const static 1]
+)
+{
+ ZoO_char * line;
+
+ if
+ (
+ (s->param.reply_rate >= (rand() % 100))
+ &&
+ (
+ ZoO_knowledge_extend
+ (
+ &(s->knowledge),
+ (struct ZoO_strings *) NULL,
+ 0,
+ &line
+ ) == 0
+ )
+ )
+ {
+ if (line[0] == ' ')
+ {
+ strcpy((s->network.out), (line + 1));
+ }
+ else
+ {
+ strcpy((s->network.out), line);
+ }
+
+ free((void *) line);
+
+ ZoO_network_send(&(s->network));
+ }
+}
+
static void handle_message
(
struct ZoO_state s [const static 1],
@@ -167,7 +204,7 @@ static void handle_message
(
string,
(size_t) msg_size,
- (s->network.msg + msg_offset),
+ (s->network.in + msg_offset),
ZoO_knowledge_punctuation_chars_count,
ZoO_knowledge_punctuation_chars
) < 0
@@ -202,11 +239,11 @@ static void handle_message
{
if (line[0] == ' ')
{
- strcpy((s->network.msg), (line + 1));
+ strcpy((s->network.out), (line + 1));
}
else
{
- strcpy((s->network.msg), line);
+ strcpy((s->network.out), line);
}
free((void *) line);
@@ -226,10 +263,11 @@ static void handle_message
}
}
-static int main_loop (struct ZoO_state s [const static 1])
+static int main_loop (struct ZoO_state s [const static 1])
{
struct ZoO_strings string;
ssize_t msg_offset, msg_size;
+ enum ZoO_msg_type msg_type;
msg_offset = 0;
msg_size = 0;
@@ -238,9 +276,27 @@ static int main_loop (struct ZoO_state s [const static 1])
while (run)
{
- if (ZoO_network_receive(&(s->network), &msg_offset, &msg_size) == 0)
+ if
+ (
+ ZoO_network_receive
+ (
+ &(s->network),
+ &msg_offset,
+ &msg_size,
+ &msg_type
+ ) == 0
+ )
{
- handle_message(s, &string, msg_offset, msg_size);
+ switch (msg_type)
+ {
+ case ZoO_JOIN:
+ handle_user_join(s);
+ break;
+
+ case ZoO_PRIVMSG:
+ handle_message(s, &string, msg_offset, msg_size);
+ break;
+ }
}
}
diff --git a/src/io/network.c b/src/io/network.c
index c8d05a2..d2797c9 100644
--- a/src/io/network.c
+++ b/src/io/network.c
@@ -13,10 +13,10 @@
#include "network.h"
-static int reconnect (struct ZoO_network net [const restrict static 1])
+static int re_create_socket (struct ZoO_network net [const restrict static 1])
{
struct timeval timeout;
- int old_errno = errno;
+ const int old_errno = errno;
errno = 0;
timeout.tv_sec = ZoO_NETWORK_TIMEOUT;
@@ -37,19 +37,11 @@ static int reconnect (struct ZoO_network net [const restrict static 1])
if (net->connection == -1)
{
- ZoO_FATAL
- (
- "Could not create socket: %s.",
- strerror(errno)
- );
+ ZoO_ERROR("Could not create socket: %s.", strerror(errno));
- errno = old_errno;
-
- return -1;
+ goto RETURN_FAILED;
}
- errno = 0;
-
if
(
(
@@ -77,13 +69,9 @@ static int reconnect (struct ZoO_network net [const restrict static 1])
{
ZoO_ERROR("Could not set timeout on network socket: %s", strerror(errno));
- errno = old_errno;
-
- return -1;
+ goto RETURN_FAILED;
}
- errno = old_errno;
-
ZoO_S_DEBUG(ZoO_DEBUG_NETWORK, "(Re)connecting to network...");
if
@@ -96,73 +84,67 @@ static int reconnect (struct ZoO_network net [const restrict static 1])
) != 0
)
{
- ZoO_ERROR
- (
- "Unable to connect to the network: %s",
- strerror(errno)
- );
+ ZoO_ERROR("Could not establish connection: %s", strerror(errno));
- errno = old_errno;
-
- return -1;
+ goto RETURN_FAILED;
}
errno = old_errno;
- snprintf
- (
- net->msg,
- 512,
- "USER %s 8 * :%s\r\n",
- net->user,
- net->name
- );
+ return 0;
- errno = 0;
+RETURN_FAILED:
+ errno = old_errno;
- if (write(net->connection, net->msg, strlen(net->msg)) < 1)
- {
- ZoO_ERROR
- (
- "Unable to write to the network: %s",
- strerror(errno)
- );
+ return -1;
+}
- errno = old_errno;
+static int reconnect (struct ZoO_network net [const restrict static 1])
+{
+ const int old_errno = errno;
+ memset(net->in, 0, (sizeof(ZoO_char) * 513));
+ memset(net->out, 0, (sizeof(ZoO_char) * 513));
+ memset(net->buffer, 0, (sizeof(ZoO_char) * 513));
+
+ if (re_create_socket(net) < 0)
+ {
return -1;
}
- snprintf
- (
- net->msg,
- 512,
- "NICK %s\r\n",
- net->nick
- );
-
- errno = 0;
+ snprintf(net->out, 512, "USER %s 8 * :%s\r\n", net->user, net->name);
- if (write(net->connection, net->msg, strlen(net->msg)) < 1)
+ if (write(net->connection, net->out, strlen(net->out)) < 1)
{
- ZoO_ERROR
- (
- "Unable to write to the network: %s",
- strerror(errno)
- );
+ goto RETURN_WRITE_FAILED;
+ }
- errno = old_errno;
+ snprintf(net->out, 512, "NICK %s\r\n", net->nick);
- return -1;
+ if (write(net->connection, net->out, strlen(net->out)) < 1)
+ {
+ goto RETURN_WRITE_FAILED;
}
- errno = old_errno;
-
net->buffer_remaining = 0;
net->buffer_index = 0;
+
ZoO_S_DEBUG(ZoO_DEBUG_NETWORK, "(Re)connected.");
+ errno = old_errno;
+
return 0;
+
+RETURN_WRITE_FAILED:
+ ZoO_ERROR
+ (
+ "Unable to write to the network: %s",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ return -1;
}
int ZoO_network_connect
@@ -189,7 +171,9 @@ int ZoO_network_connect
net->buffer_remaining = 0;
memset(&hints, 0, sizeof(struct addrinfo));
- memset(net->msg, 0, (sizeof(ZoO_char) * 513));
+ memset(net->in, 0, (sizeof(ZoO_char) * 513));
+ memset(net->out, 0, (sizeof(ZoO_char) * 513));
+ memset(net->buffer, 0, (sizeof(ZoO_char) * 513));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
@@ -222,215 +206,240 @@ int ZoO_network_connect
return -1;
}
- errno = 0;
-
+ errno = old_errno;
reconnect(net);
return 0;
}
-int ZoO_network_receive
+static void buffer_msg
(
- struct ZoO_network net [const restrict static 1],
- size_t msg_offset [const restrict static 1],
- size_t msg_size [const restrict static 1]
+ struct ZoO_network net [const static 1]
)
{
- int old_errno;
- ssize_t in_count, in_index, msg_index, cmd;
+ ssize_t in_count, i;
- old_errno = errno;
+ if (net->buffer_remaining > 0)
+ {
+ in_count = net->buffer_remaining;
+ net->buffer_remaining = 0;
+
+ goto PARSE_READ;
+ }
- for (;;)
+READ_MORE:
+ in_count = read(net->connection, net->buffer, 512);
+
+ if (in_count < 0)
{
- msg_index = 0;
+ ZoO_ERROR("Could not read from network: %s", strerror(errno));
+
+ reconnect(net);
- errno = 0;
+ goto READ_MORE;
+ }
+
+PARSE_READ:
+ for (i = 0; i < in_count; ++i)
+ {
+ net->in[net->buffer_index] = net->buffer[i];
- while
+ if
(
- (
- (in_count =
- read(
- net->connection,
- (net->buffer + net->buffer_index),
- (512 - net->buffer_index)
- )
- ) > 0
- )
+ (net->buffer_index > 0)
+ && (net->in[net->buffer_index - 1] == '\r')
+ && (net->in[net->buffer_index] == '\n')
)
{
- net->buffer_remaining += in_count;
+ net->buffer_remaining = (in_count - (i + 1));
+ net->in_length = (net->buffer_index - 1);
+ net->buffer_index = 0;
- for
- (
- in_index = 0;
- in_index < net->buffer_remaining;
- ++in_index
- )
+ if (net->buffer_remaining > 0)
{
- net->msg[msg_index] = net->buffer[net->buffer_index + in_index];
-
- if
+ memmove
(
- (msg_index == 511)
- ||
- (
- (msg_index > 0)
- && (net->msg[msg_index - 1] == '\r')
- && (net->msg[msg_index] == '\n')
- )
- )
- {
- net->msg[msg_index + 1] = '\0';
+ (void *) net->buffer,
+ (const void *) (net->buffer + (i + 1)),
+ net->buffer_remaining
+ );
+ }
+ return;
+ }
- if (net->buffer_index != net->buffer_remaining)
- {
- memmove
- (
- net->buffer,
- (net->buffer + net->buffer_index),
- (size_t) net->buffer_remaining
- );
+ net->buffer_index += 1;
- net->buffer_index = 0;
- }
+ if (net->buffer_index > 512)
+ {
+ ZoO_S_WARNING("Incoming message is too long. Discarded.");
- net->buffer_remaining -= (in_index + 1);
+ net->buffer_index = 0;
+ net->buffer_remaining = 0;
- errno = old_errno;
+ break;
+ }
+ }
- goto READ_MSG;
- }
+ goto READ_MORE;
+}
- ++msg_index;
- }
+void handle_ping (struct ZoO_network net [const restrict static 1])
+{
+ const int old_errno = errno;
- net->buffer_remaining = 0;
- net->buffer_index = 0;
+ #if ZoO_DEBUG_NETWORK_PING == 1
+ net->in[net->in_length] = '\0';
- errno = 0;
- }
+ ZoO_DEBUG(ZoO_DEBUG_NETWORK, "[NET->in] %s", net->in);
- ZoO_ERROR
- (
- "Something went wrong while trying to read from the network: %s.",
- strerror(errno)
- );
+ net->in[net->in_length] = '\r';
+ #endif
+
+ net->in[1] = 'O';
+
+ errno = 0;
+
+ if (write(net->connection, net->in, (net->in_length + 2)) < 1)
+ {
+ ZoO_ERROR("Could not reply to PING request: %s", strerror(errno));
errno = old_errno;
- if (reconnect(net) < 0)
+ while (reconnect(net) < 0)
{
- return -1;
+ sleep(5);
}
- continue;
+ return;
+ }
- READ_MSG:
+ errno = old_errno;
- ZoO_DEBUG(ZoO_DEBUG_NETWORK, "[NET->in] %s\n", net->msg);
+#if ZoO_DEBUG_NETWORK_PING == 1
+ net->in[net->in_length] = '\0';
- /* XXX: doesn't that prevent net [restrict]? */
- if (ZoO_IS_PREFIX("PING", net->msg))
- {
- errno = 0;
+ ZoO_DEBUG(ZoO_DEBUG_NETWORK, "[NET->out] %s", net->in);
+#endif
- net->msg[1] = 'O';
+}
- if (write(net->connection, net->msg, strlen(net->msg)) < 1)
- {
- ZoO_ERROR("Could not reply to PING request: %s", strerror(errno));
+int ZoO_network_receive
+(
+ struct ZoO_network net [const restrict static 1],
+ size_t msg_offset [const restrict static 1],
+ size_t msg_size [const restrict static 1],
+ enum ZoO_msg_type type [const restrict static 1]
+)
+{
+ const int old_errno = errno;
+ ssize_t cmd, i;
- errno = old_errno;
+READ_NEW_MSG:
+ buffer_msg(net);
- if (reconnect(net) < 0)
- {
- return -1;
- }
+ net->in[net->in_length + 2] = '\0';
- continue;
- }
+ /* XXX: doesn't that prevent net [restrict]? */
+ if (ZoO_IS_PREFIX("PING", net->in))
+ {
- ZoO_DEBUG(ZoO_DEBUG_NETWORK, "[NET->out] %s\n", net->msg);
+ handle_ping(net);
- errno = old_errno;
- }
- else if (net->msg[0] == ':')
- {
- cmd = 0;
+ goto READ_NEW_MSG;
+ }
- for (in_index = 1; in_index < 512; in_index++)
- {
- if (net->msg[in_index] == ' ')
- {
- cmd = (in_index + 1);
+ if (net->in_length == 0)
+ {
+ goto READ_NEW_MSG;
+ }
- break;
- }
- }
+ net->in[net->in_length] = '\0';
+
+ ZoO_DEBUG(ZoO_DEBUG_NETWORK, "[NET->in] %s", net->in);
+
+ if (net->in[0] == ':')
+ {
+ cmd = 0;
- if (cmd == 0)
+ for (i = 1; i < 512; i++)
+ {
+ if (net->in[i] == ' ')
{
- continue;
+ cmd = (i + 1);
+
+ break;
}
+ }
+
+ if (ZoO_IS_PREFIX("001", (net->in + cmd)))
+ {
+ snprintf
+ (
+ net->out,
+ 512,
+ "JOIN :%s\r\n",
+ net->channel
+ );
- if (ZoO_IS_PREFIX("001", (net->msg + cmd)))
+ errno = 0;
+
+ if (write(net->connection, net->out, strlen(net->out)) < 1)
{
- snprintf
+ ZoO_ERROR
(
- net->msg,
- 512,
- "JOIN :%s\r\n",
- net->channel
+ "Could not send JOIN request: %s",
+ strerror(errno)
);
- errno = 0;
+ errno = old_errno;
- if (write(net->connection, net->msg, strlen(net->msg)) < 1)
+ if (reconnect(net) < 0)
{
- ZoO_ERROR
- (
- "Could not send JOIN request: %s",
- strerror(errno)
- );
-
- errno = old_errno;
-
- if (reconnect(net) < 0)
- {
- return -1;
- }
+ return -1;
}
+ }
- ZoO_DEBUG(ZoO_DEBUG_NETWORK, "[NET->out] %s", net->msg);
+ errno = old_errno;
- continue;
- }
+ ZoO_DEBUG(ZoO_DEBUG_NETWORK, "[NET->out] %s", net->out);
- if (ZoO_IS_PREFIX("PRIVMSG", (net->msg + cmd)))
+ goto READ_NEW_MSG;
+ }
+
+ if (ZoO_IS_PREFIX("JOIN", (net->in + cmd)))
+ {
+ *type = ZoO_JOIN;
+
+ return 0;
+ }
+
+ if (ZoO_IS_PREFIX("PRIVMSG", (net->in + cmd)))
+ {
+
+ for (; i < 512; i++)
{
- for (; in_index < 512; in_index++)
+ if (net->in[i] == ':')
{
- if (net->msg[in_index] == ':')
- {
- cmd = (in_index + 1);
+ cmd = (i + 1);
- break;
- }
+ break;
}
+ }
- *msg_offset = cmd;
- *msg_size = (msg_index - *msg_offset - 1);
+ *msg_offset = cmd;
+ *msg_size = (net->in_length - cmd);
- /*net->msg[*msg_size - 1] = '\0'; */
+ /*net->in[*msg_size - 1] = '\0'; */
- return 0;
- }
+ *type = ZoO_PRIVMSG;
+
+ return 0;
}
}
+
+ goto READ_NEW_MSG;
}
int ZoO_network_send (struct ZoO_network net [const restrict static 1])
@@ -439,16 +448,16 @@ int ZoO_network_send (struct ZoO_network net [const restrict static 1])
snprintf
(
- net->buffer,
+ net->in,
512,
"PRIVMSG %s :%s\r\n",
net->channel,
- net->msg
+ net->out
);
errno = 0;
- if (write(net->connection, net->buffer, strlen(net->buffer)) < 1)
+ if (write(net->connection, net->in, strlen(net->in)) < 1)
{
ZoO_ERROR
(
@@ -470,7 +479,7 @@ int ZoO_network_send (struct ZoO_network net [const restrict static 1])
errno = old_errno;
- ZoO_DEBUG(ZoO_DEBUG_NETWORK, "[NET->out] %s", net->buffer);
+ ZoO_DEBUG(ZoO_DEBUG_NETWORK, "[NET->out] %s", net->in);
return 0;
}
diff --git a/src/io/network.h b/src/io/network.h
index ac7284a..647b19c 100644
--- a/src/io/network.h
+++ b/src/io/network.h
@@ -17,7 +17,8 @@ int ZoO_network_receive
(
struct ZoO_network net [const static 1],
size_t msg_offset [const restrict static 1],
- size_t msg_size [const restrict static 1]
+ size_t msg_size [const restrict static 1],
+ enum ZoO_msg_type type [const restrict static 1]
);
int ZoO_network_send (struct ZoO_network net [const restrict static 1]);
diff --git a/src/io/network_types.h b/src/io/network_types.h
index 16c81da..9a328a7 100644
--- a/src/io/network_types.h
+++ b/src/io/network_types.h
@@ -9,13 +9,21 @@
#include "../pervasive.h"
+enum ZoO_msg_type
+{
+ ZoO_PRIVMSG,
+ ZoO_JOIN
+};
+
struct ZoO_network
{
size_t buffer_index;
size_t buffer_remaining;
+ size_t in_length;
struct addrinfo * addrinfo;
ZoO_char buffer [513];
- ZoO_char msg [513];
+ ZoO_char in [513];
+ ZoO_char out [513];
int connection;
const char * restrict channel;
const char * restrict user;
diff --git a/src/tool/strings.c b/src/tool/strings.c
index fc4434a..9fe13f6 100644
--- a/src/tool/strings.c
+++ b/src/tool/strings.c
@@ -199,7 +199,7 @@ static int parse_word
int ZoO_strings_parse
(
struct ZoO_strings s [const restrict static 1],
- size_t const input_size,
+ size_t input_size,
ZoO_char input [const restrict],
ZoO_index const punctuations_count,
const ZoO_char punctuations [const restrict static punctuations_count]
diff --git a/src/tool/strings.h b/src/tool/strings.h
index 6e6e211..6fbecf7 100644
--- a/src/tool/strings.h
+++ b/src/tool/strings.h
@@ -10,7 +10,7 @@ void ZoO_strings_finalize (struct ZoO_strings s [const restrict static 1]);
int ZoO_strings_parse
(
struct ZoO_strings s [const static 1],
- size_t const input_size,
+ size_t input_size,
ZoO_char input [const restrict],
ZoO_index const punctuations_count,
const ZoO_char punctuations [const restrict static punctuations_count]