Index: Fire/src/olc.h
===================================================================
--- Fire/src/olc.h	(revision 68)
+++ Fire/src/olc.h	(working copy)
@@ -181,17 +181,24 @@
  * String Editing Functions
  */
 void                    string_edit( CHAR_DATA *ch, char **pString );
+void                    string_append( CHAR_DATA *ch, std::string &pString );
 void                    string_append( CHAR_DATA *ch, char **pString );
 char                   *string_replace( char *orig, const char *pOld, const char *pNew );
+void                    string_replace(std::string &orig, const char *pOld, const char *pNew);
 void                    string_add( CHAR_DATA *ch, const char *argument );
-char                   *format_string( char *oldstring /* , bool fSpace */  );
+char                   *format_string_const(const char *oldstring /* , bool fSpace */  );
+char                   *format_string(char *oldstring);
+void                    format_string(std::string &);
 const char             *first_arg( const char *argument, char *arg_first, bool fCase );
 char                   *string_unpad( char *argument );
 char                   *string_proper( char *argument );
 char                   *string_linedel( char *string, int line );
+void                    string_linedel(std::string &string, int line);
 char                   *string_lineadd( char *string, char *newstr, int line );
-char                   *getline( char *str, char *buf );
-char                   *numlineas( char *string );
+void                    string_lineadd(std::string &, char *newstr, int line);
+const char                   *getline( const char *str, char *buf );
+char                   *numlineas(const char *string );
+size_t                  string_getline(const std::string &str, int line);
 
 /*
  * Area Editor Prototypes
Index: Fire/src/olc_utils.c
===================================================================
--- Fire/src/olc_utils.c	(revision 68)
+++ Fire/src/olc_utils.c	(working copy)
@@ -60,22 +60,30 @@
  Purpose:        Puts player into append mode for given string.
  Called by:      (many)olc_act.c
  ****************************************************************************/
-void string_append( CHAR_DATA *ch, char **pString )
+void string_append( CHAR_DATA *ch, std::string &pString )
 {
     ch_printf( ch, "-=======- Entering APPEND Mode -========-\r\n" );
     ch_printf( ch, "    Type .h on a new line for help\r\n" );
     ch_printf( ch, " Terminate with a ~ or @ on a blank line.\r\n" );
     ch_printf( ch, "-=======================================-\r\n" );
 
-    if ( *pString == NULL )
-    {
-        *pString = str_dup( "" );
-    }
+    ch_printf( ch, "%s", numlineas( pString.c_str() ) );
+
+    ch->desc->pString_std = &pString;
+    ch->desc->pString = NULL;
+}
+
+void string_append( CHAR_DATA *ch, char **pString )
+{
+    ch_printf( ch, "-=======- Entering APPEND Mode -========-\r\n" );
+    ch_printf( ch, "    Type .h on a new line for help\r\n" );
+    ch_printf( ch, " Terminate with a ~ or @ on a blank line.\r\n" );
+    ch_printf( ch, "-=======================================-\r\n" );   
+
     ch_printf( ch, "%s", numlineas( *pString ) );
 
+    ch->desc->pString_std = NULL;
     ch->desc->pString = pString;
-
-    return;
 }
 
 /*****************************************************************************
@@ -101,6 +109,16 @@
     return str_dup( xbuf );
 }
 
+void                   string_replace(std::string &orig, const char *pOld, const char *pNew)
+{
+    size_t old_size = strlen(pOld);
+
+    size_t replace_pos = orig.find(pOld);
+
+    if(replace_pos != std::string::npos)
+	orig.replace(replace_pos, old_size, pNew);
+}
+
 /*****************************************************************************
  Name:           string_add
  Purpose:        Interpreter for string editing.
@@ -133,15 +151,31 @@
         if ( !str_cmp( arg1, ".c" ) )
         {
             ch_printf( ch, "String cleared.\r\n" );
-            free_string( *ch->desc->pString );
-            *ch->desc->pString = str_dup( "" );
+
+	    if(ch->desc->pString != NULL)
+	    {
+		free_string( *ch->desc->pString );
+		*ch->desc->pString = str_dup( "" );
+	    }
+
+	    else
+		ch->desc->pString_std->erase();
+	    
             return;
         }
 
         if ( !str_cmp( arg1, ".s" ) )
         {
+	    const char *print_me = NULL;
+
+	    if(ch->desc->pString != NULL)
+		print_me = *ch->desc->pString;
+	    else
+		print_me = ch->desc->pString_std->c_str();
+	    
             ch_printf( ch, "String so far:\r\n" );
-            ch_printf( ch, "%s", numlineas( *ch->desc->pString ) );
+
+            ch_printf( ch, "%s", numlineas( print_me ) );
             return;
         }
 
@@ -153,38 +187,64 @@
                 return;
             }
 
-            *ch->desc->pString = string_replace( *ch->desc->pString, arg2, arg3 );
+	    if(ch->desc->pString != NULL)
+		*ch->desc->pString = string_replace( *ch->desc->pString, arg2, arg3 );
+	    else
+		string_replace(*ch->desc->pString_std, arg2, arg3);
+	    
             ch_printf( ch, "'%s' replaced with '%s'.\r\n", arg2, arg3 );
             return;
         }
 
         if ( !str_cmp( arg1, ".f" ) )
         {
-            *ch->desc->pString = format_string( *ch->desc->pString );
+	    if(ch->desc->pString != NULL)
+		*ch->desc->pString = format_string( *ch->desc->pString );
+	    else
+		format_string(*ch->desc->pString_std);
+	    
             ch_printf( ch, "String formatted.\r\n" );
             return;
         }
 
         if ( !str_cmp( arg1, ".ld" ) )
         {
-            *ch->desc->pString = string_linedel( *ch->desc->pString, atoi( arg2 ) );
-            ch_printf( ch, "Line deleted.\r\n" );
+	    if(ch->desc->pString != NULL)
+		*ch->desc->pString = string_linedel( *ch->desc->pString, atoi( arg2 ) );
+	    else
+		string_linedel(*ch->desc->pString_std, atoi(arg2));
+
+	    ch_printf( ch, "Line deleted.\r\n" );
             return;
         }
 
         if ( !str_cmp( arg1, ".li" ) )
         {
-            *ch->desc->pString =
-                string_lineadd( *ch->desc->pString, tmparg3, atoi( arg2 ) );
+            if(ch->desc->pString != NULL)
+		*ch->desc->pString =
+		    string_lineadd( *ch->desc->pString, tmparg3, atoi( arg2 ) );
+	    else
+		string_lineadd(*ch->desc->pString, tmparg3, atoi(arg2));
+	    
             ch_printf( ch, "Line inserted.\r\n" );
             return;
         }
 
         if ( !str_cmp( arg1, ".lr" ) )
         {
-            *ch->desc->pString = string_linedel( *ch->desc->pString, atoi( arg2 ) );
-            *ch->desc->pString =
-                string_lineadd( *ch->desc->pString, tmparg3, atoi( arg2 ) );
+	    if(ch->desc->pString != NULL)
+	    {
+		*ch->desc->pString = string_linedel( *ch->desc->pString, atoi( arg2 ) );
+		*ch->desc->pString =
+		    string_lineadd( *ch->desc->pString, tmparg3, atoi( arg2 ) );
+	    }
+
+	    else
+	    {
+		string_linedel(*ch->desc->pString_std, atoi(arg2));
+		string_lineadd(*ch->desc->pString_std, tmparg3, atoi(arg2));
+	    }
+	    
             ch_printf( ch, "Line replaced.\r\n" );
             return;
         }
@@ -232,16 +292,18 @@
         }
 
         ch->desc->pString = NULL;
+	ch->desc->pString_std = NULL;
         return;
     }
+    
 
-    strcpy( buf, *ch->desc->pString );
-
     /*
      * Truncate strings to MAX_STRING_LENGTH.
      * --------------------------------------
      */
-    if ( strlen( buf ) + strlen( lap ) >= ( MAX_STRING_LENGTH - 4 ) )
+    if( (ch->desc->pString != NULL && strlen(*ch->desc->pString) + strlen(lap) >= (MAX_STRING_LENGTH - 4)) ||
+	(ch->desc->pString_std != NULL && ch->desc->pString_std->size() + strlen(lap) >= (MAX_STRING_LENGTH - 4)) )
+	//if ( strlen( buf ) + strlen( lap ) >= ( MAX_STRING_LENGTH - 4 ) )
     {
         ch_printf( ch, "String too long, last line skipped.\r\n" );
 
@@ -252,6 +314,11 @@
         return;
     }
 
+    else if(ch->desc->pString != NULL)
+	strcpy( buf, *ch->desc->pString );
+    else
+	strcpy(buf, ch->desc->pString_std->c_str());
+    
     /*
      * Ensure no tilde's inside string.
      * --------------------------------
@@ -261,8 +328,16 @@
 
     strcat( buf, lap );
     strcat( buf, "\r\n" );
-    free_string( *ch->desc->pString );
-    *ch->desc->pString = str_dup( buf );
+
+    if(ch->desc->pString != NULL)
+    {
+	free_string( *ch->desc->pString );
+	*ch->desc->pString = str_dup( buf );
+    }
+
+    else
+	*ch->desc->pString_std = buf;
+    
     return;
 }
 
@@ -271,11 +346,11 @@
  * Original wordwrap() written by Surreality.
  */
 /*****************************************************************************
- Name:           format_string
+ Name:           format_string_const
  Purpose:        Special string formating and word-wrapping.
  Called by:      string_add(string.c) (many)olc_act.c
  ****************************************************************************/
