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 + /* * 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 );