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 );