--- deliantra/server/common/utils.C 2007/07/01 05:00:18 1.60 +++ deliantra/server/common/utils.C 2008/04/01 19:50:36 1.72 @@ -1,11 +1,11 @@ /* - * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. + * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team + * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team * Copyright (©) 1992,2007 Frank Tore Johansen * - * Crossfire TRT is free software: you can redistribute it and/or modify + * Deliantra is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * The authors can be reached via e-mail to + * The authors can be reached via e-mail to */ /* @@ -38,6 +38,8 @@ #include +refcnt_base::refcnt_t refcnt_dummy; +size_t slice_alloc; rand_gen rndm; void @@ -214,13 +216,12 @@ if (name == mt->name) return mt; - return materialt; + return 0; } /* when doing transmutation of objects, we have to recheck the resistances, * as some that did not apply previously, may apply now. */ - void transmute_materialname (object *op, const object *change) { @@ -260,53 +261,27 @@ { materialtype_t *mt, *lmt; -#ifdef NEW_MATERIAL_CODE - int j; -#endif - if (op->materialname != NULL) return; - - if (nmt == NULL) { lmt = NULL; -#ifndef NEW_MATERIAL_CODE - for (mt = materialt; mt && mt->next; mt = mt->next) - { - if (op->materials & mt->material) - { - lmt = mt; - break; - } - } -#else for (mt = materialt; mt && mt->next; mt = mt->next) - { - if (op->materials & mt->material && rndm (1, 100) <= mt->chance && - difficulty >= mt->difficulty && (op->magic >= mt->magic || mt->magic == 0)) - { - lmt = mt; - if (!(op->is_weapon () || op->is_armor ())) - break; - } - } -#endif + if (op->materials & mt->material && rndm (1, 100) <= mt->chance && + difficulty >= mt->difficulty && (op->magic >= mt->magic || mt->magic == 0)) + { + lmt = mt; + if (!(op->is_weapon () || op->is_armor ())) + break; + } } else - { - lmt = nmt; - } + lmt = nmt; if (lmt != NULL) { -#ifndef NEW_MATERIAL_CODE - op->materialname = lmt->name; - return; -#else - if (op->stats.dam && op->is_weapon ()) { op->stats.dam += lmt->damage; @@ -322,7 +297,8 @@ { if (op->stats.ac) op->stats.ac += lmt->ac; - for (j = 0; j < NROFATTACKS; j++) + + for (int j = 0; j < NROFATTACKS; j++) if (op->resist[j] != 0) { op->resist[j] += lmt->mod[j]; @@ -332,6 +308,7 @@ op->resist[j] = -100; } } + op->materialname = lmt->name; /* dont make it unstackable if it doesn't need to be */ if (op->is_weapon () || op->is_armor ()) @@ -339,7 +316,6 @@ op->weight = (op->weight * lmt->weight) / 100; op->value = (op->value * lmt->value) / 100; } -#endif } } @@ -444,7 +420,6 @@ * This function will also strip all trailing non alphanumeric characters. * It does not insert an oxford comma. */ - void make_list_like (char *input) { @@ -496,9 +471,10 @@ void *salloc_ (int n) throw (std::bad_alloc) { -#ifdef PREFER_MALLOC +#if PREFER_MALLOC void *ptr = malloc (n); #else + slice_alloc += n; void *ptr = g_slice_alloc (n); #endif @@ -520,6 +496,46 @@ return ptr; } +/******************************************************************************/ + +#if DEBUG_SALLOC + +#define MAGIC 0xa1b2c35543deadLL + +void *g_slice_alloc (unsigned long size) +{ + unsigned long *p = (unsigned long *) (g_slice_alloc)(size + sizeof (unsigned long)); + *p++ = size ^ MAGIC; + //fprintf (stderr, "g_slice_alloc %ld %p\n", size, p);//D + return (void *)p; +} + +void *g_slice_alloc0 (unsigned long size) +{ + return memset (g_slice_alloc (size), 0, size); +} + +void g_slice_free1 (unsigned long size, void *ptr) +{ + if (expect_true (ptr)) + { + //fprintf (stderr, "g_slice_free %ld %p\n", size, ptr);//D + unsigned long *p = (unsigned long *)ptr; + unsigned long s = *--p ^ MAGIC; + + if (size != (unsigned long)(*p ^ MAGIC)) + LOG (logBacktrace | llevError, "slice free size (%lx) doesn't match alloc size (%lx)\n", size, s); + + *p = MAGIC; + + (g_slice_free1)(s + sizeof (unsigned long), p); + } +} + +#endif + +/******************************************************************************/ + void assign (char *dst, const char *src, int maxlen) { if (!src) @@ -544,40 +560,19 @@ memcpy (dst, src, len + 1); } -const std::string +const char * format (const char *format, ...) { - int len; + static dynbuf_text buf; + + buf.clear (); - { - char buf[128]; + va_list ap; + va_start (ap, format); + buf.vprintf (format, ap); + va_end (ap); - va_list ap; - va_start (ap, format); - len = vsnprintf (buf, sizeof (buf), format, ap); - va_end (ap); - - assert (len >= 0); // shield againstz broken vsnprintf's - - // was our static buffer short enough? - if (len < sizeof (buf)) - return std::string (buf, len); - } - - { - // longer, try harder - char *buf = salloc (len + 1); - - va_list ap; - va_start (ap, format); - vsnprintf (buf, len + 1, format, ap); - va_end (ap); - - const std::string s (buf, len); - sfree (buf, len + 1); - - return buf; - } + return buf; } tstamp now () @@ -655,4 +650,3 @@ 0x2d02ef8dL }; -