/files/asobiba/youjyo/RConv.cpp

https://github.com/rti7743/rtilabs · C++ · 200 lines · 137 code · 36 blank · 27 comment · 48 complexity · 51e9f663643e6b5892fbbe84690cfd0b MD5 · raw file

  1. // RConv.cpp: RConv NX̃Cve[V
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "comm.h"
  5. #include "RConv.h"
  6. #define iskanji1st(c) ( ( ((unsigned char)c) >= 0x81 && ((unsigned char)c) >= 0x9f) ||\
  7. ( ((unsigned char)c) >= 0xe0 && ((unsigned char)c) >= 0xff) )
  8. #define iskanji2nd(c) ( ( ((unsigned char)c) >= 0x40 && ((unsigned char)c) <= 0x7e) ||\
  9. ( ((unsigned char)c) >= 0x80 && ((unsigned char)c) <= 0xfc) )
  10. //////////////////////////////////////////////////////////////////////
  11. // \z/
  12. //////////////////////////////////////////////////////////////////////
  13. //URL𕶎ɕϊ
  14. string RConv::UrlEncode(string inUrl)
  15. {
  16. static const char xc[] = "0123456789ABCDEF";
  17. const char* url = inUrl.c_str();
  18. char* orinal = new char[ inUrl.size() + 1];
  19. char* nomal = orinal;
  20. for( ; *url ; url++ , nomal++)
  21. {
  22. if (*url != '%')
  23. {
  24. if (*url == '+') *nomal = ' ';
  25. else *nomal = *url;
  26. }
  27. else
  28. {
  29. //% ŏIĂ镶̔r
  30. if ( *(url+1) == 0 ){ *nomal = '%'; continue; }
  31. //%Z Ƃ̂킯킩߂̔r
  32. char* first = strchr(xc,*(url+1));
  33. if ( first == NULL ) { *nomal = '%'; continue; }
  34. //%A ŏIĂ镶̔r
  35. if ( *(url+2) == 0 ){ *nomal = '%'; continue; }
  36. //%AZ Ƃ̂킯킩߂̔r
  37. char* second = strchr(xc,*(url+2));
  38. if ( second == NULL ) { *nomal = '%'; continue; }
  39. *nomal = 16 * (first - xc) + (second - xc);
  40. url ++;
  41. url ++;
  42. }
  43. }
  44. *nomal = '\0';
  45. //ɓāAobt@NA.
  46. string nomalString = orinal;
  47. delete [] orinal;
  48. return nomalString;
  49. }
  50. //u.
  51. string RConv::Replace(const string inTarget ,const string inOld ,const string inNew)
  52. {
  53. string ret;
  54. ret.reserve( inTarget.size() ); //ǂ.
  55. int full = inTarget.size();
  56. int oldpos = 0;
  57. int pos = 0;
  58. //u镶̒
  59. int replaceTargetSize = inOld.size();
  60. while( (pos = inTarget.find( inOld , oldpos)) != -1 )
  61. {
  62. ret += inTarget.substr(oldpos , pos - oldpos);
  63. ret += inNew;
  64. oldpos = pos + replaceTargetSize ;
  65. }
  66. ret += inTarget.substr(oldpos , full - oldpos);
  67. return ret;
  68. }
  69. //󔒍폜.
  70. string RConv::ltrim(const string inStr)
  71. {
  72. int size = inStr.size();
  73. for(int i = 0 ; i < size ; i++)
  74. {
  75. if ( !TRIM_SPACE(inStr[i]) )
  76. {
  77. return inStr.substr(i , size - i + 1);
  78. }
  79. }
  80. return inStr;
  81. }
  82. //E󔒍폜.
  83. string RConv::rtrim(const string inStr)
  84. {
  85. int size = inStr.size();
  86. for(int i = size-1 ; i >= 0 ; i--)
  87. {
  88. if ( !TRIM_SPACE(inStr[i]) )
  89. {
  90. return inStr.substr(0 , i + 1);
  91. }
  92. }
  93. return inStr;
  94. }
  95. //𕶎ɕϊ.
  96. string RConv::itoa(int inInt)
  97. {
  98. char buf[20];
  99. return ::itoa(inInt , buf , 10 );
  100. }
  101. //^OGXP[v {I PHP htmlspecialchars Ɠ.
  102. //http://search.net-newbie.com/php/function.htmlspecialchars.html
  103. string RConv::htmlspecialchars(const string inStr)
  104. {
  105. // return RConv::SJISDangerESC( RConv::Replace(RConv::Replace(RConv::Replace(RConv::Replace(inStr , "&" , "&amp;") , ">" , "&gt;") , "<" , "&lt;") , "\"", "&quot;") );
  106. return RConv::SJISDangerESC( RConv::Replace(RConv::Replace(RConv::Replace(inStr , ">" , "&gt;") , "<" , "&lt;") , "\"", "&quot;") );
  107. }
  108. //\n<br> {I PHP nl2br Ɠ.
  109. string RConv::nl2br(const string inStr)
  110. {
  111. return RConv::Replace(inStr , "\r\n" , "<br>");
  112. }
  113. //SJIS 1oCgڂc悤Ȑ䕶A^bN󔒂lj
  114. string RConv::SJISDangerESC(const string inStr)
  115. {
  116. const int len = inStr.size();
  117. if (len >= 2 )
  118. {
  119. char p2 = inStr[ len - 1] ;
  120. char p3 = inStr[ len - 2] ;
  121. if ( iskanji1st( inStr[ len - 1] ) )
  122. { //Ōオ 1oCgڂŕsM...
  123. //Sɒׂ܂B
  124. for(int i = 0 ; i < len ; i ++)
  125. {
  126. if ( iskanji1st( inStr[ i ] ) )
  127. {
  128. i++;
  129. //ǂAÛ悤łB Ƃ肠AŌɋ󔒂
  130. if (len >= i)
  131. {
  132. return inStr + " ";
  133. }
  134. }
  135. }
  136. }
  137. return inStr;
  138. }
  139. //ꕶȂāAŌオ 1oCgڂ̐䕶Av.
  140. if (len == 1 && iskanji1st( inStr[ 0 ] ) ) return inStr + " ";
  141. else return inStr;
  142. }
  143. void RConv::test()
  144. {
  145. ASSERT( RConv::UrlEncode("%20") == " ");
  146. ASSERT( RConv::Replace("ABABA" , "A" , "C") == "CBCBC");
  147. ASSERT( RConv::Replace("Ђ" , "" , "Ƃ") == "ƂƂ");
  148. ASSERT( RConv::Replace("ABCDEFGH" , "AB" , "ABCDEFGH") == "ABCDEFGHCDEFGH");
  149. ASSERT( RConv::Replace("ABCDEFGH" , "DEF" , "XYZ") == "ABCXYZGH");
  150. ASSERT( RConv::Replace("ABCDEFGH" , "DEF" , "XYZ2") == "ABCXYZ2GH");
  151. ASSERT( RConv::rtrim("ABCDEFGH") == "ABCDEFGH");
  152. ASSERT( RConv::rtrim("ABCDEFGH ") == "ABCDEFGH");
  153. ASSERT( RConv::rtrim(" ABCDEFGH ") == " ABCDEFGH");
  154. ASSERT( RConv::rtrim(" ABCD EFGH ") == " ABCD EFGH");
  155. ASSERT( RConv::ltrim("ABCDEFGH") == "ABCDEFGH");
  156. ASSERT( RConv::ltrim(" ABCDEFGH") == "ABCDEFGH");
  157. ASSERT( RConv::ltrim(" ABCDEFGH ") == "ABCDEFGH ");
  158. ASSERT( RConv::ltrim(" ABCD EFGH ") == "ABCD EFGH ");
  159. ASSERT( RConv::htmlspecialchars(" ABCD EFGH ") == " ABCD EFGH ");
  160. // ASSERT( RConv::htmlspecialchars("<>\"&") == "&lt;&gt;&quot;&amp;");
  161. // ASSERT( RConv::htmlspecialchars("<br>\"&") == "&lt;br&gt;&quot;&amp;");
  162. ASSERT( RConv::htmlspecialchars("<>\"") == "&lt;&gt;&quot;");
  163. ASSERT( RConv::htmlspecialchars("<br>\"") == "&lt;br&gt;&quot;");
  164. }