ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/friend.C
(Generate patch)

Comparing deliantra/server/common/friend.C (file contents):
Revision 1.5 by root, Sun Sep 10 16:00:23 2006 UTC vs.
Revision 1.8 by pippijn, Sat Jan 6 14:42:28 2007 UTC

1
2/*
3 * static char *rcsid_friend_c =
4 * "$Id: friend.C,v 1.5 2006/09/10 16:00:23 root Exp $";
5 */
6
7/* 1/*
8 CrossFire, A Multiplayer game for X-windows 2 CrossFire, A Multiplayer game for X-windows
9 3
4 Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
10 Copyright (C) 2002 Mark Wedel & Crossfire Development Team 5 Copyright (C) 2002 Mark Wedel & Crossfire Development Team
11 Copyright (C) 1992 Frank Tore Johansen 6 Copyright (C) 1992 Frank Tore Johansen
12 7
13 This program is free software; you can redistribute it and/or modify 8 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by 9 it under the terms of the GNU General Public License as published by
22 17
23 You should have received a copy of the GNU General Public License 18 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software 19 along with this program; if not, write to the Free Software
25 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 21
27 The authors can be reached via e-mail at crossfire-devel@real-time.com 22 The authors can be reached via e-mail at <crossfire@schmorp.de>
28*/ 23*/
29 24
30#include <global.h> 25#include <global.h>
31 26
32/* 27/*
54 } 49 }
55 50
56 ol = first_friendly_object; 51 ol = first_friendly_object;
57 first_friendly_object = get_objectlink (); 52 first_friendly_object = get_objectlink ();
58 first_friendly_object->ob = op; 53 first_friendly_object->ob = op;
59 first_friendly_object->id = op->count;
60 first_friendly_object->next = ol; 54 first_friendly_object->next = ol;
61} 55}
62 56
63/* 57/*
64 * Removes the specified object from the linked list of friendly objects. 58 * Removes the specified object from the linked list of friendly objects.
81 */ 75 */
82 if (first_friendly_object->ob == op) 76 if (first_friendly_object->ob == op)
83 { 77 {
84 obj = first_friendly_object; 78 obj = first_friendly_object;
85 first_friendly_object = obj->next; 79 first_friendly_object = obj->next;
86 free (obj); 80 delete obj;
87 } 81 }
88 else 82 else
89 { 83 {
90 objectlink *prev = first_friendly_object; 84 objectlink *prev = first_friendly_object;
91 85
93 { 87 {
94 if (obj->ob == op) 88 if (obj->ob == op)
95 break; 89 break;
96 prev = obj; 90 prev = obj;
97 } 91 }
92
98 if (obj) 93 if (obj)
99 { 94 {
100 /* This should not happen. But if it does, presumably the
101 * call to remove it is still valid.
102 */
103 if (obj->id != op->count)
104 {
105 LOG (llevError, "remove_friendly_object, tags do no match, %s, %d != %d\n",
106 op->name ? (const char *) op->name : "none", op->count, obj->id);
107 }
108 prev->next = obj->next; 95 prev->next = obj->next;
109 free (obj); 96 delete obj;
110 } 97 }
111 } 98 }
112} 99}
113 100
114/* 101/*
132clean_friendly_list (void) 119clean_friendly_list (void)
133{ 120{
134 objectlink *obj, *prev = NULL, *next; 121 objectlink *obj, *prev = NULL, *next;
135 int count = 0; 122 int count = 0;
136 123
137 for (obj = first_friendly_object; obj != NULL; obj = next) 124 for (obj = first_friendly_object; obj; obj = next)
138 { 125 {
139 next = obj->next; 126 next = obj->next;
140 if (QUERY_FLAG (obj->ob, FLAG_FREED) || !QUERY_FLAG (obj->ob, FLAG_FRIENDLY) || (obj->id != obj->ob->count)) 127 if (QUERY_FLAG (obj->ob, FLAG_FREED) || !QUERY_FLAG (obj->ob, FLAG_FRIENDLY))
141 { 128 {
142 if (prev) 129 if (prev)
143 {
144 prev->next = obj->next; 130 prev->next = obj->next;
145 }
146 else 131 else
147 {
148 first_friendly_object = obj->next; 132 first_friendly_object = obj->next;
149 } 133
150 count++; 134 count++;
151 free (obj); 135 delete obj;
152 } 136 }
153 /* If we removed the object, then prev is still valid. */
154 else 137 else
138 /* If we removed the object, then prev is still valid. */
155 prev = obj; 139 prev = obj;
156 } 140 }
141
157 if (count) 142 if (count)
158 LOG (llevDebug, "clean_friendly_list: Removed %d bogus links\n", count); 143 LOG (llevDebug, "clean_friendly_list: Removed %d bogus links\n", count);
159} 144}
160 145
161/* Checks if the given object is already in the friendly list or not 146/* Checks if the given object is already in the friendly list or not

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines