/* ....[@@@..[@@@..............[@.................. MUD++ is a written from ....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and ....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++. ....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing ....[@......[@..[@@@@@..[@@@@@.................. development project. All ................................................ contributions are welcome. ....Copyright(C).1995.Melvin.Smith.............. Enjoy. ------------------------------------------------------------------------------ Melvin Smith (aka Fusion) msmith@falcon.mercer.peachnet.edu MUD++ development mailing list mudpp-list@spice.com ------------------------------------------------------------------------------ edittext.cc */ #include "string.h" #include "llist.h" #include "index.h" #include "room.h" #include "indexable.h" #include "server.h" #include "bit.h" #include "edit.h" // The edit object can be used like a char * for copy text from // the object. const String & TextEditor::asStr() { output.clr(); for( int i = 0; text[i]; i++ ) { output += text[i]; } return output; } // The edit object can be used like an array of strings by providing // the [] index operator. Returns string at text[i] const String & TextEditor::operator [] (int i) { if( i >= 0 && i < MAX_LINES ) return text[i]; else return text[MAX_LINES]; // dummy string } // Show the edit buffer in line format. const String & TextEditor::format() { output.clr(); for( int i=0; *text[i].chars(); i++ ) { output << i+1 << "] " << text[i] << "\n\r"; } return output; } // Clear the edit buffer out. void TextEditor::clr() { for( int i=0; i < MAX_LINES; i++ ) { text[i].clr(); } } // Append a line onto the text. void TextEditor::append( const char *str ) { text[current++] = str; lines++; } // Append a line onto the text. void TextEditor::append( const String & str ) { text[current++] = str; lines++; } // Clear the line but do not delete. // Can be undone. void TextEditor::clrLine( int i ) { clipped = 1; clipboard[0] = text[i]; text[i].clr(); } // Insert a line at line i. All lines >= i are shifted down. // Can be undone. void TextEditor::insertLine( const String &, int ) { } // Delete line i and shift the text up. // Can be undone. void TextEditor::cutLine( int i ) { if( i > lines ) return; // Discard the clipboard clipped = 0; for( int j = i; j < lines; j++ ) { text[j] = text[j+1]; } lines--; } // Replace line i with str. // Can be undone. void TextEditor::replaceLine( const String & str, int i ) { if( i >= MAX_LINES || i < 0 ) return; clipped = 1; clipboard[0] = text[i]; text[i] = str; } // Cut a block of text. // Can be used to paste/copy sections of text. // Can be undone. void TextEditor::cutLines( int first, int last ) { if( first > last || first >= lines || last >= lines || first < 0 || last < 0 ) return; int i, j; clipped = last - first + 1; for( i = first; i <= last; i++ ) clipboard[i-first] = text[i]; i = first; j = last+1; while( text[j] ) text[i++] = text[j++]; text[i].clr(); lines -= (last - first); } // Paste the clipboard back into the text buffer at line i. // Can be undone. void TextEditor::pasteLines( int ) { } // Text editor master function. Called from main() // Player must be in a edit state. void TextEditor::command( String & arg ) { String arg1; String arg2; if( !arg ) return; char buf[ BUF * 2 ]; int line1; if( state == EDIT_APPEND ) { if( arg[0] == '~' || arg[0] == '@' ) { state = 0; return; } else if( arg[0] == '.' ) { if( arg[1] == 'c' ) { clr(); pc->out( "\n\rBuffer cleared.\n\r" ); } else pc->out( "\n\rUnknown dot command.\n\r" ); return; } append( arg ); return; } if( isdigit( arg[0] ) ) { arg.startArgs(); arg1 = arg.getArg(); arg2 = arg.getArg(); int line1 = arg1.asInt(); if( line1 <= 0 ) { pc->out( "\n\rInvalid line number.\n\r" ); return; } if( !arg2 ) { pc->out( text[line1-1] ); return; } replaceLine( arg2, line1-1 ); return; } arg.startArgs(); arg1 = arg.getArg(); arg2 = arg.getArgRest(); switch( tolower( arg[0] ) ) { case 'a': state = TASK_EDIT_APPEND; return; case 'c': line1 = arg2.asInt(); if( line1 <= 0 ) pc->out( "\n\rUsage: clear <line #>\n\r" ); else text[ line1-1 ].clr(); return; case 'h': pc->view( "../help/editor.hlp" ); //pc->flush(); return; case 's': pc->out( format() ); return; case 'q': state = state_last; return; default: return; } }