#include "editor.h" #include Editor newEditor(unsigned int size) { unsigned char* block = calloc(1, size + 1); if (block == NULL) return NULL; Editor editor; editor.front.start = editor.front.end = block; editor.back.start = editor.back.end = block + size; return editor; } inline void freeEditor(Editor editor) { free(editor.front.start); } inline unsigned int getFreeSpace(Editor editor) { return editor.back.start - editor.front.end; } inline unsigned isFull(Editor editor) { return getFreeSpace(editor) == NULL; } unsigned char* getNearCursor(Editor editor, signed int start, signed int end) { unsigned char* block = (unsigned char*) calloc(1, end - start + 1); if (block == NULL) return NULL; memcpy(block, editor.front.end + start, min(end - start, max(0, 0 - start))); memcpy(block + max(0, 0 - start), editor.back.start + max(0, start), end - max(0, start)); return block; } void moveCursor(Editor editor, signed int change) { if (change > 0) { change = max(editor.back.end - editor.back.start, change); memcpy(editor.front.end, editor.back.start, change); editor.front.end += change; editor.back.start += change; } else if (change < 0) { change = max(editor.front.end - editor.front.start, 0 - change); memcpy(editor.back.start - change, editor.front.end - change, change); editor.front.end -= change; editor.back.start -= change; } } inline void writeAtCursor(Editor editor, unsigned char character) { editor.front.end++; *editor.front.end = character; } void writeStringAtCursor(Editor editor, unsigned char* string) { editor.front.end++; memcpy(editor.front.end, string, strlen(string)); editor.front.end += strlen(string) - 1; } inline void writeAfterCursor(Editor editor, unsigned char character) { editor.back.start--; *editor.back.start = character; } void writeStringAfterCursor(Editor editor, unsigned char* string) { editor.back.start -= strlen(string); memcpy(editor.back.start, string, strlen(string)); } inline void deleteAtCursor(Editor editor) { editor.front.end--; } inline void deleteNAtCursor(Editor editor, unsigned int length) { editor.front.end -= length; } inline void deleteAfterCursor(Editor editor) { editor.back.start++; } inline void deleteNAfterCursor(Editor editor, unsigned int length) { editor.back.start += length; }