diff options
Diffstat (limited to 'extern/verse/dist/vs_node_text.c')
-rw-r--r-- | extern/verse/dist/vs_node_text.c | 274 |
1 files changed, 0 insertions, 274 deletions
diff --git a/extern/verse/dist/vs_node_text.c b/extern/verse/dist/vs_node_text.c deleted file mode 100644 index ae7c3c737c3..00000000000 --- a/extern/verse/dist/vs_node_text.c +++ /dev/null @@ -1,274 +0,0 @@ -/* -** -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "v_cmd_gen.h" - -#if !defined V_GENERATE_FUNC_MODE - -#include "verse.h" -#include "vs_server.h" - -#define VS_TEXT_CHUNK_SIZE 4096 - -typedef struct { - char name[16]; - char *text; - size_t length; - size_t allocated; - VSSubscriptionList *subscribers; -} VSTextBuffer; - -typedef struct { - VSNodeHead head; - char language[512]; - VSTextBuffer *buffer; - unsigned int buffer_count; -} VSNodeText; - -VSNodeText * vs_t_create_node(unsigned int owner) -{ - VSNodeText *node; - char name[48]; - unsigned int i; - node = malloc(sizeof *node); - vs_add_new_node(&node->head, V_NT_TEXT); - sprintf(name, "Text_Node_%u", node->head.id); - create_node_head(&node->head, name, owner); - node->language[0] = 0; - node->buffer_count = 16; - node->buffer = malloc((sizeof *node->buffer) * node->buffer_count); - for(i = 0; i < node->buffer_count; i++) - node->buffer[i].name[0] = 0; - - return node; -} - -void vs_t_destroy_node(VSNodeText *node) -{ - unsigned int i; - destroy_node_head(&node->head); - for(i = 0; i < node->buffer_count; i++) - { - if(node->buffer[i].name[0] != 0) - { - free(node->buffer[i].text); - vs_destroy_subscription_list(node->buffer[i].subscribers); - } - } - free(node->buffer); - free(node); -} - -void vs_t_subscribe(VSNodeText *node) -{ - unsigned int i; - verse_send_t_language_set(node->head.id, node->language); - for(i = 0; i < node->buffer_count; i++) - if(node->buffer[i].name[0] != 0) - verse_send_t_buffer_create(node->head.id, i, node->buffer[i].name); -} - -void vs_t_unsubscribe(VSNodeText *node) -{ - unsigned int i; - for(i = 0; i < node->buffer_count; i++) - if(node->buffer[i].name[0] != 0) - vs_remove_subscriptor(node->buffer[i].subscribers); -} - -static void callback_send_t_language_set(void *user, VNodeID node_id, char *language) -{ - VSNodeText *node; - unsigned int i, count; - node = (VSNodeText *)vs_get_node(node_id, V_NT_TEXT); - if(node == NULL) - return; - for(i = 0; i < 511 && language[i]; i++) - node->language[i] = language[i]; - node->language[i] = 0; - count = vs_get_subscript_count(node->head.subscribers); - for(i = 0; i < count; i++) - { - vs_set_subscript_session(node->head.subscribers, i); - verse_send_t_language_set(node_id, language); - } - vs_reset_subscript_session(); - -} - -static void callback_send_t_buffer_create(void *user, VNodeID node_id, VBufferID buffer_id, const char *name) -{ - VSNodeText *node; - unsigned int i, count; - node = (VSNodeText *)vs_get_node(node_id, V_NT_TEXT); - if(node == NULL) - return; - - if(buffer_id >= node->buffer_count || node->buffer[buffer_id].name[0] != 0) - { - for(buffer_id = 0; buffer_id < node->buffer_count && node->buffer[buffer_id].name[0] != 0; buffer_id++) - ; - if(buffer_id == node->buffer_count) - { - node->buffer = realloc(node->buffer, (sizeof *node->buffer) * node->buffer_count); - for(i = node->buffer_count; i < node->buffer_count + 16; i++) - node->buffer[i].name[0] = 0; - node->buffer_count = i; - } - } - - if(node->buffer[buffer_id].name[0] == 0) - { - node->buffer[buffer_id].allocated = VS_TEXT_CHUNK_SIZE; - node->buffer[buffer_id].text = malloc(node->buffer[buffer_id].allocated); - node->buffer[buffer_id].length = 0; - node->buffer[buffer_id].subscribers = vs_create_subscription_list(); - } - for(i = 0; i < 15 && name[i] != 0; i++) - node->buffer[buffer_id].name[i] = name[i]; - node->buffer[buffer_id].name[i] = 0; - - count = vs_get_subscript_count(node->head.subscribers); - for(i = 0; i < count; i++) - { - vs_set_subscript_session(node->head.subscribers, i); - verse_send_t_buffer_create(node_id, buffer_id, name); - } - vs_reset_subscript_session(); -} - -void callback_send_t_buffer_destroy(void *user, VNodeID node_id, VBufferID buffer_id) -{ - VSNodeText *node; - unsigned int i, count; - node = (VSNodeText *)vs_get_node(node_id, V_NT_TEXT); - if(node == NULL) - return; - - if(buffer_id >= node->buffer_count || node->buffer[buffer_id].name[0] == 0) - return; - - node->buffer[buffer_id].name[0] = 0; - free(node->buffer[buffer_id].text); - vs_destroy_subscription_list(node->buffer[buffer_id].subscribers); - - count = vs_get_subscript_count(node->head.subscribers); - for(i = 0; i < count; i++) - { - vs_set_subscript_session(node->head.subscribers, i); - verse_send_t_buffer_destroy(node_id, buffer_id); - } - vs_reset_subscript_session(); -} - -static void callback_send_t_buffer_subscribe(void *user, VNodeID node_id, VBufferID buffer_id) -{ - VSNodeText *node; - unsigned int i; - - node = (VSNodeText *)vs_get_node(node_id, V_NT_TEXT); - if(node == NULL) - return; - if(buffer_id >= node->buffer_count || node->buffer[buffer_id].name[0] == 0) - return; - if(vs_add_new_subscriptor(node->buffer[buffer_id].subscribers) == 0) - return; - for(i = 0; i < node->buffer[buffer_id].length; i += VN_T_MAX_TEXT_CMD_SIZE) - { - if(i + VN_T_MAX_TEXT_CMD_SIZE > node->buffer[buffer_id].length) - verse_send_t_text_set(node_id, buffer_id, i, node->buffer[buffer_id].length - i, &node->buffer[buffer_id].text[i]); - else - verse_send_t_text_set(node_id, buffer_id, i, VN_T_MAX_TEXT_CMD_SIZE, &node->buffer[buffer_id].text[i]); - } -} - -static void callback_send_t_buffer_unsubscribe(void *user, VNodeID node_id, VBufferID buffer_id) -{ - VSNodeText *node; - node = (VSNodeText *)vs_get_node(node_id, V_NT_TEXT); - if(node == NULL) - return; - if(buffer_id >= node->buffer_count || node->buffer[buffer_id].name[0] == 0) - return; - vs_remove_subscriptor(node->buffer[buffer_id].subscribers); -} - -static void callback_send_t_text_set(void *user, VNodeID node_id, VBufferID buffer_id, uint32 pos, uint32 length, const char *text) -{ - VSNodeText *node; - VSTextBuffer *tb; - unsigned int i, count, text_length; - char *buf; - - node = (VSNodeText *) vs_get_node(node_id, V_NT_TEXT); - if(node == NULL) - return; - if(buffer_id >= node->buffer_count || node->buffer[buffer_id].name[0] == 0) - return; - tb = &node->buffer[buffer_id]; - - text_length = strlen(text); - - /* Clamp position and length of deleted region. */ - if(pos > tb->length) - pos = tb->length; - if(pos + length > tb->length) - length = tb->length - pos; - - buf = tb->text; - - if(tb->length + text_length - length > tb->allocated) - { - buf = realloc(buf, tb->length + text_length - length + VS_TEXT_CHUNK_SIZE); - tb->allocated = tb->length + text_length - length + VS_TEXT_CHUNK_SIZE; - } - - if(text_length < length) /* Insert smaller than delete? */ - { - memmove(buf + pos + text_length, buf + pos + length, tb->length - (pos + length)); - memcpy(buf + pos, text, text_length); - } - else /* Insert is larger than delete. */ - { - memmove(buf + pos + text_length, buf + pos + length, tb->length - pos); - memcpy(buf + pos, text, text_length); - } - - tb->length += (int) text_length - length; - buf[tb->length] = '\0'; - - /* Buffer very much larger than content? Then shrink it. */ - if(tb->allocated > VS_TEXT_CHUNK_SIZE * 8 && tb->allocated * 2 > tb->length) - { - buf = realloc(buf, tb->length + VS_TEXT_CHUNK_SIZE); - tb->allocated = tb->length + VS_TEXT_CHUNK_SIZE; - } - - tb->text = buf; - - count = vs_get_subscript_count(tb->subscribers); - for(i = 0; i < count; i++) - { - vs_set_subscript_session(tb->subscribers, i); - verse_send_t_text_set(node_id, buffer_id, pos, length, text); - } - vs_reset_subscript_session(); -} - - -void vs_t_callback_init(void) -{ - verse_callback_set(verse_send_t_language_set, callback_send_t_language_set, NULL); - verse_callback_set(verse_send_t_buffer_create, callback_send_t_buffer_create, NULL); - verse_callback_set(verse_send_t_buffer_destroy, callback_send_t_buffer_destroy, NULL); - verse_callback_set(verse_send_t_buffer_subscribe, callback_send_t_buffer_subscribe, NULL); - verse_callback_set(verse_send_t_buffer_unsubscribe, callback_send_t_buffer_unsubscribe, NULL); - verse_callback_set(verse_send_t_text_set, callback_send_t_text_set, NULL); -} - -#endif |