Hmm. Well, the list of frame 0 is making me wonder if there was a crash caused by copyover while the dream_append function is processing. At least, that's what it looks like from this. The dream_append functions looks fine and following the tree of program flow that gdb is showing you the next step was into the string processing libraries.
Another question I have is when did you start to notice the problem? Was it recently? Have you just added anything that affects the string processing, dream or prompt functions recently? If you have, I'd pay some attention to those functions. Vertigo Realm of Lanera @>-----Original Message----- @>From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf @>Of [EMAIL PROTECTED] @>Sent: Sunday, December 15, 2002 9:02 AM @>To: [email protected] @>Subject: Re: Crashes when setting prompts @> @> @>Ok, here's the info: @> @>1) Dream_append: @>---> @>void dream_append(const char *str) { @> int rn; @> @> if (strlen(str) < 15) return; @> if (strstr(str, "tell")) return; @> if (strstr(str, "repl")) return; @> if (strstr(str, "You are")) return; @> if (index(str, ':')) return; @> if (index(str, '|')) return; @> if (index(str, '_')) return; @> if (index(str, '-')) return; @> @> rn = number_range(0, MAX_DREAMS-1); @> sprintf(dream_table[rn], str); @>} @><--- @> @>2) List of frame 0: @>---> @>348 void stop_idling args( ( CHAR_DATA *ch ) ); @>349 void bust_a_prompt args( ( CHAR_DATA *ch ) ); @>350 @>351 /* Needs to be global because of do_copyover */ @>352 int port, control; @>353 @>354 int main( int argc, char **argv ) @>355 { @>356 struct timeval now_time; @>357 bool fCopyOver = FALSE; @><--- @> @>3) bust_a_prompt: @>---> @>void bust_a_prompt( CHAR_DATA *ch ) @>{ @> char buf[MAX_STRING_LENGTH]; @> char buf2[MAX_STRING_LENGTH]; @> const char *str; @> const char *i; @> char *point; @> char *pbuff; @> char buffer[ MAX_STRING_LENGTH*2 ]; @> char doors[MAX_INPUT_LENGTH]; @> EXIT_DATA *pexit; @> bool found; @> const char *dir_name[] = {"N","E","S","W","U","D"}; @> int door; @> @> point = buf; @> str = ch->prompt; @> if (!str || str[0] == '\0') @> { @> @> sprintf( buf, "{w<{r%d{w/{R%d{r:{Rhp @>{c%d{w/{C%d{c:{Cm {B%d{b:{Btnl {w%ld {w> %s{w", @> ch->hit, ch->max_hit, ch->mana, ch->max_mana, IS_NPC(ch) ? 0 : @> (ch->level + 1) * exp_per_level(ch,ch->pcdata->points) @>- ch->exp, @> ch->silver, ch->prefix ); @> send_to_char( buf, ch ); @> return; @> @>// str = "{w<{R%h{w/{r%H{Rhp {B%m{w/{b%M{Bm {B%X{btnl @>{w%s dollars{w> {w"; @> } @> @> @> if (IS_SET(ch->comm,COMM_AFK)) @> { @> send_to_char("{R<AFK>{x ",ch); @> return; @> } @> @> while( *str != '\0' ) @> { @> if( *str != '%' ) @> { @> *point++ = *str++; @> continue; @> } @> ++str; @> switch( *str ) @> { @> default : @> i = " "; break; @> case 'e': @> found = FALSE; @> doors[0] = '\0'; @> for (door = 0; door < 6; door++) @> { @> if ((pexit = ch->in_room->exit[door]) != NULL @> && pexit ->u1.to_room != NULL @> && !IS_SET(pexit->exit_info, EX_JUMP) @> && !IS_SET(pexit->exit_info, EX_CLIMB) @> && !IS_SET(pexit->exit_info, EX_CRAWL) @> && (can_see_room(ch,pexit->u1.to_room) @> || (IS_AFFECTED(ch,AFF_INFRARED) @> && !IS_AFFECTED(ch,AFF_BLIND)))) @> { @> if ( !IS_SET(pexit->exit_info,EX_CLOSED)) @> { @> found = TRUE; @> strcat(doors,dir_name[door]); @> } @> if (ch->level >= LEVEL_IMMORTAL @> && IS_SET(pexit->exit_info, EX_CLOSED)) @> { @> found = TRUE; @> strcat(doors, "["); @> strcat(doors, dir_name[door]); @> strcat(doors, "]"); @> } @> } @> } @> if (!found) @> strcat(buf,"none"); @> sprintf(buf2,"%s",doors); @> i = buf2; break; @> case 'c' : @> sprintf(buf2,"%s","\n\r"); @> i = buf2; break; @> case 'h' : @> sprintf( buf2, "%d", ch->hit ); @> i = buf2; break; @> case 'H' : @> sprintf( buf2, "%d", ch->max_hit ); @> i = buf2; break; @> case 'm' : @> sprintf( buf2, "%d", ch->mana ); @> i = buf2; break; @> case 'M' : @> sprintf( buf2, "%d", ch->max_mana ); @> i = buf2; break; @> case 'x' : @> sprintf( buf2, "%d", ch->exp ); @> i = buf2; break; @> case 'X' : @> sprintf(buf2, "%d", IS_NPC(ch) ? 0 : @> (ch->level + 1) * @>exp_per_level(ch,ch->pcdata->points) - ch->exp); @> i = buf2; break; @> case 's' : @> sprintf( buf2, "%ld", ch->silver); @> i = buf2; break; @> case 'a' : @> if( ch->level > 9 ) @> sprintf( buf2, "%d", ch->alignment ); @> else @> sprintf( buf2, "%s", IS_GOOD(ch) ? "good" : @>IS_EVIL(ch) ? @> "evil" : "neutral" ); @> i = buf2; break; @> case 'r' : @> if( ch->in_room != NULL ) @> sprintf( buf2, "%s", @> ((!IS_NPC(ch) && IS_SET(ch->act,PLR_HOLYLIGHT)) || @> (!IS_AFFECTED(ch,AFF_BLIND) && !room_is_dark( ch->in_room ))) @> ? ch->in_room->name : "darkness"); @> else @> sprintf( buf2, " " ); @> i = buf2; break; @> case 'R' : @> if( IS_IMMORTAL( ch ) && ch->in_room != NULL ) @> sprintf( buf2, "%d", ch->in_room->vnum ); @> else @> sprintf( buf2, " " ); @> i = buf2; break; @> case 'z': @> if( IS_IMMORTAL( ch ) && ch->in_room != NULL ) @> sprintf( buf2, "%s", ch->in_room->area->name ); @> else @> sprintf( buf2, " " ); @> i = buf2; break; @> case '%' : @> sprintf( buf2, "%%" ); @> i = buf2; break; @> case 'o' : @> sprintf( buf2, "%s", olc_ed_name(ch) ); @> i = buf2; break; @> case 'O' : @> sprintf( buf2, "%s", olc_ed_vnum(ch) ); @> i = buf2; break; @> case 'L' : @> if(!IS_NPC(ch) && ch->fighting != NULL ){ @> int tmpLimit; @> int count; @> @> sprintf(buf2, "{C["); @> if ( ch->pcdata->limit == 100 ) { @> strcat(buf2, "{W{FS U R G E!{w"); @> } else { @> tmpLimit = ch->pcdata->limit; @> for(count = 0; count < 10; count++) { @> if(tmpLimit > 0) { @> if(count == 0) @> strcat(buf2, "{D"); @> if(count == 3) @> strcat(buf2, "{r"); @> if(count == 7) @> strcat(buf2, "{R"); @> @> strcat(buf2, "+"); @> tmpLimit -= 10; @> } else { @> strcat(buf2, " "); @> } @> @> } /* for */ @> } /* if limit = 100 .. */ @> strcat(buf2, "{C]{w"); @> i = buf2; break; @> } else {/* end isnpc */ @> sprintf(buf2, " "); @> i = buf2;break; /*just to keep i equal to @>something if is_npc - leer */ @> } @> } @> ++str; @> while( (*point = *i) != '\0' ) @> ++point, ++i; @> } @> *point = '\0'; @> pbuff = buffer; @> colourconv( pbuff, buf, ch ); @> write_to_buffer( ch->desc, buffer, 0 ); @> @> if (ch->prefix[0] != '\0') @> write_to_buffer(ch->desc,ch->prefix,0); @> return; @>} @><--- @> @>Thanks for your help, @> @>Selquest of Drug Wars @>dwmud.ods.org 2528 @>http://fly.to/dwmud @> @>---Original Message--- @>I don't think it's a problem with the setting of the prompt. @> @>Do this: @> @>1) Copy the "dream_append" from dream.c and paste it here. @>2) Send us a "print" of "frame 0" in gdb. @>...and for the hell of it, @>3) Send your "bust_a_prompt" from comm.c @> @>With that, I think we can fix the problem. I doubt it's a @>problem with bust_a_prompt unless you've seriously modified @>it and left something untied causing the mud to trip. @> @>Vertigo @>Realm of Lanera @>------ @> @>-- @>ROM mailing list @>[email protected] @>http://www.rom.org/cgi-bin/mailman/listinfo/rom @>

