--- deliantra/server/include/shstr.h 2008/12/31 18:25:12 1.26 +++ deliantra/server/include/shstr.h 2009/11/03 23:44:21 1.34 @@ -1,20 +1,21 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007,2008 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2005,2006,2007,2008,2009 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * - * 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. + * Deliantra is free software: you can redistribute it and/or modify it under + * the terms of the Affero GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * You should have received a copy of the Affero GNU General Public License + * and the GNU General Public License along with this program. If not, see + * . * * The authors can be reached via e-mail to */ @@ -70,9 +71,18 @@ return length () >= plen && !strncasecmp (s, prefix, plen); } + // returns true if the substring is contained in the shstr + // if the shstr is 0, then this always returns false. + // the shstr is (theoretically) treated as a comma/colon/space etc. separated list. bool contains (const char *substring) const { - return strstr (s, substring); + return s != null () && strstr (s, substring); + } + + //TODO: case sensitive should be eradicated + bool eq_nc (const char *otherstring) const + { + return !strcasecmp (s, otherstring); } shstr_tmp () @@ -115,14 +125,11 @@ return a.s != b.s; } -inline int strlen (const shstr_tmp &sh) +inline int strlen (shstr_tmp sh) { return sh.length (); } -// undefined external reference to catch people using strcmp when they shouldn't -int strcmp (const shstr_tmp &a, const shstr_tmp &b); - static std::ostream &operator <<(std::ostream &o, shstr_tmp sh) { o.write (sh.s, sh.length ()); @@ -208,7 +215,13 @@ { const char *s; - explicit shstr_cmp (const char *str) + // initialies to the non-matching string (as opposed to the null string) + shstr_cmp () + { + s = 0; + } + + shstr_cmp (const char *str) : s (shstr::find (str)) { } @@ -234,17 +247,15 @@ return a.s == b.s; } -struct shstr_const : shstr_tmp -{ - shstr_const (const char *s) - : shstr_tmp (0, s) - { - } -}; - -#define def(str) extern const shstr_const shstr_ ## str; +#define def2(id,str) extern const shstr id; +#define def(id) def2(shstr_ ## id, # id) # include "shstrinc.h" #undef def +#undef def2 + +// undefined external reference to catch people using str* functions when they shouldn't +//template void strcmp (const shstr_tmp &a, any b); +template void strstr (const shstr_tmp &a, any b); #endif