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
@>


Reply via email to