i don't know if this same rule applies, but this line has been drilled into my 
head over the years:
 
After extract_char the ch is no longer valid!
 
This usually is the case anytime you're freeing items in a linked list... if 
you run a for loop and cycle through a list and free the item in question each 
iteration, then when it hits the end of the statement list and tries to loop, 
item->next is going to be equal to NULL since the item itself just got freed... 
this is the purpose of the ed_next, it reserves a spaceholder pointing to the 
next element in the list so that when the previous one gets freed, it still has 
a way to reference the next one in the list...
 
wavewave
Richard Lindsey.

        -----Original Message----- 
        From: Valnir [mailto:[EMAIL PROTECTED] 
        Sent: Thu 1/22/2004 10:41 PM 
        To: [email protected] 
        Cc: 
        Subject: Re: Clearing extra descriptions
        
        

        Sometimes the "ed = ed_next" and "ed_next = ed->next" has been known to 
give
        me a few headaches.
        
        Try this method instead.
        
        for ( ed = pObj->extra_descr; ed; ed = ed->next )
        {
            send_to_char( "Freeing Extra Desc '%s'.\n\r", ed->keyword );
            free_extra_descr( ed );
        }
        
        ----- Original Message -----
        From: "Hiddukel" <[EMAIL PROTECTED]>
        To: <[email protected]>
        Sent: Thursday, January 22, 2004 10:45 PM
        Subject: RE: Clearing extra descriptions
        
        
        > I also have this in my code but it only deletes one extra description 
at a
        > time.  I need a clear command to remove all the extra descriptions.
        >
        > -----Original Message-----
        > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Valnir
        > Sent: Thursday, January 22, 2004 7:22 PM
        > To: [email protected]
        > Subject: Re: Clearing extra descriptions
        >
        > Don't know if this will help, but here is how ours is done (using 
"delete"
        > instead of clear)
        >
        >     if ( !str_cmp( command, "delete" ) )
        >     {
        >         EXTRA_DESCR_DATA *ped = NULL;
        >
        >         if ( keyword[0] == '\0' )
        >         {
        >             send_to_char( "Syntax:  ed delete [keyword]\n\r", ch );
        >             return FALSE;
        >         }
        >
        >         for ( ed = pObj->extra_descr; ed; ed = ed->next )
        >         {
        >             if ( is_name( keyword, ed->keyword ) )
        >                 break;
        >             ped = ed;
        >         }
        >
        >         if ( !ed )
        >         {
        >             send_to_char( "OEdit:  Extra description keyword not
        > found.\n\r", ch );
        >             return FALSE;
        >         }
        >
        >         if ( !ped )
        >             pObj->extra_descr = ed->next;
        >         else
        >             ped->next = ed->next;
        >
        >         free_extra_descr( ed );
        >
        >         send_to_char( "Extra description deleted.\n\r", ch );
        >         return TRUE;
        >     }
        >
        > - Valnir
        > ----- Original Message -----
        > From: "Hiddukel" <[EMAIL PROTECTED]>
        > To: <[email protected]>
        > Sent: Thursday, January 22, 2004 7:16 PM
        > Subject: Clearing extra descriptions
        >
        >
        > I am seriously confused on this. What I am trying to do is clear all 
of
        the
        > extra descriptions from an object. I can add any number of extra
        > descriptions to an object but when I try to clear them using this 
code it
        > always leaves the first one. I have seen this exact same method used 
in
        olc
        > delete functions and I can't for the life of me figure out why it 
leaves
        the
        > first one in the list. Btw, I also get output saying that it is 
clearing
        > the first extra description even though it remains after the clear.
        >
        > Here is the code in question:
        > if (!str_cmp(command, "clear"))
        > {
        > EXTRA_DESCR_DATA *ed_next = NULL;
        >
        > for (ed = pObj->extra_descr; ed; ed = ed_next)
        > {
        > ed_next = ed->next;
        > ptc(ch, "Clearing exra description: %s\n\r", ed->keyword);
        > free_extra_descr(ed);
        > }
        >
        > return TRUE;
        > }
        >
        > I will also post the free_extra_descr function even though I believe 
it is
        > stock.
        >
        > void free_extra_descr(EXTRA_DESCR_DATA * ed)
        > {
        > if (!IS_VALID(ed))
        > return;
        >
        > free_string(ed->keyword);
        > free_string(ed->description);
        > INVALIDATE(ed);
        >
        > ed->next = extra_descr_free;
        > extra_descr_free = ed;
        > }
        >
        > If I am not mistaken clearing affects from objects would be done in a
        > similar way also, if I am mistaken about that then I would like to 
know
        how
        > that is done as well. I appreciate any and all help on this
        >
        >
        >
        > --
        > ROM mailing list
        > [email protected]
        > http://www.rom.org/cgi-bin/mailman/listinfo/rom
        >
        
        
        --
        ROM mailing list
        [email protected]
        http://www.rom.org/cgi-bin/mailman/listinfo/rom
        

Reply via email to