$PBExportHeader$u_xls_dfc_base_func.sru FORWARD GLOBAL TYPE u_xls_dfc_base_func FROM nonvisualobject END TYPE TYPE ust_ip_option_information FROM structure within u_xls_dfc_base_func END TYPE TYPE ust_icmp_echo_reply FROM structure within u_xls_dfc_base_func END TYPE END FORWARD TYPE ust_ip_option_information FROM structure Character ttl Character tos Character flags Character optionssize Long optionsdata END TYPE TYPE ust_icmp_echo_reply FROM structure UnsignedLong Address UnsignedLong status UnsignedLong roundtriphome UnsignedInteger datasize UnsignedInteger reserved UnsignedLong datapointer ust_ip_option_information Options Character Data[250] END TYPE GLOBAL TYPE u_xls_dfc_base_func FROM nonvisualobject AUTOINSTANTIATE END TYPE TYPE PROTOTYPES END PROTOTYPES TYPE VARIABLES END VARIABLES FORWARD PROTOTYPES PUBLIC FUNCTION String uf_replaceall (String psreplacestring, String psoldstring, String psnewstring) PUBLIC FUNCTION String uf_get_token (REF String pssource, String psseparator) PUBLIC FUNCTION Boolean uf_split (String pssource, String pssperator, REF String pssplit[]) PUBLIC FUNCTION String uf_getkeyvalue (String psstring, String pskey) PUBLIC FUNCTION String uf_setkeyvalue (String psstring, String pskey, String psvalue) PUBLIC FUNCTION String uf_get_token (REF String pssource, String psseparator, Boolean pbremovecomma) PUBLIC FUNCTION Boolean uf_split (String pssource, String pssperator, REF String pssplit[], Boolean pbremovecomma) END PROTOTYPES PUBLIC FUNCTION String uf_replaceall (String psreplacestring, String psoldstring, String psnewstring); Long dlLen, dlPos, dlStart String dsResult dlLen = Len(psoldstring) dsResult = psreplacestring dlStart = 1 DO WHILE TRUE dlPos = Pos(dsResult, psoldstring, dlStart) IF dlPos > 0 THEN dsResult = Replace(dsResult, dlPos, dlLen, psnewstring) dlStart = dlPos + Len(psnewstring) ELSE EXIT END IF LOOP RETURN dsResult END FUNCTION PUBLIC FUNCTION String uf_get_token (REF String pssource, String psseparator); RETURN uf_Get_Token(pssource, psseparator, TRUE) END FUNCTION PUBLIC FUNCTION Boolean uf_split (String pssource, String pssperator, REF String pssplit[]); RETURN uf_Split(pssource, pssperator, pssplit, TRUE) END FUNCTION PUBLIC FUNCTION String uf_getkeyvalue (String psstring, String pskey); String dsKey[] String dsValue[] Integer i psstring = uf_ReplaceAll(psstring, "~~t", "~t") uf_Split(psstring, "~t", dsKey) FOR i = 1 TO UpperBound(dsKey) uf_Split(dsKey[i], "=", dsValue) IF UpperBound(dsValue) >= 2 THEN IF Upper(Trim(dsValue[1])) = Upper(Trim(pskey)) THEN RETURN dsValue[2] END IF END IF NEXT RETURN "" END FUNCTION PUBLIC FUNCTION String uf_setkeyvalue (String psstring, String pskey, String psvalue); String dsKey[] String dsValue[] Integer i Boolean dbFound String dsString psstring = uf_ReplaceAll(psstring, "~~t", "~t") uf_Split(psstring, "~t", dsKey) dbFound = FALSE dsString = "" FOR i = 1 TO UpperBound(dsKey) uf_Split(dsKey[i], "=", dsValue) IF dsString <> "" THEN dsString += "~t" END IF IF UpperBound(dsValue) >= 2 THEN IF Upper(Trim(dsValue[1])) = Upper(Trim(pskey)) THEN dbFound = TRUE dsValue[2] = psvalue END IF dsString += dsValue[1] + "=" IF Pos(dsValue[2], "=") > 0 OR Pos(dsValue[2], "~t") > 0 THEN IF Pos(dsValue[2], '"') = 0 THEN dsString += '"' + dsValue[2]+ '"' ELSEIF Pos(dsValue[2], "'") = 0 THEN dsString += "'" + dsValue[2] + "'" ELSE MessageBox("出错信息", "调用函数 uf_SetKeyValue 出错!~n~n" + & "关键字: " + dsValue[1] + "~n值: " + dsValue[2] + "~n~n" + & "无法处理值中的等于号(=)!", StopSign!) RETURN "" END IF ELSE dsString += dsValue[2] END IF ELSE dsString += dsValue[1] END IF NEXT IF NOT dbFound THEN IF dsString <> "" THEN dsString += "~t" END IF dsString += pskey + "=" IF Pos(psvalue, "=") > 0 OR Pos(psvalue, "~t") > 0 THEN If (Left(psvalue, 1) = "'" AND Right(psvalue, 1) = "'") OR & Left(psvalue, 1) = '"' AND Right(psvalue, 1) = '"' THEN dsString += psvalue ELSE IF Pos(psvalue, '"') = 0 THEN dsString += '"' + psvalue + '"' ELSEIF Pos(psvalue, "'") = 0 THEN dsString += "'" + psvalue + "'" ELSE MessageBox("出错信息", "调用函数 uf_SetKeyValue 出错!~n~n" + & "关键字: " + pskey + "~n值: " + psvalue + "~n~n" + & "无法处理值中的等于号(=)!", StopSign!) RETURN "" END IF END IF ELSE dsString += psvalue END IF END IF RETURN dsString END FUNCTION PUBLIC FUNCTION String uf_get_token (REF String pssource, String psseparator, Boolean pbremovecomma); // uf_Get_Token // 参数: // psSource: 源串 // psSparator: 分隔符 // pbRemoveComma: 是否去除引号 // 返回: // 分隔符前的串 Long p Long dlPos String ret Boolean dbFoundComma1, dbFoundComma2 // p = Pos(psSource, psSeparator) // Get the position of the psSeparator // 查找 psSource 中 psSeparator 的位置 p = 0 dbFoundComma1 = FALSE dbFoundComma2 = FALSE FOR dlPos = 1 TO Len(pssource) IF Mid(pssource, dlPos, 1) = '"' THEN dbFoundComma1 = NOT dbFoundComma1 END IF IF Mid(pssource, dlPos, 1) = "'" THEN dbFoundComma2 = NOT dbFoundComma2 END IF IF Mid(pssource, dlPos, 1) = psseparator THEN IF NOT dbFoundComma1 AND NOT dbFoundComma2 THEN p = dlPos EXIT END IF END IF NEXT IF p = 0 THEN // if no psSeparator, ret = pssource // return the whole psSource string and pssource = "" // make the original psSource of zero length ELSE ret = Mid (pssource, 1, p - 1) // otherwise, return just the token and pssource = Mid (pssource, p + Len ( psseparator )) // strip it & the psSeparator END IF ret = Trim(ret) ret = uf_ReplaceAll(ret, "''", "'") ret = uf_ReplaceAll(ret, '""', '"') IF pbremovecomma THEN IF Left(ret, 1) = Right(ret, 1) AND & (Left(ret, 1) = "'" OR Left(ret, 1) = '"') THEN ret = Mid(ret, 2, Len(ret) - 2) END IF END IF RETURN ret END FUNCTION PUBLIC FUNCTION Boolean uf_split (String pssource, String pssperator, REF String pssplit[], Boolean pbremovecomma); // uf_Split // 参数 // psSource // psSperator // psSpilt // pbRemoveComma: 去除引号 Integer i Boolean dbFound // 判断 psSource 的最后是否是分隔符, 如果是, 则在最后添加一个空值 IF Right(pssource, Len(pssperator)) = pssperator THEN dbFound = TRUE ELSE dbFound = FALSE END IF i = 0 DO WHILE pssource <> "" i ++ pssplit[i] = Trim(uf_Get_Token(pssource, pssperator, pbremovecomma)) LOOP // 如果最后一个值是分隔符, 则添加一个空值在最后 IF dbFound THEN i ++ pssplit[i] = "" END IF RETURN TRUE END FUNCTION ON u_xls_dfc_base_func.CREATE CALL SUPER::CREATE TriggerEvent( THIS, "constructor" ) END ON ON u_xls_dfc_base_func.DESTROY TriggerEvent( THIS, "destructor" ) CALL SUPER::DESTROY END ON