Mercurial > ~dholland > hg > ag > index.cgi
diff examples/dsl/edit.h @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/dsl/edit.h Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,152 @@ +/***** + + AnaGram Programming Examples + + A Dos Script Language + Line Edit Class + The Edit Class is completely defined in this file. + There is no supporting CPP file. + + Copyright 1993 Parsifal Software. All Rights Reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +*****/ + + +#ifndef EDIT_H +#define EDIT_H + +#include <string.h> +#include "charsink.h" +#include "util.h" +#include "screen.h" + +class line_edit_buffer { + char *text; // text of line being edited + int x; // position of cursor in line + int length; // length of line + int buf_size; // does not include final zero +public: + int changes; // if non-zero, line changed + + +// Constructors + + line_edit_buffer(int n) { // Init with no initial string + buf_size = n; + text = new char[buf_size + 1]; + memset(text,0, buf_size + 1); + x = length = changes = 0; + } + + line_edit_buffer(char *s, int n) { // Init with initial string + if (s != NULL) { + length = strlen(s); + if (length > n) n = length; // Make buf at least as long + } + else length = 0; + buf_size = n; + text = new char[buf_size + 1]; + memset(text,0, buf_size + 1); + if (s != NULL) strcpy(text, s); + x = changes = 0; + } + + +// Destructor + + ~line_edit_buffer() { + delete [] text; + } + + +// Insert char in buffer + + line_edit_buffer &operator << (const int c) { + if (length >= buf_size) return *this; + if (length < x) { + memset(&text[length], ' ', x - length); + length = x; + text[length] = 0; + } + memmove(&text[x+1], &text[x], length++ - x); + text[x++] = (char )c; + changes++; + return *this; + } + + +// Increment cursor position + + line_edit_buffer &operator ++() { + if (x < buf_size) x++; + return *this; + } + + +// Move to end of line + + friend line_edit_buffer &end(line_edit_buffer &b) { + b.x = b.length; + return b; + } + line_edit_buffer &operator --() { + if (x) x--; + return *this; + } + +// Move to beginning of line + + friend line_edit_buffer &home(line_edit_buffer &b) { + b.x = 0; + return b; + } + +// Delete a character + + line_edit_buffer &operator ~() { + if (x >= length) return *this; + memmove(&text[x], &text[x+1], --length - x); + text[length] = 0; + changes++; + return *this; + } + + operator char *() { + return text; + } + + int index() { // return index in line + return x; + } + + +// Display edit buffer in a a screen rectangle + + friend screen_rect &operator << ( screen_rect &r + , const line_edit_buffer &b + ) { + int offset = b.x - r.size.x + 1; + if (offset < 0) offset = 0; + + r.set_cursor(b.x - offset) << (b.text + offset); + return r; + } +}; + +#endif