>From: Christian Ejlertsen <chr.ejlertsen@has.dk>
>Subject: [CIRCLE] Redesign of set_title causes problems
>Date: Tue, 23 Apr 2002 20:59:24 +0200
>
>Worked on a flexible title command so that you can have pretitles.
>Made it so you would set your title like this
>title Sir * the Valiant Knight
>This will resolve into Sir Playername the Valiant Knight.
>It works sweetly actually, but then i wanted to add a check that
>insured that the asteriks was in the title somewhere.
>When the asteriks is found no problems, when no asterisk it goes
>through the if and sets it. It even prompts me that it has the set the
>title, but then it's chrashes. it hangs like some sort of endless loop.
>Gdb output is.
>Program received signal SIGSEGV, segmentation fault.
>0x400cf177 in malloc() from /lib/libc.so.6
>
>What wrong ???
>
>The set_title snippet is supplied below.
>
>## START SNIPPET ##
>
>void set_title(struct char_data * ch, char *title)
>{
> const char *i = NULL;
> char lbuf[MAX_STRING_LENGTH], *buf, *retitle;
> bool found = FALSE;
>
> buf = lbuf;
>
> if (title == NULL && !PLR_FLAGGED(ch, PLR_ROLLED)) {
> if (GET_SEX(ch) == SEX_FEMALE)
> title = title_female(GET_RACE(ch), GET_LEVEL(ch));
> else
> title = title_male(GET_RACE(ch), GET_LEVEL(ch));
> }
>
> if (strlen(title) > MAX_TITLE_LENGTH)
> title[MAX_TITLE_LENGTH] = '\0';
>
> if (GET_TITLE(ch) != NULL)
> free(GET_TITLE(ch));
>
> for (;;) {
> if (*title == '*') {
> found = TRUE;
> i = GET_NAME(ch);
> while ((*buf = *(i++)))
> buf++;
> title++;
> }
> else if (!(*(buf++) = *(title++)))
> break;
> }
>
> *(--buf) = '\0';
>
> /* if no asteriks (*) found reset title */
> if (!found) {
> if (GET_SEX(ch) == SEX_FEMALE) {
> retitle = title_female(GET_RACE(ch), GET_LEVEL(ch));
> }
> else {
> retitle = title_male(GET_RACE(ch), GET_LEVEL(ch));
> }
> send_to_char("Title has to contain the (*) asterisk sign to be
>valid!\r\n"
> "Title reset to default.\r\n", ch);
> set_title(ch, retitle);
> return;
> }
>
> GET_TITLE(ch) = str_dup(lbuf);
>
> sprintf(buf2, "Okay, you're now %s.\r\n", GET_TITLE(ch));
> send_to_char(buf2, ch);
>}
>
>## STOP SNIPPET ##
I'm assuming that everything else works and the function there is the only
problem. You might want to add a 'char buf2[MAX_STRING_LENGTH];' at the
beginning of that function since you do use it inside of it. Next, look at
this "free(GET_TITLE(ch));" add in a "GET_TITLE(ch) = NULL;" right after
that so that you get:
if (GET_TITLE(ch) != NULL) {
free(GET_TITLE(ch));
GET_TITLE(ch) = NULL;
}
That should be your problem. In you loop there, you call on the function
itself so its a recursion. But remember that your GET_TITLE(ch) still
pointed to something. It would attempt to free it again, causing your seg
fault. I hope that is the problem, cuz thats the easiest thing to see.
_________________________________________________________________
Send and receive Hotmail on your mobile device: http://mobile.msn.com
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
| Newbie List: http://groups.yahoo.com/group/circle-newbies/ |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 06/25/03 PDT