u_xls_dfc_base_func.sru 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. $PBExportHeader$u_xls_dfc_base_func.sru
  2. FORWARD
  3. GLOBAL TYPE u_xls_dfc_base_func FROM nonvisualobject
  4. END TYPE
  5. TYPE ust_ip_option_information FROM structure within u_xls_dfc_base_func
  6. END TYPE
  7. TYPE ust_icmp_echo_reply FROM structure within u_xls_dfc_base_func
  8. END TYPE
  9. END FORWARD
  10. TYPE ust_ip_option_information FROM structure
  11. Character ttl
  12. Character tos
  13. Character flags
  14. Character optionssize
  15. Long optionsdata
  16. END TYPE
  17. TYPE ust_icmp_echo_reply FROM structure
  18. UnsignedLong Address
  19. UnsignedLong status
  20. UnsignedLong roundtriphome
  21. UnsignedInteger datasize
  22. UnsignedInteger reserved
  23. UnsignedLong datapointer
  24. ust_ip_option_information Options
  25. Character Data[250]
  26. END TYPE
  27. GLOBAL TYPE u_xls_dfc_base_func FROM nonvisualobject AUTOINSTANTIATE
  28. END TYPE
  29. TYPE PROTOTYPES
  30. END PROTOTYPES
  31. TYPE VARIABLES
  32. END VARIABLES
  33. FORWARD PROTOTYPES
  34. PUBLIC FUNCTION String uf_replaceall (String psreplacestring, String psoldstring, String psnewstring)
  35. PUBLIC FUNCTION String uf_get_token (REF String pssource, String psseparator)
  36. PUBLIC FUNCTION Boolean uf_split (String pssource, String pssperator, REF String pssplit[])
  37. PUBLIC FUNCTION String uf_getkeyvalue (String psstring, String pskey)
  38. PUBLIC FUNCTION String uf_setkeyvalue (String psstring, String pskey, String psvalue)
  39. PUBLIC FUNCTION String uf_get_token (REF String pssource, String psseparator, Boolean pbremovecomma)
  40. PUBLIC FUNCTION Boolean uf_split (String pssource, String pssperator, REF String pssplit[], Boolean pbremovecomma)
  41. END PROTOTYPES
  42. PUBLIC FUNCTION String uf_replaceall (String psreplacestring, String psoldstring, String psnewstring);
  43. Long dlLen, dlPos, dlStart
  44. String dsResult
  45. dlLen = Len(psoldstring)
  46. dsResult = psreplacestring
  47. dlStart = 1
  48. DO WHILE TRUE
  49. dlPos = Pos(dsResult, psoldstring, dlStart)
  50. IF dlPos > 0 THEN
  51. dsResult = Replace(dsResult, dlPos, dlLen, psnewstring)
  52. dlStart = dlPos + Len(psnewstring)
  53. ELSE
  54. EXIT
  55. END IF
  56. LOOP
  57. RETURN dsResult
  58. END FUNCTION
  59. PUBLIC FUNCTION String uf_get_token (REF String pssource, String psseparator);
  60. RETURN uf_Get_Token(pssource, psseparator, TRUE)
  61. END FUNCTION
  62. PUBLIC FUNCTION Boolean uf_split (String pssource, String pssperator, REF String pssplit[]);
  63. RETURN uf_Split(pssource, pssperator, pssplit, TRUE)
  64. END FUNCTION
  65. PUBLIC FUNCTION String uf_getkeyvalue (String psstring, String pskey);
  66. String dsKey[]
  67. String dsValue[]
  68. Integer i
  69. psstring = uf_ReplaceAll(psstring, "~~t", "~t")
  70. uf_Split(psstring, "~t", dsKey)
  71. FOR i = 1 TO UpperBound(dsKey)
  72. uf_Split(dsKey[i], "=", dsValue)
  73. IF UpperBound(dsValue) >= 2 THEN
  74. IF Upper(Trim(dsValue[1])) = Upper(Trim(pskey)) THEN
  75. RETURN dsValue[2]
  76. END IF
  77. END IF
  78. NEXT
  79. RETURN ""
  80. END FUNCTION
  81. PUBLIC FUNCTION String uf_setkeyvalue (String psstring, String pskey, String psvalue);
  82. String dsKey[]
  83. String dsValue[]
  84. Integer i
  85. Boolean dbFound
  86. String dsString
  87. psstring = uf_ReplaceAll(psstring, "~~t", "~t")
  88. uf_Split(psstring, "~t", dsKey)
  89. dbFound = FALSE
  90. dsString = ""
  91. FOR i = 1 TO UpperBound(dsKey)
  92. uf_Split(dsKey[i], "=", dsValue)
  93. IF dsString <> "" THEN
  94. dsString += "~t"
  95. END IF
  96. IF UpperBound(dsValue) >= 2 THEN
  97. IF Upper(Trim(dsValue[1])) = Upper(Trim(pskey)) THEN
  98. dbFound = TRUE
  99. dsValue[2] = psvalue
  100. END IF
  101. dsString += dsValue[1] + "="
  102. IF Pos(dsValue[2], "=") > 0 OR Pos(dsValue[2], "~t") > 0 THEN
  103. IF Pos(dsValue[2], '"') = 0 THEN
  104. dsString += '"' + dsValue[2]+ '"'
  105. ELSEIF Pos(dsValue[2], "'") = 0 THEN
  106. dsString += "'" + dsValue[2] + "'"
  107. ELSE
  108. MessageBox("出错信息", "调用函数 uf_SetKeyValue 出错!~n~n" + &
  109. "关键字: " + dsValue[1] + "~n值: " + dsValue[2] + "~n~n" + &
  110. "无法处理值中的等于号(=)!", StopSign!)
  111. RETURN ""
  112. END IF
  113. ELSE
  114. dsString += dsValue[2]
  115. END IF
  116. ELSE
  117. dsString += dsValue[1]
  118. END IF
  119. NEXT
  120. IF NOT dbFound THEN
  121. IF dsString <> "" THEN
  122. dsString += "~t"
  123. END IF
  124. dsString += pskey + "="
  125. IF Pos(psvalue, "=") > 0 OR Pos(psvalue, "~t") > 0 THEN
  126. If (Left(psvalue, 1) = "'" AND Right(psvalue, 1) = "'") OR &
  127. Left(psvalue, 1) = '"' AND Right(psvalue, 1) = '"' THEN
  128. dsString += psvalue
  129. ELSE
  130. IF Pos(psvalue, '"') = 0 THEN
  131. dsString += '"' + psvalue + '"'
  132. ELSEIF Pos(psvalue, "'") = 0 THEN
  133. dsString += "'" + psvalue + "'"
  134. ELSE
  135. MessageBox("出错信息", "调用函数 uf_SetKeyValue 出错!~n~n" + &
  136. "关键字: " + pskey + "~n值: " + psvalue + "~n~n" + &
  137. "无法处理值中的等于号(=)!", StopSign!)
  138. RETURN ""
  139. END IF
  140. END IF
  141. ELSE
  142. dsString += psvalue
  143. END IF
  144. END IF
  145. RETURN dsString
  146. END FUNCTION
  147. PUBLIC FUNCTION String uf_get_token (REF String pssource, String psseparator, Boolean pbremovecomma);
  148. // uf_Get_Token
  149. // 参数:
  150. // psSource: 源串
  151. // psSparator: 分隔符
  152. // pbRemoveComma: 是否去除引号
  153. // 返回:
  154. // 分隔符前的串
  155. Long p
  156. Long dlPos
  157. String ret
  158. Boolean dbFoundComma1, dbFoundComma2
  159. // p = Pos(psSource, psSeparator) // Get the position of the psSeparator
  160. // 查找 psSource 中 psSeparator 的位置
  161. p = 0
  162. dbFoundComma1 = FALSE
  163. dbFoundComma2 = FALSE
  164. FOR dlPos = 1 TO Len(pssource)
  165. IF Mid(pssource, dlPos, 1) = '"' THEN
  166. dbFoundComma1 = NOT dbFoundComma1
  167. END IF
  168. IF Mid(pssource, dlPos, 1) = "'" THEN
  169. dbFoundComma2 = NOT dbFoundComma2
  170. END IF
  171. IF Mid(pssource, dlPos, 1) = psseparator THEN
  172. IF NOT dbFoundComma1 AND NOT dbFoundComma2 THEN
  173. p = dlPos
  174. EXIT
  175. END IF
  176. END IF
  177. NEXT
  178. IF p = 0 THEN // if no psSeparator,
  179. ret = pssource // return the whole psSource string and
  180. pssource = "" // make the original psSource of zero length
  181. ELSE
  182. ret = Mid (pssource, 1, p - 1) // otherwise, return just the token and
  183. pssource = Mid (pssource, p + Len ( psseparator )) // strip it & the psSeparator
  184. END IF
  185. ret = Trim(ret)
  186. ret = uf_ReplaceAll(ret, "''", "'")
  187. ret = uf_ReplaceAll(ret, '""', '"')
  188. IF pbremovecomma THEN
  189. IF Left(ret, 1) = Right(ret, 1) AND &
  190. (Left(ret, 1) = "'" OR Left(ret, 1) = '"') THEN
  191. ret = Mid(ret, 2, Len(ret) - 2)
  192. END IF
  193. END IF
  194. RETURN ret
  195. END FUNCTION
  196. PUBLIC FUNCTION Boolean uf_split (String pssource, String pssperator, REF String pssplit[], Boolean pbremovecomma);
  197. // uf_Split
  198. // 参数
  199. // psSource
  200. // psSperator
  201. // psSpilt
  202. // pbRemoveComma: 去除引号
  203. Integer i
  204. Boolean dbFound
  205. // 判断 psSource 的最后是否是分隔符, 如果是, 则在最后添加一个空值
  206. IF Right(pssource, Len(pssperator)) = pssperator THEN
  207. dbFound = TRUE
  208. ELSE
  209. dbFound = FALSE
  210. END IF
  211. i = 0
  212. DO WHILE pssource <> ""
  213. i ++
  214. pssplit[i] = Trim(uf_Get_Token(pssource, pssperator, pbremovecomma))
  215. LOOP
  216. // 如果最后一个值是分隔符, 则添加一个空值在最后
  217. IF dbFound THEN
  218. i ++
  219. pssplit[i] = ""
  220. END IF
  221. RETURN TRUE
  222. END FUNCTION
  223. ON u_xls_dfc_base_func.CREATE
  224. CALL SUPER::CREATE
  225. TriggerEvent( THIS, "constructor" )
  226. END ON
  227. ON u_xls_dfc_base_func.DESTROY
  228. TriggerEvent( THIS, "destructor" )
  229. CALL SUPER::DESTROY
  230. END ON