-char                   *format_string( char *oldstring /* , bool fSpace */  )
+char                   *format_string_const( const char *oldstring /* , bool fSpace */  )
 {
     char                    xbuf[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
     char                    xbuf2[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0";
@@ -283,7 +358,7 @@
     int                     i = 0;
     bool                    cap = true;
 
-    for ( rdesc = oldstring; *rdesc; rdesc++ )
+    for ( rdesc = str_dup(oldstring); *rdesc; rdesc++ )
     {
         if ( *rdesc == '\n' )
         {
@@ -419,10 +494,29 @@
     if ( xbuf[strlen( xbuf ) - 2] != '\n' )
         strcat( xbuf, "\r\n" );
 
-    free_string( oldstring );
+    free_string( rdesc );
     return ( str_dup( xbuf ) );
 }
 
+char *format_string(char *oldstring)
+{
+    char *retval = format_string_const(oldstring);
+
+    free_string(oldstring);
+
+    return retval;
+}
+
+void format_string(std::string &str)
+{
+    // cheating :D format_string looks scary and will need to be cleaned up in the future.
+    char *newstr = format_string_const(str.c_str());
+
+    str = newstr;
+
+    free_string(newstr);
+}
+
 /*
  * Used above in string_add.  Because this function does not
  * modify case if fCase is FALSE and because it understands
@@ -564,6 +658,39 @@
     return str_dup( buf );
 }
 
+void string_linedel(std::string &str, int line)
+{
+    size_t line_begin = string_getline(str, line);
+    size_t next_line_begin = string_getline(str, line + 1);
+
+    size_t line_length;
+
+    if(next_line_begin == std::string::npos)
+	line_length = std::string::npos;
+    else
+	line_length = next_line_begin - line_begin;
+
+    str.erase(line_begin, line_length);
+}
+
+size_t string_getline(const std::string &str, int line)
+{
+    size_t retval = 0;
+
+    while(line-- > 1 && retval != std::string::npos)
+	retval = str.find("\n", retval);
+
+    // advance pos one more if the newline is \n\r.
+    if(retval != std::string::npos && str.at(retval+1) == '\r')
+	retval += 1;
+
+    if(retval != 0 && retval != std::string::npos)
+	// advance pos to point to the first character of the line.
+	retval += 1;
+    
+    return retval;
+}
+    
 char                   *string_lineadd( char *string, char *newstr, int line )
 {
     char                   *strtmp = string;
@@ -603,8 +730,23 @@
     return str_dup( buf );
 }
 
+// Inserts newstr + a newline as line #.
+void string_lineadd(std::string &str, char *newstr, int line)
+{
+    size_t insertpoint = string_getline(str, line);
+    std::string insertme(newstr);
+
+    insertme += "\r\n";
+    
+    // if we didn't find the line, add the text to the end of the string.
+    if(insertpoint == std::string::npos)
+	str += insertme;
+    else
+	str.insert(insertpoint, insertme);
+}
+
 /* buf queda con la linea sin \r\n */
-char                   *getline( char *str, char *buf )
+const char                   *getline( const char *str, char *buf )
 {
     int                     tmp = 0;
     bool                    found = false;
@@ -634,7 +776,7 @@
     return str;
 }
 
-char                   *numlineas( char *string )
+char                   *numlineas(const char *string )
 {
     int                     cnt = 1;
     static char             buf[MAX_STRING_LENGTH * 2] = "\0\0\0\0\0\0\0";
Index: Fire/src/merc.h
===================================================================
--- Fire/src/merc.h	(revision 68)
+++ Fire/src/merc.h	(working copy)
@@ -29,6 +29,8 @@
 *       ROM license, in the file Rom24/doc/rom.license                     *
 ***************************************************************************/
 
+#include <string>
+
 /*
  * LEGACY:
  * These things are here to make snippet integration easier.
@@ -156,7 +158,7 @@
     bool                    valid;
     int                     ban_flags;
     int                     level;
-    char                   *name;
+    std::string             name;
 };
 
 struct buf_type
@@ -242,6 +244,7 @@
     char                   *showstr_point;
     void                   *pEdit;                     /* OLC */
     char                  **pString;                   /* OLC */
+    std::string           *pString_std;
     int                     editor;                    /* OLC */
 };
 
@@ -290,12 +293,15 @@
  * Help table types.
  */
 struct help_data
+
 {
     HELP_DATA              *next;
     HELP_DATA              *next_area;
     int                     level;
-    char                   *keyword;
-    char                   *text;
+    //char                   *keyword;
+    //char                   *text;
+    std::string             keyword;
+    std::string             text;
 };
 
 struct help_area_data
Index: Fire/src/comm.c
===================================================================
--- Fire/src/comm.c	(revision 68)
+++ Fire/src/comm.c	(working copy)
@@ -576,6 +574,7 @@
     dnew->outsize = 2000;
     dnew->pEdit = NULL;                                /* OLC */
     dnew->pString = NULL;                              /* OLC */
+    dnew->pString_std = NULL;
     dnew->editor = 0;                                  /* OLC */
     dnew->outbuf = ( char * ) alloc_mem( dnew->outsize );