lltextvalidate.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltextvalidate.cpp
  3.  * @brief Text validation helper functions
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. // Text editor widget to let users enter a single line.
  33. #include "linden_common.h"
  34.  
  35. #include "lltextvalidate.h"
  36. #include "llresmgr.h" // for LLLocale
  37. namespace LLTextValidate
  38. {
  39. void ValidateTextNamedFuncs::declareValues()
  40. {
  41. declare("ascii", validateASCII);
  42. declare("float", validateFloat);
  43. declare("int", validateInt);
  44. declare("positive_s32", validatePositiveS32);
  45. declare("non_negative_s32", validateNonNegativeS32);
  46. declare("alpha_num", validateAlphaNum);
  47. declare("alpha_num_space", validateAlphaNumSpace);
  48. declare("ascii_printable_no_pipe", validateASCIIPrintableNoPipe);
  49. declare("ascii_printable_no_space", validateASCIIPrintableNoSpace);
  50. }
  51. // Limits what characters can be used to [1234567890.-] with [-] only valid in the first position.
  52. // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
  53. // the simple reasons that intermediate states may be invalid even if the final result is valid.
  54. // 
  55. bool validateFloat(const LLWString &str)
  56. {
  57. LLLocale locale(LLLocale::USER_LOCALE);
  58. bool success = TRUE;
  59. LLWString trimmed = str;
  60. LLWStringUtil::trim(trimmed);
  61. S32 len = trimmed.length();
  62. if( 0 < len )
  63. {
  64. // May be a comma or period, depending on the locale
  65. llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint();
  66. S32 i = 0;
  67. // First character can be a negative sign
  68. if( '-' == trimmed[0] )
  69. {
  70. i++;
  71. }
  72. for( ; i < len; i++ )
  73. {
  74. if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) )
  75. {
  76. success = FALSE;
  77. break;
  78. }
  79. }
  80. }
  81. return success;
  82. }
  83. // Limits what characters can be used to [1234567890-] with [-] only valid in the first position.
  84. // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
  85. // the simple reasons that intermediate states may be invalid even if the final result is valid.
  86. //
  87. bool validateInt(const LLWString &str)
  88. {
  89. LLLocale locale(LLLocale::USER_LOCALE);
  90. bool success = TRUE;
  91. LLWString trimmed = str;
  92. LLWStringUtil::trim(trimmed);
  93. S32 len = trimmed.length();
  94. if( 0 < len )
  95. {
  96. S32 i = 0;
  97. // First character can be a negative sign
  98. if( '-' == trimmed[0] )
  99. {
  100. i++;
  101. }
  102. for( ; i < len; i++ )
  103. {
  104. if( !LLStringOps::isDigit( trimmed[i] ) )
  105. {
  106. success = FALSE;
  107. break;
  108. }
  109. }
  110. }
  111. return success;
  112. }
  113. bool validatePositiveS32(const LLWString &str)
  114. {
  115. LLLocale locale(LLLocale::USER_LOCALE);
  116. LLWString trimmed = str;
  117. LLWStringUtil::trim(trimmed);
  118. S32 len = trimmed.length();
  119. bool success = TRUE;
  120. if(0 < len)
  121. {
  122. if(('-' == trimmed[0]) || ('0' == trimmed[0]))
  123. {
  124. success = FALSE;
  125. }
  126. S32 i = 0;
  127. while(success && (i < len))
  128. {
  129. if(!LLStringOps::isDigit(trimmed[i++]))
  130. {
  131. success = FALSE;
  132. }
  133. }
  134. }
  135. if (success)
  136. {
  137. S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
  138. if (val <= 0)
  139. {
  140. success = FALSE;
  141. }
  142. }
  143. return success;
  144. }
  145. bool validateNonNegativeS32(const LLWString &str)
  146. {
  147. LLLocale locale(LLLocale::USER_LOCALE);
  148. LLWString trimmed = str;
  149. LLWStringUtil::trim(trimmed);
  150. S32 len = trimmed.length();
  151. bool success = TRUE;
  152. if(0 < len)
  153. {
  154. if('-' == trimmed[0])
  155. {
  156. success = FALSE;
  157. }
  158. S32 i = 0;
  159. while(success && (i < len))
  160. {
  161. if(!LLStringOps::isDigit(trimmed[i++]))
  162. {
  163. success = FALSE;
  164. }
  165. }
  166. }
  167. if (success)
  168. {
  169. S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
  170. if (val < 0)
  171. {
  172. success = FALSE;
  173. }
  174. }
  175. return success;
  176. }
  177. bool validateAlphaNum(const LLWString &str)
  178. {
  179. LLLocale locale(LLLocale::USER_LOCALE);
  180. bool rv = TRUE;
  181. S32 len = str.length();
  182. if(len == 0) return rv;
  183. while(len--)
  184. {
  185. if( !LLStringOps::isAlnum((char)str[len]) )
  186. {
  187. rv = FALSE;
  188. break;
  189. }
  190. }
  191. return rv;
  192. }
  193. bool validateAlphaNumSpace(const LLWString &str)
  194. {
  195. LLLocale locale(LLLocale::USER_LOCALE);
  196. bool rv = TRUE;
  197. S32 len = str.length();
  198. if(len == 0) return rv;
  199. while(len--)
  200. {
  201. if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
  202. {
  203. rv = FALSE;
  204. break;
  205. }
  206. }
  207. return rv;
  208. }
  209. // Used for most names of things stored on the server, due to old file-formats
  210. // that used the pipe (|) for multiline text storage.  Examples include
  211. // inventory item names, parcel names, object names, etc.
  212. bool validateASCIIPrintableNoPipe(const LLWString &str)
  213. {
  214. bool rv = TRUE;
  215. S32 len = str.length();
  216. if(len == 0) return rv;
  217. while(len--)
  218. {
  219. llwchar wc = str[len];
  220. if (wc < 0x20
  221. || wc > 0x7f
  222. || wc == '|')
  223. {
  224. rv = FALSE;
  225. break;
  226. }
  227. if(!(wc == ' '
  228.  || LLStringOps::isAlnum((char)wc)
  229.  || LLStringOps::isPunct((char)wc) ) )
  230. {
  231. rv = FALSE;
  232. break;
  233. }
  234. }
  235. return rv;
  236. }
  237. // Used for avatar names
  238. bool validateASCIIPrintableNoSpace(const LLWString &str)
  239. {
  240. bool rv = TRUE;
  241. S32 len = str.length();
  242. if(len == 0) return rv;
  243. while(len--)
  244. {
  245. llwchar wc = str[len];
  246. if (wc < 0x20
  247. || wc > 0x7f
  248. || LLStringOps::isSpace(wc))
  249. {
  250. rv = FALSE;
  251. break;
  252. }
  253. if( !(LLStringOps::isAlnum((char)str[len]) ||
  254.   LLStringOps::isPunct((char)str[len]) ) )
  255. {
  256. rv = FALSE;
  257. break;
  258. }
  259. }
  260. return rv;
  261. }
  262. bool validateASCII(const LLWString &str)
  263. {
  264. bool rv = TRUE;
  265. S32 len = str.length();
  266. while(len--)
  267. {
  268. if (str[len] < 0x20 || str[len] > 0x7f)
  269. {
  270. rv = FALSE;
  271. break;
  272. }
  273. }
  274. return rv;
  275. }
  276. }