From 3b98f3439e33b15bba2036c402f9925340fdb2b9 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Sat, 29 Jun 2013 23:23:43 -0700 Subject: Poison std::string and use the various string classes --- src/common/mmo.hpp | 121 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 109 insertions(+), 12 deletions(-) (limited to 'src/common/mmo.hpp') diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index 450aa61..89ff50a 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -4,7 +4,10 @@ # include "sanity.hpp" # include "timer.t.hpp" -# include "utils.hpp" +# include "utils2.hpp" + +// affects CharName +# define NAME_IGNORING_CASE 1 constexpr int FIFOSIZE_SERVERLINK = 256 * 1024; @@ -37,6 +40,105 @@ constexpr int MAX_PARTY = 12; # define CHAR_CONF_NAME "conf/char_athena.conf" +struct AccountName : VString<23> {}; +struct AccountPass : VString<23> {}; +struct AccountCrypt : VString<39> {}; +struct AccountEmail : VString<39> {}; +struct ServerName : VString<19> {}; +struct PartyName : VString<23> {}; +struct VarName : VString<31> {}; +template +T stringish(VString iv) +{ + T rv; + static_cast&>(rv) = iv; + return rv; +} +#define DEFAULT_EMAIL stringish("a@a.com") + +// It is decreed: a mapname shall not contain an extension +class MapName : public strings::_crtp_string +{ + VString<15> _impl; +public: + MapName() = default; + MapName(VString<15> v) : _impl(v.oislice_h(std::find(v.begin(), v.end(), '.'))) {} + + iterator begin() const { return &*_impl.begin(); } + iterator end() const { return &*_impl.begin(); } + const char *c_str() const { return _impl.c_str(); } + + operator FString() const { return _impl; } + operator TString() const { return _impl; } + operator SString() const { return _impl; } + operator ZString() const { return _impl; } + operator XString() const { return _impl; } +}; +template<> +inline +MapName stringish(VString<15> iv) +{ + return iv; +} +inline +const char *decay_for_printf(const MapName& vs) { return vs.c_str(); } + +// It is decreed: a charname is sometimes case sensitive +struct CharName +{ +private: + VString<23> _impl; +public: + CharName() = default; + explicit CharName(VString<23> name) + : _impl(name) + {} + + VString<23> to__actual() const + { + return _impl; + } + VString<23> to__lower() const + { + return _impl.to_lower(); + } + VString<23> to__upper() const + { + return _impl.to_upper(); + } + VString<23> to__canonical() const + { +#if NAME_IGNORING_CASE == 0 + return to__actual(); +#endif +#if NAME_IGNORING_CASE == 1 + return to__lower(); +#endif + } + + friend bool operator == (const CharName& l, const CharName& r) + { return l.to__canonical() == r.to__canonical(); } + friend bool operator != (const CharName& l, const CharName& r) + { return l.to__canonical() != r.to__canonical(); } + friend bool operator < (const CharName& l, const CharName& r) + { return l.to__canonical() < r.to__canonical(); } + friend bool operator <= (const CharName& l, const CharName& r) + { return l.to__canonical() <= r.to__canonical(); } + friend bool operator > (const CharName& l, const CharName& r) + { return l.to__canonical() > r.to__canonical(); } + friend bool operator >= (const CharName& l, const CharName& r) + { return l.to__canonical() >= r.to__canonical(); } + + friend + VString<23> convert_for_printf(const CharName& vs) { return vs.to__actual(); } +}; +template<> +inline +CharName stringish(VString<23> iv) +{ + return CharName(iv); +} + namespace e { enum class EPOS : uint16_t @@ -78,7 +180,7 @@ struct item struct point { - char map_[16]; + MapName map_; short x, y; }; @@ -105,7 +207,7 @@ struct skill_value struct global_reg { - char str[32]; + VarName str; int value; }; @@ -182,7 +284,7 @@ struct mmo_charstatus short shield; short head_top, head_mid, head_bottom; - char name[24]; + CharName name; unsigned char base_level, job_level; earray attrs; unsigned char char_num, sex; @@ -221,7 +323,8 @@ struct GM_Account struct party_member { int account_id; - char name[24], map[24]; + CharName name; + MapName map; int leader, online, lv; struct map_session_data *sd; }; @@ -229,16 +332,10 @@ struct party_member struct party { int party_id; - char name[24]; + PartyName name; int exp; int item; struct party_member member[MAX_PARTY]; }; -struct square -{ - int val1[5]; - int val2[5]; -}; - #endif // MMO_HPP -- cgit v1.2.3-70-g09d2