git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7230 c06c8d41-db1a-0410-9941-cceddc491573
HI7TDIAMNN575UUNXL32LZ7Y7HBR7S2JNH5IFUNPPVM5PKIYWZFAC EYYPQHFWHZDTHI6FJYCVGWLOXOI3J4LIQXFFYOBI74WYYIE2IL5QC HHGT66YN4T3VYBU4BZZVSWIX62FIZKMQ5NWPO3V5NWTMELVSGQHQC BINKDWGFGUPTOA7IE5KK4ZIELGU5WC3X47MYXOWU4X43EGAC5DUAC SPWOUV6ZNHLBSAX455ACJDBEJYVFHGO4H76L4NPAE5DF6BEAK34QC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC CMAHQ2ZS37MGH4XGMVKRDK665PKNFBISOEZLY7RZXX7CXVLUPL5AC FCL7KOWXA5O3GLMDR22JCGMTHMZ57C4WQIJKBIIUQV3LI2CI3X7AC X343NDQNM6NY4KNVC45IV6BYY5XQR4RLSNJBMCFDSHFG73ZVYS3AC RTB6BWX5OPHNXFSRXCQ34G5THZO4F6QZCW4GQBAL6JHVEMEMSPOAC COLMJH3UIQFF4R5AV642OJK4HHGUIIPLNP5WGKLWWYNJV7ZGPI7AC ENI6P5WUO7DS4Y7EUDCYB4PSNT7CXH2L5JIB5BLZHNMWN4QDXMWQC 5B5DP5S6A6LQMKZYVLQAEMHQZWFWYDHPCKQGRNSCNNYIBQYZ6BIQC 5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC 7YUGK5Q64KG5O7GJGTUBRRLHAHBCJ5YOE23YUPT6UBKUSB67CYAQC L57WEZMVIHTFRLWVIPWOIOWHCF2I53TVUVYJ2V6IZ64R56FVTZZAC 2N5AKUYV6EUUT254C47WSHZKD7FGN65JKJ3RCKSDP74XJIHIFMDQC 4XGOVPFCU6KZIYHKWCHUTZY6G5S326DKBG3UREPR34Q4TSDD3TAAC static int _string_tag_length(const std::string& s){int taglen = 0;bool in_tag = false;int last_taglen = 0;for (std::string::const_iterator ci = s.begin(); ci != s.end(); ++ci){if (in_tag){if (*ci == '<' && last_taglen == 1){in_tag = false;--taglen;}else if (*ci == '>'){in_tag = false;++taglen;}else{++last_taglen;++taglen;}}else if (*ci == '<'){in_tag = true;last_taglen = 1;++taglen;}}return (taglen);}
// Return the actual (string) offset of character #loc to be printed,// i.e. ignoring tags. So for instance, if s == "<tag>ab</tag>", then// _find_string_location(s, 2) == 6.int _find_string_location(const std::string& s, int loc){int real_offset = 0;bool in_tag = false;int last_taglen = 0;int offset = 0;for (std::string::const_iterator ci = s.begin();ci != s.end() && real_offset < loc;++ci, ++offset){if (in_tag){if (*ci == '<' && last_taglen == 1){++real_offset;in_tag = false;}else if (*ci == '>'){in_tag = false;}else{++last_taglen;}}else if (*ci == '<'){in_tag = true;last_taglen = 1;}else{++real_offset;}}return (offset);}// Return the substring of s from character start to character end,// where tags count as length 0.std::string tagged_string_substr(const std::string& s, int start, int end){return (s.substr(_find_string_location(s, start),_find_string_location(s, end)));}int tagged_string_printable_length(const std::string& s){int len = 0;bool in_tag = false;int last_taglen = 0;for (std::string::const_iterator ci = s.begin(); ci != s.end(); ++ci){if (in_tag){if (*ci == '<' && last_taglen == 1) // "<<" sequence{in_tag = false; // this is an escape for '<'++len; // len wasn't incremented before}else if (*ci == '>') // tag close, still nothing printed{in_tag = false;}else // tag continues{++last_taglen;}}else if (*ci == '<') // tag starts{in_tag = true;last_taglen = 1;}else // normal, printable character{++len;}}return (len);}// Count the length of the tags in the string.int tagged_string_tag_length(const std::string& s){return s.size() - tagged_string_printable_length(s);}